Node-RED, первые шаги
Если вы установили Node-RED (как устанавливать я не буду писать, в интернете полно пошаговых инструкций, да и зависит все от вашего дистрибутива), то можем поэкспериментировать вместе с ним.
Давайте для начала используя отладочные средства Node-RED создадим, как водится, Hello World сценарий.
Как я писал в предыдущем блоге про Node-RED, есть входные узлы (Node) и исходящие. Для отладки есть стандартные, входная нода Inject (русск. Впрыск) и выходная нода Debug (русск. Отладка).
Перетяните из палитры ноду Inject и поместите ее левее на сценарии, а справа от нее поместите ноду Dеbug.
Как видно, нода Inject стала называться “Timestamp”. Почему? Двойным щелчком по ноде открывается окошко свойств этой ноды. Откройте свойства.
Небольшое отступление. Как я уже говорил, от ноды к ноде в Node-RED передается Javascript объект под названием msg. У этого объекта есть обязательный атрибут msg.payload. Payload (русск. Полезная нагрузка) хранит собственно значение, которое мы передаем от ноды к ноде. Оно может быть любого типа поддерживаемого javascript-ом. Время, число, строка, json, Javascript-объект, короче все, что угодно. Помимо msg.payload атрибута, у msg могут быть другие атрибуты, в зависимости, какая нода сформировала msg объект. Так как это все javascript, вы можете сами добавлять атрибуты объекту msg, к примеру если помимо состояния умной лампочки, хочется хранить и время, когда лампочка была включена.
Так вот, назначение ноды Inject состоит в том, что бы присвоить начальное значение payload и запустить процесс обработки. Как видно в окне свойств, атрибуту payload присваивается timestamp - актуальные дата и время. В выпадающем списке можно выбрать тип данных. Помимо типа данных в списке можно видеть еще два объекта glob. и flow. Это тоже два объекта javascript, только один глобальный и создается когда запускается Node-RED и один локальный для текущего сценария. В этих объектах можно хранить данные. К примеру можно кэшировать температуру за окном и в сценарии не запрашивать ее с openweathermap каждый раз когда понадобится, а брать с глобального объекта, где это значение будет обновляться раз в час.
Здесь можно выбрать тип payload String и ввести Hello World! И в принципе все было бы готово. Но мы не ищем легких путей. Поэто пока не меняйте ничего и закройте окно свойств.
Давайте посмотрим на ноды, на нашем сценарии. У ноды Inject слева имеется кнопка. Если ее нажать, то при активном сценарии будет запущен поток обработки с заданным значением. Пока она ничего не делает, так как сценарий неактивен. Справа у ноды имеется точка связывания. Точно такая же точка имеется на исходящей ноде Debug. На ноде Debug справа тоже имеется кнопка и она служит для включения/выключения отладки данной ноды.
Для связывания двух нод наведите курсор мышки на точку связывания входной ноды. Она подсветится красным. Теперь нажмите кнопку мышки и протяните линию до входной точки ноды Debug.
Смысл наверное понятен. msg-Объект будет передан по линии связи на вход ноды Debug.
Наш сценарий готов к употреблению, но он еще не активен. Что бы он стал активен, его надо задеплоить. Для этого в правом верхнем углу имеется кнопка Deploy. Должно появиться выпадающее окно с “Successful deployed” и на сценарии станут активны кнопки у обоих нод.
Справа имеются две панели Info и Debug. Выберите Debug и щелкните по кнопке входной ноды Inject.
Как видно во всплывающем окне появилось сообщение “successful injected: timestamp”, а на отладочной панели появился текст. Msg.payload: number а ниже большое число типа 1487343429625. Все правильно. Timestmp в памяти хранится как целое число миллисекунд прошедших с начала 1970 года. Epoch. Такой формат хранения времени очень удобен, потому как можно временем оперировать простыми арифметическими действиями.
Теперь можно попробовать добавить на сценарий функциональную ноду. Функциональные ноды служат для обработки msg объекта. Давайте добавим задержку в обработку сообщение. Такое часто требуется если надо выключить лампочку по истечении какого времени после срабатывания датчика движения.
Найдите на палитре в группе function ноду Delay (русск. Задержка) и перетяните ее на сценарий разместив ее между нашими нодами. Тепь щелкнув мышкой выделите линию связывающую ноды Inject и Debug и удалите ее нажав кнопку “del”.
Вместо этого свяжите ноды Inject и Delay и ноды Delay и Debug. На ноде Delay написано, что будет задержка 5 секунд. Можно в свойствах изменить поведение ноды. Можно задать другую задержку в секундах, миллисекундах, и даже днях. Можно задать, чтобы была задержка на случайно число секунд. Можно задать ограничение на число пропускаемых сообщений за определенный период времени, дабы к примеру снизить нагрузку на управляемый агрегат. И так далее.
Задеплойте ваши изменения и нажмите на кнопку на ноде Inject. Теперь видно, сообщение на панели debug появилось только некоторое время спустя.
Ну и для финала давайте модифицируем наш msg объект. Найдите на палитре слева ноду Change (русск. Сменить) перетяните ее на сценарий. Подключите новую ноду Change между delay и Debug и соедините Inject и Debug ноды, чтобы получилось как у меня на иллюстрации. Откройте окно свойств ноды Change.
Как видно нам предлагают установить (Set) msg.payload атрибут в другое значение. Впишите здесь “Привет Мир!”.
Помимо Set можно выбрать Change (русск. Изменить), Delete (русск. Удалить) или Move (русск. Переместить).
Сохраните изменения и задеплойте их. Теперь, если нажать на кнопку ноды Inject, то сразу же в отладочном окне появится число с миллисекундами, а спустя некоторое время наше долгожданное “Привет мир!”.
Как видно ноды можно соединять с несколькими другими. В нашем случае, нода Inject передала объект msg разу ноде Debug и этой нодой был распечатан payload с timestamp-ом. Одновременно msg объект был передан ноде Delay. Через пять секунд нода Delay передала msg объект без изменений далее, на вход ноды Change, где наш payload был изменен на “Привет Мир!” и передан дальше ноде Debug, которая вывела содержимое payload на отладочной панели. Обратите внимание на временные метки в отладочном окне. Разница между предыдущим и последним сообщениями пять секунд.
Node-RED удобный инструмент, который помогает абстрагироваться от написания кода. Не обязательно писать код. Если что требуется под ваши нужды посмотрите в базе нод, возможно кто то решил вашу проблему. Если нет, есть нода Function (русск. Функция). Технически это процедура на языке javascript, которая получает msg объект как параметр и возвращает так же msg. Так что если есть знания javascript, то можно сценарии расширять как душе угодно.
Так же есть возможность создавать свои библиотеки сценариев. Для этого создается Subflow. На Subflow вы можете задать входные и исходящие точки и создать сложный сценарий. После чего вы можете использовать Subflow в других сценариях, как ноду.
В следующем блоге про Node-RED приведу какой нибудь живой пример. Думаю попробовать мигать лампочкой, когда кто-то голосует за меня на golos-е.