2 way switch sonoff - How to?

I’ve just set it up yesterday mine, I don’t have an issue with it, but I’ve used a slightly different rule. I don’t think it’s matters here. But my switch has a ‘cooldown’ time by default, in that time it doesn’t accept a new command to registered, so maybe that’s why I can’t reproduce this. However, I would suggest trying to increase the ButtonDebounce time, and instead of directly message the other switch, create a group topic put both switches into that topic and turn the power on and off with that topic. That might stop that effect. In your case, the problem is that the two switches can be in a different state when you changing the states. The only possible solution that I see now to reduce the latency of your network or put a cooldown so it can’t be pressed again within x second after button press (at least to change the state), where the x needs to be greater than the latency of your network from A to B to A switch. What you need to prevent is to send A switch to B to turn on while B sends A switch to turn off.

Will try the GroupTopic thing, that might help to keep them in sync. Actually, I haven’t thought about the logic of that all the way through, but yolo

The GroupTopic publishing rule didn’t work, got another infinite loop today. There is no way with Tasmota I can find to avoid this infinite loop problem, unless they give us the ability in Rules to differentiate between different MQTT topics as well as the physical switch instead of just the “power” state.

I’m moving to Home Assistant’s new automation modes to do this instead. Automations are now by default “single” mode, and you can add a sub-second delay now, both thanks to the 0.113 update. So I’ve added a delay of milliseconds: 250 to the end of my 2-way/synced switch automation to avoid this infinite loop once and for all.

I found this topic after having the same crazy switching issue with my setup too, which is similar to the OP except I have switches at top and bottom of my stairwell. Only the top switch is connected to lamps, the bottom one is connected to power but is effectively just a remote. Both are 3 gang switches.
I’m fairly new to HA and Tasmota, but I think (I hope?) I have it sorted now so wanted to share what I have.
I think the trick is only having one device ever send commands based on its power state; the other one only ever sends MQTT commands on button state.
In my setup, the rules are, for the top switch:
ON Power1#State DO Publish cmnd/StairBottomLights/POWER1 %value% ENDON

And for the bottom switch:
ON Button1#State=2 DO Publish cmnd/StairTopLights/POWER1 TOGGLE ENDON

Seems to be working so far… Will report back if it fails though!

I think that might be about the best way you could handle it. As long as both devices are not responding to and sending out messages on the same topic like I had previously tried with POWER, then I think you’ll avoid the feedback loop.

Thank you for this.

So far so good and instant!

I had the same issue and found the best way to solve it was to add a delay to the
rule of the master switch (the one that is connected to the light). So basically when the switch state of the master switch changes to off (only the off rule not the on) delay 2 seconds before switching off the slave switch. This prevents and loop happening and has no delay to button to light times.
This has been working for me for the last 12 months.

1 Like

Hi, I’m just about to program a few switches for 2 way operation and I also had this mad switching loop. Would you mind sharing what you did to set those rules to make it work?

Yes, please could you share the delay

Ok so here’s the rule for the master switch ( the one that is connected to the Light):
Rule1 on Power1#state=1 do publish cmnd//POWER ON endon on Power1#state=0 do Backlog Delay 20; publish cmnd//POWER OFF endon

And the slave switch:
Rule1 on Power1#state=1 do publish cmnd//POWER ON endon on Power1#state=0 do publish cmnd//POWER OFF endon

Obviously *** is the topic of the switch and 20 in the example s the delay time (10 = 1 second I believe)
And remember to activate the rule with Rule1 1

You can switch either switch on and off as fast as you like without any loop, however if you do it to the master switch you will need to wait a few seconds for the back log of delayed ‘OFF’ commands to clear before switching the switch back on. With this in mind sometime you can lower the delay value so the back log of delayed off commands clear faster.

If anyone has a better way please let me know.

:slight_smile:

2 Likes

Thank you Martyn, really much appreciated!

I changed my rules to follow the above but im still able to get it rapidly go on and off again.

Main Bedroom (2 gang. button 2 is the activator)
on Power2#state=1 do publish cmnd/main_bedroom_entrance/POWER ON endon on Power2#state=0 do Backlog Delay 20; publish cmnd/main_bedroom_entrance/POWER OFF endon

Entrance to bedroom (1 gang)
on Power#state=1 do publish cmnd/main_bedroom/POWER2 ON endon on Power#state=0 do publish cmnd/main_bedroom/POWER2 OFF endon


