Stupid House

Защита дома от протечек на датчиках 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 можно вывести отображение наших датчиков и переключатель обнаруженной протечки, таймер проверки протечки показывает время, через которое будет отправлено очередное уведомление.

leak protection info panet

 

leak protection control panel

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

 

leak protection info panel leak detected

 

И напоследок, при создании автоматизаций вручную будьте внимательны с разметкой, не забываем про отступы, сначала описываем блок, потом добавляем в этот блок компоненты, скрипты в блок script, автоматизации в блок automation. Если возникают проблемы, то лучше воспользоваться мастером создания автоматизаций в меню Configuration. Для отправки уведомлений используется сервис Telegram, его настройку для Home Assistant можно посмотреть здесь.

Автор: muxa, 28.08.2020
Войдите или зарегистрируйтесь, чтобы иметь возможность оставлять комментарии