Защита дома от протечек на датчиках 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 можно посмотреть здесь.