Notificação de dispositivos com bateria baixa

Achei um sensor template para monitorar quando a bateria dos dispositivos estiverem baixa.

1 - Criar um Input Number com o nome Nível de bateria baixa para definir a partir de qual nível a bateria será considerada baixa:

2 - No arquivo template.yaml adicionar o sensor abaixo:

    sensor:
      - name: "Dispositivos bateria baixa"
        icon: mdi:battery-low
        state: >
          {% set threshold = states('input_number.nivel_de_bateria_baixa') | int %}
          {%- set ns = namespace(sensors=[]) -%}
          {%- for state in states.sensor
            | selectattr('attributes.device_class', 'defined')
            | selectattr('attributes.state_class', 'defined')
            | selectattr('attributes.device_class', '==', 'battery')
            | selectattr('attributes.state_class', '==', 'measurement')
            | selectattr('entity_id', 'in', integration_entities('mqtt'))
            | selectattr('state', 'is_number') -%}
            {%- if state.state | int <= threshold -%}
              {%set ns.sensors = ns.sensors + [dict(name = state.name | replace(' battery', '') | replace(' Baterry', ''), state = state.state | int)] %}
            {%- endif -%}
          {%- endfor -%}
          {%- set batt = ns.sensors | sort(attribute='state') %}
          {%- set ns = namespace(batt='') -%}
          {%- for state in batt -%}
              {% set ns.batt= ns.batt + (state.name ~ ' (' ~ state.state ~'%)' ~ "\n") %}
          {% endfor -%}
        
          {% if ns.batt | count > 0 %}
            {{ ns.batt | truncate(255, true, '...') }}
          {%else %}
            {{ 'unavailable' }}
          {% endif %}
    
    

No meu caso quero monitorar apenas os dispositivos Zigbee2mqtt, então o sensor esta filtrando apenas as baterias de dispositivos da integração MQTT.
Remova ou altere a linha abaixo caso necessário:

| selectattr('entity_id', 'in', integration_entities('mqtt'))

3 - Reinicie o HA

4 - Exemplo de automação:

alias: Monitoramento > Dispositivos Bateria Baixa
description: ""
trigger:
  - platform: state
    entity_id:
      - sensor.dispositivos_bateria_baixa
condition:
  - condition: template
    value_template: "{{ trigger.to_state.state not in ['unknown', 'unavailable','none'] }}"
action:
  - service: notify.mobile_app_sm_g985f
    data:
      title: Dispositivo Zigbee com bateria baixa
      message: "{{ states(\"sensor.dispositivos_bateria_baixa\") }}"
      data:
        ttl: 0
        priority: high
        importance: high
        vibrationPattern: 100, 1000, 100, 1000, 100
        color: "#ff0000"
        channel: Alerta
        tag: dispositivo_bateria_baixa
mode: single

O sensor só pode ter 255 caracteres, se tiver muitos sensores com bateria baixa, será colocado reticências no final.

5 Likes

Legal, esses dias até tinha pensando em fazer algo mas não sabia nem por onde começar, acho que da pra fazer algo na qualidade de sinal dos dispositivos zigbee também

Aqui nenhum dispositivo está informando para o HA o sinal, só consigo ver direto no z2m.

Mas se mudar os filtros, linhas com selectattr e alterar os nomes das variáveis deve dar certo

1 Like

@kelvinrafaeli depois vc testa. O Linkquality fica desabilitado por padrão ai só habilitei 1 para testar

      - name: "Dispositivos Sinal Baixo"
        icon: mdi:wifi-arrow-up-down
        state: >
          {% set threshold = states('input_number.sinal_baixo') | int %}
          {%- set ns = namespace(sensors=[]) -%}
          {%- for state in states.sensor
            | selectattr('attributes.state_class', 'defined')
            | selectattr('attributes.unit_of_measurement', '==', 'lqi')
            | selectattr('attributes.state_class', '==', 'measurement')
            | selectattr('entity_id', 'in', integration_entities('mqtt'))
            | selectattr('state', 'is_number') -%}
            {%- if state.state | int <= threshold -%}
              {%set ns.sensors = ns.sensors + [dict(name = state.name | replace(' linkquality', '') | replace(' Linkquality', ''), state = state.state | int)] %}
            {%- endif -%}
          {%- endfor -%}
          {%- set signal = ns.sensors | sort(attribute='state') %}
          {%- set ns = namespace(signal='') -%}
          {%- for state in signal -%}
              {% set ns.signal= ns.signal + (state.name ~ ' (' ~ state.state ~' lqi)' ~ "\n") %}
          {% endfor -%}
        
          {% if ns.signal | count > 0 %}
            {{ ns.signal | truncate(255, true, '...') }}
          {%else %}
            {{ 'unavailable' }}
          {% endif %}
    

Tem que criar o input number com valor de 0 a 255

@Walber funcionou certinho!! Habilitei de um dispositivo aqui para testes também

image

Obrigado por compartilhar

1 Like