function - 如何对多个输入求和?
问题描述
我正在尝试读取 LuvitRED 中的 5 个微动开关(其他形式的节点红色)。为了在程序的其余部分中有用,5 个传感器应该组合成 1 个整数。
上图是 node-RED 的布局。起初,我打算将每个输入转换为一个单独的函数。底部显示了第二个想法,其中所有微动开关都被读取并汇总为 1 个函数。
这个想法是:
- 微动开关 1 = 1(激活时)
- 微动开关 2 = 10
- 微动开关 3 = 100 依此类推。
这样,当我将它们全部相加时,最终数字将介于两者之间00000
并11111
取决于哪些是活动的,并且可以轻松识别哪些微动开关处于活动状态。
图像的底部使用了简单的按钮,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。然而,由于某种原因,当我按下按钮时出现输入错误,而调试器没有任何结果。大家对我如何解决这个问题有任何想法吗?
解决方案
假设您不能使用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
.
推荐阅读
- c - 使用 sem_t 时大小为 8 的无效写入
- angular - 如何在 ftl 文件中获取当前页面 url
- javascript - Angular 模板未在 RxJS 可观察更改上更新
- api - 无法连接到服务器端 API
- android - Android Studio 4.2 在我尝试打开它时没有响应
- python - 为什么在这个例子中没有提出未定义的 NameError?
- angular - 同一客户端的不同重定向 uri - Keycloak + Angular + SpringBoot
- angular - 从 Angular 9 升级到 11,仅对未执行的测试有问题
- sql - MongoDB :: 将 SQL 转换为 MongoDB
- android - Kotlin“何时”不中断(Java 中的 switch case 选项)