I have investigated the problem and tested, beside the thermostat node, also the switch node and the selector switch, as these are the node that are used and also sends commands back to your USB-ESP.
I found that the only node that returns a command on MQTT out is the thermostat node. The other ones do not return a MQTT out command, if they receive a status update on the MQTT input.
It is not what I had expected and in my opinion the Thermostat should not return a command on MQTT out.
While testing, I also found two other bugs (the same), which has been corrected as well.
As it only applies to incoming status updates to the thermostat device, I block only thermostat outgoing commands during 250 msec, after a status update for the Thermostat device has been received.
In my case 250 msec was enough, but you might want to do some tests with different values, if necessary..
In order to use the new flow, you have to install a new node, if not done before.
To do so, go to the "Hamburger" menu and select "Manage palette". Go to "Install" and search for: "node-red-contrib-simple-gate".
Install this module.
Post starting June. 2nd, 2020 14:38 I described the working of the gate.
Can you replace your existing flow with this new one, as there are the following changes:
- correction in Function node, called "To Domoticz" in lines 32 and 78 ("nvalaue":1 changed no "nvalue": 0)
- added 3 nodes to prevent MQTT loop for Thermostat node.
Code: Select all
[{"id":"68bd7ad.9fccc84","type":"mqtt in","z":"95e506f1.1038d","name":"","topic":"myhome/topic/+","qos":"0","datatype":"auto","broker":"9136b136.ffa5a","x":200,"y":220,"wires":[["d2541dab.eb513","9ee4d50e.2de438"]]},{"id":"ca543182.bf65","type":"debug","z":"95e506f1.1038d","name":"","active":true,"tosidebar":true,"console":false,"tostatus":false,"complete":"false","statusVal":"","statusType":"auto","x":610,"y":160,"wires":[]},{"id":"d972de82.247a18","type":"mqtt out","z":"95e506f1.1038d","name":"","topic":"domoticz/in","qos":"0","retain":"false","broker":"9136b136.ffa5a","x":610,"y":220,"wires":[]},{"id":"ceb584c5.533378","type":"mqtt in","z":"95e506f1.1038d","name":"","topic":"domoticz/out","qos":"2","datatype":"json","broker":"9136b136.ffa5a","x":190,"y":545,"wires":[["358b0c09.08538c"]]},{"id":"358b0c09.08538c","type":"switch","z":"95e506f1.1038d","name":"Filter Haier Commands","property":"payload.idx","propertyType":"msg","rules":[{"t":"eq","v":"253","vt":"num"},{"t":"eq","v":"247","vt":"num"},{"t":"eq","v":"248","vt":"num"},{"t":"eq","v":"249","vt":"num"},{"t":"eq","v":"251","vt":"num"},{"t":"eq","v":"252","vt":"num"},{"t":"eq","v":"255","vt":"num"}],"checkall":"true","repair":false,"outputs":7,"x":430,"y":545,"wires":[["feaeee49.a4a35"],["bf2ffdd0.ea5db8"],["1a75f100.5454c7"],["400d7b0a.3f83ac"],["a6a851b6.d7a12"],["8f421108.cf8ac8"],["fce8813.b2ecf"]]},{"id":"7295f34.ad2e70c","type":"comment","z":"95e506f1.1038d","name":"Output explanation","info":"1. Lock Remote\n2. Power\n3. Health\n4. Swing\n5. Fan Speed\n6. Mode\n7. Thermostat Setpoint","x":410,"y":645,"wires":[]},{"id":"bf2ffdd0.ea5db8","type":"function","z":"95e506f1.1038d","name":"Lock Remote","func":"msg.topic = \"myhome/topic/set/Lock_Remote\";\nmsg.payload = msg.payload.nvalue.toString();\nreturn msg;","outputs":1,"noerr":0,"initialize":"","finalize":"","x":680,"y":440,"wires":[["e977c161.b80918"]]},{"id":"1a75f100.5454c7","type":"function","z":"95e506f1.1038d","name":"Power","func":"msg.topic = \"myhome/topic/set/Power\";\nmsg.payload = msg.payload.nvalue.toString();\nreturn msg;","outputs":1,"noerr":0,"initialize":"","finalize":"","x":650,"y":480,"wires":[["e977c161.b80918"]]},{"id":"400d7b0a.3f83ac","type":"function","z":"95e506f1.1038d","name":"Health","func":"msg.topic = \"myhome/topic/set/Health\";\nmsg.payload = msg.payload.nvalue.toString();\nreturn msg;","outputs":1,"noerr":0,"initialize":"","finalize":"","x":650,"y":520,"wires":[["e977c161.b80918"]]},{"id":"a6a851b6.d7a12","type":"function","z":"95e506f1.1038d","name":"Swing","func":"msg.topic = \"myhome/topic/set/Swing\";\nif ((msg.payload.nvalue === 0) && msg.payload.svalue1 == \"0\") {\n msg.payload = \"off\";\n} else if (msg.payload.nvalue === 2) {\n switch (msg.payload.svalue1) {\n case \"10\":\n msg.payload = \"ud\";\n break;\n \n case \"20\":\n msg.payload = \"lr\";\n break;\n\n case \"30\":\n msg.payload = \"all\";\n break;\n\n }\n}\nreturn msg;","outputs":1,"noerr":0,"initialize":"","finalize":"","x":650,"y":560,"wires":[["e977c161.b80918"]]},{"id":"8f421108.cf8ac8","type":"function","z":"95e506f1.1038d","name":"Fan Speed","func":"msg.topic = \"myhome/topic/set/Fan_Speed\";\nif (msg.payload.nvalue === 2) {\n switch (msg.payload.svalue1) {\n case \"10\":\n msg.payload = \"max\";\n break;\n \n case \"20\":\n msg.payload = \"mid\";\n break;\n\n case \"30\":\n msg.payload = \"min\";\n break;\n\n case \"40\":\n msg.payload = \"auto\";\n break;\n\n }\n}\nreturn msg;","outputs":1,"noerr":0,"initialize":"","finalize":"","x":670,"y":600,"wires":[["e977c161.b80918"]]},{"id":"fce8813.b2ecf","type":"function","z":"95e506f1.1038d","name":"Mode","func":"msg.topic = \"myhome/topic/set/Mode\";\nif ((msg.payload.nvalue === 0) && msg.payload.svalue1 == \"0\") {\n msg.payload = \"off\";\n} else if (msg.payload.nvalue === 2) {\n switch (msg.payload.svalue1) {\n case \"10\":\n msg.payload = \"dry\";\n break;\n\n case \"20\":\n msg.payload = \"heat\";\n break;\n \n case \"30\":\n msg.payload = \"cool\";\n break;\n\n case \"40\":\n msg.payload = \"auto\";\n break;\n\n }\n}\nreturn msg;","outputs":1,"noerr":0,"initialize":"","finalize":"","x":650,"y":640,"wires":[["e977c161.b80918"]]},{"id":"feaeee49.a4a35","type":"function","z":"95e506f1.1038d","name":"Set Temperature","func":"msg.topic = \"myhome/topic/set/Set_Temp\";\nmsg.payload = msg.payload.svalue1;\nif (Number(msg.payload) < 16) (msg.payload) = \"16.00\";\nif (Number(msg.payload) > 30) (msg.payload) = \"30.00\";\nreturn msg;","outputs":1,"noerr":0,"initialize":"","finalize":"","x":690,"y":400,"wires":[["305bd6e2.f7e4ea"]]},{"id":"e977c161.b80918","type":"mqtt out","z":"95e506f1.1038d","name":"MQTT to Haier","topic":"","qos":"0","retain":"false","broker":"9136b136.ffa5a","x":1080,"y":540,"wires":[]},{"id":"d2541dab.eb513","type":"function","z":"95e506f1.1038d","name":"To Domoticz","func":"switch (msg.topic) {\n\n case \"myhome/topic/Fresh\":\n msg.payload = {\"command\":\"switchlight\",\"idx\":246,\"switchcmd\":msg.payload.charAt(0).toUpperCase() + msg.payload.slice(1)};\n break;\n \n case \"myhome/topic/Lock_Remote\":\n if (msg.payload == \"true\") {\n msg.payload = {\"command\":\"switchlight\",\"idx\":247,\"switchcmd\":\"On\"};\n } else if (msg.payload == \"false\") {\n msg.payload = {\"command\":\"switchlight\",\"idx\":247,\"switchcmd\":\"Off\"};\n }\n break;\n \n case \"myhome/topic/Power\":\n msg.payload = {\"command\":\"switchlight\",\"idx\":248,\"switchcmd\":msg.payload.charAt(0).toUpperCase() + msg.payload.slice(1)};\n break;\n \n case \"myhome/topic/Health\":\n msg.payload = {\"command\":\"switchlight\",\"idx\":249,\"switchcmd\":msg.payload.charAt(0).toUpperCase() + msg.payload.slice(1)};\n break;\n \n case \"myhome/topic/Compressor\":\n msg.payload = {\"command\":\"switchlight\",\"idx\":250,\"switchcmd\":msg.payload.charAt(0).toUpperCase() + msg.payload.slice(1)};\n break;\n \n case \"myhome/topic/Swing\": \n \n switch (msg.payload) {\n\n case \"off\":\n msg.payload = {\"command\":\"udevice\",\"idx\":251,\"nvalue\":0,\"svalue\":\"0\"};\n break;\n \n case \"ud\":\n msg.payload = {\"command\":\"udevice\",\"idx\":251,\"nvalue\":1,\"svalue\":\"10\"};\n break;\n\n case \"lr\":\n msg.payload = {\"command\":\"udevice\",\"idx\":251,\"nvalue\":1,\"svalue\":\"20\"};\n break;\n\n case \"all\":\n msg.payload = {\"command\":\"udevice\",\"idx\":251,\"nvalue\":1,\"svalue\":\"30\"};\n break;\n\n }\n break;\n \n case \"myhome/topic/Fan_Speed\": \n \n switch (msg.payload) {\n\n case \"max\":\n msg.payload = {\"command\":\"udevice\",\"idx\":252,\"nvalue\":1,\"svalue\":\"10\"};\n break;\n \n case \"mid\":\n msg.payload = {\"command\":\"udevice\",\"idx\":252,\"nvalue\":1,\"svalue\":\"20\"};\n break;\n\n case \"min\":\n msg.payload = {\"command\":\"udevice\",\"idx\":252,\"nvalue\":1,\"svalue\":\"30\"};\n break;\n\n case \"auto\":\n msg.payload = {\"command\":\"udevice\",\"idx\":252,\"nvalue\":1,\"svalue\":\"40\"};\n break;\n\n }\n break;\n \n case \"myhome/topic/Mode\": \n \n switch (msg.payload) {\n\n case \"Off\":\n msg.payload = {\"command\":\"udevice\",\"idx\":255,\"nvalue\":0,\"svalue\":\"0\"};\n break;\n \n case \"Dry\":\n msg.payload = {\"command\":\"udevice\",\"idx\":255,\"nvalue\":1,\"svalue\":\"10\"};\n break;\n\n case \"Heat\":\n msg.payload = {\"command\":\"udevice\",\"idx\":255,\"nvalue\":1,\"svalue\":\"20\"};\n break;\n\n case \"Cool\":\n msg.payload = {\"command\":\"udevice\",\"idx\":255,\"nvalue\":1,\"svalue\":\"30\"};\n break;\n\n case \"Auto\":\n msg.payload = {\"command\":\"udevice\",\"idx\":255,\"nvalue\":1,\"svalue\":\"40\"};\n break;\n\n }\n break;\n \n case \"myhome/topic/Set_Temp\":\n msg.payload = {\"command\":\"udevice\",\"idx\":253,\"nvalue\":0,\"svalue\":msg.payload};\n break; \n \n case \"myhome/topic/Current_Temp\":\n msg.payload = {\"command\":\"udevice\",\"idx\":254,\"nvalue\":0,\"svalue\":msg.payload};\n break;\n \n}\n\nreturn msg;","outputs":1,"noerr":0,"initialize":"","finalize":"","x":410,"y":220,"wires":[["d972de82.247a18","ca543182.bf65"]]},{"id":"8f6bc3ad.da4b8","type":"comment","z":"95e506f1.1038d","name":"246 Fresh 247 Lock_Remote 248 Power 249 Health 250 Compressor 251 Swing 252 Fan_Speed 253 Set_Temp 254 Current_Temp 255 Mode","info":"246 Fresh\n247 Lock_Remote\n248 Power\n249 Health\n250 Compressor\n251 Swing\n252 Fan_Speed\n253 Set_Temp\n254 Current_Temp\n255 Mode","x":590,"y":60,"wires":[]},{"id":"b1b7bcd5.fdb2b8","type":"trigger","z":"95e506f1.1038d","name":"","op1":"","op2":"open","op1type":"pay","op2type":"str","duration":"250","extend":true,"units":"ms","reset":"","bytopic":"all","topic":"topic","outputs":1,"x":680,"y":300,"wires":[["305bd6e2.f7e4ea"]]},{"id":"305bd6e2.f7e4ea","type":"gate","z":"95e506f1.1038d","name":"Gate","controlTopic":"control","defaultState":"open","openCmd":"open","closeCmd":"close","toggleCmd":"toggle","defaultCmd":"default","persist":false,"x":890,"y":400,"wires":[["e977c161.b80918","52236be3.57f05c"]]},{"id":"9ee4d50e.2de438","type":"function","z":"95e506f1.1038d","name":"Create Gate Control","func":"if (msg.topic == \"myhome/topic/Set_Temp\") {\n msg.topic = \"control\";\n msg.payload = \"close\";\n return [msg, null];\n} else {\n return [null,msg]\n}","outputs":1,"noerr":0,"initialize":"","finalize":"","x":440,"y":300,"wires":[["b1b7bcd5.fdb2b8"]]},{"id":"52236be3.57f05c","type":"debug","z":"95e506f1.1038d","name":"","active":true,"tosidebar":true,"console":false,"tostatus":false,"complete":"false","statusVal":"","statusType":"auto","x":1070,"y":400,"wires":[]},{"id":"9136b136.ffa5a","type":"mqtt-broker","z":"","name":"localhost","broker":"127.0.0.1","port":"1883","clientid":"","usetls":false,"compatmode":true,"keepalive":"60","cleansession":true,"birthTopic":"","birthQos":"0","birthPayload":"","closeTopic":"","closeQos":"0","closePayload":"","willTopic":"","willQos":"0","willPayload":""}]
Test it carefully and let me know.
As said, it might be necessary to play with the time in the trigger node (currently 250 msec)