ГлавнаяАкадемияNode-RED: установка, flows, msg/JSON, отладка → Что такое Node-RED и его роль в автоматизации

Что такое Node-RED и его роль в автоматизации

Урок · Node-RED: установка, flows, msg/JSON, отладка · 30 мин · theory

Что такое Node-RED? Философия визуального программирования

Добро пожаловать в основу современной автоматизации на платформе HI. В этом уроке мы заложим фундамент для понимания ключевого инструмента, который превращает разрозненные устройства в единую интеллектуальную систему — Node-RED.

Представьте, что вам нужно построить сложный механизм. Один подход — взять сырые материалы (металл, пластик) и с помощью сложных станков вытачивать каждую деталь с нуля, а затем сваривать их вместе. Это похоже на традиционное текстовое программирование. Другой подход — использовать готовые стандартные блоки (как LEGO), каждый из которых выполняет свою функцию, и соединять их в нужной последовательности. Именно этот второй подход лежит в основе Node-RED.

Node-RED — это визуальный инструмент для потокового программирования (flow-based programming). Вместо написания сотен строк кода вы оперируете графическими блоками — узлами (nodes), которые соединяете между собой, создавая потоки (flows). Каждый узел выполняет одну конкретную, четко определенную задачу: получить данные из сети, прочитать значение с датчика, выполнить математическое вычисление, отправить команду на реле или записать событие в базу данных. Поток данных, представленный в виде последовательности соединенных узлов, наглядно демонстрирует логику работы сценария автоматизации.

> 💡 Подсказка: Node-RED является проектом с открытым исходным кодом под эгидой OpenJS Foundation. Это гарантирует активное развитие, огромное количество готовых модулей (nodes), написанных сообществом для интеграции практически с любым оборудованием и сервисом, и мощную поддержку в решении возникающих проблем.

Изначально разработанный в стенах IBM Emerging Technology Services для быстрого прототипирования и связывания аппаратных и программных компонентов Интернета вещей (IoT), Node-RED быстро вырос в самостоятельный, мощный open-source проект. Его ядро построено на Node.js — высокоэффективной среде выполнения JavaScript, что обеспечивает асинхронную обработку событий и высокую производительность, критически важную для систем реального времени.

На контроллерах HI Node-RED выполняет роль центрального интеграционного хаба — универсального «клея» или «переводчика», который связывает воедино разнородные миры. Он позволяет без лишних усилий «подружить» промышленные протоколы, такие как Modbus, с веб-технологиями, такими как MQTT или HTTP API.

Ключевые преимущества, сделавшие Node-RED стандартом в сфере IoT и автоматизации:

Таким образом, для инженера автоматизации на платформе HI Node-RED — это не просто один из инструментов, а основная среда разработки, позволяющая реализовывать логику любой сложности, от простого включения света по кнопке до комплексных алгоритмов управления климатом в здании.

---

Ключевые компоненты: Nodes, Flows, Palette, Workspace

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

> 📋 Ключевые понятия:

> * Workspace (Рабочая область): центральное «полотно», где происходит проектирование.

> * Palette (Палитра): библиотека доступных узлов слева.

> * Nodes (Узлы): функциональные блоки из палитры.

> * Flows (Потоки): набор соединенных узлов на рабочей области.

> * Wires (Соединения): линии, связывающие узлы.

Nodes (Узлы)

Узлы — это фундаментальные строительные блоки любого сценария в Node-RED. Каждый узел представляет собой преднастроенный кусок кода, инкапсулирующий определенную функциональность. У узлов могут быть «входы» (слева) и «выходы» (справа). Когда на вход узла поступает сообщение, он выполняет свою работу и может передать результат (в виде нового или измененного сообщения) на один из своих выходов.

