node red setInterval return 同值

node red setInterval return same value

我的问题是我有一个函数节点每 2 秒从 PIR 传感器读取输入 0 或 1。我希望我的功能节点在从传感器读取 1 后将输出 1 保持 10 秒。

var newMsg;

if (msg.payload === 1 ){
    newMsg = {payload:0};
    setInterval(returnMsg, 10000);
}

else{
    newMsg = {payload:1};
}

return newMsg;



function returnMsg(){
    return newMsg;
}

我尝试使用 setInterval,但它不起作用。

编辑:

非常感谢大家的回复!

具体来说:

flow

仪表将是这样的:

gauge

我想要做的是,一旦 PIR 传感器检测到运动,仪表将显示 0 大约 10 秒。但现在一旦传感器读数发生变化,仪表就会不断变化。

只需检查自上次 1 收到后是否不到 10 秒:

这一行应该在读取传感器值的函数之外

var last = new Date(2000, 1, 1,  1, 1);

然后在你的函数中:

if (msg.payload === 1 ){
    last = new Date();
}

return (new Date() - last)<10000?1:0;

满足您的要求的一种可能方法是使用开关节点作为门。此门将首先打开以允许消息流。当有效负载为“1”时,表示 PIR 被触发,功能节点内的代码将通过更改控制切换节点的流上下文变量来关闭门。同时,函数节点中的代码会配置一个10秒内重开大门的回调函数。

函数内代码:

if (msg.payload === 1) {
    closeGate();
}


function closeGate() {
        flow.set("gateopen", false); //close gate
        setTimeout(openGate, 10000); // reopen gate within 10 seconds
}


function openGate() {
    flow.set("gateopen", true);
}

flow.get("gateopen") ? node.status({fill:"green",shape:"ring",text:"Opened"}) :
                       node.status({fill:"red",shape:"ring",text:"Closed"});

return msg;

流量:

[{"id":"8696aea0.42f8f","type":"tab","label":"Flow 3","disabled":false,"info":""},{"id":"e3f585c9.421cb8","type":"inject","z":"8696aea0.42f8f","name":"","topic":"","payload":"0","payloadType":"num","repeat":"2","crontab":"","once":true,"onceDelay":"0.5","x":190,"y":200,"wires":[["be4bd9b8.de4d78"]]},{"id":"be4bd9b8.de4d78","type":"switch","z":"8696aea0.42f8f","name":"","property":"gateopen","propertyType":"flow","rules":[{"t":"true"}],"checkall":"true","repair":false,"outputs":1,"x":370,"y":220,"wires":[["23cd0407.7efcec"]]},{"id":"63b4ec7c.b18904","type":"inject","z":"8696aea0.42f8f","name":"","topic":"","payload":"1","payloadType":"num","repeat":"","crontab":"","once":false,"onceDelay":0.1,"x":190,"y":240,"wires":[["be4bd9b8.de4d78"]]},{"id":"db6c9c0d.4c21b","type":"debug","z":"8696aea0.42f8f","name":"","active":true,"tosidebar":true,"console":false,"tostatus":true,"complete":"payload","targetType":"msg","x":670,"y":220,"wires":[]},{"id":"fbf0ec86.55906","type":"inject","z":"8696aea0.42f8f","name":"Open gate","topic":"","payload":"","payloadType":"date","repeat":"","crontab":"","once":true,"onceDelay":"0.5","x":190,"y":120,"wires":[["2325a5f7.0d1d1a"]]},{"id":"23cd0407.7efcec","type":"function","z":"8696aea0.42f8f","name":"Gate","func":"if (msg.payload === 1) {\n    closeGate();\n}\n\n\nfunction closeGate() {\n        flow.set(\"gateopen\", false); //close gate\n        setTimeout(openGate, 10000); // reopen gate within 10 seconds\n}\n\n\nfunction openGate() {\n    flow.set(\"gateopen\", true);\n}\n\nflow.get(\"gateopen\") ? node.status({fill:\"green\",shape:\"ring\",text:\"Opened\"}) :\n                       node.status({fill:\"red\",shape:\"ring\",text:\"Closed\"});\n\nreturn msg;","outputs":1,"noerr":0,"x":510,"y":220,"wires":[["db6c9c0d.4c21b"]]},{"id":"2325a5f7.0d1d1a","type":"change","z":"8696aea0.42f8f","name":"Open gate","rules":[{"t":"set","p":"gateopen","pt":"flow","to":"true","tot":"bool"}],"action":"","property":"","from":"","to":"","reg":false,"x":350,"y":120,"wires":[[]]}]

