From 36a22400e55cdad1f953547cf6af74249cba407c Mon Sep 17 00:00:00 2001 From: Teemu R Date: Fri, 8 Oct 2021 00:20:26 +0200 Subject: [PATCH] Fix transition handling for tplink lights (#57272) * Fix transition handling for tplink light * Apply suggestions from code review * Test that all transitions are passed correctly * Fix linting Co-authored-by: Paulus Schoutsen --- homeassistant/components/tplink/light.py | 8 +++-- tests/components/tplink/test_light.py | 42 +++++++++++++++--------- 2 files changed, 32 insertions(+), 18 deletions(-) diff --git a/homeassistant/components/tplink/light.py b/homeassistant/components/tplink/light.py index f0e911ea412..49e8adbf08e 100644 --- a/homeassistant/components/tplink/light.py +++ b/homeassistant/components/tplink/light.py @@ -63,7 +63,9 @@ class TPLinkSmartBulb(CoordinatedTPLinkEntity, LightEntity): @async_refresh_after async def async_turn_on(self, **kwargs: Any) -> None: """Turn the light on.""" - transition = kwargs.get(ATTR_TRANSITION) + if (transition := kwargs.get(ATTR_TRANSITION)) is not None: + transition = int(transition * 1_000) + if (brightness := kwargs.get(ATTR_BRIGHTNESS)) is not None: brightness = round((brightness * 100.0) / 255.0) @@ -92,7 +94,9 @@ class TPLinkSmartBulb(CoordinatedTPLinkEntity, LightEntity): @async_refresh_after async def async_turn_off(self, **kwargs: Any) -> None: """Turn the light off.""" - await self.device.turn_off(transition=kwargs.get(ATTR_TRANSITION)) + if (transition := kwargs.get(ATTR_TRANSITION)) is not None: + transition = int(transition * 1_000) + await self.device.turn_off(transition=transition) @property def min_mireds(self) -> int: diff --git a/tests/components/tplink/test_light.py b/tests/components/tplink/test_light.py index 501221f5a6f..93d8cdbf07d 100644 --- a/tests/components/tplink/test_light.py +++ b/tests/components/tplink/test_light.py @@ -1,5 +1,6 @@ """Tests for light platform.""" +from typing import Optional from unittest.mock import PropertyMock import pytest @@ -14,6 +15,7 @@ from homeassistant.components.light import ( ATTR_MIN_MIREDS, ATTR_RGB_COLOR, ATTR_SUPPORTED_COLOR_MODES, + ATTR_TRANSITION, ATTR_XY_COLOR, DOMAIN as LIGHT_DOMAIN, ) @@ -45,8 +47,9 @@ async def test_light_unique_id(hass: HomeAssistant) -> None: assert entity_registry.async_get(entity_id).unique_id == "AABBCCDDEEFF" -async def test_color_light(hass: HomeAssistant) -> None: - """Test a light.""" +@pytest.mark.parametrize("transition", [2.0, None]) +async def test_color_light(hass: HomeAssistant, transition: Optional[float]) -> None: + """Test a color light and that all transitions are correctly passed.""" already_migrated_config_entry = MockConfigEntry( domain=DOMAIN, data={}, unique_id=MAC_ADDRESS ) @@ -58,6 +61,11 @@ async def test_color_light(hass: HomeAssistant) -> None: await hass.async_block_till_done() entity_id = "light.my_bulb" + KASA_TRANSITION_VALUE = transition * 1_000 if transition is not None else None + + BASE_PAYLOAD = {ATTR_ENTITY_ID: entity_id} + if transition: + BASE_PAYLOAD[ATTR_TRANSITION] = transition state = hass.states.get(entity_id) assert state.state == "on" @@ -72,50 +80,52 @@ async def test_color_light(hass: HomeAssistant) -> None: assert attributes[ATTR_XY_COLOR] == (0.42, 0.336) await hass.services.async_call( - LIGHT_DOMAIN, "turn_off", {ATTR_ENTITY_ID: entity_id}, blocking=True + LIGHT_DOMAIN, "turn_off", BASE_PAYLOAD, blocking=True ) - bulb.turn_off.assert_called_once() + bulb.turn_off.assert_called_once_with(transition=KASA_TRANSITION_VALUE) - await hass.services.async_call( - LIGHT_DOMAIN, "turn_on", {ATTR_ENTITY_ID: entity_id}, blocking=True - ) - bulb.turn_on.assert_called_once() + await hass.services.async_call(LIGHT_DOMAIN, "turn_on", BASE_PAYLOAD, blocking=True) + bulb.turn_on.assert_called_once_with(transition=KASA_TRANSITION_VALUE) bulb.turn_on.reset_mock() await hass.services.async_call( LIGHT_DOMAIN, "turn_on", - {ATTR_ENTITY_ID: entity_id, ATTR_BRIGHTNESS: 100}, + {**BASE_PAYLOAD, ATTR_BRIGHTNESS: 100}, blocking=True, ) - bulb.set_brightness.assert_called_with(39, transition=None) + bulb.set_brightness.assert_called_with(39, transition=KASA_TRANSITION_VALUE) bulb.set_brightness.reset_mock() await hass.services.async_call( LIGHT_DOMAIN, "turn_on", - {ATTR_ENTITY_ID: entity_id, ATTR_COLOR_TEMP: 150}, + {**BASE_PAYLOAD, ATTR_COLOR_TEMP: 150}, blocking=True, ) - bulb.set_color_temp.assert_called_with(6666, brightness=None, transition=None) + bulb.set_color_temp.assert_called_with( + 6666, brightness=None, transition=KASA_TRANSITION_VALUE + ) bulb.set_color_temp.reset_mock() await hass.services.async_call( LIGHT_DOMAIN, "turn_on", - {ATTR_ENTITY_ID: entity_id, ATTR_COLOR_TEMP: 150}, + {**BASE_PAYLOAD, ATTR_COLOR_TEMP: 150}, blocking=True, ) - bulb.set_color_temp.assert_called_with(6666, brightness=None, transition=None) + bulb.set_color_temp.assert_called_with( + 6666, brightness=None, transition=KASA_TRANSITION_VALUE + ) bulb.set_color_temp.reset_mock() await hass.services.async_call( LIGHT_DOMAIN, "turn_on", - {ATTR_ENTITY_ID: entity_id, ATTR_HS_COLOR: (10, 30)}, + {**BASE_PAYLOAD, ATTR_HS_COLOR: (10, 30)}, blocking=True, ) - bulb.set_hsv.assert_called_with(10, 30, None, transition=None) + bulb.set_hsv.assert_called_with(10, 30, None, transition=KASA_TRANSITION_VALUE) bulb.set_hsv.reset_mock()