Paulo,
Desde que o motive, tudo bem! Mas porque não aprender Node red a fazer novas automações? Assim não está a duplicar coisas que já tem e aproveita o tempo, que dispende na aprendizagem! Importe o código abaixo para um novo flow no node red. Analise a função Anterior VS Actual. No meu caso eu tenho dois valores anteriores e dois novos, quando um valor “novo” é actualizado, a função vai carregar o valor anterior, compara com o novo, executa uma condição e no final guarda o novo valor.
[{"id":"d25ba615.19ed78","type":"function","z":"7c67bb31.ba4454","name":"Anterior VS Actual","func":"var values = flow.get([\"a_anterior\",\"b_anterior\"])||0;\n//var b_anterior = context.get('b_anterior')||0;\n//var2 - Sensor Porta\n//var1 - Sensor Fechadura\na_anterior = values[0];\nb_anterior = values[1];\nvar a;\nvar b;\n\nswitch(msg.topic){\n //Mudou Fechadura\n case \"var1\":\n a = msg.payload;\n b = b_anterior;\n //context.set('a_anterior',a);\n if (a===\"ON\"&&a_anterior===\"OFF\"){\n msg.payload = \"alarm_disarm\";}\n if (a===\"ON\"&&a_anterior===\"ON\"){\n msg.payload = \"alarm_disarm\";}\n if ((a===\"OFF\")&&(b===\"off\")){\n msg.payload = \"alarm_arm_home\";}\n if ((a===\"OFF\")&&(b===\"on\")){\n msg.payload = \"alarm_arm_away\";}\n flow.set([\"a_anterior\",\"b_anterior\"],[a,b]);\n return msg;\n case \"var2\":\n b = msg.payload;\n a = a_anterior;\n msg.payload = null;\n //context.set('b_anterior',b);\n //if ((a===\"ON\")&&(b===\"on\")){\n // msg.payload = \"Destrancada e aberta\";}\n //if ((a===\"ON\")&&(b===\"off\")){\n // msg.payload = \"Destrancada e fechada\";}\n flow.set([\"a_anterior\",\"b_anterior\"],[a,b]);\n break;\n default:\n msg = null;\n break;\n}\nreturn;","outputs":1,"noerr":0,"initialize":"","finalize":"","x":1450,"y":520,"wires":[["6b47c0d3.e624d"]]}]