06:02:41 MQT: stat/main_bedroom/RESULT = {"POWER2":"OFF"}
06:02:41 MQT: stat/main_bedroom/POWER2 = OFF (retained)
06:02:41 MQT: stat/main_bedroom/RESULT = {"POWER2":"OFF"}
06:02:41 MQT: stat/main_bedroom/POWER2 = OFF (retained)
06:02:41 MQT: stat/main_bedroom/RESULT = {"POWER2":"ON"}
06:02:41 MQT: stat/main_bedroom/POWER2 = ON (retained)
06:02:41 RUL: POWER2#STATE=1 performs "publish cmnd/main_bedroom_entrance/POWER ON"
06:02:41 MQT: cmnd/main_bedroom_entrance/POWER = ON
06:02:41 MQT: stat/main_bedroom/RESULT = {"POWER2":"OFF"}
06:02:41 MQT: stat/main_bedroom/POWER2 = OFF (retained)
06:02:41 RUL: POWER2#STATE=0 performs "Backlog Delay 20; publish cmnd/main_bedroom_entrance/POWER OFF"
06:02:41 MQT: stat/main_bedroom/RESULT = {"POWER2":"ON"}
06:02:41 MQT: stat/main_bedroom/POWER2 = ON (retained)
06:02:41 RUL: POWER2#STATE=1 performs "publish cmnd/main_bedroom_entrance/POWER ON"
06:02:41 MQT: cmnd/main_bedroom_entrance/POWER = ON
06:02:45 MQT: stat/main_bedroom/POWER2 = ON (retained)
06:02:45 RUL: POWER2#STATE=1 performs "publish cmnd/main_bedroom_entrance/POWER ON"
06:02:45 MQT: cmnd/main_bedroom_entrance/POWER = ON
06:02:45 MQT: stat/main_bedroom/RESULT = {"POWER2":"OFF"}
06:02:45 MQT: stat/main_bedroom/POWER2 = OFF (retained)
06:02:45 RUL: POWER2#STATE=0 performs "Backlog Delay 20; publish cmnd/main_bedroom_entrance/POWER OFF"
06:02:45 MQT: stat/main_bedroom/RESULT = {"POWER2":"ON"}
06:02:45 MQT: stat/main_bedroom/POWER2 = ON (retained)
06:02:45 RUL: POWER2#STATE=1 performs "publish cmnd/main_bedroom_entrance/POWER ON"
06:02:45 MQT: cmnd/main_bedroom_entrance/POWER = ON
06:02:45 MQT: stat/main_bedroom/RESULT = {"POWER2":"OFF"}
06:02:45 MQT: stat/main_bedroom/POWER2 = OFF (retained)
06:02:45 RUL: POWER2#STATE=0 performs "Backlog Delay 20; publish cmnd/main_bedroom_entrance/POWER OFF"
06:02:45 MQT: stat/main_bedroom/RESULT = {"POWER2":"OFF"}
06:02:45 MQT: stat/main_bedroom/POWER2 = OFF (retained)
06:02:45 MQT: stat/main_bedroom/RESULT = {"POWER2":"ON"}
06:02:45 MQT: stat/main_bedroom/POWER2 = ON (retained)
06:02:45 RUL: POWER2#STATE=1 performs "publish cmnd/main_bedroom_entrance/POWER ON"
06:02:45 MQT: cmnd/main_bedroom_entrance/POWER = ON
06:02:45 MQT: stat/main_bedroom/RESULT = {"POWER2":"OFF"}
06:02:45 MQT: stat/main_bedroom/POWER2 = OFF (retained)
06:02:45 RUL: POWER2#STATE=0 performs "Backlog Delay 20; publish cmnd/main_bedroom_entrance/POWER OFF"
06:02:45 MQT: stat/main_bedroom/RESULT = {"POWER2":"OFF"}
06:02:45 MQT: stat/main_bedroom/POWER2 = OFF (retained)
06:02:46 MQT: stat/main_bedroom/RESULT = {"POWER2":"ON"}
06:02:46 MQT: stat/main_bedroom/POWER2 = ON (retained)
06:02:46 RUL: POWER2#STATE=1 performs "publish cmnd/main_bedroom_entrance/POWER ON"
06:02:46 MQT: cmnd/main_bedroom_entrance/POWER = ON
06:02:46 MQT: stat/main_bedroom/RESULT = {"POWER2":"OFF"}
06:02:46 MQT: stat/main_bedroom/POWER2 = OFF (retained)
06:02:46 RUL: POWER2#STATE=0 performs "Backlog Delay 20; publish cmnd/main_bedroom_entrance/POWER OFF"
06:02:46 MQT: stat/main_bedroom/RESULT = {"POWER2":"ON"}
06:02:46 MQT: stat/main_bedroom/POWER2 = ON (retained)
06:02:46 RUL: POWER2#STATE=1 performs "publish cmnd/main_bedroom_entrance/POWER ON"
06:02:46 MQT: cmnd/main_bedroom_entrance/POWER = ON
06:02:46 MQT: stat/main_bedroom/RESULT = {"POWER2":"OFF"}
06:02:46 MQT: stat/main_bedroom/POWER2 = OFF (retained)
06:02:46 RUL: POWER2#STATE=0 performs "Backlog Delay 20; publish cmnd/main_bedroom_entrance/POWER OFF"
06:02:46 MQT: stat/main_bedroom/RESULT = {"POWER2":"OFF"}
06:02:46 MQT: stat/main_bedroom/POWER2 = OFF (retained)
06:02:46 MQT: stat/main_bedroom/RESULT = {"POWER2":"ON"}
06:02:46 MQT: stat/main_bedroom/POWER2 = ON (retained)
06:02:46 RUL: POWER2#STATE=1 performs "publish cmnd/main_bedroom_entrance/POWER ON"
06:02:46 MQT: cmnd/main_bedroom_entrance/POWER = ON
06:02:46 MQT: stat/main_bedroom/RESULT = {"POWER2":"OFF"}
06:02:46 MQT: stat/main_bedroom/POWER2 = OFF (retained)
06:02:46 RUL: POWER2#STATE=0 performs "Backlog Delay 20; publish cmnd/main_bedroom_entrance/POWER OFF"
06:02:46 MQT: stat/main_bedroom/RESULT = {"POWER2":"OFF"}
06:02:46 MQT: stat/main_bedroom/POWER2 = OFF (retained)
06:02:46 MQT: stat/main_bedroom/RESULT = {"POWER2":"ON"}
06:02:46 MQT: stat/main_bedroom/POWER2 = ON (retained)
06:02:46 RUL: POWER2#STATE=1 performs "publish cmnd/main_bedroom_entrance/POWER ON"
06:02:46 MQT: cmnd/main_bedroom_entrance/POWER = ON
06:02:46 MQT: stat/main_bedroom/RESULT = {"POWER2":"OFF"}
06:02:46 MQT: stat/main_bedroom/POWER2 = OFF (retained)
06:02:46 RUL: POWER2#STATE=0 performs "Backlog Delay 20; publish cmnd/main_bedroom_entrance/POWER OFF"
06:02:46 MQT: stat/main_bedroom/RESULT = {"POWER2":"ON"}
06:02:46 MQT: stat/main_bedroom/POWER2 = ON (retained)
06:02:46 RUL: POWER2#STATE=1 performs "publish cmnd/main_bedroom_entrance/POWER ON"
06:02:46 MQT: cmnd/main_bedroom_entrance/POWER = ON
06:02:47 MQT: stat/main_bedroom/RESULT = {"POWER2":"ON"}
06:02:47 MQT: stat/main_bedroom/POWER2 = ON (retained)
06:02:47 RUL: POWER2#STATE=1 performs "publish cmnd/main_bedroom_entrance/POWER ON"
06:02:47 MQT: cmnd/main_bedroom_entrance/POWER = ON
06:02:47 MQT: stat/main_bedroom/RESULT = {"POWER2":"OFF"}
06:02:47 MQT: stat/main_bedroom/POWER2 = OFF (retained)
06:02:47 RUL: POWER2#STATE=0 performs "Backlog Delay 20; publish cmnd/main_bedroom_entrance/POWER OFF"
06:02:48 MQT: stat/main_bedroom/RESULT = {"POWER2":"OFF"}
06:02:48 MQT: stat/main_bedroom/POWER2 = OFF (retained)
06:02:48 MQT: stat/main_bedroom/RESULT = {"POWER2":"ON"}
06:02:48 MQT: stat/main_bedroom/POWER2 = ON (retained)
06:02:48 RUL: POWER2#STATE=1 performs "publish cmnd/main_bedroom_entrance/POWER ON"
06:02:48 MQT: cmnd/main_bedroom_entrance/POWER = ON
06:02:48 MQT: stat/main_bedroom/RESULT = {"POWER2":"OFF"}
06:02:48 MQT: stat/main_bedroom/POWER2 = OFF (retained)
06:02:48 RUL: POWER2#STATE=0 performs "Backlog Delay 20; publish cmnd/main_bedroom_entrance/POWER OFF"
06:02:48 MQT: stat/main_bedroom/RESULT = {"POWER2":"ON"}
06:02:48 MQT: stat/main_bedroom/POWER2 = ON (retained)
06:02:48 RUL: POWER2#STATE=1 performs "publish cmnd/main_bedroom_entrance/POWER ON"
06:02:48 MQT: cmnd/main_bedroom_entrance/POWER = ON
06:02:48 MQT: stat/main_bedroom/RESULT = {"POWER2":"OFF"}
06:02:48 MQT: stat/main_bedroom/POWER2 = OFF (retained)
06:02:48 RUL: POWER2#STATE=0 performs "Backlog Delay 20; publish cmnd/main_bedroom_entrance/POWER OFF"
06:02:48 MQT: stat/main_bedroom/RESULT = {"POWER2":"OFF"}
06:02:48 MQT: stat/main_bedroom/POWER2 = OFF (retained)
06:02:48 MQT: stat/main_bedroom/RESULT = {"POWER2":"ON"}
06:02:48 MQT: stat/main_bedroom/POWER2 = ON (retained)
06:02:48 RUL: POWER2#STATE=1 performs "publish cmnd/main_bedroom_entrance/POWER ON"
06:02:48 MQT: cmnd/main_bedroom_entrance/POWER = ON
06:02:48 MQT: stat/main_bedroom/RESULT = {"POWER2":"ON"}
06:02:48 MQT: stat/main_bedroom/POWER2 = ON (retained)
06:02:48 MQT: stat/main_bedroom/RESULT = {"POWER2":"OFF"}
06:02:48 MQT: stat/main_bedroom/POWER2 = OFF (retained)
06:02:48 RUL: POWER2#STATE=0 performs "Backlog Delay 20; publish cmnd/main_bedroom_entrance/POWER OFF"
06:02:48 MQT: stat/main_bedroom/RESULT = {"POWER2":"ON"}
06:02:48 MQT: stat/main_bedroom/POWER2 = ON (retained)
06:02:48 RUL: POWER2#STATE=1 performs "publish cmnd/main_bedroom_entrance/POWER ON"
06:02:48 MQT: cmnd/main_bedroom_entrance/POWER = ON
06:02:48 MQT: stat/main_bedroom/RESULT = {"POWER2":"OFF"}
06:02:48 MQT: stat/main_bedroom/POWER2 = OFF (retained)
06:02:48 RUL: POWER2#STATE=0 performs "Backlog Delay 20; publish cmnd/main_bedroom_entrance/POWER OFF"
06:02:48 MQT: stat/main_bedroom/RESULT = {"POWER2":"OFF"}
06:02:48 MQT: stat/main_bedroom/POWER2 = OFF (retained)
06:02:48 MQT: stat/main_bedroom/RESULT = {"POWER2":"ON"}
06:02:48 MQT: stat/main_bedroom/POWER2 = ON (retained)
06:02:48 RUL: POWER2#STATE=1 performs "publish cmnd/main_bedroom_entrance/POWER ON"
06:02:48 MQT: cmnd/main_bedroom_entrance/POWER = ON
06:02:48 MQT: stat/main_bedroom/RESULT = {"POWER2":"ON"}
06:02:48 MQT: stat/main_bedroom/POWER2 = ON (retained)
06:02:48 MQT: stat/main_bedroom/RESULT = {"POWER2":"OFF"}
06:02:48 MQT: stat/main_bedroom/POWER2 = OFF (retained)
06:02:48 RUL: POWER2#STATE=0 performs "Backlog Delay 20; publish cmnd/main_bedroom_entrance/POWER OFF"
06:02:48 MQT: stat/main_bedroom/RESULT = {"POWER2":"ON"}
06:02:48 MQT: stat/main_bedroom/POWER2 = ON (retained)
06:02:48 RUL: POWER2#STATE=1 performs "publish cmnd/main_bedroom_entrance/POWER ON"
06:02:48 MQT: cmnd/main_bedroom_entrance/POWER = ON
06:02:48 MQT: stat/main_bedroom/RESULT = {"POWER2":"OFF"}
06:02:48 MQT: stat/main_bedroom/POWER2 = OFF (retained)
06:02:48 RUL: POWER2#STATE=0 performs "Backlog Delay 20; publish cmnd/main_bedroom_entrance/POWER OFF"
06:02:48 MQT: stat/main_bedroom/RESULT = {"POWER2":"OFF"}
06:02:48 MQT: stat/main_bedroom/POWER2 = OFF (retained)
06:02:50 MQT: stat/main_bedroom/RESULT = {"POWER2":"ON"}
06:02:50 MQT: stat/main_bedroom/POWER2 = ON (retained)
06:02:50 RUL: POWER2#STATE=1 performs "publish cmnd/main_bedroom_entrance/POWER ON"
06:02:50 MQT: cmnd/main_bedroom_entrance/POWER = ON
06:02:50 MQT: stat/main_bedroom/RESULT = {"POWER2":"OFF"}
06:02:50 MQT: stat/main_bedroom/POWER2 = OFF (retained)
06:02:50 RUL: POWER2#STATE=0 performs "Backlog Delay 20; publish cmnd/main_bedroom_entrance/POWER OFF"
06:02:50 MQT: stat/main_bedroom/RESULT = {"POWER2":"ON"}
06:02:50 MQT: stat/main_bedroom/POWER2 = ON (retained)
06:02:50 RUL: POWER2#STATE=1 performs "publish cmnd/main_bedroom_entrance/POWER ON"
06:02:50 MQT: cmnd/main_bedroom_entrance/POWER = ON
06:02:50 MQT: stat/main_bedroom/RESULT = {"POWER2":"OFF"}
06:02:50 MQT: stat/main_bedroom/POWER2 = OFF (retained)
06:02:50 RUL: POWER2#STATE=0 performs "Backlog Delay 20; publish cmnd/main_bedroom_entrance/POWER OFF"
06:02:50 MQT: stat/main_bedroom/RESULT = {"POWER2":"OFF"}
06:02:50 MQT: stat/main_bedroom/POWER2 = OFF (retained)
06:02:50 MQT: stat/main_bedroom/RESULT = {"POWER2":"ON"}
06:02:50 MQT: stat/main_bedroom/POWER2 = ON (retained)
06:02:50 RUL: POWER2#STATE=1 performs "publish cmnd/main_bedroom_entrance/POWER ON"
06:02:50 MQT: cmnd/main_bedroom_entrance/POWER = ON
06:02:50 MQT: stat/main_bedroom/RESULT = {"POWER2":"OFF"}
06:02:50 MQT: stat/main_bedroom/POWER2 = OFF (retained)
06:02:50 RUL: POWER2#STATE=0 performs "Backlog Delay 20; publish cmnd/main_bedroom_entrance/POWER OFF"
06:02:50 MQT: stat/main_bedroom/RESULT = {"POWER2":"ON"}
06:02:50 MQT: stat/main_bedroom/POWER2 = ON (retained)
06:02:50 RUL: POWER2#STATE=1 performs "publish cmnd/main_bedroom_entrance/POWER ON"
06:02:50 MQT: cmnd/main_bedroom_entrance/POWER = ON
06:02:50 MQT: stat/main_bedroom/RESULT = {"POWER2":"OFF"}
06:02:50 MQT: stat/main_bedroom/POWER2 = OFF (retained)
06:02:50 RUL: POWER2#STATE=0 performs "Backlog Delay 20; publish cmnd/main_bedroom_entrance/POWER OFF"
06:02:50 MQT: stat/main_bedroom/RESULT = {"POWER2":"OFF"}
06:02:50 MQT: stat/main_bedroom/POWER2 = OFF (retained)
06:02:50 MQT: stat/main_bedroom/RESULT = {"POWER2":"ON"}
06:02:50 MQT: stat/main_bedroom/POWER2 = ON (retained)
06:02:50 RUL: POWER2#STATE=1 performs "publish cmnd/main_bedroom_entrance/POWER ON"
06:02:50 MQT: cmnd/main_bedroom_entrance/POWER = ON
06:02:50 MQT: stat/main_bedroom/RESULT = {"POWER2":"OFF"}
06:02:50 MQT: stat/main_bedroom/POWER2 = OFF (retained)
06:02:50 RUL: POWER2#STATE=0 performs "Backlog Delay 20; publish cmnd/main_bedroom_entrance/POWER OFF"
06:02:50 MQT: stat/main_bedroom/RESULT = {"POWER2":"ON"}
06:02:50 MQT: stat/main_bedroom/POWER2 = ON (retained)
06:02:50 RUL: POWER2#STATE=1 performs "publish cmnd/main_bedroom_entrance/POWER ON"
06:02:51 MQT: cmnd/main_bedroom_entrance/POWER = ON
06:02:51 MQT: stat/main_bedroom/RESULT = {"POWER2":"OFF"}
06:02:51 MQT: stat/main_bedroom/POWER2 = OFF (retained)
06:02:51 RUL: POWER2#STATE=0 performs "Backlog Delay 20; publish cmnd/main_bedroom_entrance/POWER OFF"
06:02:51 MQT: stat/main_bedroom/RESULT = {"POWER2":"ON"}
06:02:51 MQT: stat/main_bedroom/POWER2 = ON (retained)
06:02:51 RUL: POWER2#STATE=1 performs "publish cmnd/main_bedroom_entrance/POWER ON"
06:02:51 MQT: cmnd/main_bedroom_entrance/POWER = ON
06:02:51 MQT: stat/main_bedroom/RESULT = {"POWER2":"OFF"}
06:02:51 MQT: stat/main_bedroom/POWER2 = OFF (retained)
06:02:51 RUL: POWER2#STATE=0 performs "Backlog Delay 20; publish cmnd/main_bedroom_entrance/POWER OFF"
06:02:51 MQT: stat/main_bedroom/RESULT = {"POWER2":"OFF"}
06:02:51 MQT: stat/main_bedroom/POWER2 = OFF (retained)
06:02:51 MQT: stat/main_bedroom/RESULT = {"POWER2":"ON"}
06:02:51 MQT: stat/main_bedroom/POWER2 = ON (retained)
06:02:51 RUL: POWER2#STATE=1 performs "publish cmnd/main_bedroom_entrance/POWER ON"
06:02:51 MQT: cmnd/main_bedroom_entrance/POWER = ON

