Refactor light platform to avoid duplicate property calls (#106857)
This commit is contained in:
parent
73bc65059b
commit
3f1263a533
1 changed files with 51 additions and 45 deletions
|
@ -345,6 +345,9 @@ def filter_turn_off_params(
|
|||
light: LightEntity, params: dict[str, Any]
|
||||
) -> dict[str, Any]:
|
||||
"""Filter out params not used in turn off or not supported by the light."""
|
||||
if not params:
|
||||
return params
|
||||
|
||||
supported_features = light.supported_features_compat
|
||||
|
||||
if LightEntityFeature.FLASH not in supported_features:
|
||||
|
@ -947,8 +950,8 @@ class LightEntity(ToggleEntity, cached_properties=CACHED_PROPERTIES_WITH_ATTR_):
|
|||
@property
|
||||
def color_temp_kelvin(self) -> int | None:
|
||||
"""Return the CT color value in Kelvin."""
|
||||
if self._attr_color_temp_kelvin is None and self.color_temp:
|
||||
return color_util.color_temperature_mired_to_kelvin(self.color_temp)
|
||||
if self._attr_color_temp_kelvin is None and (color_temp := self.color_temp):
|
||||
return color_util.color_temperature_mired_to_kelvin(color_temp)
|
||||
return self._attr_color_temp_kelvin
|
||||
|
||||
@cached_property
|
||||
|
@ -993,19 +996,21 @@ class LightEntity(ToggleEntity, cached_properties=CACHED_PROPERTIES_WITH_ATTR_):
|
|||
supported_color_modes = self._light_internal_supported_color_modes
|
||||
|
||||
if ColorMode.COLOR_TEMP in supported_color_modes:
|
||||
data[ATTR_MIN_COLOR_TEMP_KELVIN] = self.min_color_temp_kelvin
|
||||
data[ATTR_MAX_COLOR_TEMP_KELVIN] = self.max_color_temp_kelvin
|
||||
if not self.max_color_temp_kelvin:
|
||||
min_color_temp_kelvin = self.min_color_temp_kelvin
|
||||
max_color_temp_kelvin = self.max_color_temp_kelvin
|
||||
data[ATTR_MIN_COLOR_TEMP_KELVIN] = min_color_temp_kelvin
|
||||
data[ATTR_MAX_COLOR_TEMP_KELVIN] = max_color_temp_kelvin
|
||||
if not max_color_temp_kelvin:
|
||||
data[ATTR_MIN_MIREDS] = None
|
||||
else:
|
||||
data[ATTR_MIN_MIREDS] = color_util.color_temperature_kelvin_to_mired(
|
||||
self.max_color_temp_kelvin
|
||||
max_color_temp_kelvin
|
||||
)
|
||||
if not self.min_color_temp_kelvin:
|
||||
if not min_color_temp_kelvin:
|
||||
data[ATTR_MAX_MIREDS] = None
|
||||
else:
|
||||
data[ATTR_MAX_MIREDS] = color_util.color_temperature_kelvin_to_mired(
|
||||
self.min_color_temp_kelvin
|
||||
min_color_temp_kelvin
|
||||
)
|
||||
if LightEntityFeature.EFFECT in supported_features:
|
||||
data[ATTR_EFFECT_LIST] = self.effect_list
|
||||
|
@ -1018,30 +1023,27 @@ class LightEntity(ToggleEntity, cached_properties=CACHED_PROPERTIES_WITH_ATTR_):
|
|||
self, color_mode: ColorMode | str
|
||||
) -> dict[str, tuple[float, ...]]:
|
||||
data: dict[str, tuple[float, ...]] = {}
|
||||
if color_mode == ColorMode.HS and self.hs_color:
|
||||
hs_color = self.hs_color
|
||||
if color_mode == ColorMode.HS and (hs_color := self.hs_color):
|
||||
data[ATTR_HS_COLOR] = (round(hs_color[0], 3), round(hs_color[1], 3))
|
||||
data[ATTR_RGB_COLOR] = color_util.color_hs_to_RGB(*hs_color)
|
||||
data[ATTR_XY_COLOR] = color_util.color_hs_to_xy(*hs_color)
|
||||
elif color_mode == ColorMode.XY and self.xy_color:
|
||||
xy_color = self.xy_color
|
||||
elif color_mode == ColorMode.XY and (xy_color := self.xy_color):
|
||||
data[ATTR_HS_COLOR] = color_util.color_xy_to_hs(*xy_color)
|
||||
data[ATTR_RGB_COLOR] = color_util.color_xy_to_RGB(*xy_color)
|
||||
data[ATTR_XY_COLOR] = (round(xy_color[0], 6), round(xy_color[1], 6))
|
||||
elif color_mode == ColorMode.RGB and self.rgb_color:
|
||||
rgb_color = self.rgb_color
|
||||
elif color_mode == ColorMode.RGB and (rgb_color := self.rgb_color):
|
||||
data[ATTR_HS_COLOR] = color_util.color_RGB_to_hs(*rgb_color)
|
||||
data[ATTR_RGB_COLOR] = tuple(int(x) for x in rgb_color[0:3])
|
||||
data[ATTR_XY_COLOR] = color_util.color_RGB_to_xy(*rgb_color)
|
||||
elif color_mode == ColorMode.RGBW and self._light_internal_rgbw_color:
|
||||
rgbw_color = self._light_internal_rgbw_color
|
||||
elif color_mode == ColorMode.RGBW and (
|
||||
rgbw_color := self._light_internal_rgbw_color
|
||||
):
|
||||
rgb_color = color_util.color_rgbw_to_rgb(*rgbw_color)
|
||||
data[ATTR_HS_COLOR] = color_util.color_RGB_to_hs(*rgb_color)
|
||||
data[ATTR_RGB_COLOR] = tuple(int(x) for x in rgb_color[0:3])
|
||||
data[ATTR_RGBW_COLOR] = tuple(int(x) for x in rgbw_color[0:4])
|
||||
data[ATTR_XY_COLOR] = color_util.color_RGB_to_xy(*rgb_color)
|
||||
elif color_mode == ColorMode.RGBWW and self.rgbww_color:
|
||||
rgbww_color = self.rgbww_color
|
||||
elif color_mode == ColorMode.RGBWW and (rgbww_color := self.rgbww_color):
|
||||
rgb_color = color_util.color_rgbww_to_rgb(
|
||||
*rgbww_color, self.min_color_temp_kelvin, self.max_color_temp_kelvin
|
||||
)
|
||||
|
@ -1049,8 +1051,10 @@ class LightEntity(ToggleEntity, cached_properties=CACHED_PROPERTIES_WITH_ATTR_):
|
|||
data[ATTR_RGB_COLOR] = tuple(int(x) for x in rgb_color[0:3])
|
||||
data[ATTR_RGBWW_COLOR] = tuple(int(x) for x in rgbww_color[0:5])
|
||||
data[ATTR_XY_COLOR] = color_util.color_RGB_to_xy(*rgb_color)
|
||||
elif color_mode == ColorMode.COLOR_TEMP and self.color_temp_kelvin:
|
||||
hs_color = color_util.color_temperature_to_hs(self.color_temp_kelvin)
|
||||
elif color_mode == ColorMode.COLOR_TEMP and (
|
||||
color_temp_kelvin := self.color_temp_kelvin
|
||||
):
|
||||
hs_color = color_util.color_temperature_to_hs(color_temp_kelvin)
|
||||
data[ATTR_HS_COLOR] = (round(hs_color[0], 3), round(hs_color[1], 3))
|
||||
data[ATTR_RGB_COLOR] = color_util.color_hs_to_RGB(*hs_color)
|
||||
data[ATTR_XY_COLOR] = color_util.color_hs_to_xy(*hs_color)
|
||||
|
@ -1062,22 +1066,26 @@ class LightEntity(ToggleEntity, cached_properties=CACHED_PROPERTIES_WITH_ATTR_):
|
|||
"""Return state attributes."""
|
||||
data: dict[str, Any] = {}
|
||||
supported_features = self.supported_features_compat
|
||||
supported_color_modes = self._light_internal_supported_color_modes
|
||||
supported_color_modes = self.supported_color_modes
|
||||
legacy_supported_color_modes = (
|
||||
supported_color_modes or self._light_internal_supported_color_modes
|
||||
)
|
||||
supported_features_value = supported_features.value
|
||||
color_mode = self._light_internal_color_mode if self.is_on else None
|
||||
_is_on = self.is_on
|
||||
color_mode = self._light_internal_color_mode if _is_on else None
|
||||
|
||||
if color_mode and color_mode not in supported_color_modes:
|
||||
if color_mode and color_mode not in legacy_supported_color_modes:
|
||||
# Increase severity to warning in 2021.6, reject in 2021.10
|
||||
_LOGGER.debug(
|
||||
"%s: set to unsupported color_mode: %s, supported_color_modes: %s",
|
||||
self.entity_id,
|
||||
color_mode,
|
||||
supported_color_modes,
|
||||
legacy_supported_color_modes,
|
||||
)
|
||||
|
||||
data[ATTR_COLOR_MODE] = color_mode
|
||||
|
||||
if brightness_supported(self.supported_color_modes):
|
||||
if brightness_supported(supported_color_modes):
|
||||
if color_mode in COLOR_MODES_BRIGHTNESS:
|
||||
data[ATTR_BRIGHTNESS] = self.brightness
|
||||
else:
|
||||
|
@ -1085,20 +1093,19 @@ class LightEntity(ToggleEntity, cached_properties=CACHED_PROPERTIES_WITH_ATTR_):
|
|||
elif supported_features_value & SUPPORT_BRIGHTNESS:
|
||||
# Backwards compatibility for ambiguous / incomplete states
|
||||
# Add warning in 2021.6, remove in 2021.10
|
||||
if self.is_on:
|
||||
if _is_on:
|
||||
data[ATTR_BRIGHTNESS] = self.brightness
|
||||
else:
|
||||
data[ATTR_BRIGHTNESS] = None
|
||||
|
||||
if color_temp_supported(self.supported_color_modes):
|
||||
if color_temp_supported(supported_color_modes):
|
||||
if color_mode == ColorMode.COLOR_TEMP:
|
||||
data[ATTR_COLOR_TEMP_KELVIN] = self.color_temp_kelvin
|
||||
if self.color_temp_kelvin:
|
||||
color_temp_kelvin = self.color_temp_kelvin
|
||||
data[ATTR_COLOR_TEMP_KELVIN] = color_temp_kelvin
|
||||
if color_temp_kelvin:
|
||||
data[
|
||||
ATTR_COLOR_TEMP
|
||||
] = color_util.color_temperature_kelvin_to_mired(
|
||||
self.color_temp_kelvin
|
||||
)
|
||||
] = color_util.color_temperature_kelvin_to_mired(color_temp_kelvin)
|
||||
else:
|
||||
data[ATTR_COLOR_TEMP] = None
|
||||
else:
|
||||
|
@ -1107,43 +1114,42 @@ class LightEntity(ToggleEntity, cached_properties=CACHED_PROPERTIES_WITH_ATTR_):
|
|||
elif supported_features_value & SUPPORT_COLOR_TEMP:
|
||||
# Backwards compatibility
|
||||
# Add warning in 2021.6, remove in 2021.10
|
||||
if self.is_on:
|
||||
data[ATTR_COLOR_TEMP_KELVIN] = self.color_temp_kelvin
|
||||
if self.color_temp_kelvin:
|
||||
if _is_on:
|
||||
color_temp_kelvin = self.color_temp_kelvin
|
||||
data[ATTR_COLOR_TEMP_KELVIN] = color_temp_kelvin
|
||||
if color_temp_kelvin:
|
||||
data[
|
||||
ATTR_COLOR_TEMP
|
||||
] = color_util.color_temperature_kelvin_to_mired(
|
||||
self.color_temp_kelvin
|
||||
)
|
||||
] = color_util.color_temperature_kelvin_to_mired(color_temp_kelvin)
|
||||
else:
|
||||
data[ATTR_COLOR_TEMP] = None
|
||||
else:
|
||||
data[ATTR_COLOR_TEMP_KELVIN] = None
|
||||
data[ATTR_COLOR_TEMP] = None
|
||||
|
||||
if color_supported(supported_color_modes) or color_temp_supported(
|
||||
supported_color_modes
|
||||
if color_supported(legacy_supported_color_modes) or color_temp_supported(
|
||||
legacy_supported_color_modes
|
||||
):
|
||||
data[ATTR_HS_COLOR] = None
|
||||
data[ATTR_RGB_COLOR] = None
|
||||
data[ATTR_XY_COLOR] = None
|
||||
if ColorMode.RGBW in supported_color_modes:
|
||||
if ColorMode.RGBW in legacy_supported_color_modes:
|
||||
data[ATTR_RGBW_COLOR] = None
|
||||
if ColorMode.RGBWW in supported_color_modes:
|
||||
if ColorMode.RGBWW in legacy_supported_color_modes:
|
||||
data[ATTR_RGBWW_COLOR] = None
|
||||
if color_mode:
|
||||
data.update(self._light_internal_convert_color(color_mode))
|
||||
|
||||
if LightEntityFeature.EFFECT in supported_features:
|
||||
data[ATTR_EFFECT] = self.effect if self.is_on else None
|
||||
data[ATTR_EFFECT] = self.effect if _is_on else None
|
||||
|
||||
return data
|
||||
|
||||
@property
|
||||
def _light_internal_supported_color_modes(self) -> set[ColorMode] | set[str]:
|
||||
"""Calculate supported color modes with backwards compatibility."""
|
||||
if self.supported_color_modes is not None:
|
||||
return self.supported_color_modes
|
||||
if (_supported_color_modes := self.supported_color_modes) is not None:
|
||||
return _supported_color_modes
|
||||
|
||||
# Backwards compatibility for supported_color_modes added in 2021.4
|
||||
# Add warning in 2021.6, remove in 2021.10
|
||||
|
|
Loading…
Add table
Reference in a new issue