Узлы можно условно разделить на три основные категории:

  • Input Nodes (Узлы ввода): Инициируют поток. Они не имеют входов, только выходы. Их задача — генерировать сообщения на основе какого-либо внешнего события.
  • * Примеры: `inject` (ручной запуск или по расписанию), `mqtt in` (получение сообщения из топика MQTT), `modbus-read` (опрос устройства по Modbus), `http in` (ожидание HTTP-запроса).

  • Processing Nodes (Узлы обработки): Получают сообщение, выполняют над ним некую операцию и передают дальше. У них есть и входы, и выходы.
  • * Примеры: `function` (выполнение произвольного JavaScript-кода), `switch` (маршрутизация сообщения в зависимости от его содержимого), `change` (изменение, удаление или установка свойств сообщения), `delay` (задержка передачи сообщения).

  • Output Nodes (Узлы вывода): Завершают поток (или его ветвь). У них есть входы, но обычно нет выходов. Их задача — передать данные во внешний мир.
  • * Примеры: `debug` (вывод сообщения в боковую панель отладки), `mqtt out` (публикация сообщения в топик MQTT), `modbus-write` (запись данных в устройство по Modbus), `http response` (ответ на HTTP-запрос).

    Flows (Потоки) и Wires (Соединения)

    Поток (Flow) — это логическая последовательность соединенных узлов, которая представляет собой полный сценарий автоматизации. Например, поток для управления освещением может состоять из узла, принимающего сигнал от выключателя, узла, определяющего текущее время суток, и узла, управляющего реле.

    Потоки создаются путем перетаскивания узлов из палитры в рабочую область и их соединения с помощью "проводов" (Wires). Соединение создается кликом на выходном порту одного узла и последующим кликом на входном порту другого. По этим «проводам» от узла к узлу передаются объекты `msg`, о которых мы поговорим подробнее в следующем разделе. Одна рабочая область может содержать множество независимых потоков. Для лучшей организации их можно размещать на разных вкладках (которые также называются "flows").

    Palette (Палитра)

    Палитра (Palette) — это библиотека всех доступных вам узлов, расположенная по умолчанию в левой части редактора Node-RED. Она сгруппирована по категориям для удобства навигации (input, output, function, social, storage и т.д.).

    Одна из самых мощных возможностей Node-RED — это управление палитрой. Через меню `Manage Palette` вы можете:

    На контроллерах HI палитра уже содержит предустановленные наборы узлов для работы со всей встроенной периферией: `Modbus`, `DALI`, `CAN`, `MQTT`, а также для взаимодействия с универсальными входами/выходами (UI/UO).

    ---

    Объект msg: Структура и передача данных

    Если узлы — это органы системы, а потоки — ее нервные пути, то объект `msg` — это нервный импульс, несущий информацию. Понимание структуры и жизненного цикла объекта `msg` является абсолютно ключевым для успешной работы в Node-RED.

    `msg` — это обычный объект JavaScript, который передается от одного узла к другому по "проводам". Он служит контейнером для всех данных, которые необходимо обработать в рамках потока. Каждый раз, когда узел `inject` срабатывает или узел `mqtt in` получает сообщение, создается новый объект `msg`, который начинает свое путешествие по потоку.

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

    Базовая структура объекта `msg`

    Хотя объект `msg` может содержать любые свойства, существуют два стандартных и наиболее важных ключа, которые являются частью негласного соглашения между всеми разработчиками узлов:

  • `msg.payload` (полезная нагрузка): Это основное свойство, в котором передаются данные. Большинство узлов по умолчанию ищут входящие данные именно в `msg.payload` и помещают результат своей работы также в `msg.payload`, затирая его предыдущее значение. Полезная нагрузка может быть любого типа: строка, число, булево значение, массив или даже другой объект.
  • `msg.topic` (тема): Это строковое свойство, которое часто используется для маршрутизации или категоризации сообщений. Например, узел `mqtt in` помещает в `msg.topic` MQTT-топик, из которого пришло сообщение. Узел `switch` может использовать `msg.topic` для направления сообщения по разным веткам потока.
  • Кроме этих двух, вы всегда встретите свойство `_msgid` — это уникальный идентификатор, который Node-RED присваивает каждому сообщению для отслеживания его пути в отладчике. Вы можете добавлять в объект `msg` любые свои свойства, например, `msg.config`, `msg.source_id`, `msg.timestamp`. Это полезно для передачи дополнительного контекста между узлами без изменения основной полезной нагрузки.

    > ⚠️ Внимание: Частая ошибка новичков в узле `Function` — присваивание нового значения напрямую объекту `msg` (`msg = {payload: 'new'}`). Это действие создает совершенно новый объект и уничтожает все служебные и дополнительные свойства (`_msgid`, `topic` и др.), которые могли быть важны для последующих узлов. Правильная практика — модифицировать свойства существующего объекта: `msg.payload = 'new'; return msg;`.

    Жизненный цикл и отладка

    Давайте рассмотрим жизненный цикл `msg` на простом примере:

  • Узел `inject` срабатывает и создает объект `msg` со свойством `payload`, содержащим временную метку (timestamp).
  •     {

    "payload": 1678886400000,

    "topic": "",

    "_msgid": "a1b2c3d4.e5f6g7"

    }

  • Этот объект поступает в узел `function`, который преобразует timestamp в читаемую строку и добавляет новое свойство `msg.device`.
  •     // Код внутри узла function

    const date = new Date(msg.payload);

    msg.payload = date.toISOString();

    msg.device = "main-controller";

    return msg;

  • Измененный `msg` отправляется дальше. Теперь он выглядит так:
  •     {

    "payload": "2023-03-15T12:00:00.000Z",

    "topic": "",

    "device": "main-controller",

    "_msgid": "a1b2c3d4.e5f6g7"

    }

  • Наконец, он попадает в узел `debug`, который выводит его содержимое в боковую панель отладки. После этого, если узел `debug` не имеет выходов, объект `msg` уничтожается.
  • Отслеживание изменений `msg` с помощью узла `debug`, настроенного на вывод всего объекта (`complete msg object`), является основным методом отладки потоков в Node-RED.

    ---

    Практическое применение: Node-RED на контроллерах HI

    Теория важна, но истинная сила Node-RED раскрывается в решении практических задач на реальном оборудовании. На контроллерах HI среда Node-RED является штатным инструментом, выбранным за его исключительную гибкость, надежность и безграничную расширяемость.

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

    Задача: Опрашивать датчик температуры, подключенный к контроллеру по шине RS-485 (протокол Modbus RTU), и публиковать полученное значение в топик MQTT. Участвующие системы:

    Поток в Node-RED

    Для решения этой задачи наш поток будет состоять из четырех основных узлов:

    `[Inject]` -> `[Modbus-Getter]` -> `[Function]` -> `[MQTT Out]`

  • `Inject` (узел ввода): Этот узел будет настроен на автоматический запуск каждые 15 секунд. Он инициирует процесс опроса датчика.
  • `Modbus-Getter` (узел обработки): Это специализированный узел из библиотеки `node-red-contrib-modbus`. Он настраивается на:
  • * Адрес устройства на шине (Slave ID).

    * Адрес регистра, в котором хранится значение температуры (согласно документации на датчик).

    * Параметры COM-порта контроллера HI.

    При срабатывании он отправляет Modbus-запрос и помещает полученный ответ в `msg.payload`. Как правило, это массив чисел (`[235]`).

  • `Function` (узел обработки): Здесь происходит "магия" преобразования данных. Сырые данные от Modbus-устройства редко представляют собой готовое значение. Например, производитель для экономии места может передавать температуру в виде целого числа, умноженного на 10 (т.е. `235` означает `23.5 °C`). Задача этого узла — выполнить преобразование и привести сообщение к стандартному JSON-контракту.
  •     // Код внутри узла Function

    // Входящий msg.payload: [235] (пример ответа от Modbus-Getter)

    // 1. Извлекаем сырое значение

    const rawValue = msg.payload[0];

    // 2. Преобразуем его в градусы Цельсия

    const temperature = rawValue / 10.0;

    // 3. Формируем новый, структурированный payload по стандарту нашей системы

    msg.payload = {

    "value": temperature,

    "unit": "°C",

    "source": "temp-sensor-living-room",

    "ts": new Date().getTime() // Добавляем временную метку

    };

    // 4. Устанавливаем топик для отправки в MQTT

    msg.topic = "hi/telemetry/living_room/temperature";

    return msg;

  • `MQTT Out` (узел вывода): Этот узел подключается к MQTT-брокеру и публикует данные, полученные от узла `Function`. Поскольку `msg.payload` уже является JSON-объектом, узел `mqtt out` автоматически преобразует его в JSON-строку перед отправкой. `msg.topic` используется для определения целевого топика публикации.
  • В результате этого простого потока мы связали "старый" мир промышленной автоматики (Modbus) с современным миром IoT (MQTT), сделав данные доступными для любых сетевых устройств. Это и есть главная роль Node-RED на контроллере HI — быть универсальным мостом между технологиями.

    ---

    Итоги и следующие шаги

    тоги и следующие шаги

    В этом уроке мы сделали первый и самый важный шаг в освоении Node-RED. Мы разобрали его философию, базовые компоненты и посмотрели, какую ключевую роль он играет в экосистеме контроллеров HI.

    Давайте закрепим основные понятия:

    Архитектура и хранение данных

    Для дальнейшей работы важно понимать, как Node-RED устроен внутри контроллера HI. Среда исполнения (Runtime) работает как изолированный сервис, а все ваши настройки, установленные палитры и сами потоки (flows) хранятся в системной директории `/data`.

    > 💡 Важно помнить: Директория `/data` является критически важной для persistence (сохранности данных). При создании бэкапов или переносе конфигурации на другой контроллер, именно содержимое этой папки определяет состояние всей вашей автоматизации.

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

    > 🔗 Связанный материал: В следующем уроке, COURSE-06-M01-L02, мы перейдем от теории к практике: запустим редактор Node-RED, детально изучим его интерфейс и создадим свой первый, самый простой, но очень важный поток "Hello, World!", который научит вас основам развертывания и отладки сценариев на контроллере HI.