Have you any other automations or groups linking the switches?
Also I don’t use power retain within tasmota or mqtt retain within HA, it causes me all sorts of problems.
Have you got the delay on the switch that is connected to the light not the slave?

@tinimark Did it work for you?

Sorry for the late reply. Yes, this is working perfectly now.

Working great, thank you @martynhr

I have three two-way setups configured now. Two of them are using two buttons on the same 3-gang slave switch so I had to create rule1 and rule2.

needless to say this feature has improved the wife-acceptance-factor drastically.

That’s half of the battle :grin:

Is there a reason you couldn’t do this with Tasmota Device Groups, rather than manual rules? I haven’t fully groked the docs yet but it looks like it would work, is a bit cleaner, and would even work if your mqtt server went down. Cutting HA out of the equation has to be better for latency and system outages, which are a critical element of WAF.

2 Likes

Update: this is criminally easy with Device Groups. I’ve tried pretty hard and can’t trigger any of the looping behaviour described above with the rules based approach. Documenting the steps here for anyone who (like me) finds this over Google.

Note that in my case I have a 1-gang which really controls my foyer light, and a 4-gang which is going to fake control the light. You might need to move some of the below around if your setup is different.

  1. Make sure you’re running the latest Tasmota, Device Groups haven’t been around forever. If you haven’t done this before follow the instructions at Upgrading - Tasmota, noting in particular that you might want a URL pointing to the .bin (not the .tar.gz) if you’re on a really old version.

  2. Enable device groups on the switch that actually controls the light: SetOption85 1

  3. Enable individual relay control - my switch is a 1-gang, but just in case: SetOption88 1

  4. Set DevGroup 1 name (which is linked to relay 1) to something catchy: DevGroupName1 FoyerLight

  5. Enable device groups and individual relay controls on the other switch (SetOption 85 and 88 again)

  6. DevGroupName1 FoyerLight (subsitute 1 for N where relay N is your slave multi-way button)

Tested and works perfectly - the light toggles on and off from either switch, the button colours are synced (e.g if I turn it on from upstairs, the downstairs light switch shows the correct state visually).

5 Likes

Thanks! I’m going to try this. I don’t think device groups were a thing when this conversation started :slight_smile: