Что-то изменилось в радиообстановке в моем доме и я заметил, что сенсоры периодически стали отваливаться от НА, уходя в состояние "Недоступен". Для оперативного реагирования, да и просто чтобы понять как часто это происходит, я решил сделать автоматизацию, которая будет присылать мне уведомление в Телеграм если какой-то из сенсоров Home Assistant перешел в состояние недоступен.
Я заметил, что когда сенсор недоступен то и все его сущности переходят в это же состояние, а так как почти все сенсоры ZigBee у меня на батарейках, то я решил что проще всего отслеживать состояние сущности battery сенсоров.
Т.к. сенсоров было не очень много, то я в триггере автоматизации просто перечислил все свои сенсоры батареек и успокоился. Больше полугода эта автоматизация у меня работала, исправно присылая уведомление в Telegram, когда какой-нибудь датчик отваливался от сервера умного дома Home Assistant.
Так же у меня есть счетчик
unavailable_sensors_counter, который увеличивается на единицу каждый раз когда, какой-то сенсор отваливается и я получаю уведомление. Его значение я тоже присылаю себе в виде уведомления каждый раз.
В результате уведомление выглядит вот так:

# Home Assistant unavailable sensor notify to Telegram
# Уведомление в Телеграм о том, что один из сенсоров ушел в состояние "Недоступен"
####################################################
# СКРИПТЫ #
####################################################
script:
unavailable_sensor_list:
alias: Отправка недоступных сенсоров
sequence:
- service: notify.telegram_admin
data:
message: |
{{"\U0001F50B"}} Отчет за {{ states('sensor.time_date') }}
Список недоступных сенсоров:
{{ states.sensor | selectattr('state', 'eq', 'unavailable') | map(attribute="name") | join ("
") }}
####################################################
# АВТОМАТИЗАЦИИ #
####################################################
automation:
- id: Уведомление о том что датчик ушел в состояние unavailable
alias: send_sensors_unavailable
trigger:
- platform: state
entity_id:
- sensor.battery_1************9
- sensor.battery_1************3
- sensor.battery_1************a
- sensor.battery_1************a
* * *
- sensor.battery_1************3
to: unavailable
for: '00:01:00'
condition: []
action:
- service: notify.telegram_admin
data:
message: |
{{"\U000026A0"}} Датчик unavailable!!! {{ states('sensor.time_date') }}
unavaibale counter = {{ states('counter.unavailable_sensors_counter') }}
- service: script.turn_on
entity_id: script.unavailable_sensor_list
- service: counter.increment
data:
entity_id: counter.unavailable_sensors_counter
Код доступен на
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 выглядит вот так:
Уведомление var2 выглядит вот так:
Код доступен на
GitHub-е