Защита дома от протечек на датчиках Xiaomi/Aqara - Часть 2, Автоматизация
В первой части статьи был рассмотрен пример создания системы защиты от протечек интегрируемых в систему управления умного дома. Теперь пришло время создать автоматизации в Home Assistant.
Итак, мы используем двухканальное реле, датчики протечки и одноклавишный беспроводной выключатель Aqara. При использовании системы автоматизации Home Assistant датчики протечки и выключатель могут быть подключены через шлюз Xiaomi, но работа двухканального реле не поддерживается в Home Assistant при подключении через данный шлюз, поэтому реле необходимо подключить через USB координатор CC2531, CC2538 или какой ни будь другой позволяющий работать с реле через ZigBee2MQTT (Подключение USB координатора CC2531, установку и настройку ZigBee2MQTT можно посмотреть здесь).
Для работы нам понадобятся два дополнительных вспомогательных компонента (Helper) типа input_boolen
. Первый будет показывать состояние наличия протечки и переводиться в положение "Протечка" при срабатывании любого из датчиков, это позволит не запускать автоматизацию на закрытие стояков при срабатывании других датчиков протечки после первого, а сделать это один раз. На основании значения этого триггера будет периодически отсылаться уведомление о наличии протечки, а система автоматизации не даст открыть краны пока состояние наличия протечки не будет сброшено. Сброс состояния будет производиться вручную. Второй триггер будет показывать текущее положение механизма крана, т.к. краны сами не могут передавать в каком положении они находятся в закрытом или открытом, то положение этого триггера будет устанавливаться после того как отработает какая-либо из двух линий реле, напомню, одна линия реле отвечает за открытие кранов, вторая за закрытие.
Для удобства, вся автоматизация будет описана в одном отдельном пакетном файле (про пакеты можно почитать на сайте Home Assistant здесь). Создаем файл leakprotection.yaml
в папке .homeassistant/packages/
и добавляем в него дополнительные компоненты:
input_boolean: # Триггер обнаруженной протечки home_leak_detected: name: Протечка в доме icon: mdi:pipe-leak # Триггер состояния стояков home_pipelines_state: name: Состояние запора стояков icon: mdi:water-pump-off
Для периодической проверки и оповещения о не устраненной протечке добавим таймер. Время повторной проверки 5 минут = 300 сек.
timer: # Таймер проверки устранения протечки home_leak_not_fixed: name: Таймер проверки устранения протечки duration: 300
Для визуального оповещения в доме будет использован встроенный светильник шлюза Xiaomi Gateway 2 и пара прикроватных ламп Mijia Bedside Lamp. При обнаружении протечки и периодическом оповещении по таймеру они будут загораться красным светом. Что бы не прописывать действия каждого светильника в автоматизациях создадим отдельные скрипты на включение и выключение светильников, далее в автоматизациях будут вызываться эти скрипты.
script: # Включение аварийного сигнального освещения home_leak_protect_warning_light_on: alias: Leak protect - Leakage warning light on sequence: - service: light.turn_on entity_id: light.gateway_light_777777777777 data: brightness: 5 color_name: red - service: light.turn_on entity_id: light.night_light_l data: brightness: 5 color_name: red - service: light.turn_on entity_id: light.night_light_r data: brightness: 5 color_name: red # Выключение аварийного сигнального освещения home_leak_protect_warning_light_off: alias: Leak protect - Leakage warning light off sequence: - service: light.turn_off entity_id: light.gateway_light_777777777777 data: {} - service: light.turn_off entity_id: light.night_light_l data: {} - service: light.turn_off entity_id: light.night_light_r data: {}
Для запирания и открытия кранов тоже будут использоваться скрипты, в пункт scripts
необходимо добавить два скрипта, на открытие и закрытие. По замеренным данным, время закрытия и открытия кранов около 16 секунд, поэтому нужная линия реле будет включаться, а затем отключаться через 20 секунд.
# Закрытие кранов home_leak_protect_pipelines_close: alias: Leak protect - Close pipelines sequence: - service: switch.turn_on entity_id: switch.xiaomi_relay_2ch_switch_l1 data: {} - delay: 00:00:20 - service: switch.turn_off entity_id: switch.xiaomi_relay_2ch_switch_l1 data: {} # Открытие кранов home_leak_protect_pipelines_open: alias: Leak protect - Open pipelines sequence: - service: switch.turn_on entity_id: switch.xiaomi_relay_2ch_switch_l2 data: {} - delay: 00:00:20 - service: switch.turn_off entity_id: switch.xiaomi_relay_2ch_switch_l2 data: {}
Для отслеживания текущего состояния протечки используется созданный ранее триггер home_leak_detected
. В обычном состоянии он находится в положении OFF
- краны могут быть как открыты, так и закрыты вручную. При срабатывании одного из датчиков протечки, триггер переводится в состоянии ON
и выполнятся автоматизация выполняющая закрытие кранов. Если триггер уже находится в состоянии ON
и срабатывает датчик протечки, то повторная команда на закрытие уже не отдается. Т.к. краны не отдают текущее свое состояние, то ранее мы ввели триггер состояния home_pipelines_state
, положение которого выставляется после срабатывания одной из двух линий реле, но в автоматизации запора стояков при первом обнаружении протечки этот триггер использоваться не будет во избежание случая, когда триггер будет в состоянии закрыто, а по факту стояки будут открыты вручную. Следующая автоматизация будет срабатывать при переводе триггера home_leak_detected
в состояние ON
после чего будет выполнен скрипт, зажигающий в доме аварийное освещение, запущен скрипт, закрывающий стояки и запущен таймер, отслеживающий состояние триггера home_leak_detected
.
automation: # Закрытие стояков при обнаружении в доме протечки - id: home_leak_protect_leak_detected_in_home alias: Leak protect - Leak detected in home trigger: - platform: state entity_id: input_boolean.home_leak_detected to: 'on' condition: [] action: - service: script.home_leak_protect_warning_light_on data: {} - service: script.home_leak_protect_pipelines_close data: {} - entity_id: timer.home_leak_not_fixed service: timer.start data: {} mode: single
При переводе триггера home_leak_detected
в состояние OFF
, подразумевается, что протечка в доме уже устранена, либо ведутся работы по ее устранению и оповещения не требуются. Перед отключением системы не забываем просушить датчики протечки и убрать воду. Следующая автоматизация отрабатывает при переводе триггера в состояние OFF
, аварийное освещение отключается, отключается таймер отслеживания и отправляются оповещения в систему и telegram.
# Протечка в доме устранена - id: home_leak_protect_leak_fixed_in_home alias: Leak protect - Leak fixed trigger: - platform: state entity_id: input_boolean.home_leak_detected to: 'off' condition: [] action: - service: script.home_leak_protect_warning_light_off data: {} - entity_id: timer.home_leak_not_fixed service: timer.cancel data: {} - service: persistent_notification.create data: title: Leak fixed message: '{{ states(''sensor.date'') }} {{ states(''sensor.time'') }} - Протечка в доме устранена!' - service: telegram_bot.send_message data: message: {{ states('sensor.date') }} {{ states('sensor.time') }} - Протечка в доме устранена! mode: single
При обнаружении протечки запускается таймер home_leak_not_fixed
, каждые 5 минут будет загораться аварийное освещение и сыпаться уведомления в систему и telegram. Это сделано на случай что бы не забыть и не пропустить аварию. Таймер отключится только после перевода триггера home_leak_detected
в состояние OFF
.
# Протечка не устранена - Таймер завершил отсчет - id: home_leak_protect_timer_finished alias: Leak protect - Leak not fixed - Timer finished trigger: - platform: event event_type: timer.finished event_data: entity_id: timer.home_leak_not_fixed condition: - condition: state entity_id: input_boolean.home_leak_detected state: 'on' action: - service: script.home_leak_protect_warning_light_on data: {} - service: persistent_notification.create data: title: Leak detected message: '{{ states(''sensor.date'') }} {{ states(''sensor.time'') }} - Обнаружена протечка в доме!' - service: telegram_bot.send_message data: message: {{ states('sensor.date') }} {{ states('sensor.time') }} - Обнаружена протечка в доме! - service: timer.start entity_id: timer.home_leak_not_fixed data: {} mode: single
Отслеживание состояния кранов будет производиться на основе того, какая линия реле отработала последней. Следующие две автоматизации устанавливают значение триггера home_pipelines_state
. Если линия один (L1) перешла из состояния ON
в состояние OFF
, то краны закрылись и триггер home_pipelines_state
переводится в состояние ON
. Если линия два (L2) перешла из состояния ON
в состояние OFF
, то краны открылись и триггер home_pipelines_state
переводится в состояние OFF
. О работе автоматизаций отсылаются соответствующие уведомления.
# Реле запора стояков - Стояки заперты - id: home_leak_protect_set_pipelines_on alias: Leak protect - Pipelines reley - Set pipelines on trigger: - platform: state entity_id: switch.xiaomi_relay_2ch_switch_l1 from: 'on' to: 'off' condition: [] action: - service: input_boolean.turn_on entity_id: input_boolean.home_pipelines_state data: {} - service: persistent_notification.create data: title: Pipelines are closed message: '{{ states(''sensor.date'') }} {{ states(''sensor.time'') }} - Стояки закрыты!' - service: telegram_bot.send_message data: message: {{ states('sensor.date') }} {{ states('sensor.time') }} - Стояки закрыты! mode: single # Реле запора стояков - Стояки открыты - id: home_leak_protect_set_pipelines_off alias: Leak protect - Pipelines reley - Set pipelines off trigger: - platform: state entity_id: switch.xiaomi_relay_2ch_switch_l2 from: 'on' to: 'off' condition: [] action: - service: input_boolean.turn_off entity_id: input_boolean.home_pipelines_state data: {} - service: persistent_notification.create data: title: ⚠ Pipelines are opened message: '{{ states(''sensor.date'') }} {{ states(''sensor.time'') }} - Стояки открыты!' - service: telegram_bot.send_message data: message: ⚠ {{ states('sensor.date') }} {{ states('sensor.time') }} - Стояки открыты! mode: single
В первой части статьи было описано, что для удобства закрытия и открытия стояков был установлен беспроводной одноклавишный выключатель. Поскольку этот выключатель имеет только одно действие single click
, то при нажатии необходимое решение на закрытие или открытие будет приниматься на основе триггера текущего состояния кранов home_pipelines_state
. Что бы не искать device_id
лучше эти автоматизации сделать в мастере автоматизаций, а потом перенести из файла automations.yaml
в созданный вами файл leakprotection.yaml
. Внимание! Открытие стояков возможно только если нет обнаруженной протечки.
# Беспроводной выключатель - Закрыть стояки - id: home_leak_protect_ww_close_pipelines alias: Leak protect - Wireless switch - Close pipelines trigger: - device_id: 041bab6a45b64151a574efbba816e377 discovery_id: 0x00158d0002222222 click_single domain: mqtt platform: device subtype: single type: click condition: - condition: state entity_id: input_boolean.home_pipelines_state state: 'off' action: - service: script.home_leak_protect_pipelines_close data: {} mode: single # Беспроводной выключатель - Открыть стояки - id: home_leak_protect_ww_open_pipelines alias: Leak protect - Wireless switch - Open pipelines trigger: - device_id: 041bab6a45b64151a574efbba816e377 discovery_id: 0x00158d0002222222 click_single domain: mqtt platform: device subtype: single type: click condition: - condition: state entity_id: input_boolean.home_pipelines_state state: 'on' - condition: and conditions: - condition: state entity_id: input_boolean.home_leak_detected state: 'off' action: - service: script.home_leak_protect_pipelines_open data: {} mode: single
Что бы краны не закисали и хорошо закрывались и открывались, добавим автоматизацию, которая каждую среду в 3 часа ночи будет закрывать и открывать стояки. Данная автоматизация будет срабатывать только если нет обнаруженной протечки и краны находятся в состоянии открыто.
# Реле запора стояков - Проверка стояков - id: home_leak_protect_check_pipelines alias: Leak protect - Pipelines reley - Check pipelines trigger: - platform: time_pattern hours: '03' minutes: '00' seconds: '00' condition: - condition: state entity_id: input_boolean.home_leak_detected state: 'off' - condition: and conditions: - condition: state entity_id: input_boolean.home_pipelines_state state: 'off' - condition: and conditions: - condition: time weekday: - wed action: - service: persistent_notification.create data: title: Check pipelines message: '{{ states(''sensor.date'') }} {{ states(''sensor.time'') }} - Проверка кранов запора стояков!' - service: script.home_leak_protect_pipelines_close data: {} - delay: 00:02:00 - service: script.home_leak_protect_pipelines_open data: {} mode: single
Теперь настала очередь главных автоматизаций, необходимо прописать автоматизации, отрабатывающие при срабатывании каждого датчика протечки. При срабатывании датчика, автоматизация переведет триггер обнаруженной протечки home_leak_detected
состояние ON
и отправит уведомление в систему и telegram, запускать скрипт на закрытие кранов не надо, это сделает автоматизация срабатывающая, как только триггер home_leak_detected
поменяет состояние.
# Датчик протечки #1 - Обнаружена протечка - id: home_leak_protect_leak_detected_1 alias: Leak protect - Leak sensor 1 - Leak detected trigger: - platform: state entity_id: binary_sensor.xiaomi_leak_sensor_1_water_leak to: 'on' condition: [] action: - service: input_boolean.turn_on entity_id: input_boolean.home_leak_detected data: {} - service: persistent_notification.create data: title: Leak detected message: '{{ states(''sensor.date'') }} {{ states(''sensor.time'') }} - Обнаружена протечка - датчик #1!' - service: telegram_bot.send_message data: message: '{{ states(''sensor.date'') }} {{ states(''sensor.time'') }} - Обнаружена протечка - датчик #1!' mode: single # Датчик протечки #2 - Обнаружена протечка - id: home_leak_protect_leak_detected_2 alias: Leak protect - Leak sensor 2 - Leak detected trigger: - platform: state entity_id: binary_sensor.xiaomi_leak_sensor_2_water_leak to: 'on' condition: [] action: - service: input_boolean.turn_on entity_id: input_boolean.home_leak_detected data: {} - service: persistent_notification.create data: title: Leak detected message: '{{ states(''sensor.date'') }} {{ states(''sensor.time'') }} - Обнаружена протечка - датчик #2!' - service: telegram_bot.send_message data: message: '{{ states(''sensor.date'') }} {{ states(''sensor.time'') }} - Обнаружена протечка - датчик #2!' mode: single
После прописывания автоматизаций всех датчиков сохраняем файл leakprotection.yaml
, в Home Assistant идем Configuration ->
Server Controls
выполняем проверку конфигурации CHECK CONFIGURATION
и перезагружаем автоматизации RELOAD AUTOMATIONS
.
Для удобства на панель lovelace
можно вывести отображение наших датчиков и переключатель обнаруженной протечки, таймер проверки протечки показывает время, через которое будет отправлено очередное уведомление.
Проверяем работу автоматизаций при нажатии на выключатель запирания/открытия, при погружении датчиков протечки в воду. Для проверки еженедельной проверки от закисания, то можно поменять время и день недели на необходимое.
И напоследок, при создании автоматизаций вручную будьте внимательны с разметкой, не забываем про отступы, сначала описываем блок, потом добавляем в этот блок компоненты, скрипты в блок script
, автоматизации в блок automation
. Если возникают проблемы, то лучше воспользоваться мастером создания автоматизаций в меню Configuration
. Для отправки уведомлений используется сервис Telegram, его настройку для Home Assistant можно посмотреть здесь.