Чем займемся?

В данной реализации приведем пример отслеживания работоспособности стика, мостов, Zigbee2MQTT, а так же связанности датчиков, сенсоров. Решение на постоянной основе отслеживает статус и принимает решение о перезагрузке-восстановлению, дополнительно формируются информационные сообщая по PUSH Home Assistant App.

Используется 3 стика для увеличения покрытия, поэтому в конфиге упоминается по 3 записи мостов и дополнений.

Аналогично можно сделать решение для любой другой интеграции.

Как это работает?
1. MQTT‑сенсоры (отслеживание состояния мостов)

В секции mqtt создаются три сенсора для мониторинга состояния Zigbee‑мостов:

  • Каждый сенсор отслеживает состояние своего моста через отдельный топик MQTT:
    • первый — zigbee2mqtt/bridge/state;
    • второй — zigbee2mqtt_2/bridge/state;
    • третий — zigbee2mqtt_3/bridge/state.
  • У всех сенсоров установлен значок mdi:zigbee для наглядности в интерфейсе.
2. Шаблонные сенсоры (аналитика и агрегация данных)

Сенсор Zigbee devices offline

Отслеживает устройства, которые:

  • стали недоступны (unavailable);
  • не обновляли статус более 3 часов.

Алгоритм:

  1. Фильтрует сенсоры с классом timestamp (где хранится время последнего контакта).
  2. Проверяет, содержит ли ID сенсора подстроку last_seen.
  3. Сравнивает текущее время с временем последнего контакта.
  4. Формирует список устройств с указанием времени недоступности.
  5. Обрезает результат до 254 символов.

Сенсор Zigbee_bridges_status

Мониторит состояние трёх Zigbee‑мостов. Логика:

  • Если мост в состоянии off или unavailable — добавляет его в список проблем.
  • Если все мосты работают — выводит сообщение «✅ Все мосты работают нормально».

Сенсор Zigbee devices offline1

Более детальная версия отслеживания офлайн‑устройств:

  • Определяет устройства, не обновлявшие статус более 1 часа.
  • Обрабатывает случаи с состояниями unavailable, unknown, none.
  • Формирует читаемый список с указанием времени последней активности.
  • При отсутствии проблем выводит «Все устройства онлайн».
3. Автоматизации (реакция на события)

Автоматизация 1: «Отключение моста, устройств + обязательная сверка»

Триггеры:

  • изменение состояния любого из трёх мостов на off, unavailable, unknow;
  • отсутствие обновлений от сенсора sensor.zigbee_devices_offline в течение 10 минут;
  • ежедневное срабатывание в 21:00.

Действие:

  • отправляет уведомление в мобильное приложение с текущим статусом мостов и списком офлайн‑устройств.

Автоматизация 2: «Проверка подключения моста и принудительная перезагрузка если недоступен»

Триггер: каждые 30 минут.

Условие: хотя бы один мост в состоянии off, unavailable, unknow.

Действия:

  1. Отправляет предупреждение о недоступности мостов.
  2. Перезапускает три экземпляра аддона Zigbee2MQTT (по ID).

Триггер: восстановление связи с любым мостом (состояние on).

Действие:

  • после 5‑секундной задержки отправляет уведомление с текущим статусом мостов и устройств.

Итоговая логика работы системы

  1. Мониторинг: сенсоры постоянно отслеживают состояние мостов и устройств.
  2. Анализ: шаблонные сенсоры агрегируют данные и выявляют проблемы.
  3. Реакция:
    • при обнаружении проблем — уведомления пользователю;
    • если мост недоступен долго — автоматическая перезагрузка;
    • после восстановления связи — проверка состояния устройств.
  4. Профилактика: регулярная сверка статуса (в 21:00) и периодическая проверка мостов (каждые 30 минут).

Ключевые преимущества решения

  • Наглядность: статусы отображаются в интерфейсе Home Assistant.
  • Автоматизация: система самостоятельно перезапускает мосты при сбоях.
  • Оповещение: пользователь получает уведомления о проблемах и их устранении.
  • Гибкость: легко добавить новые мосты или изменить пороги времени.
Пример уведомления

Код:

				
					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
				
			

Добавить комментарий