我正在尝试读取LuvitRED(其他形式的节点红色)中的5个微动开关。为了在程序的其余部分中有用,五个传感器应该合计为1个整数。
上图是节点红色的布局。最初,我打算将每个输入转换为单独的函数。底部显示了第二个概念,其中所有微动开关都在1个功能中进行读取和求和。
想法是:
这样,当我将它们全部加总时,最终数字将在00000
和11111
之间,具体取决于哪个处于活动状态,并易于识别哪个微动开关处于活动状态。
图像的底部使用简单的按钮,当按下按钮进行快速测试时,它们都会发送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。但是由于某些原因,按下按钮时出现输入错误,但调试器中没有任何结果。你们都对如何解决此问题有任何想法吗?
答案 0 :(得分:0)
假设您不能使用join
节点(这是正常的做法),则可以使用流变量。尽管您需要检查LuvitRed是否支持flow.get
和flow.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
。