В данной реализации приведем пример отслеживания работоспособности стика, мостов, Zigbee2MQTT, а так же связанности датчиков, сенсоров. Решение на постоянной основе отслеживает статус и принимает решение о перезагрузке-восстановлению, дополнительно формируются информационные сообщая по PUSH Home Assistant App.
Используется 3 стика для увеличения покрытия, поэтому в конфиге упоминается по 3 записи мостов и дополнений.
Аналогично можно сделать решение для любой другой интеграции.
В секции mqtt создаются три сенсора для мониторинга состояния Zigbee‑мостов:
zigbee2mqtt/bridge/state;zigbee2mqtt_2/bridge/state;zigbee2mqtt_3/bridge/state.mdi:zigbee для наглядности в интерфейсе.Сенсор Zigbee devices offline
Отслеживает устройства, которые:
unavailable);Алгоритм:
timestamp (где хранится время последнего контакта).last_seen.Сенсор Zigbee_bridges_status
Мониторит состояние трёх Zigbee‑мостов. Логика:
off или unavailable — добавляет его в список проблем.Сенсор Zigbee devices offline1
Более детальная версия отслеживания офлайн‑устройств:
unavailable, unknown, none.Автоматизация 1: «Отключение моста, устройств + обязательная сверка»
Триггеры:
off, unavailable, unknow;sensor.zigbee_devices_offline в течение 10 минут;Действие:
Автоматизация 2: «Проверка подключения моста и принудительная перезагрузка если недоступен»
Триггер: каждые 30 минут.
Условие: хотя бы один мост в состоянии off, unavailable, unknow.
Действия:
Триггер: восстановление связи с любым мостом (состояние on).
Действие:
mqtt:
sensor:
- name: Zigbee2MQTT bridge state 1
state_topic: "zigbee2mqtt/bridge/state"
icon: mdi:zigbee
- name: Zigbee2MQTT bridge state 2
state_topic: "zigbee2mqtt_2/bridge/state"
icon: mdi:zigbee
- name: Zigbee2MQTT bridge state 3
state_topic: "zigbee2mqtt_3/bridge/state"
icon: mdi:zigbee
template:
- sensor:
- name: "Zigbee devices offline"
state: >
{% set result = namespace(sensors=[]) %}
{% for state in states.sensor | rejectattr('attributes.device_class', 'undefined') | selectattr('attributes.device_class', '==', 'timestamp') %}
{% if 'last_seen' in state.entity_id and (states(state.entity_id) == 'unavailable' or ((as_timestamp(now()) - as_timestamp(states(state.entity_id))) > ((3 | int) * 60 * 60))) %}
{% set result.sensors = result.sensors + [state.name | regex_replace(find=' Last seen', replace='', ignorecase=True) ~ ' (' ~ relative_time(strptime(states(state.entity_id), '%Y-%m-%dT%H:%M:%S%z', 'недоступен')) ~ ')'] %}
{% endif %}
{% endfor %}
{{ result.sensors | join('\n') | truncate(254, True) }}
- sensor:
- name: "Zigbee_bridges_status"
state: >
{% set result = namespace(bridges=[]) %}
{% set bridges = [
{'id': 'binary_sensor.zigbee2mqtt_bridge_connection_state', 'name': 'Zigbee2MQTT Мост 1'},
{'id': 'binary_sensor.zigbee2mqtt_bridge_connection_state_4', 'name': 'Zigbee2MQTT Мост 2'},
{'id': 'binary_sensor.zigbee2mqtt_bridge_connection_state_5', 'name': 'Zigbee2MQTT Мост 3'}
] %}
{% for bridge in bridges %}
{% set state = states(bridge.id) %}
{% if state == 'off' or state == 'unavailable' %}
{% set result.bridges = result.bridges + [bridge.name ~ ' (' ~ state ~ ')'] %}
{% endif %}
{% endfor %}
{% if result.bridges %}
{{ result.bridges | join('\n') | truncate(254, True) }}
{% else %}
✅ Все мосты работают нормально
{% endif %}
- sensor:
- name: "Zigbee devices offline1"
state: >
{% set ns = namespace(offline_devices=[]) %}
{% set cutoff_time = as_timestamp(now()) - (1 * 3600) %}
{% for state in states.sensor
| selectattr('attributes.device_class', 'defined')
| selectattr('attributes.device_class', '==', 'timestamp')
| selectattr('entity_id', 'match', '.*last_seen.*') %}
{% set last_seen = states(state.entity_id) %}
{% if last_seen == 'unavailable' or last_seen == 'unknown' or last_seen == 'none' %}
{% set device_name = state.name | regex_replace(find=' last seen', replace='', ignorecase=True) %}
{% set ns.offline_devices = ns.offline_devices + [device_name ~ ' (недоступен)'] %}
{% elif as_timestamp(strptime(last_seen, '%Y-%m-%dT%H:%M:%S%z')) < cutoff_time %}
{% set time_ago = relative_time(strptime(last_seen, '%Y-%m-%dT%H:%M:%S%z')) %}
{% set device_name = state.name | regex_replace(find=' last seen', replace='', ignorecase=True) %}
{% set ns.offline_devices = ns.offline_devices + [device_name ~ ' (' ~ time_ago ~ ')'] %}
{% endif %}
{% endfor %}
{% if ns.offline_devices %}
{{ ns.offline_devices | join('\n') | truncate(254, true, '...') }}
{% else %}
Все устройства онлайн
{% endif %}
automation:
- alias: Zigbee2MQTT. Отключение моста, устройств + обязательная сверка
trigger:
- platform: state
entity_id:
- binary_sensor.zigbee2mqtt_bridge_connection_state
- binary_sensor.zigbee2mqtt_bridge_connection_state_4
- binary_sensor.zigbee2mqtt_bridge_connection_state_5
to:
- 'off'
- 'unavailable'
- 'unknow'
id: z2m_status_bridge
- platform: state
entity_id:
- sensor.zigbee_devices_offline
from: 'null'
to: 'null'
for:
hours: 0
minutes: 10
seconds: 0
id: z2m_status_device
- platform: time
at: '21:00:00'
id: z2m_time
condition: []
action:
- delay: "00:00:05"
- service: notify.mobile_app_m2102k1g
metadata: {}
data:
title: "Zigbee2MQTT: статус состояния"
message: |
{{ states('sensor.zigbee_bridges_status') }}
{% if not states('sensor.zigbee_devices_offline') %}
✅ Все устройства в сети!
{% else %}
❌ Следующие устройства недоступны:
{% for entity in expand('sensor.zigbee_devices_offline') | map(attribute='entity_id') | list %}
{{ states(entity) }}
{% endfor %}
{% endif %}
mode: single
- alias: Zigbee2MQTT. Проверка подключения моста и принудительная перезагрузка если недоступен.
trigger:
- platform: time_pattern
minutes: "/30"
conditions:
- condition: state
entity_id:
- binary_sensor.zigbee2mqtt_bridge_connection_state
- binary_sensor.zigbee2mqtt_bridge_connection_state_4
- binary_sensor.zigbee2mqtt_bridge_connection_state_5
match: any
state:
- 'off'
- 'unavailable'
- 'unknow'
action:
- service: notify.mobile_app_m2102k1g
metadata: {}
data:
title: "Zigbee2MQTT: статус состояния"
message: |
❗ Следующие мосты не доступны более 30 минут: {{ states('sensor.zigbee_bridges_status') }}, пробую перезагружать.
- service: hassio.addon_restart
data:
addon: 45df7312_zigbee2mqtt
- service: hassio.addon_restart
data:
addon: 8c77aaed_zigbee2mqtt
- service: hassio.addon_restart
data:
addon: 997a5552_zigbee2mqtt
mode: single
- alias: Zigbee2MQTT. Подключение мостов
trigger:
- platform: state
entity_id:
- binary_sensor.zigbee2mqtt_bridge_connection_state
- binary_sensor.zigbee2mqtt_bridge_connection_state_4
- binary_sensor.zigbee2mqtt_bridge_connection_state_5
to:
- 'on'
id: z2m_status_bridge
condition: []
action:
- delay: "00:00:05"
- service: notify.mobile_app_m2102k1g
metadata: {}
data:
title: "Zigbee2MQTT: мосты перезапущены"
message: |
{{ states('sensor.zigbee_bridges_status') }}
{% if not states('sensor.zigbee_devices_offline') %}
✅ Все устройства в сети!
{% else %}
❌ Следующие устройства недоступны:
{% for entity in expand('sensor.zigbee_devices_offline') | map(attribute='entity_id') | list %}
{{ states(entity) }}
{% endfor %}
{% endif %}
mode: single