如何汇总多个输入?

时间:2019-03-23 20:22:09

标签: function node-red

我正在尝试读取LuvitRED(其他形式的节点红色)中的5个微动开关。为了在程序的其余部分中有用,五个传感器应该合计为1个整数。

enter image description here

上图是节点红色的布局。最初,我打算将每个输入转换为单独的函数。底部显示了第二个概念,其中所有微动开关都在1个功能中进行读取和求和。

想法是:

  • 微动开关1 = 1(处于活动状态)
  • 微动开关2 = 10
  • 微动开关3 = 100,依此类推。

这样,当我将它们全部加总时,最终数字将在0000011111之间,具体取决于哪个处于活动状态,并易于识别哪个微动开关处于活动状态。

图像的底部使用简单的按钮,当按下按钮进行快速测试时,它们都会发送msg.payload = 1。此功能的代码在下面提到。

我在Google上搜索了此问题,许多论坛都指出,将change函数(将1更改为10或更多)与join函数结合使用是可行的。但是令人遗憾的是,在LuvitRED中没有连接功能,因为它是Node-RED的更改版本。

if not msg then
-- called on startup
return
end

flow.microswitch1 = 0;
flow.microswitch2 = 0;
flow.microswitch3 = 0;
flow.microswitch4 = 0;
flow.microswitch5 = 0;

if (msg.topic == 'microswitch1') then
  flow.microswitch1 = msg.payload;
 elseif (msg.topic == 'microswitch2') then
  flow.microswitch2 = msg.payload * 10;
 elseif (msg.topic == 'microswitch3') then
  flow.microswitch3 = msg.payload * 100;
 elseif (msg.topic == 'microswitch4') then
  flow.microswitch4 = msg.payload * 1000;
 elseif (msg.topic == 'microswitch5') then
  flow.microswitch5 = msg.payload * 10000;
end

global.availableSpaces = flow.microswitch1 + flow.microswitch2 +                     
flow.microswitch3 + flow.microswitch4 + flow.microswitch5
msg.payload = global.availableSpaces

return msg

我希望它能正常工作,因为我现在仅使用按钮,按下按钮时总是发送1 msg.payload。但是由于某些原因,按下按钮时出现输入错误,但调试器中没有任何结果。你们都对如何解决此问题有任何想法吗?

1 个答案:

答案 0 :(得分:0)

假设您不能使用join节点(这是正常的做法),则可以使用流变量。尽管您需要检查LuvitRed是否支持flow.getflow.set,以及两次重启之间是否具有持久存储。

读取微动开关时,只需将其保存到流量变量即可:

flow.set('microswitch1', msg.payload); // or however you're getting the value

然后func中的每一行都将遵循以下内容:

var microswitch1 = flow.get('microswitch1') || 0;
// etc

这样,如果microswitch2尚未更改,它将使用0代替。

但是结果是您需要照顾到最终func在收到的每条消息上运行。等待所有消息的唯一方法是使用join