Автоматическое переключение на локальные сценарии Xiaomi Gateway 3 при недоступности Home Assistant

Когда умный дом настроен и работает в штатном режиме — это прекрасно. Но в жизни бывают разные ситуации. Одна из распространённых — отказ сервера умного дома по какой-либо причине. Опыт других людей показывает, что выход из строя сервера умного дома встречается гораздо чаще выхода из строя шлюза Xiaomi Gateway 3. Моя профессиональная деформация не даёт спокойно спать, когда нет резерва и заставляет постоянно задумываться над различными вариантами резервирования.

Сегодня мы поговорим о том, как можно зарезервировать некоторые вещи в умном доме при использовании в Home Assistant шлюза Xiaomi Gateway 3 через компонент Xiaomi Gateway 3. Почему именно в такой связке? Потому что так оно работает у меня. На момент написания статьи, с использованием этого компонента, у меня через один шлюз заведено 63 устройства (Zigbee + Bluetooth).

Теория

Итак, что же мы, в итоге, должны сделать, чтобы реализовать переключение на локальные сценарии?

  1. Нужен датчик из экосистемы Mi Home, подключенный к Xiaomi Gateway 3 штатными средствами Mi Home.
  2. Нужно реле с локальной логикой и «сухим контактом», которое будет принудительно переключать состояние датчика.
  3. Немного поработать паяльником.
  4. Придумать и реализовать триггеры, срабатывающие, когда Home Assistant становится недоступным и наоборот.
  5. Придумать и прописать автоматизации в Mi Home, которые должны будут срабатывать тогда, когда Home Assistant недоступен.

ВНИМАНИЕ! «Сухой контакт» у реле обязателен. Без него датчик может выйти из строя!

Оборудование

В качестве датчика я выбрал Xiaomi door & window contact sensor (MCCGQ01LM), у меня он уже был.

А вот над устройством с локальной логикой пришлось немного подумать. Но, в итоге, я остановился на реле Sonoff SV. Для того, чтобы его использовать в решении нашей задачи, нужно немного потрудиться, т.к. ни программно, ни аппаратно «из коробки» оно не удовлетворяет нашим требованиям. Для начала, нужно прошить реле прошивкой Tasmota, чтобы можно было логику работы реализовать локально на самом реле. Ну и, конечно, модифицировать реле под «сухой контакт». Там нет ничего сложного: нужно аккуратно выломать два резистора. У меня получилось с первого раза. :-)

Если бы на момент принятия решения я знал, что Sonoff RE5V1C можно прошить Tasmota, я бы выбрал его. Оно дешевле и у него «сухой контакт» «из коробки».

Ну а теперь нужно припаять датчик открытия двери. В сети есть много инструкций, как модифицировать такой датчик для своих целей, например, вот эта. Я припаялся прямо к контактам геркона.

Схематически у меня получилось примерно так. Да, я запитываю реле постоянным напряжением 5В.

Настройка

«Железо» мы подготовили, теперь попробуем заставить его работать так, как это нужно нам.

У вас уже должно быть настроено в Home Assistant:
- интеграция MQTT
- интеграция Tasmota
- компонент Xiaomi Gateway 3

Добавляем датчик открытия двери в Mi Home обычным способом.

Настраиваем реле после прошивки в Tasmota. Нам нужно подключить реле к Wi-Fi, MQTT-брокеру, задать положение реле при включении по питанию, сконфигурировать локальные правила.

Первоначальная настройка WiFi подробно описана на официальном сайте прошивки.

Чуть не забыл, в настройках надо указать правильный модуль, иначе реле может работать некорректно. В нашем случае — это Sonoff SV. Переходим на страницу http://<tasmota-ip-address>/md и выбираем Sonoff SV в выпадающем списке.

Теперь откроем настройки MQTT у нашего реле в браузере по ссылке http://<tasmota-ip-address>/mq и введём корректные значения Host, Port, User и Password для подключения к MQTT-брокеру.

После этого наше реле должно успешно подключиться к MQTT-брокеру. Проверить это можно перейдя в консоль по ссылке http://<tasmota-ip-address>/cs. Консоль нам понадобится и для дальнейших настроек.

Я для себя определил, что когда Home Assistant «жив», реле разомкнуто (находится в положении выключено), а датчик, соответственно, показывает «дверь открыта».

Отчасти, поэтому решил, что после подачи питания на реле, оно должно замкнуть контакты, а если Home Assistant «жив», он, со временем, скажет об этом и контакты разомкнутся.

Чтобы объяснить это нашему реле, введём в консоли команду:

PowerOnState 1

Настраиваем локальные правила:

Rule1 ON Event#ha_alive DO RuleTimer1 365 ENDON ON Rules#Timer=1 DO Power1 1 ENDON

Они означают следующее:
- при получении события ha_alive, запускаем таймер на 365 секунд
- при завершении таймера, замыкаем контакты реле

И активируем их:

Rule1 1

Теперь добавляем автоматизацию в Home Assistant:

alias: Home Assistant Alive Check
description: ''
trigger:
  - platform: time_pattern
    minutes: /2
condition:
  - condition: not
    conditions:
      - condition: state
        entity_id: remote.gw3_pair
        state: unavailable
action:
  - choose:
      - conditions:
          - condition: state
            entity_id: switch.sonoffsv_switch
            state: 'on'
        sequence:
          - service: switch.turn_off
            data: {}
            entity_id: switch.sonoffsv_switch
    default: []
  - service: mqtt.publish
    data:
      topic: cmnd/sonoffsv/event
      payload: ha_alive
mode: single

Каждые 2 минуты, если шлюз Xiaomi Gateway 3 доступен в Home Assistant, размыкаем контакты реле, если они были замкнуты и отправляем на реле команду event ha_alive через MQTT.

Ну и пример локального сценария в Mi Home с указанием в условиях статуса для нужного нам датчика «дверь закрыта»:

В штатном режиме включением света в туалете у меня занимается Home Assistant через компонент Xiaomi Gateway 3 от AlexxIT. Если же по какой-то причине Home Assistant «умрёт», это должен сделать тот же шлюз Xiaomi Gateway 3, но уже средствами Mi Home. Обратите внимание на второй скриншот выше: сценарий локальный, т.е. он сработает даже если в этот момент отсутствует доступ к облаку Mi Home.

Итоги

Что мы получили? Home Assistant раз в две минуты сообщает реле о том, что он «жив». Реле, получив это сообщение, сбрасывает таймер. Если на протяжении 365 секунд (3 пропуска сообщения подряд через 120 секунд каждое, плюс 5 секунд на непредвиденные задержки) реле не получало от Home Assistant информации о том, что он жив, оно замкнёт контакты и датчик открытия двери изменит свой статус на «дверь закрыта». Начнут работать подготовленные нами заранее локальные сценарии Mi Home. Когда Home Assistant «оживёт», сработает автоматизация, которая разомкнёт контакты реле и отправит сообщение о том, что он «жив» и датчик изменит свой статус на «дверь открыта». Локальные сценарии Mi Home перестанут срабатывать.

Знаю, что предложенный мной вариант не единственный. Никого ни к чему не призываю, ничего не навязываю. Просто делюсь тем, как реализовал у себя. Допускаю, что моя реализация не оптимальна, но на данном этапе меня она устраивает. Если есть желание поделиться своими решениями или появились вопросы, заходите обсудить.

Vladimir Turekhanov ・ June 27, 2021

вернуться