Node-Red JavaScript布尔切换

时间:2016-01-13 22:19:46

标签: javascript boolean toggle node-red

我有一个声音传感器,它发送一个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!

4 个答案:

答案 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"]]}]