Реализация двух входов в Node-RED

в моем текущем проекте мы пытаемся реализовать текущую функциональность приложения с помощью узел-красный. Функциональность показана ниже. Здесь состояние огня получает два входа: (1) TemperatureSensor (2) SmokeDetector. Оба датчика публикуют данные с помощью издателей MQTT. и Firestate компонент может получать данные через MQTT subsciber.

состояние огня может производить вывод на основе этих двух параметров, который является if temperaturevalue > 70 and Smokevalue == true. В связи с этим мой вопрос -- поддерживает ли Node-RED функциональность двух входов? если да, то как мы можем реализовать эту функцию? Если нет, тогда.. Могу ли я сказать, что две функции ввода не могут быть реализованы с помощью Node-RED???? Как мы видели, Node-RED предоставляет несколько выходов, а не входов.

enter image description here

3 ответов


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

что-то вроде этого:

context.temp = context.temp || 0.0;
context.smoke = context.smoke || false;

if (msg.topic === 'smokeDetector') {
  context.smoke = msg.payload;
} else if (msg.topic === 'tempSensor') {
  context.temp = msg.payload;
}

if (context.temp >= 70.0 && context.smoke) {
  return {topic: 'fireState', payload: 'FIRE!'}
} else {
  return null
}

более подробную информацию можно найти в узле функции doc здесь


вы можете подключить любое количество входов к любому узлу - просто имейте в виду, что ваш узел будет видеть только один вход msg за раз. Нет присущей агрегации msg просто потому, что есть несколько входных проводов.

вместо этого задача агрегирования нескольких входных msgs обрабатывается определенными узлами, некоторые из которых встроены в основной сервер node-red, а некоторые из них были предоставлены сообществом. Которых вы должны выбрать, будет зависеть от конкретного случая использования. Для например, должны ли два объекта быть добавлены в массив или объединены в один большой объект? Только вы будете знать, что вы хотите-node-red не делает никаких предположений, но дает вам разные узлы для обработки многих распространенных случаев использования. Для любых других случаев использования всегда есть generic function узел, в котором вы можете использовать javascript для реализации любого поведения, которое вам нужно.

для вашего первоначального вопроса Вы ищете способ объединить 2 полезные нагрузки от разных датчиков в один объект. Ядро join и change узлы могут быть использованы для этого, как node-red-contrib-bool-gate и node-red-contrib-aggregator узлы, найденные на библиотека потоков сайт.

вот пример объединения двух входов датчика с помощью join узел, а затем с помощью switch узел с выражением payload.temp > 70 and payload.smoke чтобы определить, следует ли отправлять msg вниз по потоку:

payloads","mode":"custom","build":"object","property":"payload","propertyType":"msg","key":"topic","joiner":"\n","joinerType":"str","accumulate":true,"timeout":"","count":"2","reduceRight":false,"reduceExp":"","reduceInit":"","reduceInitType":"","reduceFixup":"","x":430,"y":1200,"wires":[["315c9ce3.570d64","50f981b4.be654"]]},{"id":"315c9ce3.570d64","type":"switch","z":"f9a2eec9.c2e26","name":"сигнализация?","собственность":"полезные.temp > 70 и payload.smoke","propertyType":"jsonata","rules":[{"t":"true"}],"checkall":"true","repair":false,"outputs":1,"x":640,"y":1200,"wires":[["50f981b4.be654"]]},{"id":"50f981b4.be654","type":"debug","z":"f9a2eec9.c2e26","name":"","active":true,"tosidebar":true,"console":false,"tostatus":false,"complete":"false","x":690,"y":1260,"wires":[]}]

можно использовать Узла и меняем его конфигурация установив режим вручную, и используйте фиксированное количество сообщений как 2. Затем, как только оба входа будут получены, вы можете вызвать следующий функциональный узел. Узел Join может объединять как полезную нагрузку, так и массив или объект. И затем в последнем коде функции вы можете отправить объединенные данные в MQTT после проверки вашего состояния.