Hero Image

Автоматизация Аквастоп

Этой статьей мы открываем серию, в которой будем разбирать создание практичных автоматизаций с использованием ПушОк Автоматизации.

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

Для начала посмотрим, как выглядит аналогичная простейшая автоматизация:

Состояния:
- Кран [КранХВ.Состояние]
- Датчик [Протечка1.Состояние]
Правила:
- Кран := Закрыт, если Датчик = Вкл

Правило практически полностью повторяет типичную автоматизацию. Но есть разница в поведении. Например, пока датчик протечки активен, кран не получится открыть ни физической кнопкой, ни через приложение. Причина в том, что автоматизация описана не через события (случилось это — сделай то), а через состояние. Давайте представим, что мы хотим, чтобы кран открылся, когда мы устранили протечку и осушили датчик. В типичной схеме нужно будет добавить еще один сценарий: "Если датчик не активен — открой кран". В нашем случае нужно лишь немного модифицировать правило:

Правила:
- Кран := НЕ Датчик

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

Процессы:
- ТренировкаКрана
Триггеры:
- ВремяТренировки [время: 01:00, дни недели: чт]
Правила:
- Кран := НЕ (Датчик ИЛИ ТренировкаКрана)
- Запустить `ТренировкаКрана` на 15 секунд, если Триггер = `ВремяТренировки`

Мы дополнили нашу автоматизацию триггером, который будет срабатывать в час ночи в четверг. По триггеру мы запускаем процесс на 15 секунд, а сам процесс добавляем в правило для состояния крана. Важно отметить, что не возникнет проблемы, если в час ночи в четверг уже была обнаружена протечка и кран нельзя будет открыть после тренировки — он как был, так и останется закрыт. Безусловно, когда случилась протечка, важно об этом узнать. Мало закрыть кран, необходимо оперативно ликвидировать последствия. Поэтому будет полезно добавить уведомление. Уведомления привязаны к процессам, так как последние связаны со временем и имеют начало и конец.

Процессы:
- Протечка
- ТренировкаКрана
Оповещения:
- "Обнаружена протечка", когда Протечка запущен
Триггеры:
- ВремяТренировки [время: 01:00, дни недели: чт]
Правила:
- Кран := НЕ (Протечка ИЛИ ТренировкаКрана)
- Запустить ТренировкаКрана на 15 секунд, если Триггер = ВремяТренировки
- Запустить Протечка на 3600 секунд, если Датчик

Мы добавили процесс для протечки и уведомление о том, что обнаружена протечка в момент, когда процесс запущен. Запускаем процесс при срабатывании датчика, а в условии для состояния крана заменяем датчик на процесс. Что дает запуск процесса на 1 час (3600 секунд)? Догадаетесь сами? Это позволяет крану оставаться закрытым еще час после того, как датчик протечки вернулся в нормальное состояние. Последнее, но не менее важное: при всей надежности ZigBee возможны случайные сбои. Наши краны умеют сообщать свое реальное состояние, и мы можем дополнить автоматизацию так, чтобы она активно пыталась привести кран к желаемому состоянию. Для этого добавим еще одно состояние и новый процесс.

Состояния:
- Кран [КранХВ.Состояние]
- КранСтатус [КранХВ.Состояние2]
- Датчик [Протечка1.Состояние]
Процессы:
- ПоворотКрана
- Протечка
- ТренировкаКрана
Оповещения:
- "Обнаружена протечка", когда Протечка запущен
Триггеры:
- ВремяТренировки [время: 01:00, дни недели: чт]
Правила:
- Кран := НЕ (Протечка ИЛИ ТренировкаКрана)
- Запустить ТренировкаКрана на 15 секунд, если Триггер = ВремяТренировки
- Запустить Протечка на 3600 секунд, если Датчик
- Запустить ПоворотКрана на 15 секунд, если ((Кран = Открыт) И (КранСтатус ≠ Открыт)) ИЛИ ((Кран = Закрыт) И (КранСтатус ≠ Закрыт))

Здесь мы запускаем процесс поворота крана каждый раз, когда желаемое состояние не соответствует действительному. Это нужно для того, чтобы через 15 секунд правила проверились еще раз и отправили команду на закрытие крана.

Таким образом, мы получили практичную автоматизацию, которая не просто закроет кран, если повезет, а будет стараться это сделать максимально эффективно. Она отправит нам уведомление и раз в неделю, глубокой ночью по четвергам, будет тренировать наш кран. Она же откроет кран, когда мы устраним протечку.

Довольно большая автоматизация, не правда ли? Хорошая новость в том, что её можно одним кликом клонировать и поменять привязку состояний на второй кран и второй датчик. Впрочем, можно объединить оба крана в одной автоматизации. Все в наших руках!