Статья

Node-Red. Простые рецепты. Датчик движения.


Исходные данные: есть установленные Home Assistant и Node-Red, прицеплен шлюз Xiaomi с датчиком движения.

Задача: сделать так, чтобы при срабатывании датчика движения на шлюзе включалась подсветка. Подсветка должна включаться только в темноте. Подсветка должна выключаться через 2 минуты после окончания движения.

Алгоритм работы датчика движения от Xiaomi: при сработке датчик посылает сообщение "on" и начинает двухминутный отчет. Если в течение этого времени было движение, то таймер сбрасывается на ноль и отсчет начинается заново. Если движения нет в течение 2 минут, он посылает сообщение "off" и в дополнительных атрибутах сообщения указывает время в секундах с момента последнего движения. Затем от посылает еще несколько аналогичных сообщений "off" через 3, 5, 10 минут. Этим можно воспользоваться в своих автоматизациях. Но сначала реализуем самый простой вариант с выключением света по первому сообщению "off" через две минуты после окончания движения.

Необходимые ноды: events:state, current state, call service.

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

Логика работы такая: ждем срабатывания датчика движения. После сработки проверяем, было ли это включение ("on") или выключение ("off"). Если включение - то отправляем сообщение дальше на следующую проверку. Если выключение - то выключаем свет.

Свойства ноды events:state заполняем так:

Name: наименование ноды. Придумываете сами.

Server: имя соединения с Home Assistant.

Entity ID: тут мы вводим наименование датчика, которое хотим отслеживать. В данном случае это датчик движения binary_sensor.motion_sensor_158d0002c1877d.

Halt if State: вот это интересно. Тут мы можем ввести условие, при котором нода прекращает свою работу и не передает сообщения дальше. Например, мы не хотим получать сообщения о выключении датчика, для этого пишем условие is off, т.е. остановиться, если сообщение == "off". Тем самым мы пропускаем дальше только сообщения о включении датчика на движение. Но! Сообщение в этом случае отправляется на второй выход ноды. Этим и воспользуемся.

State type: String. Это тут по умолчанию.

Еще две галочки: 

Output only if state change: выдавать сообщение только если состояние изменилось. Пусть выдает все сообщения. Выключаем.

Output Initially / On Deploy: выдавать значение при запуске системе или при перезапуске потока. Включаем ее, это позволит освещению сразу включаться, если было движение перед запуском потока.

Жмем Done, закрываем ноду.

Теперь займемся реализацией проверки уровня освещенности. 

Нода current state проверяет значения датчика освещенности на шлюзе и, если темно, то пропускает выполнение дальше, иначе останавливает выполнение потока:

Первые два поля заполняем как и раньше.

Entity ID: здесь указываем датчик освещенности на шлюзе. Она нам выдает значения освещенности от 0 до 992. Это значение мы и будем использовать.

Halt if State: останавливаем выполнение, если слишком светло. Тут мы проверяем, что уровень освещенности с датчика больше 300 люкс. Если больше - останавливаемся. Обратите внимание на выпадающий список перед полем, куда мы вводим число 300 - там выбраны числовые значения (number).

Остальное оставляем по умолчанию.

Теперь самое интересное - включение света. Реализуется это вызовом соответствующего сервиса Home Assistant. Нода так и называется - call service, настраивается так:

Domain: homeassistant

Service: turn_on

Entity ID: вводим то, что хотим включить. В данном случает это подсветка на шлюзе light.gateway_light_04cf8c8f96cf.

Остальное по умолчанию.

При срабатывании этой ноды произойдет вызов сервиса turn_on и на этом выполнение закончится.

Вторая вызывает сервис, который выключает подсветку на шлюзе. Настраивается аналогично, только вызывается сервис turn_off:

После срабатывания этой ноды выполнение полностью прекратится до поступления новой сработки датчика движения.

Итого, все работает так:

  1. Получаем событие от датчика движения. Если оно равно off - выключаем подсветку. Если on - идем дальше.
  2. Проверяем уровень освещенности. Если слишком светло (> 300 люкс) - останавливаемся. Если темнее - идем дальше.
  3. Включаем подсветку на шлюзе.  Подсветка выключится через 2 минуты после последнего зарегистрированного движения.

Код к статье доступен тут. В Node-Red выберите Меню - Import - Clipboard, скопируйте этот кусок кода и выберите, куда вставить ноды. Поправьте наименования датчиков и шлюза на свои - и можно запускать.


Ждём продолжение =)

Вопрос: неужели, это нельзя было решить силами ХА?

Это - запросто. Но нужно начинать с чего-то простого, чтобы понять идею. Дальше - все сложнее. И все проще, по мере понимания.

Странно, но у меня интерфейс выглядит несколько по другому, там где у тебя "Halt if state" у меня просто if state и верхняя ветка указывает на "if state = true" я про ноду "current state" может из за того что работаю как с компонентом из под HA или обновление последние х.з. соответственно условия несколько иначе ходят, сегодня проверю.

Спасибо за материал, очень познавательно.

У меня тоже самое. В hassio  версия node-red 0.20.8 стоит.

Доброго, я начинающий в Node-Red

да и HA по сути тоже, основное что не нравиться в HA это конфигуратор yaml с его табуляциями и разметкой, думаю доведут когда-то до ума (в настоящий момент плата стоит в доме в деревне и использовать другой редактор для yaml нет возможности). У меня вопрос, не знает ли кто как более правильно организовать работу с датчиком движения? Поясню, если я отключаю свет не через 2 минуты (по состоянию датчика) а например по таймеру через любой промежуток времени, и если этот промежуток меньше указанных 2-х минут (датчика движения) то повторное включение не происходит т.к. датчик типа включен. Кто что посоветует, желательно в Node-Red или принципы взаимодействия.

Доброго! Со своим вопросом, разобрался сам. Напишу тут, может кому потребуется. За основу берем ноду "Events all" далее нода "Switch" по msg.payload.event_type и условию ==xiaomi_aqara.motion после него ставим ноду "Switch" по msg.payload.entity_id  и условию ==binary_sensor.motion_sensor_158d0001ae9177(тут ваш сенсор). Так отловили событие, после этого я запускаю сервис "включить" и "таймер на задержку"->"отключить" перед ними еще можно поставить ноду "current state" и смотреть Lux если нужно, можно много на ваш выбор. Пока не разобрался как в параметр "Data"(json) для ноды "call service" передать int из нашего flow для настройки яркости ламп. Так "brightness":"flow.Current_Bright" не ест, говорит нужен int 1-100, но у меня там и есть число, нужно наверное как-то по другому передавать.

"Затем от посылает еще несколько аналогичных сообщений "off" через 3, 5, 10 минут. Этим можно воспользоваться в своих автоматизациях."


Как быть, если у меня датчик движения подключен не через шлюз (через z2m) и там нету такого аттрибута, чтобы присылал сколько прошло секунд с последнего движения. Как настроить автоматизацию, если я хочу, чтобы свет выключался через 3/5/10 минут с последнего движения?

ADD: Нашел, через триггер есть таймер, который сбрасывается, если было движение

Ссылка на код - 404

Вернуться назад

Устройства


Xiaomi

Motion sensor

(11 отзывов)

Xiaomi

Xiaomi Mijia Gateway 2

(11 отзывов)

Вернуться назад