我有一个声音传感器,它发送一个mqtt消息到node-red,而node-red发送一个新的mqtt消息给模块供电或者关闭灯。它与电源的红外代码相同或关灯。 我的目标是知道什么时候开机以及什么时候开机。所以我试图使用一个简单的布尔代码,但它不起作用,因为它不保存以前的状态。
我找到了不同的解决方案,但是这些人将新状态保存在“cookie”上,问题是,在Node-Red中我们找不到这种东西。 我无法安装节点,因为我使用的是云托管的Node-Red(https://fred.sensetecnic.com/)
我测试了许多不同的代码,我选择了这个代码,因为它很容易理解我想要做的事情:
var value = true;
if (msg.payload === "sensor detection"){
if (value === true){
!value;
msg.payload = "off";
}else{
!value;
msg.payload = "on";
}
}
return msg;
我在这里发帖是因为我真的不知道怎么做,我尝试了很多不同的代码,现在我在谷歌上找不到更多。我不是很好,也不知道Javascript中的所有不同技巧,所以我希望有经验的人可以给我有趣的信息来找到解决方案。
THX!
答案 0 :(得分:2)
您需要使用上下文对象在执行函数节点之间存储状态:
context.value = context.value || true;
if (msg.payload === "sensor detection"){
if (context.value === true){
!context.value;
msg.payload = "off";
}else{
!context.value;
msg.payload = "on";
}
}
return msg;
答案 1 :(得分:0)
这是我的最终代码:
//i changed "sensor detection" for "input"
if(msg.payload === "input"){
if(context.global.state === false){
msg.payload = true;
}else{
msg.payload = false;
}
context.global.state = msg.payload;
}
return msg;
还有另一个函数用于存储第一个值:
context.global.state = false;
这是最终的节点红色代码:
[{"id":"f49168ea.0b6e98","type":"debug","name":"","active":true,"console":"false","complete":"false","x":1175,"y":1664,"z":"a08c8e03.5f737","wires":[]},{"id":"33e86259.cc179e","type":"function","name":"Main function","func":"if(msg.payload === \"input\"){\n\nif(context.global.state === false){\n msg.payload = true; \n}else{\n msg.payload = false;\n}\ncontext.global.state = msg.payload;\n}\nreturn msg;","outputs":1,"noerr":0,"x":883,"y":1712,"z":"a08c8e03.5f737","wires":[["f49168ea.0b6e98"]]},{"id":"9a2c2fc6.65d3d","type":"function","name":"First value","func":"//push \"Start\" only once after deployed.\ncontext.global.state = false;\nreturn msg;","outputs":1,"noerr":0,"x":381,"y":1714,"z":"a08c8e03.5f737","wires":[["33e86259.cc179e"]]},{"id":"b81c9765.47e368","type":"inject","name":"Input(mqtt etc)","topic":"","payload":"input","payloadType":"string","repeat":"","crontab":"","once":false,"x":361,"y":1648,"z":"a08c8e03.5f737","wires":[["33e86259.cc179e"]]},{"id":"c77a0446.3885f8","type":"inject","name":"","topic":"","payload":"Start","payloadType":"string","repeat":"","crontab":"","once":false,"x":146,"y":1714,"z":"a08c8e03.5f737","wires":[["9a2c2fc6.65d3d"]]}]
那些页面也帮助了我: http://noderedguide.com/index.php/2015/11/06/node-red-lecture-6-intermediate-flows-2/ 这个(这对我的个人代码非常有用): https://www.ibm.com/developerworks/community/blogs/hickmat/entry/nodered_powered_christmas_lights?lang=en
答案 2 :(得分:0)
我搜索了很长时间! 谢谢你
这是我的贡献,可以使用多个切换功能:
/*
To use more toggle functions we give them
a unique name here
*/
var fname = "toggle1";
if(msg.payload === "input"){
if(context.get(fname) === false){
msg.payload = true;
}else{
msg.payload = false;
}
context.set(fname, msg.payload);
}
return msg;
答案 3 :(得分:0)
也许是根据每个切换功能的ID进行此操作的更好方法。这使它易于使用,每个切换无需设置。每个切换按钮都有其自己的状态,该状态由唯一的ID存储。
// Toggle Function (unique to nodes id)
if(context.get(node.id) === true){
msg.payload = false;
}else{
msg.payload = true;
}
context.set(node.id, msg.payload);
return msg;
节点红色代码:[{"id":"2f72e700.98a7aa","type":"function","z":"56c38643.490368","name":"Toogle","func":"// Toggle Function (unique to nodes id)\nif(context.get(node.id) === true){\n msg.payload = false; \n}else{\n msg.payload = true;\n}\ncontext.set(node.id, msg.payload);\nreturn msg;","outputs":"1","noerr":0,"initialize":"","finalize":"","x":210,"y":340,"wires":[["f05ff5d3.904228"]]}]