Главная > Умный дом > Уведомление в Телеграм если какой-то из сенсоров Home Assistant перешел в состояние недоступен

Уведомление в Телеграм если какой-то из сенсоров Home Assistant перешел в состояние недоступен


1 июля 2021. Разместил: dimon
Что-то изменилось в радиообстановке в моем доме и я заметил, что сенсоры периодически стали отваливаться от НА, уходя в состояние "Недоступен". Для оперативного реагирования, да и просто чтобы понять как часто это происходит, я решил сделать автоматизацию, которая будет присылать мне уведомление в Телеграм если какой-то из сенсоров Home Assistant перешел в состояние недоступен.

Я заметил, что когда сенсор недоступен то и все его сущности переходят в это же состояние, а так как почти все сенсоры ZigBee у меня на батарейках, то я решил что проще всего отслеживать состояние сущности battery сенсоров.

Т.к. сенсоров было не очень много, то я в триггере автоматизации просто перечислил все свои сенсоры батареек и успокоился. Больше полугода эта автоматизация у меня работала, исправно присылая уведомление в Telegram, когда какой-нибудь датчик отваливался от сервера умного дома Home Assistant.

Так же у меня есть счетчик unavailable_sensors_counter, который увеличивается на единицу каждый раз когда, какой-то сенсор отваливается и я получаю уведомление. Его значение я тоже присылаю себе в виде уведомления каждый раз.

В результате уведомление выглядит вот так:

Уведомление в Телеграм если какой-то из сенсоров Home Assistant перешел в состояние недоступен




Код доступен на GitHub-е



Еще во время написания этой автоматизации я думал, что нужно в триггере как-то указать домен устройств, чтобы не перечислять их все ручками, но код работал, а времени ковыряться особо не было.

Сейчас, наконец, критическая масса проблем доросла до толчка допилить эту автоматизацию до удобоваримого вида.

К тому же оказалось, что некоторые новые датчики Xiaomi (Aqara), которые имеют интерфейс BLE (Bluetooth Low Energy) не отдают значение батарейки, хотя такую сущность в HA заводят, и соответственно каждый раз показываются в списке Недоступных. Да и количество сенсоров постоянно растет, а постоянно отслеживать и каждый раз ручками добавлять в автоматизацию новые датчики становится довольно суетно.

Поэтому переделаем автоматизацию, изменив триггер со списка сенсоров батареек на домены устройств.

Перво-наперво заведем Template sensor-ы со счетчиком количества недоступных светильников, свичей, сенсоров и бинарных сенсоров:


    sensor:

      - platform: template
        sensors:

          unavailable_now_light:
            friendly_name: "Всего недоступных светильников - "
            entity_id:
              - sensor.time
            value_template: "{{states.light | selectattr ('state', 'equalto', 'unavailable') | list | length}}"
            icon_template: mdi:counter        

          unavailable_now_switch:
            friendly_name: "Всего недоступных реле - "
            entity_id:
              - sensor.time
            value_template: "{{states.switch | selectattr ('state', 'equalto', 'unavailable') | list | length}}"
            icon_template: mdi:counter 
            
          unavailable_now_sensor:
            friendly_name: "Всего недоступных сенсоров - "
            entity_id:
              - sensor.time
            value_template: "{{states.sensor | selectattr ('state', 'equalto', 'unavailable') | list | length}}"
            icon_template: mdi:counter
            
          unavailable_now_binary_sensor:
            friendly_name: "Всего недоступных бинарных сенсоров - "
            entity_id:
              - sensor.time
            value_template: "{{states.binary_sensor | selectattr ('state', 'equalto', 'unavailable') | list | length}}"
            icon_template: mdi:counter
            


Далее нам нужно сделать скрипты, которые будут отсылать сообщения (уведомления) в Телеграм:


    script:

      unavailable_list_var1:    
        alias: Отправка отчета о недоступных сущностях var1
        sequence:
         - service: notify.telegram_admin
           data:
             message: | 
                 {{"\U0001F6A8"}} Отчет за {{ states('sensor.time_date') }}
                 
                 {{"\U0001F4A1"}} Светильников недоступно - {{ states('sensor.unavailable_now_light') }} 
                 {{"\U0001F50C"}} Свичей недоступно - {{ states('sensor.unavailable_now_switch') }} 
                 {{"\U0001F321"}} Сенсоров недоступно - {{ states('sensor.unavailable_now_sensor') }} 
                 {{"\U0001F51F"}} Бинарных сенсоров недоступно - {{ states('sensor.unavailable_now_binary_sensor') }}             
                 
                 Список недоступных сущностей:
                 {{ states | selectattr('state', 'eq', 'unavailable') | map(attribute="name") | join ("
                 ") }}

      unavailable_list_var2:    
        alias: Отправка отчета о недоступных сущностях var1
        sequence:
         - service: notify.telegram_admin
           data:
             message: | 
                 {{"\U0001F6A8"}} Отчет за {{ states('sensor.time_date') }}
                 
                 {% if (states('sensor.unavailable_now_light') | int > 0) -%}
                   -  
                 {{"\U0001F4A1"}} Светильников недоступно - {{ states('sensor.unavailable_now_light') }}:
                 {{ states.light | selectattr('state', 'eq', 'unavailable') | map(attribute="name") | join ("
                 ") }}
                 {%- endif %}
                 {% if (states('sensor.unavailable_now_switch') | int > 0) -%}
                   -  
                 {{"\U0001F50C"}} Свичей недоступно - {{ states('sensor.unavailable_now_switch') }}:
                 {{ states.switch | selectattr('state', 'eq', 'unavailable') | map(attribute="name") | join ("
                 ") }}
                 {%- endif %}
                 {% if (states('sensor.unavailable_now_sensor') | int > 0) -%}
                   -  
                 {{"\U0001F321"}} Сенсоров недоступно - {{ states('sensor.unavailable_now_sensor') }}:
                 {{ states.sensor | selectattr('state', 'eq', 'unavailable') | map(attribute="name") | join ("
                 ") }}
                 {%- endif %}
                 {% if (states('sensor.unavailable_now_binary_sensor') | int > 0) -%}
                   -  
                 {{"\U0001F51F"}} Бинарных сенсоров недоступно - {{ states('sensor.unavailable_now_binary_sensor') }}:
                 {{ states.binary_sensor | selectattr('state', 'eq', 'unavailable') | map(attribute="name") | join ("
                 ") }}
                 {%- endif %}


Ну и напоследок - автоматизацию, которая при изменении значения этих сенсоров будет запускать эти скрипты:


    automation:   

        - id: Уведомление о недоступных сущностях
          alias: send_unavailable_entity_list
          trigger:
          - platform: state
            entity_id:
             - sensor.unavailable_now_light
             - sensor.unavailable_now_switch
             - sensor.unavailable_now_sensor
             - sensor.unavailable_now_binary_sensor
            for: '00:01:00'
          condition: []
          action:
          - service: script.turn_on
            entity_id: script.unavailable_list_var1
          - service: script.turn_on
            entity_id: script.unavailable_list_var2
	


Уведомление var1 выглядит вот так:

Уведомление в Телеграм если какой-то из сенсоров Home Assistant перешел в состояние недоступен


Уведомление var2 выглядит вот так:

Уведомление в Телеграм если какой-то из сенсоров Home Assistant перешел в состояние недоступен


Код доступен на GitHub-е

Вернуться назад