Лучшая автоматизация света в ванной | Node-RED, Home Assistant
Казалось бы, простой вопрос: «Как сделать включение света автоматическим?». Решается это, действительно, очень просто. Но вот «Как сделать автоматическим, а, главное, корректным, его выключение?» — совсем не то же самое.
Суть задачи сводится к определению наличия человека в помещении. И сейчас я покажу, как с нуля построить вот такой сценарий в Node-RED, используя датчик движения и датчик открытия двери.
Ещё с самого начала пути внедрения умного дома в 2012 году мне никак не удавалось решить вторую часть этой головоломки, а именно — выключение света в ванной. Встроенные и сторонние инструменты создания сценариев в используемых тогда мною контроллерах не имели никаких шансов на это.
- Vera Lite — любой более-менее сложный сценарий автоматизации на этом контроллере решался только с помощью сторонних модулей. Причём, насколько я помню, надёжностью это решение не очень отличалось.
- Fibaro Home Center Lite — это iPhone в мире контроллеров домашней автоматизации, только версии Lite. Красиво, просто, для хомячков. Сложные сценарии создавались путём дробления алгоритма на несколько частей с последующей их связкой. Но это не спасало, и для еще большей гибкости нужно было писать сценарии на языке LUA.
- Raspberry Pi — хардкорное решение с Raspbian и Domoticz. Такой инструмент как Blockly позволял реализовывать по-настоящему сложные вещи. Тогда мне казалось, что я решил поставленную задачу. Пусть с костылями и нагромождениями блоков. Но, нет, осечки и ложные выключения всё еще случались.
Лишь в 2018 году, когда я переехал на более-менее юзабельную версию Home Assistant, примерно 0.40, я познакомился с Node-RED — прекрасный, гибкий, мощнейший инструмент автоматизации. И в нём то я и обнаружил тот заветный компонент для решения моей задачи — state-machine.
State-машина или Конечный автомат в рамках Node-RED — это нода, имеющая определённое количество состояний и триггеров, которые вызывают её переход из одного состояния в другое. В любой момент времени нода может находиться только в одном из состояний и переходить в другое лишь, когда сработает определённый для этого состояния триггер. Один и тот же триггер может быть использован для перехода более чем из одного состояния.
Вот схематичный пример того, как будет выглядеть будущий сценарий:
- Я открываю дверь (2) — свет включился.
- Захожу внутрь (3) — движение обнаружилось (4).
- Закрываю дверь (5) и начинаю делать свои дела (6) — свет остаётся включённым, и при выполнении следующего условия по обнаружению движения (7), помещение помечается занятым (8). С этого момента свет сам не погаснет.
- Выхожу из санузла (9) и закрываю дверь (5) — свет выключится через заданный промежуток времени (10).
- Если оставить дверь открытой (2, 9, 14), то свет погаснет по таймауту после последнего события об отсутствии движения (11). Состояние помещения до тех пор не меняется.
- Если, находясь внутри, выключить свет выключателем (12), то при следующем обнаружении движения, он включится (13).
Детальное описание сценария Node-RED доступно в видео.
В примере показан сценарий с использованием датчика движения Fibaro.
В нём можно настраивать период, после которого контроллеру отправляется сообщение о том, что движения больше нет. Я поставил 15 секунд.
Если вместо него использовать, например, датчик от Aqara, то немного поменяется логика определения повторного движения для перехода в состояние «занято».
Так как он отправляет контроллеру статус о том, что движения больше нет, только спустя 1 минуту после последнего обнаружения, то 90 секунд, заданных в таймере в примере, гарантированно достаточно для того, чтобы точно определить наличие человека внутри, при условии, что дверь не открывалась.
Еще пару лет с момента создания я неспешно доводил этот сценарий до ума, вылавливая разные редкие глюки и ложные срабатывания. Поэтому, кроме как лучшей, эту автоматизацию ни назвать.
Все конфигурации, описанные в статье, доступны на GitHub.