Автоматизация света в Hass.io на Node Red

04 ноября 2019, 09:35

Home Assistant является одной из самых популярных систем, на которой продвинутые пользователи решаются строить свой центр умного дома. Именно продвинутые, потому что на его установку вряд ли решится далёкий от IT человек.


Все устройства и автоматизации настраиваются в текстовых конфигах на языке yaml. Данный подход часто становится болью как начинающих, так и бывалых пользователей. Частые ошибки при написании сценариев, отсутствие инструментов отладки, не всегда логичные решения - могут пошатнуть даже самые крепкие нервы.


Помимо Home Assistant большую популярность в сообществе приобрела система визуального проектирования домашних автоматизаций - Node-RED.


Пользователи Hass.io в пару кликов могут установить себе Node-RED и тут же начать им пользоваться. Остальным пользователям Home Assistant придется изучить мануалы по установке, настройке и взаимодействию этих двух систем.


Чтоб начать пользоваться Node-RED - совсем необязательно повторять в нём всё нажитое непосильным трудом. Устройства и настройки можно оставить в Home Assistant, а в Node-RED проектировать автоматизации - задача с которой эта система справляется на отлично.

Ниже я покажу несколько примеров управления светом, заведённым в Home Assistant.

Каждый кубик в Node-RED называется нода. Тёмно синие и светло синие ноды на примерах ниже отвечают за связь с системой Home Assistant.


Свет по датчику движения на 2 минуты

1600x_image.png?1572856829

Мы следим за состоянием датчика движения Mi Motion Sensor, заведённого в Home Assistant через Xiaomi Gateway 2.

Если датчик перейдёт в состояние on - дальнейшее выполнение пойдёт по верхнему пути. Если датчик перейдёт в любое другое состояние - выполнение пойдёт по нижнему пути.

Нода будет срабатывать только при изменении состояния датчика.

1600x_image.png?1572856829

Первым шагом верхнего пути мы проверяем, выключена ли подсветка на кухне (лента Yeelight) - состояние off. Это делать не обязательно, но зачем нам лишний раз включать лампу, если она уже и так включена.

При успешном выполнении условия (состояние лампы = off) дальнейшее выполнение пойдёт по верхнему пути.

При неуспешном - по нижнему. Он нас не интересует, поэтому выход никуда не подключаем.

1600x_image.png?1572856829

Последним шагом верхнего пути мы отправляем команду на включение лампы.

По нижнему пути делаем аналогиную логику с проверкой лампы на состояние включено и выключением лампы при успешной проверке.

1600x_image.png?1572857116

Логика работы датчиков движения в Xiaomi Gateway

Сами датчики движения Xiaomi работают по своеобразной логике, которая многих пользователей вводит в заблуждение.

При первом обнаружении движения они посылают соответствующий сигнал на Gateway, а следовательно и в сторонние системы. Затем засыпают на 60 секунд для экономии батареи. После чего просыпаются и при новом обнаружении движения пошлют сигнал на Gateway. То есть событие обнаружения движения может срабатывать не чаще чем раз в минуту.

Через 2 минуты после движения Gateway посылает сигнал "нет движения". Каждое новое движение (помним про 60 секунд сна) обновляет этот таймер.

Gateway шлёт событие "нет движения" через 2, 3, 5, 10, 20 и 30 минут после последнего движения. И сценарии в приложении Mi Home ориентируются именно на это событие от датчика. А вот Home Assistant переводит датчик в состояние "выключено" сразу после первого такого события, то есть сразу через 2 минуты. Но при каждом событии меняет атрибут датчика No motion since на количество секунд без движения.

Ещё большую путаницу в вышеупомянутую логику вносит существование 2х версий API локального протокола Xiaomi. По какой-то причине для 2й версии протокола Home Assistant не доверяет таймеру Gateway и сам запускает свой внутренний таймер на 120 секунд. Если я правильно понял - на 2й версии работает Aqara Air Conditioning Companion. У меня такого нет, поверить не могу.

Свет по датчику движения на 5 минут

1600x_image.png?1572857298

В случае с ванной 2х минут без движения мало, поэтому будем следить не за статусом, а за атрибутом No motion since. Необходимо написать немного JavaScript кода.

node.status это один из мощнейших инструментов Node-RED. Он позволяет выводить нужные вам отладочные значения под кубиками нод прямо в процессе выполнения сценария. Это очень удобно для отладки и понимания, что всё работает именно так, как вам нужно.

В данном случае мы записываем количество секунд без движения в переменную payload и показываем это значение в статусе ноды.

k01-1.jpg
В следующей ноде мы сравниваем ранее полученное значение с 300 секундами. В случае совпадения - переходим к следующему шагу.
k01-1.jpg
Важный момент! Поскольку мы следим за атрибутом, а не состоянием - у первой ноды необходимо отключить настройку Output only on state change (она включена по умолчанию). Потому как все события про отсутствие движения будут со статусом off. А с этой настройкой обработается только первое событие.
k01-1.jpg

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

Свет по таймеру

