在我目前的项目中,我们尝试使用 Node-RED 来实现当前的应用程序功能。功能如下所示。这里,Fire状态接收两个输入:(1)TemperatureSensor
(2)SmokeDetector
。两个传感器都使用MQTT发布者发布数据。和Firestate
组件可以通过MQTT子网接收数据。
火灾状态可以根据if temperaturevalue > 70 and Smokevalue == true
这两个参数生成输出。鉴于此,我的问题是 - Node-RED是否支持两种输入功能?如果是,那么我们如何实现此功能呢?如果没有,那么..我可以说使用Node-RED无法实现两个输入功能吗?我们已经看到Node-RED提供多个输出,但不提供输入。
答案 0 :(得分:13)
您需要使用函数节点并使用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 here
中找到更多详细信息答案 1 :(得分:0)
您可以将任意数量的输入连接到任何节点 - 只需要知道您的节点一次只能看到一个输入消息。没有固有的消息聚合只是因为有多条输入线。
相反,聚合多个输入消息的任务由某些节点处理 - 其中一些节点内置于核心节点 - 红色服务器,一些节点由社区贡献。您应该选择哪一个取决于具体的用例。例如,应该将两个对象附加到数组中,还是合并为一个大对象?只有你会知道你想要什么 - node-red不会做任何假设,但会给你不同的节点来处理许多常见的用例。对于任何其他用例,始终存在通用function
节点,您可以使用javascript来实现您需要的任何行为。
对于您的原始问题,您正在寻找一种方法将来自不同传感器的2个有效负载合并为单个对象。可以使用核心join
和change
节点,flow library网站上的node-red-contrib-bool-gate
和node-red-contrib-aggregator
节点也可以使用。
以下是使用join
节点组合两个传感器输入,然后使用带有表达式switch
的{{1}}节点来确定是否向下发送msg的示例:< / p>
[{ “ID”: “87df68f8.51ad58”, “类型”: “注射”, “Z”: “f9a2eec9.c2e26”, “姓名”: “”, “主题”: “烟”,“有效载荷“:” 真”, “载荷类型”: “布尔”, “重复”: “”, “crontab的”: “”, “一次”:假 “onceDelay”:0.1, “×”:160, “Y”: 1180年, “线”:[[ “da4182a8.47939”]]},{ “ID”: “3ad419ec.1453a6”, “类型”: “注射”, “Z”: “f9a2eec9.c2e26”, “姓名”: “”, “主题”: “烟”, “有效载荷”: “假”, “载荷类型”: “布尔”, “重复”: “”, “crontab中”: “”, “曾经”:假的, “onceDelay” :0.1, “×”:170, “Y”:1140, “线”:[[ “da4182a8.47939”]]},{ “ID”: “a45b3cb0.f3312”, “类型”: “注射”,” Z “:” f9a2eec9.c2e26" , “名”: “”, “主题”: “温度”, “有效载荷”: “65”, “载荷类型”: “民”, “重复”: “”, “的crontab” : “”, “一次”:假 “onceDelay”:0.1, “×”:160, “Y”:1220, “线”:[[ “da4182a8.47939”]]},{ “ID”:“a3b07d81 .e6b17" , “类型”: “注入”, “Z”: “f9a2eec9.c2e26”, “名”: “”, “主题”: “温度”, “有效载荷”: “75”, “载荷类型”:” NUM “ ”重复“: ”“, ”crontab的“: ”“, ”一次“:假 ”onceDelay“:0.1, ”ד:160, ”Y“:1260, ”线“:[[” da4182a8。 47939“]]},{”id“:”da4182a8.47939“,”type“:”join“,”z“:”f9a2eec9.c2e26“,”name“:”join payloads“,”mode“:”custom“ “” BUI LD “:” 对象 “ ”属性“: ”有效载荷“, ”属性类型“: ”味精“, ”关键“: ”主题“, ”木匠“: ”\ n“, ”joinerType“: ”海峡“,” 积聚“:真,” 超时 “:””, “数”: “2”, “reduceRight”:假的, “reduceExp”: “”, “reduceInit”: “”, “reduceInitType”: “”, “reduceFixup”: “”, “×”:430, “Y”:1200, “线”:[[ “315c9ce3.570d64”, “50f981b4.be654”]]},{ “ID”: “315c9ce3.570d64”, “类型” :“switch”,“z”:“f9a2eec9.c2e26”,“name”:“Trigger Alarm?”,“property”:“payload.temp&gt; 70和payload.smoke“,”propertyType“:”jsonata“,”rules“:[{”t“:”true“}],”checkall“:”true“,”repair“:false,”outputs“:1中, “x”:640, “Y”:1200, “线”:[[ “50f981b4.be654”]]},{ “ID”: “50f981b4.be654”, “类型”: “调试”, “z” 的: “f9a2eec9.c2e26”, “名”: “”, “主动”:真实的, “tosidebar”:真正的 “控制台”:假的, “tostatus”:假的, “完全”: “假”, “X”: 690, “Y”:1260, “线”:[]}]
答案 2 :(得分:0)
我们可以使用Join Node并通过将模式设置为手动来更改其configuration,并使用固定数量的消息作为2.然后,一旦接收到两个输入,您就可以调用下一个功能节点。 Join节点可以将有效负载组合为数组或对象。然后在最后一个功能代码中,您可以在检查条件后将组合数据发送到MQTT。