Migrate wemo light to ColorMode (#70857)
This commit is contained in:
parent
e5870c65ee
commit
75ce66e8bd
2 changed files with 46 additions and 25 deletions
|
@ -11,9 +11,7 @@ from homeassistant.components.light import (
|
||||||
ATTR_COLOR_TEMP,
|
ATTR_COLOR_TEMP,
|
||||||
ATTR_HS_COLOR,
|
ATTR_HS_COLOR,
|
||||||
ATTR_TRANSITION,
|
ATTR_TRANSITION,
|
||||||
SUPPORT_BRIGHTNESS,
|
ColorMode,
|
||||||
SUPPORT_COLOR,
|
|
||||||
SUPPORT_COLOR_TEMP,
|
|
||||||
LightEntity,
|
LightEntity,
|
||||||
LightEntityFeature,
|
LightEntityFeature,
|
||||||
)
|
)
|
||||||
|
@ -29,13 +27,6 @@ from .const import DOMAIN as WEMO_DOMAIN
|
||||||
from .entity import WemoBinaryStateEntity, WemoEntity
|
from .entity import WemoBinaryStateEntity, WemoEntity
|
||||||
from .wemo_device import DeviceCoordinator
|
from .wemo_device import DeviceCoordinator
|
||||||
|
|
||||||
SUPPORT_WEMO = (
|
|
||||||
SUPPORT_BRIGHTNESS
|
|
||||||
| SUPPORT_COLOR_TEMP
|
|
||||||
| SUPPORT_COLOR
|
|
||||||
| LightEntityFeature.TRANSITION
|
|
||||||
)
|
|
||||||
|
|
||||||
# The WEMO_ constants below come from pywemo itself
|
# The WEMO_ constants below come from pywemo itself
|
||||||
WEMO_OFF = 0
|
WEMO_OFF = 0
|
||||||
|
|
||||||
|
@ -94,6 +85,8 @@ def async_setup_bridge(
|
||||||
class WemoLight(WemoEntity, LightEntity):
|
class WemoLight(WemoEntity, LightEntity):
|
||||||
"""Representation of a WeMo light."""
|
"""Representation of a WeMo light."""
|
||||||
|
|
||||||
|
_attr_supported_features = LightEntityFeature.TRANSITION
|
||||||
|
|
||||||
def __init__(self, coordinator: DeviceCoordinator, light: bridge.Light) -> None:
|
def __init__(self, coordinator: DeviceCoordinator, light: bridge.Light) -> None:
|
||||||
"""Initialize the WeMo light."""
|
"""Initialize the WeMo light."""
|
||||||
super().__init__(coordinator)
|
super().__init__(coordinator)
|
||||||
|
@ -133,27 +126,48 @@ class WemoLight(WemoEntity, LightEntity):
|
||||||
return cast(int, self.light.state.get("level", 255))
|
return cast(int, self.light.state.get("level", 255))
|
||||||
|
|
||||||
@property
|
@property
|
||||||
def hs_color(self) -> tuple[float, float] | None:
|
def xy_color(self) -> tuple[float, float] | None:
|
||||||
"""Return the hs color values of this light."""
|
"""Return the xy color value [float, float]."""
|
||||||
if xy_color := self.light.state.get("color_xy"):
|
return self.light.state.get("color_xy") # type:ignore[no-any-return]
|
||||||
return color_util.color_xy_to_hs(*xy_color)
|
|
||||||
return None
|
|
||||||
|
|
||||||
@property
|
@property
|
||||||
def color_temp(self) -> int | None:
|
def color_temp(self) -> int | None:
|
||||||
"""Return the color temperature of this light in mireds."""
|
"""Return the color temperature of this light in mireds."""
|
||||||
return cast(Optional[int], self.light.state.get("temperature_mireds"))
|
return cast(Optional[int], self.light.state.get("temperature_mireds"))
|
||||||
|
|
||||||
|
@property
|
||||||
|
def color_mode(self) -> ColorMode:
|
||||||
|
"""Return the color mode of the light."""
|
||||||
|
if (
|
||||||
|
"colorcontrol" in self.light.capabilities
|
||||||
|
and self.light.state.get("color_xy") is not None
|
||||||
|
):
|
||||||
|
return ColorMode.XY
|
||||||
|
if "colortemperature" in self.light.capabilities:
|
||||||
|
return ColorMode.COLOR_TEMP
|
||||||
|
if "levelcontrol" in self.light.capabilities:
|
||||||
|
return ColorMode.BRIGHTNESS
|
||||||
|
return ColorMode.ONOFF
|
||||||
|
|
||||||
|
@property
|
||||||
|
def supported_color_modes(self) -> set[ColorMode]:
|
||||||
|
"""Flag supported color modes."""
|
||||||
|
modes: set[ColorMode] = set()
|
||||||
|
if "colorcontrol" in self.light.capabilities:
|
||||||
|
modes.add(ColorMode.XY)
|
||||||
|
if "colortemperature" in self.light.capabilities:
|
||||||
|
modes.add(ColorMode.COLOR_TEMP)
|
||||||
|
if "levelcontrol" in self.light.capabilities and not modes:
|
||||||
|
modes.add(ColorMode.BRIGHTNESS)
|
||||||
|
if not modes:
|
||||||
|
modes.add(ColorMode.ONOFF)
|
||||||
|
return modes
|
||||||
|
|
||||||
@property
|
@property
|
||||||
def is_on(self) -> bool:
|
def is_on(self) -> bool:
|
||||||
"""Return true if device is on."""
|
"""Return true if device is on."""
|
||||||
return cast(int, self.light.state.get("onoff")) != WEMO_OFF
|
return cast(int, self.light.state.get("onoff")) != WEMO_OFF
|
||||||
|
|
||||||
@property
|
|
||||||
def supported_features(self) -> int:
|
|
||||||
"""Flag supported features."""
|
|
||||||
return SUPPORT_WEMO
|
|
||||||
|
|
||||||
def turn_on(self, **kwargs: Any) -> None:
|
def turn_on(self, **kwargs: Any) -> None:
|
||||||
"""Turn the light on."""
|
"""Turn the light on."""
|
||||||
xy_color = None
|
xy_color = None
|
||||||
|
@ -194,10 +208,8 @@ class WemoLight(WemoEntity, LightEntity):
|
||||||
class WemoDimmer(WemoBinaryStateEntity, LightEntity):
|
class WemoDimmer(WemoBinaryStateEntity, LightEntity):
|
||||||
"""Representation of a WeMo dimmer."""
|
"""Representation of a WeMo dimmer."""
|
||||||
|
|
||||||
@property
|
_attr_supported_color_modes = {ColorMode.BRIGHTNESS}
|
||||||
def supported_features(self) -> int:
|
_attr_color_mode = ColorMode.BRIGHTNESS
|
||||||
"""Flag supported features."""
|
|
||||||
return SUPPORT_BRIGHTNESS
|
|
||||||
|
|
||||||
@property
|
@property
|
||||||
def brightness(self) -> int:
|
def brightness(self) -> int:
|
||||||
|
|
|
@ -8,7 +8,13 @@ from homeassistant.components.homeassistant import (
|
||||||
DOMAIN as HA_DOMAIN,
|
DOMAIN as HA_DOMAIN,
|
||||||
SERVICE_UPDATE_ENTITY,
|
SERVICE_UPDATE_ENTITY,
|
||||||
)
|
)
|
||||||
from homeassistant.components.light import ATTR_COLOR_TEMP, DOMAIN as LIGHT_DOMAIN
|
from homeassistant.components.light import (
|
||||||
|
ATTR_COLOR_MODE,
|
||||||
|
ATTR_COLOR_TEMP,
|
||||||
|
ATTR_SUPPORTED_COLOR_MODES,
|
||||||
|
DOMAIN as LIGHT_DOMAIN,
|
||||||
|
ColorMode,
|
||||||
|
)
|
||||||
from homeassistant.const import ATTR_ENTITY_ID, STATE_OFF, STATE_ON
|
from homeassistant.const import ATTR_ENTITY_ID, STATE_OFF, STATE_ON
|
||||||
from homeassistant.setup import async_setup_component
|
from homeassistant.setup import async_setup_component
|
||||||
|
|
||||||
|
@ -32,6 +38,7 @@ def pywemo_bridge_light_fixture(pywemo_device):
|
||||||
light.name = pywemo_device.name
|
light.name = pywemo_device.name
|
||||||
light.bridge = pywemo_device
|
light.bridge = pywemo_device
|
||||||
light.state = {"onoff": 0, "available": True}
|
light.state = {"onoff": 0, "available": True}
|
||||||
|
light.capabilities = ["onoff", "levelcontrol", "colortemperature"]
|
||||||
pywemo_device.Lights = {pywemo_device.serialnumber: light}
|
pywemo_device.Lights = {pywemo_device.serialnumber: light}
|
||||||
return light
|
return light
|
||||||
|
|
||||||
|
@ -102,6 +109,8 @@ async def test_light_update_entity(
|
||||||
)
|
)
|
||||||
state = hass.states.get(wemo_entity.entity_id)
|
state = hass.states.get(wemo_entity.entity_id)
|
||||||
assert state.attributes.get(ATTR_COLOR_TEMP) == 432
|
assert state.attributes.get(ATTR_COLOR_TEMP) == 432
|
||||||
|
assert state.attributes.get(ATTR_SUPPORTED_COLOR_MODES) == [ColorMode.COLOR_TEMP]
|
||||||
|
assert state.attributes.get(ATTR_COLOR_MODE) == ColorMode.COLOR_TEMP
|
||||||
assert state.state == STATE_ON
|
assert state.state == STATE_ON
|
||||||
|
|
||||||
# Off state.
|
# Off state.
|
||||||
|
|
Loading…
Add table
Reference in a new issue