🔴

Node-RED + RealIoT

Как рабочее поле и Node-RED работают вместе
Два слоя одной системы. Рабочее поле показывает устройства и принимает действия пользователя. Node-RED выполняет алгоритмы: условия, расчёты, задержки, интеграции. Данные между ними ходят только двумя путями: через MQTT-брокер и через базу данных.

Исходные данные приходят с рабочего поля

Node-RED не опрашивает устройства сам по себе. Источник правды — иконки и виджеты, которые вы установили на рабочее поле.

  • Реальные датчики и исполнительные устройства — WiFi, Zigbee, Matter, LoRaWAN, Modbus. Их телеметрия приходит по MQTT, отображается на рабочем поле и доступна алгоритмам Node-RED.
  • Виртуальные датчики и виджетыVirtualNumber, VirtualToggle, VirtualSelect, Virtual Schedule, Virtual Formula, Virtual Integrator, VirtualThermostat и другие. Пользователь меняет значение на поле, а Node-RED читает его как обычный параметр устройства.
Связь иконки с узлом Node-RED задаётся полями Рабочее поле и Device SN. Эти значения должны совпадать точно.

Алгоритмы в Node-RED: MQTT и база данных

Простые правила удобнее делать в сценариях If-Else. Когда нужна сложная логика, расчёт, история или интеграция, алгоритм собирают в Node-RED. Обмен с рабочим полем идёт двумя независимыми путями. Смешивать их «на всякий случай» нельзя: каждый узел использует один конкретный канал.

Путь 1. MQTT-брокер — живые события

Локальный брокер Mosquitto принимает телеметрию устройств и команды. Сервер RealIoT подписан на топики, обновляет рабочее поле и пишет историю. Узлы Node-RED из палитры realiot используют тот же брокер.

  • В Node-RED. Узлы mqtt input и state trigger подписаны на топик realiot/data/json. Сообщение приходит сразу, как только изменилось состояние устройства.
  • Из Node-RED на устройство. Узлы actuator и multi actuator публикуют команду в топик протокола устройства: WiFi realiot/command/<deviceSN>, Zigbee zigbee2mqtt/<friendlyName>/set, Matter matter/<deviceId>/set и другие.
  • Виртуальные значения обратно на поле. Узлы virtual sensor, virtual switch, virtual number, thermostat и db-writer публикуют телеметрию в realiot/data/json с топиком устройства realiot/virtual/<deviceSN>. Рабочее поле получает обновление сразу.
MQTT — это «сейчас». Используйте его, когда алгоритм должен среагировать на изменение датчика, нажатие виджета или команду пользователю.
Путь 2. База данных — текущее состояние и история

Рабочее поле хранится в MongoDB: состав иконок, Device SN, текущие payloadData. История параметров пишется в отдельную коллекцию телеметрии. Узлы Node-RED читают и пишут эти документы напрямую.

  • Текущее состояние. device state и get multi загружают устройство из рабочего поля и отдают актуальные значения параметров. Так можно стартовать поток по таймеру и узнать, что сейчас на поле, даже если MQTT-события давно не было.
  • Расписание с поля. schedule link читает виджет Virtual Schedule из документа рабочего поля.
  • История. get history и history stats запрашивают архив параметра из коллекции телеметрии. История должна быть включена в свойствах устройства.
  • Запись на поле. db-writer записывает вычисленные поля в документ виртуального устройства в MongoDB и затем публикует MQTT, чтобы интерфейс обновился сразу.
База данных — это «как есть сейчас» и «как было раньше». Используйте её для опросов, статистики, расписаний и записи результатов расчёта.

Какой путь у какого узла

УзелКаналНазначение
mqtt input, state trigger MQTT Событие изменения состояния
actuator, multi actuator MQTT Команда устройству
virtual sensor, virtual switch, virtual number, thermostat MQTT + запись на поле Виртуальное устройство, видимое на рабочем поле
device state, get multi База данных Прочитать текущее состояние
schedule link База данных Состояние расписания с поля
sun link База данных Окно восхода и заката с поля
get history, history stats База данных Архив параметра
db-writer База данных, затем MQTT Записать результат на поле и обновить интерфейс

Практические потоки и список узлов — на странице Node-RED.

Сообщения между узлами: объект msg

В Node-RED все сообщения между узлами имеют стандартную структуру объекта msg. Это соглашение документации Node-RED, а не особенность RealIoT.

