Node-RED:Рецепты/Как настроить отправку «сообщений-заглушек» вместо потока сообщений

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

Перевод: Максим Кузьмин
Проверка/Оформление/Редактирование: Мякишев Е.А.


Как настроить отправку «сообщений-заглушек» вместо потока сообщений[1]

Проблема

Допустим, у вас есть поток сообщений, идущих от датчика через равные периоды времени. И вам нужно, чтобы на случай, если датчик перестанет отправлять сообщения, поток продолжал отправлять вместо них «сообщения-заглушки» с тем же интервалом.

Например, эти данные от датчика могут идти в график на панели управления, созданный с помощью модуля «node-red-dashboard». Если датчик перестанет отправлять сообщения, данные в графике перестанут обновляться. Поэтому нам необходимы «сообщения-заглушки», чтобы график продолжал обновляться с помощью значений «0», показывающих пользователю, что датчик прекратил отправлять сообщения.

Решение

Нам понадобится две ноды «Trigger». Одна – для того, чтобы определить, было ли сообщение получено спустя заданное количество времени, а другая – чтобы отправлять «сообщения-заглушки» через регулярные периоды времени.

Пример

[{"id":"9ccdf268.c96ff","type":"inject","z":"ac14500e.2c57d","name":"","topic":"","payload":"","payloadType":"date","repeat":"","crontab":"","once":false,"onceDelay":0.1,"x":100,"y":1660,"wires":[["38950a5.28d15f6","2c532f67.0330e"]]},{"id":"38950a5.28d15f6","type":"debug","z":"ac14500e.2c57d","name":"","active":true,"tosidebar":true,"console":false,"tostatus":false,"complete":"false","x":610,"y":1660,"wires":[]},{"id":"2c532f67.0330e","type":"trigger","z":"ac14500e.2c57d","op1":"reset","op2":"true","op1type":"str","op2type":"bool","duration":"2","extend":true,"units":"s","reset":"","bytopic":"all","name":"","x":260,"y":1700,"wires":[["e4e42b96.97a338"]]},{"id":"e4e42b96.97a338","type":"trigger","z":"ac14500e.2c57d","op1":"0","op2":"0","op1type":"num","op2type":"str","duration":"-2","extend":false,"units":"s","reset":"reset","bytopic":"all","name":"","x":420,"y":1700,"wires":[["38950a5.28d15f6"]]}]

Разбор

В примере выше верхняя ветка – это обычный поток сообщений (от ноды «Inject» к ноде «Debug»).

Нижняя ветка потока – это две ноды «Trigger». Первая из них настроена таким образом, что в самом начале отправляет значение «reset», а затем ждет 2 секунды прежде, чем отправить таймаутное сообщение. Кроме того, в настройках этой ноды поставлена галочка рядом с пунктом «extend delay if new message arrives». Это значит, что если сообщения будут приходить без перерыва, нода ничего делать не будет. Но если с момента прибытия последнего сообщения пройдет 2 секунды, она отправит таймаутное сообщение.

Таймаутное сообщение отправляется второй ноде «Trigger». Она настроена на то, чтобы каждые 2 секунды отправлять значение «0» в верхнюю ветку потока. Кроме того, эта нода настроена так, чтобы перестать отправлять нули, если получит «msg.payload» со значением «reset». Поскольку это первое значение, отправляемое первой нодой «Trigger» при получении сообщения от датчика, это заставит вторую ноду «Trigger» сбросить таймер, т.к. это будет значить, что датчик возобновил отправку собственных сообщений.

См.также

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