У меня закончились датчики движения, поэтому в коридоре я настроил выключение света по таймеру через 5 минут после включения. В этом случае за таймером следит Node-RED.

1600x_image.png?1572858136

При включении света в прихожей (верхний путь) - запускается отсчет 5 минут на ноде триггера.

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

1600x_image.png?1572858136

Свет по датчику движения на Х минут

Если доступный перечень таймеров датчика Xiaomi не устраивает - можно сделать свой, но уже полностью на Node-RED.

1600x_image.png?1572858136

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

По статусам или атрибутам датчика невозможно понять когда датчик последний раз сработал.

Для этого в Home Assistant есть недокументированное событие начала движения. За ним мы и будем следить.

1600x_image.png?1572858137
Следующим шагом смотрим по какому датчику сработало событие.

В эту ноду можно добавить и другие ваши датчики. Количество выходов у ноды увеличится и можно будет писать логику для каждого датчика отдельно.

1600x_image.png?1572858137
Таймер настраиваем как и в прошлом примере, только без условия на остановку таймера.

Включаем настройку extend delay if new message arrives - так каждое событие движения будет сбрасывать таймер на начало.

1600x_image.png?1572858138

Отдельного упоминания достойна нода Debug (зелёная). Если вы не понимаете что происходит - вставляете её на выходе интересующей ноды и в реальном времени следите за выполнением своей автоматизации.

В ванной и коридоре свет управляется безнулевыми Wi-Fi выключателями, о которых я рассказывал в прошлой статье.

PS: Конечно всё вышеупомянутое можно реализовать и в самом Home Assistant. Но лично я уже перенёс все свои автоматизации в Node-RED и начинаю потихоньку восстанавливать нервы и получать от написания автоматизаций удовольствие.


Все новости мира умных домов - t.me/SprutAI_News

Остались вопросы? Мы в Telegram - t.me/soprut

Хочешь умный дом но нет времени разбираться?
Посмотри примеры работ и выбери себе интегратора.
  1. Денис Игнат (iGnat78)
    Денис Игнат (iGnat78) 8 дней назад

    Спасибо большое, Очень своевременно статья вышла ! Ещё бы добавить пример работы автоматизации в определённое время с 20:00 до 8:00 и по закату и восходу солнца

  2. Денис Игнат (iGnat78)
    Денис Игнат (iGnat78) 8 дней назад

    Ссылка не открывается...

  3. (Locy)
    (Locy) 7 дней назад

    Спасибо! Но вот бы еще примеры, если на прямую брать, без прослойки НА, с mqtt или deconz.. Не знаю, в чем сложность в yaml, там можно накосячить только с табуляцией, все переменные текстом и в единой иерархии построения, в то же время, в НР можно в любом месте накосячить, особенно в безумном синтаксе js, точка, запятая, кавычки, скобки.. даже вроде как логически верно выстроенная цепочка, а не работает.. здесь уже действительно надо быть программистом.

    P.S. что ж так в сообществе НР не любят делится кодом примеров, 8 из 10 вопросов отпали б..?!?) 

    • Алексей Х (AlexxIT)
      Алексей Х (AlexxIT) 7 дней назад

      Лично у меня нет mqtt и deconz. Но в чате NR много таких примеров.

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

  4. Антон Киселёв (Whilser)
    Антон Киселёв (Whilser) 6 дней назад

    Ой да ладно, ничего сложного в автоматизациях ХА нет. Да, логика немного другая и к этому нужно и можно привыкнуть, без документации никуда - но это применимо к любому языку программирования. Просто здесь формат не совсем привычный, сначала тоже плевался - потом проникся :)

К списку блогов

Скидки для сообщества

Ноотехника

+375 17 233-25-45
Промокод:
Sprut
Размер скидки:
10%
Действует у всех официальных представителей. Для применение необходимо указать в поле комментария или при звонке менеджеру.

Интернет-магазин yourhomekit.ru

+7 914 550-51-11
Промокод:
SPRUT-BLG
Размер скидки:
8%
Cамый большой ассортимент в России аксессуаров Apple HomeKit

Похожие записи

05 февраля 2019, 00:29
Строю свой первый дом и рассказываю о муках выбора, проводке под умный дом, оборудовании. 05.09.2019 - лето
20 января 2019, 17:39
Создание очень бюджетной автоматизации рулонных штор
13 февраля 2019, 22:00
Подключение радио на Xiaomi Gateway к Home Assistant c дальнейшим использованием в автоматизациях
19 апреля 2019, 20:53
Требуется ваше мнение!
06 февраля 2019, 12:02
Автоматизированное открытие/закрытие окна
04 апреля 2019, 12:45
Самое важное из апдейта Home Assistant 0.91-0.91.4 от 03.04.19.
21 марта 2019, 11:59
Самое важное из апдейта Home Assistant 0.9 от 20.03.19.
21 февраля 2019, 21:12
Самое важное из апдейта Home Assistant 0.88 от 20.02.19.
07 февраля 2019, 21:12
Самое важное из апдейта Home Assistant 0.87 от 06.02.19.