如果发生新的 PIR 事件,下面是延长计时器的替代流程:

[{"id":"585ba08b.3667e","type":"tab","label":"Flow 3","disabled":false,"info":""},{"id":"4cb35501.7c04fc","type":"inject","z":"585ba08b.3667e","name":"","topic":"","payload":"0","payloadType":"num","repeat":"2","crontab":"","once":true,"onceDelay":"0.5","x":190,"y":200,"wires":[["87ab9f12.fd8ad"]]},{"id":"e1699672.cb5788","type":"switch","z":"585ba08b.3667e","name":"","property":"gateopen","propertyType":"flow","rules":[{"t":"true"}],"checkall":"true","repair":false,"outputs":1,"x":590,"y":200,"wires":[["c40dbf1f.79ef4"]]},{"id":"aafaf20e.95d46","type":"inject","z":"585ba08b.3667e","name":"","topic":"","payload":"1","payloadType":"num","repeat":"","crontab":"","once":false,"onceDelay":0.1,"x":190,"y":240,"wires":[["87ab9f12.fd8ad"]]},{"id":"c40dbf1f.79ef4","type":"debug","z":"585ba08b.3667e","name":"","active":true,"tosidebar":true,"console":false,"tostatus":true,"complete":"payload","targetType":"msg","x":810,"y":200,"wires":[]},{"id":"5e76c261.a4f9ac","type":"inject","z":"585ba08b.3667e","name":"Open gate","topic":"","payload":"","payloadType":"date","repeat":"","crontab":"","once":true,"onceDelay":"0.5","x":190,"y":120,"wires":[["b255cf40.af298"]]},{"id":"4c13bbad.850434","type":"function","z":"585ba08b.3667e","name":"Gate","func":"if (flow.get(\"gateopen\")) {\n    closeGate(); // gate is opened and will be closes it for 10 seconds\n} else {\n    extendGate(); // gate is already closed. The timer will reset and  new 10 second timeout will start\n}\n\n\nfunction closeGate() {\n        flow.set(\"gateopen\", false); //close gate\n        flow.set(\"gateid\", setTimeout(openGate, 10000));\n}\n\n\nfunction openGate() {\n    flow.set(\"gateopen\", true);\n}\n\nfunction extendGate() {\n    clearTimeout(flow.get(\"gateid\"));\n    closeGate();\n}\n\n\nreturn msg;","outputs":1,"noerr":0,"x":590,"y":240,"wires":[["c40dbf1f.79ef4"]]},{"id":"b255cf40.af298","type":"change","z":"585ba08b.3667e","name":"Open gate","rules":[{"t":"set","p":"gateopen","pt":"flow","to":"true","tot":"bool"}],"action":"","property":"","from":"","to":"","reg":false,"x":350,"y":120,"wires":[[]]},{"id":"87ab9f12.fd8ad","type":"switch","z":"585ba08b.3667e","name":"","property":"payload","propertyType":"msg","rules":[{"t":"eq","v":"0","vt":"num"},{"t":"eq","v":"1","vt":"num"}],"checkall":"true","repair":false,"outputs":2,"x":370,"y":220,"wires":[["e1699672.cb5788"],["4c13bbad.850434"]]}]