красный узел setInterval возвращает то же значение - PullRequest
0 голосов
/ 16 марта 2019

Моя проблема в том, что у меня есть функциональный узел, который считывает вход 0 или 1 с датчика PIR каждые 2 секунды.Я хочу, чтобы мой функциональный узел сохранял вывод 1 в течение 10 секунд после считывания 1 с датчика.

var newMsg;

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

else{
    newMsg = {payload:1};
}

return newMsg;



function returnMsg(){
    return newMsg;
}

Я пытаюсь использовать setInterval, но он не работает.

edit:

Спасибо всем большое за ответ!

, чтобы быть конкретным:

flow

и датчик будет выглядеть следующим образом:

датчик

я пытаюсь сделать так, чтобы при обнаружении движения с помощью ИК-датчика датчикпоказать на 0, как 10 с.но теперь датчик продолжает меняться после считывания показаний датчика.

Ответы [ 2 ]

1 голос
/ 16 марта 2019

Одним из возможных способов удовлетворения ваших требований является использование узла коммутатора в качестве шлюза. Эти ворота будут первоначально открыты, позволяя поток сообщений. Когда полезная нагрузка равна «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":[[]]}]

enter image description here

Ниже альтернативного потока для расширения таймера, если происходит новое событие 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"]]}]

enter image description here

0 голосов
/ 16 марта 2019

Просто проверьте, прошло ли менее 10 секунд с момента получения последнего 1:

эта строка должна быть вне вашей функции, которая считывает значение датчика

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

и затем в вашей функции:

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

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