mirror of
https://github.com/home-assistant/core.git
synced 2025-07-09 14:27:07 +00:00
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 <paulus@home-assistant.io>
This commit is contained in:
parent
cd1a71b070
commit
36a22400e5
@ -63,7 +63,9 @@ class TPLinkSmartBulb(CoordinatedTPLinkEntity, LightEntity):
|
|||||||
@async_refresh_after
|
@async_refresh_after
|
||||||
async def async_turn_on(self, **kwargs: Any) -> None:
|
async def async_turn_on(self, **kwargs: Any) -> None:
|
||||||
"""Turn the light on."""
|
"""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:
|
if (brightness := kwargs.get(ATTR_BRIGHTNESS)) is not None:
|
||||||
brightness = round((brightness * 100.0) / 255.0)
|
brightness = round((brightness * 100.0) / 255.0)
|
||||||
|
|
||||||
@ -92,7 +94,9 @@ class TPLinkSmartBulb(CoordinatedTPLinkEntity, LightEntity):
|
|||||||
@async_refresh_after
|
@async_refresh_after
|
||||||
async def async_turn_off(self, **kwargs: Any) -> None:
|
async def async_turn_off(self, **kwargs: Any) -> None:
|
||||||
"""Turn the light off."""
|
"""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
|
@property
|
||||||
def min_mireds(self) -> int:
|
def min_mireds(self) -> int:
|
||||||
|
@ -1,5 +1,6 @@
|
|||||||
"""Tests for light platform."""
|
"""Tests for light platform."""
|
||||||
|
|
||||||
|
from typing import Optional
|
||||||
from unittest.mock import PropertyMock
|
from unittest.mock import PropertyMock
|
||||||
|
|
||||||
import pytest
|
import pytest
|
||||||
@ -14,6 +15,7 @@ from homeassistant.components.light import (
|
|||||||
ATTR_MIN_MIREDS,
|
ATTR_MIN_MIREDS,
|
||||||
ATTR_RGB_COLOR,
|
ATTR_RGB_COLOR,
|
||||||
ATTR_SUPPORTED_COLOR_MODES,
|
ATTR_SUPPORTED_COLOR_MODES,
|
||||||
|
ATTR_TRANSITION,
|
||||||
ATTR_XY_COLOR,
|
ATTR_XY_COLOR,
|
||||||
DOMAIN as LIGHT_DOMAIN,
|
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"
|
assert entity_registry.async_get(entity_id).unique_id == "AABBCCDDEEFF"
|
||||||
|
|
||||||
|
|
||||||
async def test_color_light(hass: HomeAssistant) -> None:
|
@pytest.mark.parametrize("transition", [2.0, None])
|
||||||
"""Test a light."""
|
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(
|
already_migrated_config_entry = MockConfigEntry(
|
||||||
domain=DOMAIN, data={}, unique_id=MAC_ADDRESS
|
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()
|
await hass.async_block_till_done()
|
||||||
|
|
||||||
entity_id = "light.my_bulb"
|
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)
|
state = hass.states.get(entity_id)
|
||||||
assert state.state == "on"
|
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)
|
assert attributes[ATTR_XY_COLOR] == (0.42, 0.336)
|
||||||
|
|
||||||
await hass.services.async_call(
|
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(
|
await hass.services.async_call(LIGHT_DOMAIN, "turn_on", BASE_PAYLOAD, blocking=True)
|
||||||
LIGHT_DOMAIN, "turn_on", {ATTR_ENTITY_ID: entity_id}, blocking=True
|
bulb.turn_on.assert_called_once_with(transition=KASA_TRANSITION_VALUE)
|
||||||
)
|
|
||||||
bulb.turn_on.assert_called_once()
|
|
||||||
bulb.turn_on.reset_mock()
|
bulb.turn_on.reset_mock()
|
||||||
|
|
||||||
await hass.services.async_call(
|
await hass.services.async_call(
|
||||||
LIGHT_DOMAIN,
|
LIGHT_DOMAIN,
|
||||||
"turn_on",
|
"turn_on",
|
||||||
{ATTR_ENTITY_ID: entity_id, ATTR_BRIGHTNESS: 100},
|
{**BASE_PAYLOAD, ATTR_BRIGHTNESS: 100},
|
||||||
blocking=True,
|
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()
|
bulb.set_brightness.reset_mock()
|
||||||
|
|
||||||
await hass.services.async_call(
|
await hass.services.async_call(
|
||||||
LIGHT_DOMAIN,
|
LIGHT_DOMAIN,
|
||||||
"turn_on",
|
"turn_on",
|
||||||
{ATTR_ENTITY_ID: entity_id, ATTR_COLOR_TEMP: 150},
|
{**BASE_PAYLOAD, ATTR_COLOR_TEMP: 150},
|
||||||
blocking=True,
|
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()
|
bulb.set_color_temp.reset_mock()
|
||||||
|
|
||||||
await hass.services.async_call(
|
await hass.services.async_call(
|
||||||
LIGHT_DOMAIN,
|
LIGHT_DOMAIN,
|
||||||
"turn_on",
|
"turn_on",
|
||||||
{ATTR_ENTITY_ID: entity_id, ATTR_COLOR_TEMP: 150},
|
{**BASE_PAYLOAD, ATTR_COLOR_TEMP: 150},
|
||||||
blocking=True,
|
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()
|
bulb.set_color_temp.reset_mock()
|
||||||
|
|
||||||
await hass.services.async_call(
|
await hass.services.async_call(
|
||||||
LIGHT_DOMAIN,
|
LIGHT_DOMAIN,
|
||||||
"turn_on",
|
"turn_on",
|
||||||
{ATTR_ENTITY_ID: entity_id, ATTR_HS_COLOR: (10, 30)},
|
{**BASE_PAYLOAD, ATTR_HS_COLOR: (10, 30)},
|
||||||
blocking=True,
|
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()
|
bulb.set_hsv.reset_mock()
|
||||||
|
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user