首页 > 解决方案 > 如何对多个输入求和?

问题描述

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

在此处输入图像描述

上图是 node-RED 的布局。起初,我打算将每个输入转换为一个单独的函数。底部显示了第二个想法,其中所有微动开关都被读取并汇总为 1 个函数。

这个想法是:

这样,当我将它们全部相加时,最终数字将介于两者之间0000011111取决于哪些是活动的,并且可以轻松识别哪些微动开关处于活动状态。

图像的底部使用了简单的按钮,msg.payload = 1按下时都会发送一个用于快速测试的按钮。该函数的代码在下面提到。

我用谷歌搜索了这个问题,很多论坛都说使用 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。然而,由于某种原因,当我按下按钮时出现输入错误,而调试器没有任何结果。大家对我如何解决这个问题有任何想法吗?

标签: functionnode-red

解决方案


假设您不能使用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.


推荐阅读