Быстрый переход
Исходные данные приходят с рабочего поля
Node-RED не опрашивает устройства сам по себе. Источник правды — иконки и виджеты, которые вы установили на рабочее поле.
- Реальные датчики и исполнительные устройства — WiFi, Zigbee, Matter, LoRaWAN, Modbus. Их телеметрия приходит по MQTT, отображается на рабочем поле и доступна алгоритмам Node-RED.
- Виртуальные датчики и виджеты — VirtualNumber, VirtualToggle, VirtualSelect, Virtual Schedule, Virtual Formula, Virtual Integrator, VirtualThermostat и другие. Пользователь меняет значение на поле, а Node-RED читает его как обычный параметр устройства.
Рабочее поле и Device SN.
Эти значения должны совпадать точно.
Алгоритмы в Node-RED: MQTT и база данных
Простые правила удобнее делать в сценариях If-Else. Когда нужна сложная логика, расчёт, история или интеграция, алгоритм собирают в Node-RED. Обмен с рабочим полем идёт двумя независимыми путями. Смешивать их «на всякий случай» нельзя: каждый узел использует один конкретный канал.
Локальный брокер Mosquitto принимает телеметрию устройств и команды.
Сервер RealIoT подписан на топики, обновляет рабочее поле и пишет историю.
Узлы Node-RED из палитры realiot используют тот же брокер.
-
В Node-RED.
Узлы
mqtt inputиstate triggerподписаны на топикrealiot/data/json. Сообщение приходит сразу, как только изменилось состояние устройства. -
Из Node-RED на устройство.
Узлы
actuatorиmulti actuatorпубликуют команду в топик протокола устройства: WiFirealiot/command/<deviceSN>, Zigbeezigbee2mqtt/<friendlyName>/set, Mattermatter/<deviceId>/setи другие. -
Виртуальные значения обратно на поле.
Узлы
virtual sensor,virtual switch,virtual number,thermostatиdb-writerпубликуют телеметрию вrealiot/data/jsonс топиком устройстваrealiot/virtual/<deviceSN>. Рабочее поле получает обновление сразу.
Рабочее поле хранится в 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;
msg.req и msg.res от начала до конца.
Обычно изменяйте поля полученного msg и возвращайте его же.
Подробнее о function-узле: Writing Functions. Документация Node-RED: nodered.org/docs.
Как узнать структуру msg у конкретного узла
Каждый узел документирует свой формат входа и выхода.
Жёсткого стандарта для содержимого payload нет: его задаёт узел-источник.
- Выделите узел на холсте.
- В правой панели нажмите значок книги — откроется описание узла.
- Читайте разделы Inputs и Outputs.
Тот же текст доступен из окна настройки: дважды кликните узел и откройте вкладку Info.
- Подключите
debugк выходу интересующего узла. - Нажмите Deploy и отправьте тестовое сообщение.
- В правой панели смотрите фактическую структуру
msg.
Стандартные узлы и узлы RealIoT
В редакторе есть стандартные узлы Node-RED: inject, switch,
change, function, delay, debug и другие.
Узлы, написанные специально для RealIoT, находятся в разделе realiot
в левой палитре. Они знают рабочие поля, Device SN, MQTT-топики устройств
и документы MongoDB. Полный список и типовые потоки — на странице
Node-RED.
Отладка: узел debug
Для отладки потока используйте узлы debug.
Они выводят значения в правую панель, которая открывается кликом по значку жучка.
- По умолчанию debug показывает
msg.payload. - В настройках узла можно выбрать
complete message object— тогда видна вся структураmsg. - После изменения потока нажимайте Deploy, иначе debug покажет старое поведение.
Быстрый чеклист при работе с новым узлом
- Подключите
debugк выходу узла. - Отправьте тестовое сообщение через
inject. - Изучите структуру в правой панели (значок жучка).
- Прочитайте документацию узла (значок книги / вкладка Info).
- Проверьте тип
payload:string,object,array? - Добавьте проверки в
function-узлах, если тип или поля могут отличаться.
JSONata: извлечение данных из payload
JSONata — язык запросов к JSON. В Node-RED он доступен в узлах change и
switch, когда выражение задано как JSONata.
Примеры
| Выражение | Результат |
|---|---|
payload.deviceSN |
Значение поля deviceSN |
payload.*.temperature |
Все поля temperature на любом уровне |
$sum(payload.values) |
Сумма массива values |
Резюме
msg— всегда объект.msg.payload— основное поле с данными.- Структура
payloadзависит от узла-источника. Жёсткого стандарта, что должно быть внутри, нет. - Есть соглашения: HTTP-узлы кладут объект с
bodyиheaders; MQTT даётpayloadиtopic; файловые узлы — содержимое или путь; узлы базы данных — результат запроса. - Узлы RealIoT в палитре realiot общаются с рабочим полем через MQTT (события и команды) и через MongoDB (состояние, история, запись результата).
- Реальную структуру всегда проверяйте узлом
debug.
Рабочее поле показывает состояние. Node-RED считает и управляет.
Данные приходят от иконок на поле. Алгоритм в Node-RED читает и пишет их через MQTT или базу данных.
Смотрите msg в debug, прежде чем строить условия.