Для чего нужен node red
Node-Red основные блоки и пример их использования в автоматизации
Предисловие
Добрый день, уже выложили множество статей для новичков про Node-Red. Я так же хочу дополнить эту нишу и описать основы для построения автоматизаций. К каждому примеру будет прикреплен flow, который вы можете импортировать себе и проверить. Давайте начнем.
P.S. рекомендую ознакомиться со статьями:
Термины
Нода (node) – «кубик», набор которых позволяет вам исполнить ваши желания. Вы можете их найти в правой части веб интерфейса.
Флоу (flow) – «вкладка» в веб интерфейсе Node-Red. Вы можете разнести логические части по разным флоу. Так, у меня, например, есть флоу с Deconz, Z-Way, Roborock.
Дебаг (debug) – термин из программирования, что значит отладка. С помощью дебага мы находим ошибки в нашем флоу.
Сообщение (message, msg) – набор данных, которые ноды принимают для обработки и отдают на выходе.
Пейлоад (payload) – термин, означающий полезную нагрузку. Сообщение может содержать в себе множество данных, но основные (наиболее полезные) передаются в объекте payload.
Деплой (deploy) – применение изменений.
Inject & Debug
Это две наиболее часто используемые ноды.
Давайте выведем в дебаг «Hello, sprut.ai!». Для этого нам необходимо настроить ноду inject так, чтобы она отсылала строку и нажать на кнопку (слева от ноды).
Работы с данными:
Настройки этой ноды позволяют нам оперировать данными в соответствии с заданными нами правилами. Мы можем удалять данные по ключу, переносить из одного ключа в другой, изменять данные по ключу, устанавливать данные в новый ключ. Для примера, давайте заменим в строке из предыдущего примера подстроку «Hello,» на «Welcome to». Для этого, в ноде change мы указываем, что данные нужно изменить (Change) в msg.payload, указываем необходимую строку для поиска и значение, на которые ее надо заменить.
Своя логика:
Мы можем написать логику на языке javascript внутри ноды Function. Давайте с помощью Function выведем в дебаг знакомую нам строку «Hello, sprut.ai». Для этого в объект msg.payload запишем желаемое значение и отдадим на выход Function наше сообщение. Что посылает Inject нам значения не имеет, мы все равно перепишем это.
Настройки ноды Function:
Разделяем логически данные:
Если нам нужно разделить данные логически, например, у нас есть текущее время и нужно определить, это день или ночь. Если значение часовой стрелки в интервале с 7 до 23, то мы считаем это за день, иначе – ночь. В этом нам поможет нода Switch. В примере ниже мы будем инжектить значение часовой стрелки вручную и проверять входит ли оно в интервал дня или ночи и выводить соответствующее слово в дебаг.
Тригер:
Разберем последнюю ноду для нашей автоматизации – Trigger. Документация говорит нам следующее: » При срабатывании может отправить сообщение, а затем дополнительно второе сообщение, если оно не было расширено или сброшено. » Давайте разберем на примере. Мы включили свет и через 30 секунд нам нужно его выключить.
С помощью Inject пошлем на вход строку «on», далее настроим триггер таким образом:
Автоматизация:
Самое время применить наши знания и написать автоматизацию со следующими условиями:
Будем использовать плагины node-red-contrib-deconz, node-red-contrib-zway, node-red-contrib-homekit-bridged.
По своему желанию вы можете взять датчик движения с Deconz или же выключатель Z-Way и внести изменения во флоу самостоятельно. Вам поможет использование Debug, чтобы узнать, какие данные шлются и что фильтровать. С вопросами не стесняйтесь писать мне в телеграме.
Материалов на эту тему не мало, но, благодаря участникам портала, Node-RED становится все легче и понятнее для новых пользователей, так как появляются новые плагины и решения.
В этой статье я опишу установку и настройку Node-RED на Raspberry Pi deCONZ и интеграцию ZigBee устройств в HomeKit.
Установка deCONZ
Установка Node-RED
Подключаемся к малине по SSH и устанавливаем Node-RED следующей командой:
Соглашаемся два раза, нажав »Y».
После успешной установки Node-RED, запускаем веб-интерфейс, вбив в браузере: IP малины:1880.
Установка необходимых нам contributions:
В данной статье мы будем использовать всего несколько нод. Существует два способа их установки:
Установим контрибьюшн для связи с HomeKit через веб-интерфейс. Для этого нужно перейти:
Теперь в нодах (раздел advanced) появилась нода HomeKit.
Вводим в строке поиска node-red-contrib-deconz и устанавливаем.
Теперь перезагрузим Node-RED и почистим кэш, выполнив следующие команды:
Как видим, у нас появились новые ноды:
Рассмотрим добавление на примере геркона от Aqara и проводного одноклавишного выключателя без нулевой линии Aqara, которые у нас уже добавлены в deCONZ. В процессе добавления первого устройства, нам потребуется добавить сервер deCONZ и мост HomeKit, но делается это единоразово.
В ноде in имеется 2 выхода(серые маленькие квадратики):
В ноде in пишем любое название, выбираем созданный нами сервер и выбираем нужное нам устройство.
Дважды нажимаем на ноду homekit, нажимаем на карандашик напротив строки Bridge.
Pin Code и Name пишем любые (Пин код должен быть строго в таком же формате ***-**-***).
Нажимаем кнопку Add, Confim. Мост настроен.
Нажимаем кнопку Deploy в правом верхнем углу.
Теперь мы можем добавить мост в приложении Дом на устройстве Apple. Вместе с мостом добавится и наш датчик касания.
У датчика касания есть батарейка, поэтому нам нужно добавить ноду батареи. Для этого перетягиваем ноду battery и homekit.
В ноде battery выбираем наш датчик и пишем любое имя в строке «название». Нажимаем Done.
В ноде homekit в строке «Service Hierarchy» выбираем Linked (т.к батарея у нас это дочерний сервис). В строке «Parent service» выбираем наше родительское устройство (т.е сам датчик касания). В строке «Service» выбираем BatteryService. Имя выбираем любое.
Возле кнопки Deploy нажимаем на треугольник и выбираем Modified Nodes.
Теперь в HomeKit мы сможем увидеть заряд батареи на нашем датчике касания.
Далее устройства добавлять гораздо проще т.к сервер и мост уже есть.
Вместо предисловия
Как видно из картинок, мы существенно экономим место на экране, и это только одно из преимуществ упаковки нескольких нод в одно субфлоу. Как видно из картинок, субфлоу может иметь только один вход, как обычная нода, и несколько выходов.
Для того, чтобы сделать субфлоу универсальным кирпичиком для использования в различных автоматизациях, необходимо передавать ему определенные данные, которые будут различаться при управления другими объектами. А для их передачи и необходимы переменные окружения. Свойства субфлоу можно задавать через переменные окружения и применяются они в момент выполнения субфлоу. Для понимания сказанного, я приведу пример переменных окружения моего субфлоу управления светом по датчику движения и описание функционала.
В настройках субфлоу созданы следующие переменные окружения:
Примеры настроек в моих флоу управлением светом на кухне и в прихожей. Поскольку субфлоу у меня универсальный кирпич для управления светом от датчика движения, а управлять светом в прихожей мне надо постоянно, независимо от времени суток, то я создал постоянную глобальную переменную Global_on, которая всегда true и, соответственно, свет всегда управляется там в любое время суток. Тоже самое я сделал и для ванной комнаты.
К вышесказанному
Конечно, это краткая статья о субфлоу, но, надеюсь, она натолкнет на возможность применения их в ваших проектах. Я, как и многие из Вас, не эксперт в этом деле, а нахожусь в стадии изучения. Желающим предлагаю импортировать мое субфлоу по ссылке и ниже краткое описание того, что оно может.
Существует 3 выхода данного субфлоу:
Если данные датчика движения забираете через Деконз ноду, и светом управляете через Деконз, то настройки там должны быть такие, как на картинках ниже:
Само флоу с использованием данного субфлоу можно увидеть на первой картинке статьи. Не забудьте задать имя субфлоу и заполнить поля переменных окружения. Также должны быть заданны глобальные данные, которые используются в переменных окружения.
В комментариях к статье буду рад ответить на вопросы или критику.
В качестве предисловия
На портале уже есть информация о том, как установить Node Red и как подключить к нему zigbee hub от компании Deconz. Также существуют дополнительные библиотеки (плагины), которые расширяют функциональность Node Red и позволяют работать с различными программами через API или отдельными устройствами, подключаемыми через USB или по сети. Некоторые плагины для Node Red написаны участниками нашего сообщества. Вы можете их найти в разделе плагины. Неплохая информация по работе в Node Red из нескольких уроков по ссылке (Английский).
Глобальные переменные (Global)
Для начала разберемся, какие переменные бывают и чем они отличаются.
Для чего нужны глобальные переменные
Глобальные переменные хороши тем, что они видимы во всем проекте. Если проект планируется как какая-то структура и состоит из нескольких флоу для удобства отладки, то с помощью глобальных переменных легко взаимодействовать между различными флоу. В процессе отладки проекта легко делать коррекции или дополнительные автоматизации.
Если настроить запись события в глобальную переменную, то она сохраняет последнее событие и нет необходимости проводить опрос датчика или условия перед выполнением определенной автоматизации. М ожно сразу эту переменную ставить в условие выполнения. Также можно использовать глобальные переменные для фиксированных значений (например, яркость, температура цвета для ламп и т.д.) и в дальнейшем использовать эти значения в зависимости от условий или времени суток.
У меня в глобальных переменных хранится набор параметров для различных сценариев, которые передаются в зависимости от выбранного действия.
Для изменения параметров сценария (ну не устраивает заданная яркость ночью), нет необходимости долго искать место, где это прописано. Заходишь во флоу с глобальными переменными и корректируешь значение.
Как правильно использовать
Примеры использования
В качестве примера использования переменных я выбрал флоу тестирования работы ноды AND (логическое И). В автоматизациях всегда возникает необходимость выполнять какую-то функцию в зависимости от определенных условий. Их может быть несколько и они могут различаться (например: открыто/закрыто, меньше/больше значения и т.д.). Для того, чтобы реализовать данный функционал, я использую ноду AND (плагин: node-red-contrib-bool-gate). В этом плагине есть еще и нода OR (логическое ИЛИ). Само флоу показано на картинке ниже и ее левая часть используется только для тестирования (симуляция устройств). Она заменяется на статусы датчиков в реальной автоматизации.
Описание левой часть экрана.
Нода функции Дверь отдает готовый статус для HomKit ноды контактного датчика Открытия/Закрытия двери.
Теперь переходим к правой части экрана
Переключателями Toggle 1 и 2 меняем состояния глобальных переменных Value 1 и 2, которые были заданы при старте Node Red в верхней части экрана. Как раз эти значения будут условиями, которые разрешают прохождению статуса от ноды Дверь.
Вот мы и добрались до ноды AND. Параметры этой ноды показаны на картинке ниже.
Тип ноды AND, но можно выбрать NAND (инверсное И ).
В True restriction обязательно выбираем галочку.
Еще раз напомню, что существует и нода ИЛИ из этого же плагина.
Теперь, загрузив данное флоу, можете попробовать его работу. Пощелкайте нодами inject, меняя состояния глобальных переменных. Убедитесь в том, что статус от ноды Дверь, будет проходить только тогда, когда значения Value 1 и 2 равны 1.
Как я это использовал (или буду использовать) у себя
Я часто уезжаю в командировки и не хочется оставлять квартиру с открытыми окнами или дверью балкона. Поэтому, при открытии входной двери, я получаю голосовое напоминание о не закрытых окнах и, соответственно, уведомление в Телеграмм.
Очень легко добавить ноду AND для блокировки прохождения любого события или статуса по вашим условиям, так как предела совершенства автоматизаций НЕТ.
Флоу, которое было описано в статье, вы можете загрузить по ссылке.
Если есть вопросы, пишите в комментариях или на канале Node Red.
HMI на основе Node-red и Scadavis.io
Scadavis.io
Начну описание scadavis с той информации, которая представлена в официальных источниках. На странице сайта scadavis.io указано: «Powerful SCADA-like visualization tools, free-form synoptic graphics for real-time data display. A pure HTML5 solution, mobile friendly, framework agnostic, with no special server requirements needed. All your data and graphics stay on your servers and clients.» (Мощные SCADA-подобные инструменты визуализации, сводные графики произвольной формы для отображения данных в реальном времени. Чистое решение HTML5, мобильное, независимое от фреймворка, без особых требований к серверу. Все ваши данные остаются на ваших серверах и клиентах.)
Далее представлены примеры страниц, которые можно спроектировать.
Затем идет информация о графическом редакторе построения экранных страниц SCADAvis.io Synoptic Editor, который можно преобрести в Microsoft Store.
Также на сайте представлена таблица с планами использования Scadavis.io. Их три: Basic, Pro, Enterprise. Основные характеристики Basic-плана: бесплатный, нет технической поддержки, исходный код расположен на SCADAvis.io.
Дисклеймер – в данном абзаце я хочу показать файловую структуру проекта, которую мне было любопытно увидеть. Это никоим образом не призывает нарушать лицензионные права данной системы. Тем более список файлов легко просматривается с помощью инструментов разработчика в консоли браузера.
Подключение скрипта проекта, документация API и Synoptic Editor представлены на ресурсе scadavis.io/learn.html
Node-red
Node-red – чрезвычайно популярная платформа. На просторах сети есть огромное количество статей и видеороликов о ней. На wikihandbk.com следующее определение: Node-RED – это инструмент визуального программирования для интернета вещей, позволяющий подключать друг к другу устройства, API и онлайн-сервисы. Сами авторы позиционируют Node-red как IoT edge платформу:
В блоге Ricardo Olsenn показаны шаги по интеграции системы Scadavis.io и платформы Node-red, а также представлены исходные файлы экранных страниц формата svg. Автор рекомендует использовать плагин для Node-red — node-red-contrib-uibuilder, который позволяет создавать динамический веб-интерфейс с помощью различных js-библиотек, а также использовать веб-фреймворк VueJS.
Однако это не единственный способ, позволяющий построить пользовательский интерфейс на базе Node-red. Имеется достаточно популярный модуль, содержащий ряд нод для создания дашбордов в реальном времени от создателей самой платформы node-red-dashboard.
Виджет Template может содержать любые допустимые директивы html и Angular/Angular-Material. Этот узел можно использовать для создания динамического элемента пользовательского интерфейса, который изменяет свой внешний вид на основе входящего сообщения и может отправлять сообщения обратно в Node-RED. С помощью ноды Template можно создать объект экранной страницы Scadavis, задать необходимые свойства, эмулировать поведение объекта и связать теги (переменные) экранной страницы с внешней средой
В статье Node-RED Dashboard Template Examples (AngularJS) хорошо показаны примеры взаимодействия ноды Template с другими нодами, которые обмениваются сообщениями msg в контексте Angular Scope.
Допустим, мы хотим в качестве свойства объекта msg.topic передавать имя тега, а в качестве значения msg.payload. И при каждом изменении объекта msg обновляем объект SCADA с помощью методов storeValue и updateValues
Графический редактор
Как уже упоминалось выше, на официальном сайте предлагается приобрести SCADAvis.io Synoptic Editor для построения визуальных страниц SCADA-системы. Однако это не единственный возможный вариант. Как известно из самого описания, редактор построен на базе Inkscape SVG Editor. Практически — это Inkscape с плагином позволяющий назначать теги (переменные) и другие свойства различным графическим компонентам svg файла. То есть для простого отображения в контексте scadavis странице достаточно иметь svg файл, который можно редактировать в любом удобном редакторе. Но это еще не все. Есть большое сходство между редактором компании ECAVA INTEGRAXOR www.integraxor.com Inkscape 0.91 SAGE 4.16, который распостраняют бесплатно (необходимо только зарегистрироваться на сайте) и Synoptic Editor. Как в итоге оказалось, действительно возможно создавать и редактировать svg файлы для Scadavis, используя Inkscape 0.91 SAGE 4.16. Разница наблюдается при проектировании скриптовой анимации и некоторых других специфических вещах, которые отсутствуют в Object properties редактора SAGE.
Согласно описанию SCADAvis.io Synoptic Editor, для того чтобы назначить цвет объектов по условию включения, необходимо в колонке Limit указать цифру 2:
Плагин для работы с PLC Siemens
В арсенале Node-red имеется плагин для работы с PLC Siemens — node-red-contrib-s7, основанный на фреймворке nodeS7. Плагин достаточно прост и интуитивно понятен. Он содержит три ноды: S7 in, S7 out, S7 control. В основном используются первые две ноды для чтения и записи тегов в PLC. Один нюанс, который нужно учитывать при работе с S7-1200, описан в документации к плагину. Я с этим сталкнулся ранее, когда использовал библиотеку Snap7
Необходимы некоторые дополнительные шаги настройки в ПЛК: