В качестве предисловия
На портале уже есть информация о том, как установить Node Red и как подключить к нему zigbee hub от компании Deconz. Также существуют дополнительные библиотеки (плагины), которые расширяют функциональность Node Red и позволяют работать с различными программами через API или отдельными устройствами, подключаемыми через USB или по сети. Некоторые плагины для Node Red написаны участниками нашего сообщества. Вы можете их найти в разделе плагины. Неплохая информация по работе в Node Red из нескольких уроков по ссылке (Английский).
Глобальные переменные (Global)
Для начала разберемся, какие переменные бывают и чем они отличаются.
- Node - переменные, используемые внутри ноды, за пределами они не видимы;
- Flow - переменные, используемые внутри флоу;
- Global - переменные, видимые всем флоу проекта.
Для чего нужны глобальные переменные
Глобальные переменные хороши тем, что они видимы во всем проекте. Если проект планируется как какая-то структура и состоит из нескольких флоу для удобства отладки, то с помощью глобальных переменных легко взаимодействовать между различными флоу. В процессе отладки проекта легко делать коррекции или дополнительные автоматизации.
Если настроить запись события в глобальную переменную, то она сохраняет последнее событие и нет необходимости проводить опрос датчика или условия перед выполнением определенной автоматизации. Можно сразу эту переменную ставить в условие выполнения. Также можно использовать глобальные переменные для фиксированных значений (например, яркость, температура цвета для ламп и т.д.) и в дальнейшем использовать эти значения в зависимости от условий или времени суток.
У меня в глобальных переменных хранится набор параметров для различных сценариев, которые передаются в зависимости от выбранного действия.
Для изменения параметров сценария (ну не устраивает заданная яркость ночью), нет необходимости долго искать место, где это прописано. Заходишь во флоу с глобальными переменными и корректируешь значение.
Как правильно использовать
После старта Node Red все Ваши глобальные переменные принимают неопределенные значения и поэтому их необходимо задать. Для удобства я создал отдельное флоу для задания глобальных переменных при старте. Идея проста: если используешь глобальную переменную, то она должна быть задана при старте - либо принудительной установкой значения, либо методом опроса состояния и последующей записью его в глобальную переменную. Иначе все автоматизации, основанные на глобальных переменных, будут работать не верно.
Пример задания глобальных переменных при старте. Обратите внимание на то, чтобы в ноде inject стояла галочка в квадрате перед фразой inject once after. Это означает запустить один раз после старта, через 0.1 секунды. Для опроса состояний устройств в Deconz есть нода Deconz-get (если Вы конечно используете плагин от участника нашего портала @popov1988), после которой надо поставить ноду swich для разделения событий (для примера: "Включено" и "Выключено"), а потом ноды change для установки глобальных переменных. Значения глобальных переменных Вы можете увидеть во вкладке context data (ctrl-g x), но не забывайте нажимать иконку обновления данных.
Примеры использования
В качестве примера использования переменных я выбрал флоу тестирования работы ноды AND (логическое И). В автоматизациях всегда возникает необходимость выполнять какую-то функцию в зависимости от определенных условий. Их может быть несколько и они могут различаться (например: открыто/закрыто, меньше/больше значения и т.д.). Для того, чтобы реализовать данный функционал, я использую ноду AND (плагин: node-red-contrib-bool-gate). В этом плагине есть еще и нода OR (логическое ИЛИ). Само флоу показано на картинке ниже и ее левая часть используется только для тестирования (симуляция устройств). Она заменяется на статусы датчиков в реальной автоматизации.
Описание левой часть экрана.
Нода функции Дверь отдает готовый статус для HomKit ноды контактного датчика Открытия/Закрытия двери.
Ноды функций Toggle 1 и 2 - обычные кнопки, при поступлении любого события на вход, они меняют состояние msg.payload c 0 на 1 или с 1 на 0. Отличие в данных функциях: в функции Toggle 1 используется context локальной переменной, а в функции Toggle 2 используется переменная flow. Если вы скопируете функцию Toggle 1 несколько раз, то она будет работать прекрасно, так как локальная переменная не видна другим нодам. Есть маленькое но: при старте Node Red, первое событие, которое придет на эту ноду, выдаст значение 0 на выходе. В функции Toggle 2 используется flow переменная toggle2, которой задаем стартовое значение вверху экрана и соответственно этим можно задать выход при первом событии на ноду. Просто копировать эту функцию внутри флоу нельзя, обязательно изменение имени переменной toggle2 внутри функции и задание стартового значения при необходимости.
Теперь переходим к правой части экрана
Переключателями Toggle 1 и 2 меняем состояния глобальных переменных Value 1 и 2, которые были заданы при старте Node Red в верхней части экрана. Как раз эти значения будут условиями, которые разрешают прохождению статуса от ноды Дверь.
Вот мы и добрались до ноды AND. Параметры этой ноды показаны на картинке ниже.
Теперь, загрузив данное флоу, можете попробовать его работу. Пощелкайте нодами inject, меняя состояния глобальных переменных. Убедитесь в том, что статус от ноды Дверь, будет проходить только тогда, когда значения Value 1 и 2 равны 1.
Как я это использовал (или буду использовать) у себя
Я часто уезжаю в командировки и не хочется оставлять квартиру с открытыми окнами или дверью балкона. Поэтому, при открытии входной двери, я получаю голосовое напоминание о не закрытых окнах и, соответственно, уведомление в Телеграмм.
Использую функцию Охранной сигнализации (от HomKit ) со статусами Дома, Не дома, Отключено, Ночь. Соответственно , в зависимости от статуса сигнализации, отфильтровываю лишние сообщения в Телеграмм.
Очень легко добавить ноду AND для блокировки прохождения любого события или статуса по вашим условиям, так как предела совершенства автоматизаций НЕТ.
Флоу, которое было описано в статье, вы можете загрузить по ссылке.
Если есть вопросы, пишите в комментариях или на канале Node Red.
Коллеги по сообществу, жду коментов и предложений сделать какую-нибудь интересную и актуальную автоматизацию, которая у Вас не получается. Возможно она появится в плагинах, блоге или отдельной статье и сможет помочь другим нашим товарищам которые пойдут по нашему с Вами пути.
Евгений спасибо! Отличная статья! Мое предложение добавить информации о сохранении глобальных переменных, чтоб значение не терялось при перезагрузки нодереда. Это менее релевантно для ламп где его можно легко запросить через ноду inject, а вот для самодельных переменных как например presence через HomeKit это пригодиться.
У меня они сохраняются автоматически, но могут быть нюансы при потере питания, поэтому я в статье для начинающих и не выложил это специально. Будет следующая статья, я коснусь этого вопроса.
Ниче не понял, но спасибо! ))) будем штудировать
Евгений, приветствую! Подскажи пожалуйста как в параметр "Data"(та что json) для ноды "call service" подставить значение параметра из нашего flow или global, например для настройки яркости ламп. Так { "brightness" : "flow.Current_Bright" } не ест, говорит нужен int 1-100, но у меня там и есть число, нужно наверное как-то по другому указывать?
Разговор про ноду от HA
https://sprut.ai/client/article/1014#">https://sprut.ai/client/article/1014#">https://sprut.ai/client/article/1014#">https://sprut.ai/client/article/1014#">https://sprut.ai/client/article/1014#">https://sprut.ai/client/article/1014#">
https://sprut.ai/client/article/1014#">
https://sprut.ai/client/article/1014#">https://sprut.ai/client/article/1014#">
https://sprut.ai/client/article/1014#">
Ссылка не работает, нельзя ли обновить?
Статья интересная и полезная, спасибо!