Sync three climate controls

I’ve got three heating units in one giant room. The attached climate controls have switches on them to change the temperature. I’d like to synchronize the temperature that has been changed on any of the climate control to be reflected on all three.

My setup looks like this:

What happened until a few days ago (before upgrading):

  1. I changed the temperature on one device (e.g. from 19°C to 21°C)
  2. the last change (21°C) was propagated through the debounce node to all three nodes
  3. the other two nodes’ state change to 21°C was debounced and the last change was propagated again to all three nodes

Since all three nodes are now at 21°C, the last change was ignored and the cycle is complete.

In rare edge cases of the network being overwhelmed, this sometimes lead to one effect. When one of the devices was very slow to answer, it could send over the old value, which would lead to a flip-flop between 19°C and 21°C (in the example) - however, this would just happen once or twice and regulate itself out, as soon as the network was stable enough again.

Since the last update, this does not work anymore and I get changes to old values all of the time. It just flip-flops all the time between the previous and the new value and I have no idea why.

Has anyone else designed a flow to sync multiple devices like this?

You can disable the triggers briefly after a msg comes through. Then renable them after the changes have occurred.

[{"id":"01586dce1acb8a7f","type":"trigger-state","z":"ec78a76b.a0a4d","name":"","server":"6b1110b5.183a4","version":1,"exposeToHomeAssistant":false,"haConfig":[{"property":"name","value":""},{"property":"icon","value":""}],"entityid":"","entityidfiltertype":"exact","debugenabled":false,"constraints":[{"targetType":"this_entity","targetValue":"","propertyType":"current_state","comparatorType":"is","comparatorValueDatatype":"str","comparatorValue":"","propertyValue":"new_state.state"}],"inputs":1,"outputs":2,"customoutputs":[],"outputinitially":false,"state_type":"str","enableInput":true,"x":430,"y":2500,"wires":[["9c95deef8826641b"],[]]},{"id":"67180987726929f0","type":"trigger-state","z":"ec78a76b.a0a4d","name":"","server":"6b1110b5.183a4","version":1,"exposeToHomeAssistant":false,"haConfig":[{"property":"name","value":""},{"property":"icon","value":""}],"entityid":"","entityidfiltertype":"exact","debugenabled":false,"constraints":[{"targetType":"this_entity","targetValue":"","propertyType":"current_state","comparatorType":"is","comparatorValueDatatype":"str","comparatorValue":"","propertyValue":"new_state.state"}],"inputs":1,"outputs":2,"customoutputs":[],"outputinitially":false,"state_type":"str","enableInput":true,"x":430,"y":2560,"wires":[["9c95deef8826641b"],[]]},{"id":"43b98add16f3ce5b","type":"trigger-state","z":"ec78a76b.a0a4d","name":"","server":"6b1110b5.183a4","version":1,"exposeToHomeAssistant":false,"haConfig":[{"property":"name","value":""},{"property":"icon","value":""}],"entityid":"","entityidfiltertype":"exact","debugenabled":false,"constraints":[{"targetType":"this_entity","targetValue":"","propertyType":"current_state","comparatorType":"is","comparatorValueDatatype":"str","comparatorValue":"","propertyValue":"new_state.state"}],"inputs":1,"outputs":2,"customoutputs":[],"outputinitially":false,"state_type":"str","enableInput":true,"x":430,"y":2620,"wires":[["9c95deef8826641b"],[]]},{"id":"1f3fd334fb7a05c3","type":"link out","z":"ec78a76b.a0a4d","name":"","mode":"link","links":[],"x":875,"y":2500,"wires":[]},{"id":"2824f9dae7cc90e0","type":"link in","z":"ec78a76b.a0a4d","name":"","links":[],"x":195,"y":2500,"wires":[["01586dce1acb8a7f","67180987726929f0","43b98add16f3ce5b"]]},{"id":"9c95deef8826641b","type":"trigger","z":"ec78a76b.a0a4d","name":"","op1":"disable","op2":"enable","op1type":"str","op2type":"str","duration":"3","extend":false,"overrideDelay":false,"units":"s","reset":"","bytopic":"all","topic":"topic","outputs":1,"x":700,"y":2500,"wires":[["1f3fd334fb7a05c3"]]},{"id":"6b1110b5.183a4","type":"server","name":"Home Assistant","version":2,"addon":true,"rejectUnauthorizedCerts":true,"ha_boolean":"y|yes|true|on|home|open","connectionDelay":true,"cacheJson":true,"heartbeat":false,"heartbeatInterval":30}]