Node-RED:Рецепты/Как создать одно сообщение из разных потоков сообщений

Материал из Онлайн справочника
Перейти к навигации Перейти к поиску

Перевод: Максим Кузьмин (Cubewriter) Контакты:</br>* Skype: cubewriter</br>* E-mail: cubewriter@gmail.com</br>* Максим Кузьмин на freelance.ru
Проверка/Оформление/Редактирование: Мякишев Е.А.


Pixel Art Mini Meow Animated.gif Черновик


Как создать одно сообщение из разных потоков сообщений[1]

Проблема

У вас есть сообщения, приходящие из разных источников, и вам нужно собрать их в одно сообщение.

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

Решение

Присвойте каждому потоку сообщений уникальное значение «msg.topic», а затем при помощи ноды «Join» сгруппируйте их одно сообщение.

Пример

Nodered recipe join-streams.png
[{"id":"8ccddb9a.a55f38","type":"inject","z":"ac14500e.2c57d","name":"temperature","topic":"temperature","payload":"10","payloadType":"num","repeat":"","crontab":"","once":false,"onceDelay":0.1,"x":110,"y":1760,"wires":[["47b769c5.cb0e28"]]},{"id":"47b769c5.cb0e28","type":"join","z":"ac14500e.2c57d","name":"","mode":"custom","build":"object","property":"payload","propertyType":"msg","key":"topic","joiner":"\\n","joinerType":"str","accumulate":false,"timeout":"","count":"3","reduceRight":false,"reduceExp":"","reduceInit":"","reduceInitType":"","reduceFixup":"","x":310,"y":1800,"wires":[["f9afb265.b11b7"]]},{"id":"f9afb265.b11b7","type":"debug","z":"ac14500e.2c57d","name":"","active":true,"tosidebar":true,"console":false,"tostatus":false,"complete":"false","x":470,"y":1800,"wires":[]},{"id":"2d269127.4f04ce","type":"inject","z":"ac14500e.2c57d","name":"humidity","topic":"humidity","payload":"","payloadType":"num","repeat":"","crontab":"","once":false,"onceDelay":0.1,"x":100,"y":1800,"wires":[["47b769c5.cb0e28"]]},{"id":"d6fbe805.0e4628","type":"inject","z":"ac14500e.2c57d","name":"pressure","topic":"pressure","payload":"999","payloadType":"num","repeat":"","crontab":"","once":false,"onceDelay":0.1,"x":100,"y":1840,"wires":[["47b769c5.cb0e28"]]}]

Разбор

В примере выше каждая нода «Inject» служит отдельным источником сообщений. Кроме того, каждая из них присваивает своим сообщениям уникальное значение «msg.topic», благодаря чему их можно будет определить дальше в потоке.

В настройках ноды «Join» задан режим «manual» и то, что она будет создавать объект «ключ/значение», где значение «msg.topic» будет в качестве ключа. Нам нужно объединить три разных потока сообщений, поэтому нам нужно настроить ноду «Join», чтобы она отправляла сообщение, получив три сообщения от разных источников.

Это значит, что она будет отправлять сообщение каждый раз, когда получит по крайней мере одно сообщение от трех разных нод «Inject» – используя самые новые значения от каждого источника:

{
    "temperature":10,
    "humidity":0,
    "pressure":999
}

В ноде «Join» также есть настройки, не используемые в этом примере. К примеру, в ней можно задать таймаут, чтобы нода отправила хотя бы что-то в случае, если один из датчиков перестанет присылать данные.

Если это именно ваш случай, то советуем заглянуть в эту статью, где объясняется, как отправлять «сообщения-заглушки».

См.также

Внешние ссылки