Обязательные поля

msg = {
  payload: <любые данные>,  // основные данные сообщения
  _msgid: "уникальный-ID"    // идентификатор, Node-RED ставит сам
}

Дополнительные стандартные поля

msg = {
  payload: ...,
  topic: "тема/маршрут",      // MQTT, switch и другие узлы
  req: {...},                 // HTTP request
  res: {...},                 // HTTP response
  error: {...},               // информация об ошибке
  statusCode: 200,            // HTTP-статус
  headers: {...},             // HTTP-заголовки
  cookies: {...},             // HTTP cookies
  filename: "file.txt",       // имя файла для file node
  parts: {...}                // split / join
}

Возвращаемый объект не обязан быть тем же самым, что пришёл на вход. Function-узел может собрать новый объект и вернуть его:

const newMsg = { payload: msg.payload.length };
return newMsg;
Новый объект теряет свойства исходного сообщения. Для HTTP In/Response нужны msg.req и msg.res от начала до конца. Обычно изменяйте поля полученного msg и возвращайте его же.

Подробнее о function-узле: Writing Functions. Документация Node-RED: nodered.org/docs.

Как узнать структуру msg у конкретного узла

Каждый узел документирует свой формат входа и выхода. Жёсткого стандарта для содержимого payload нет: его задаёт узел-источник.

1 Документация узла
  1. Выделите узел на холсте.
  2. В правой панели нажмите значок книги — откроется описание узла.
  3. Читайте разделы Inputs и Outputs.

Тот же текст доступен из окна настройки: дважды кликните узел и откройте вкладку Info.

2 Узел debug
  1. Подключите debug к выходу интересующего узла.
  2. Нажмите Deploy и отправьте тестовое сообщение.
  3. В правой панели смотрите фактическую структуру msg.

Стандартные узлы и узлы RealIoT

В редакторе есть стандартные узлы Node-RED: inject, switch, change, function, delay, debug и другие.

Узлы, написанные специально для RealIoT, находятся в разделе realiot в левой палитре. Они знают рабочие поля, Device SN, MQTT-топики устройств и документы MongoDB. Полный список и типовые потоки — на странице Node-RED.

Для узлов RealIoT заполняйте Рабочее поле и Device SN так же, как на иконке рабочего поля. Опечатка в любом из полей разрывает связь.

Отладка: узел debug

Для отладки потока используйте узлы debug. Они выводят значения в правую панель, которая открывается кликом по значку жучка.

  • По умолчанию debug показывает msg.payload.
  • В настройках узла можно выбрать complete message object — тогда видна вся структура msg.
  • После изменения потока нажимайте Deploy, иначе debug покажет старое поведение.

Быстрый чеклист при работе с новым узлом

  1. Подключите debug к выходу узла.
  2. Отправьте тестовое сообщение через inject.
  3. Изучите структуру в правой панели (значок жучка).
  4. Прочитайте документацию узла (значок книги / вкладка Info).
  5. Проверьте тип payload: string, object, array?
  6. Добавьте проверки в function-узлах, если тип или поля могут отличаться.

JSONata: извлечение данных из payload

JSONata — язык запросов к JSON. В Node-RED он доступен в узлах change и switch, когда выражение задано как JSONata.

Примеры

ВыражениеРезультат
payload.deviceSN Значение поля deviceSN
payload.*.temperature Все поля temperature на любом уровне
$sum(payload.values) Сумма массива values
JSONata удобна, когда нужно вытащить одно поле из объекта без function-узла. Если структура неизвестна — сначала посмотрите её в debug.

Резюме

  • msg — всегда объект. msg.payload — основное поле с данными.
  • Структура payload зависит от узла-источника. Жёсткого стандарта, что должно быть внутри, нет.
  • Есть соглашения: HTTP-узлы кладут объект с body и headers; MQTT даёт payload и topic; файловые узлы — содержимое или путь; узлы базы данных — результат запроса.
  • Узлы RealIoT в палитре realiot общаются с рабочим полем через MQTT (события и команды) и через MongoDB (состояние, история, запись результата).
  • Реальную структуру всегда проверяйте узлом debug.

Рабочее поле показывает состояние. Node-RED считает и управляет.

Данные приходят от иконок на поле. Алгоритм в Node-RED читает и пишет их через MQTT или базу данных. Смотрите msg в debug, прежде чем строить условия.

← Назад к справке