diff --git a/kasa/smartbulb.py b/kasa/smartbulb.py index e5dcfbe9..c2d09539 100644 --- a/kasa/smartbulb.py +++ b/kasa/smartbulb.py @@ -34,6 +34,9 @@ TPLINK_KELVIN = { r"KL430": ColorTempRange(2500, 9000), } + +NON_COLOR_MODE_FLAGS = {"transition_period", "on_off"} + _LOGGER = logging.getLogger(__name__) @@ -211,8 +214,14 @@ class SmartBulb(SmartDevice): if "on_off" not in state: state["on_off"] = 1 - # This is necessary to allow turning on into a specific state - state["ignore_default"] = 1 + # If we are turning on without any color mode flags, + # we do not want to set ignore_default to ensure + # we restore the previous state. + if state["on_off"] and NON_COLOR_MODE_FLAGS.issuperset(state): + state["ignore_default"] = 0 + else: + # This is necessary to allow turning on into a specific state + state["ignore_default"] = 1 light_state = await self._query_helper( self.LIGHT_SERVICE, self.SET_LIGHT_METHOD, state diff --git a/kasa/tests/test_bulb.py b/kasa/tests/test_bulb.py index ea8a28cb..03215442 100644 --- a/kasa/tests/test_bulb.py +++ b/kasa/tests/test_bulb.py @@ -232,3 +232,16 @@ async def test_non_dimmable(dev): assert dev.brightness == 0 with pytest.raises(SmartDeviceException): await dev.set_brightness(100) + + +@bulb +async def test_ignore_default_not_set_without_color_mode_change_turn_on(dev, mocker): + query_helper = mocker.patch("kasa.SmartBulb._query_helper") + # When turning back without settings, ignore default to restore the state + await dev.turn_on() + args, kwargs = query_helper.call_args_list[0] + assert args[2] == {"on_off": 1, "ignore_default": 0} + + await dev.turn_off() + args, kwargs = query_helper.call_args_list[1] + assert args[2] == {"on_off": 0, "ignore_default": 1}