diff --git a/homeassistant/components/yeelight/light.py b/homeassistant/components/yeelight/light.py index 6a4b7e85001..8d0a3b0ffd4 100644 --- a/homeassistant/components/yeelight/light.py +++ b/homeassistant/components/yeelight/light.py @@ -18,11 +18,14 @@ from homeassistant.components.light import ( ATTR_KELVIN, ATTR_RGB_COLOR, ATTR_TRANSITION, + COLOR_MODE_BRIGHTNESS, + COLOR_MODE_COLOR_TEMP, + COLOR_MODE_HS, + COLOR_MODE_ONOFF, + COLOR_MODE_RGB, + COLOR_MODE_UNKNOWN, FLASH_LONG, FLASH_SHORT, - SUPPORT_BRIGHTNESS, - SUPPORT_COLOR, - SUPPORT_COLOR_TEMP, SUPPORT_EFFECT, SUPPORT_FLASH, SUPPORT_TRANSITION, @@ -62,13 +65,7 @@ from . import ( _LOGGER = logging.getLogger(__name__) -SUPPORT_YEELIGHT = ( - SUPPORT_BRIGHTNESS | SUPPORT_TRANSITION | SUPPORT_FLASH | SUPPORT_EFFECT -) - -SUPPORT_YEELIGHT_WHITE_TEMP = SUPPORT_YEELIGHT | SUPPORT_COLOR_TEMP - -SUPPORT_YEELIGHT_RGB = SUPPORT_YEELIGHT_WHITE_TEMP | SUPPORT_COLOR +SUPPORT_YEELIGHT = SUPPORT_TRANSITION | SUPPORT_FLASH | SUPPORT_EFFECT ATTR_MINUTES = "minutes" @@ -273,7 +270,7 @@ async def async_setup_entry( elif device_type == BulbType.Color: if nl_switch_light and device.is_nightlight_supported: _lights_setup_helper(YeelightColorLightWithNightlightSwitch) - _lights_setup_helper(YeelightNightLightModeWithWithoutBrightnessControl) + _lights_setup_helper(YeelightNightLightModeWithoutBrightnessControl) else: _lights_setup_helper(YeelightColorLightWithoutNightlightSwitch) elif device_type == BulbType.WhiteTemp: @@ -398,6 +395,9 @@ def _async_setup_services(hass: HomeAssistant): class YeelightGenericLight(YeelightEntity, LightEntity): """Representation of a Yeelight generic light.""" + _attr_color_mode = COLOR_MODE_BRIGHTNESS + _attr_supported_color_modes = {COLOR_MODE_BRIGHTNESS} + def __init__(self, device, entry, custom_effects=None): """Initialize the Yeelight light.""" super().__init__(device, entry) @@ -406,6 +406,7 @@ class YeelightGenericLight(YeelightEntity, LightEntity): self._color_temp = None self._hs = None + self._rgb = None self._effect = None model_specs = self._bulb.get_model_specs() @@ -503,6 +504,11 @@ class YeelightGenericLight(YeelightEntity, LightEntity): """Return the color property.""" return self._hs + @property + def rgb_color(self) -> tuple: + """Return the color property.""" + return self._rgb + @property def effect(self): """Return the current effect.""" @@ -558,32 +564,30 @@ class YeelightGenericLight(YeelightEntity, LightEntity): def update(self): """Update light properties.""" self._hs = self._get_hs_from_properties() + self._rgb = self._get_rgb_from_properties() if not self.device.is_color_flow_enabled: self._effect = None def _get_hs_from_properties(self): - rgb = self._get_property("rgb") - color_mode = self._get_property("color_mode") - - if not rgb or not color_mode: + hue = self._get_property("hue") + sat = self._get_property("sat") + if hue is None or sat is None: return None - color_mode = int(color_mode) - if color_mode == 2: # color temperature - temp_in_k = mired_to_kelvin(self.color_temp) - return color_util.color_temperature_to_hs(temp_in_k) - if color_mode == 3: # hsv - hue = int(self._get_property("hue")) - sat = int(self._get_property("sat")) + return (int(hue), int(sat)) - return (hue / 360 * 65536, sat / 100 * 255) + def _get_rgb_from_properties(self): + rgb = self._get_property("rgb") + + if rgb is None: + return None rgb = int(rgb) blue = rgb & 0xFF green = (rgb >> 8) & 0xFF red = (rgb >> 16) & 0xFF - return color_util.color_RGB_to_hs(red, green, blue) + return (red, green, blue) def set_music_mode(self, music_mode) -> None: """Set the music mode on or off.""" @@ -606,10 +610,19 @@ class YeelightGenericLight(YeelightEntity, LightEntity): brightness / 255 * 100, duration=duration, light_type=self.light_type ) + @_cmd + def set_hs(self, hs_color, duration) -> None: + """Set bulb's color.""" + if hs_color and COLOR_MODE_HS in self.supported_color_modes: + _LOGGER.debug("Setting HS: %s", hs_color) + self._bulb.set_hsv( + hs_color[0], hs_color[1], duration=duration, light_type=self.light_type + ) + @_cmd def set_rgb(self, rgb, duration) -> None: """Set bulb's color.""" - if rgb and self.supported_features & SUPPORT_COLOR: + if rgb and COLOR_MODE_RGB in self.supported_color_modes: _LOGGER.debug("Setting RGB: %s", rgb) self._bulb.set_rgb( rgb[0], rgb[1], rgb[2], duration=duration, light_type=self.light_type @@ -618,7 +631,7 @@ class YeelightGenericLight(YeelightEntity, LightEntity): @_cmd def set_colortemp(self, colortemp, duration) -> None: """Set bulb's color temperature.""" - if colortemp and self.supported_features & SUPPORT_COLOR_TEMP: + if colortemp and COLOR_MODE_COLOR_TEMP in self.supported_color_modes: temp_in_k = mired_to_kelvin(colortemp) _LOGGER.debug("Setting color temp: %s K", temp_in_k) @@ -702,7 +715,7 @@ class YeelightGenericLight(YeelightEntity, LightEntity): brightness = kwargs.get(ATTR_BRIGHTNESS) colortemp = kwargs.get(ATTR_COLOR_TEMP) hs_color = kwargs.get(ATTR_HS_COLOR) - rgb = color_util.color_hs_to_RGB(*hs_color) if hs_color else None + rgb = kwargs.get(ATTR_RGB_COLOR) flash = kwargs.get(ATTR_FLASH) effect = kwargs.get(ATTR_EFFECT) @@ -726,6 +739,7 @@ class YeelightGenericLight(YeelightEntity, LightEntity): try: # values checked for none in methods + self.set_hs(hs_color, duration) self.set_rgb(rgb, duration) self.set_colortemp(colortemp, duration) self.set_brightness(brightness, duration) @@ -786,13 +800,23 @@ class YeelightGenericLight(YeelightEntity, LightEntity): _LOGGER.error("Unable to set scene: %s", ex) -class YeelightColorLightSupport: +class YeelightColorLightSupport(YeelightGenericLight): """Representation of a Color Yeelight light support.""" + _attr_supported_color_modes = {COLOR_MODE_COLOR_TEMP, COLOR_MODE_HS, COLOR_MODE_RGB} + @property - def supported_features(self) -> int: - """Flag supported features.""" - return SUPPORT_YEELIGHT_RGB + def color_mode(self): + """Return the color mode.""" + color_mode = int(self._get_property("color_mode")) + if color_mode == 1: # RGB + return COLOR_MODE_RGB + if color_mode == 2: # color temperature + return COLOR_MODE_COLOR_TEMP + if color_mode == 3: # hsv + return COLOR_MODE_HS + _LOGGER.debug("Light reported unknown color mode: %s", color_mode) + return COLOR_MODE_UNKNOWN @property def _predefined_effects(self): @@ -800,12 +824,10 @@ class YeelightColorLightSupport: class YeelightWhiteTempLightSupport: - """Representation of a Color Yeelight light.""" + """Representation of a White temp Yeelight light.""" - @property - def supported_features(self) -> int: - """Flag supported features.""" - return SUPPORT_YEELIGHT_WHITE_TEMP + _attr_color_mode = COLOR_MODE_COLOR_TEMP + _attr_supported_color_modes = {COLOR_MODE_COLOR_TEMP} @property def _predefined_effects(self): @@ -913,12 +935,15 @@ class YeelightNightLightModeWithAmbientSupport(YeelightNightLightMode): return "main_power" -class YeelightNightLightModeWithWithoutBrightnessControl(YeelightNightLightMode): +class YeelightNightLightModeWithoutBrightnessControl(YeelightNightLightMode): """Representation of a Yeelight, when in nightlight mode. It represents case when nightlight mode brightness control is not supported. """ + _attr_color_mode = COLOR_MODE_ONOFF + _attr_supported_color_modes = {COLOR_MODE_ONOFF} + @property def supported_features(self): """Flag no supported features.""" diff --git a/tests/components/yeelight/__init__.py b/tests/components/yeelight/__init__.py index d6306e273ff..5725880f942 100644 --- a/tests/components/yeelight/__init__.py +++ b/tests/components/yeelight/__init__.py @@ -49,7 +49,9 @@ PROPERTIES = { "bg_flowing": "0", "bg_ct": "5000", "bg_bright": "80", - "bg_rgb": "16711680", + "bg_rgb": "65280", + "bg_hue": "200", + "bg_sat": "70", "nl_br": "23", "active_mode": "0", "current_brightness": "30", diff --git a/tests/components/yeelight/test_light.py b/tests/components/yeelight/test_light.py index a001f099062..9283514cb70 100644 --- a/tests/components/yeelight/test_light.py +++ b/tests/components/yeelight/test_light.py @@ -77,8 +77,6 @@ from homeassistant.components.yeelight.light import ( SERVICE_SET_MUSIC_MODE, SERVICE_START_FLOW, SUPPORT_YEELIGHT, - SUPPORT_YEELIGHT_RGB, - SUPPORT_YEELIGHT_WHITE_TEMP, YEELIGHT_COLOR_EFFECT_LIST, YEELIGHT_MONO_EFFECT_LIST, YEELIGHT_TEMP_ONLY_EFFECT_LIST, @@ -171,7 +169,91 @@ async def test_services(hass: HomeAssistant, caplog): == err_count + 1 ) - # turn_on + # turn_on rgb_color + brightness = 100 + rgb_color = (0, 128, 255) + transition = 2 + await hass.services.async_call( + "light", + SERVICE_TURN_ON, + { + ATTR_ENTITY_ID: ENTITY_LIGHT, + ATTR_BRIGHTNESS: brightness, + ATTR_RGB_COLOR: rgb_color, + ATTR_FLASH: FLASH_LONG, + ATTR_EFFECT: EFFECT_STOP, + ATTR_TRANSITION: transition, + }, + blocking=True, + ) + mocked_bulb.turn_on.assert_called_once_with( + duration=transition * 1000, + light_type=LightType.Main, + power_mode=PowerMode.NORMAL, + ) + mocked_bulb.turn_on.reset_mock() + mocked_bulb.start_music.assert_called_once() + mocked_bulb.start_music.reset_mock() + mocked_bulb.set_brightness.assert_called_once_with( + brightness / 255 * 100, duration=transition * 1000, light_type=LightType.Main + ) + mocked_bulb.set_brightness.reset_mock() + mocked_bulb.set_color_temp.assert_not_called() + mocked_bulb.set_color_temp.reset_mock() + mocked_bulb.set_hsv.assert_not_called() + mocked_bulb.set_hsv.reset_mock() + mocked_bulb.set_rgb.assert_called_once_with( + *rgb_color, duration=transition * 1000, light_type=LightType.Main + ) + mocked_bulb.set_rgb.reset_mock() + mocked_bulb.start_flow.assert_called_once() # flash + mocked_bulb.start_flow.reset_mock() + mocked_bulb.stop_flow.assert_called_once_with(light_type=LightType.Main) + mocked_bulb.stop_flow.reset_mock() + + # turn_on hs_color + brightness = 100 + hs_color = (180, 100) + transition = 2 + await hass.services.async_call( + "light", + SERVICE_TURN_ON, + { + ATTR_ENTITY_ID: ENTITY_LIGHT, + ATTR_BRIGHTNESS: brightness, + ATTR_HS_COLOR: hs_color, + ATTR_FLASH: FLASH_LONG, + ATTR_EFFECT: EFFECT_STOP, + ATTR_TRANSITION: transition, + }, + blocking=True, + ) + mocked_bulb.turn_on.assert_called_once_with( + duration=transition * 1000, + light_type=LightType.Main, + power_mode=PowerMode.NORMAL, + ) + mocked_bulb.turn_on.reset_mock() + mocked_bulb.start_music.assert_called_once() + mocked_bulb.start_music.reset_mock() + mocked_bulb.set_brightness.assert_called_once_with( + brightness / 255 * 100, duration=transition * 1000, light_type=LightType.Main + ) + mocked_bulb.set_brightness.reset_mock() + mocked_bulb.set_color_temp.assert_not_called() + mocked_bulb.set_color_temp.reset_mock() + mocked_bulb.set_hsv.assert_called_once_with( + *hs_color, duration=transition * 1000, light_type=LightType.Main + ) + mocked_bulb.set_hsv.reset_mock() + mocked_bulb.set_rgb.assert_not_called() + mocked_bulb.set_rgb.reset_mock() + mocked_bulb.start_flow.assert_called_once() # flash + mocked_bulb.start_flow.reset_mock() + mocked_bulb.stop_flow.assert_called_once_with(light_type=LightType.Main) + mocked_bulb.stop_flow.reset_mock() + + # turn_on color_temp brightness = 100 color_temp = 200 transition = 1 @@ -203,6 +285,8 @@ async def test_services(hass: HomeAssistant, caplog): duration=transition * 1000, light_type=LightType.Main, ) + mocked_bulb.set_hsv.assert_not_called() + mocked_bulb.set_rgb.assert_not_called() mocked_bulb.start_flow.assert_called_once() # flash mocked_bulb.stop_flow.assert_called_once_with(light_type=LightType.Main) @@ -331,12 +415,12 @@ async def test_services(hass: HomeAssistant, caplog): ) -async def test_device_types(hass: HomeAssistant): +async def test_device_types(hass: HomeAssistant, caplog): """Test different device types.""" mocked_bulb = _mocked_bulb() properties = {**PROPERTIES} properties.pop("active_mode") - properties["color_mode"] = "3" + properties["color_mode"] = "3" # HSV mocked_bulb.last_properties = properties async def _async_setup(config_entry): @@ -403,15 +487,16 @@ async def test_device_types(hass: HomeAssistant): ct = color_temperature_kelvin_to_mired(int(PROPERTIES["ct"])) hue = int(PROPERTIES["hue"]) sat = int(PROPERTIES["sat"]) - hs_color = (round(hue / 360 * 65536, 3), round(sat / 100 * 255, 3)) - rgb_color = color_hs_to_RGB(*hs_color) - xy_color = color_hs_to_xy(*hs_color) + rgb = int(PROPERTIES["rgb"]) + rgb_color = ((rgb >> 16) & 0xFF, (rgb >> 8) & 0xFF, rgb & 0xFF) + hs_color = (hue, sat) bg_bright = round(255 * int(PROPERTIES["bg_bright"]) / 100) bg_ct = color_temperature_kelvin_to_mired(int(PROPERTIES["bg_ct"])) + bg_hue = int(PROPERTIES["bg_hue"]) + bg_sat = int(PROPERTIES["bg_sat"]) bg_rgb = int(PROPERTIES["bg_rgb"]) + bg_hs_color = (bg_hue, bg_sat) bg_rgb_color = ((bg_rgb >> 16) & 0xFF, (bg_rgb >> 8) & 0xFF, bg_rgb & 0xFF) - bg_hs_color = color_RGB_to_hs(*bg_rgb_color) - bg_xy_color = color_RGB_to_xy(*bg_rgb_color) nl_br = round(255 * int(PROPERTIES["nl_br"]) / 100) # Default @@ -440,14 +525,15 @@ async def test_device_types(hass: HomeAssistant): }, ) - # Color + # Color - color mode CT + mocked_bulb.last_properties["color_mode"] = "2" # CT model_specs = _MODEL_SPECS["color"] await _async_test( BulbType.Color, "color", { "effect_list": YEELIGHT_COLOR_EFFECT_LIST, - "supported_features": SUPPORT_YEELIGHT_RGB, + "supported_features": SUPPORT_YEELIGHT, "min_mireds": color_temperature_kelvin_to_mired( model_specs["color_temp"]["max"] ), @@ -456,11 +542,8 @@ async def test_device_types(hass: HomeAssistant): ), "brightness": current_brightness, "color_temp": ct, - "hs_color": hs_color, - "rgb_color": rgb_color, - "xy_color": xy_color, - "color_mode": "hs", - "supported_color_modes": ["color_temp", "hs"], + "color_mode": "color_temp", + "supported_color_modes": ["color_temp", "hs", "rgb"], }, { "supported_features": 0, @@ -469,6 +552,144 @@ async def test_device_types(hass: HomeAssistant): }, ) + # Color - color mode HS + mocked_bulb.last_properties["color_mode"] = "3" # HSV + model_specs = _MODEL_SPECS["color"] + await _async_test( + BulbType.Color, + "color", + { + "effect_list": YEELIGHT_COLOR_EFFECT_LIST, + "supported_features": SUPPORT_YEELIGHT, + "min_mireds": color_temperature_kelvin_to_mired( + model_specs["color_temp"]["max"] + ), + "max_mireds": color_temperature_kelvin_to_mired( + model_specs["color_temp"]["min"] + ), + "brightness": current_brightness, + "hs_color": hs_color, + "rgb_color": color_hs_to_RGB(*hs_color), + "xy_color": color_hs_to_xy(*hs_color), + "color_mode": "hs", + "supported_color_modes": ["color_temp", "hs", "rgb"], + }, + { + "supported_features": 0, + "color_mode": "onoff", + "supported_color_modes": ["onoff"], + }, + ) + + # Color - color mode RGB + mocked_bulb.last_properties["color_mode"] = "1" # RGB + model_specs = _MODEL_SPECS["color"] + await _async_test( + BulbType.Color, + "color", + { + "effect_list": YEELIGHT_COLOR_EFFECT_LIST, + "supported_features": SUPPORT_YEELIGHT, + "min_mireds": color_temperature_kelvin_to_mired( + model_specs["color_temp"]["max"] + ), + "max_mireds": color_temperature_kelvin_to_mired( + model_specs["color_temp"]["min"] + ), + "brightness": current_brightness, + "hs_color": color_RGB_to_hs(*rgb_color), + "rgb_color": rgb_color, + "xy_color": color_RGB_to_xy(*rgb_color), + "color_mode": "rgb", + "supported_color_modes": ["color_temp", "hs", "rgb"], + }, + { + "supported_features": 0, + "color_mode": "onoff", + "supported_color_modes": ["onoff"], + }, + ) + + # Color - color mode HS but no hue + mocked_bulb.last_properties["color_mode"] = "3" # HSV + mocked_bulb.last_properties["hue"] = None + model_specs = _MODEL_SPECS["color"] + await _async_test( + BulbType.Color, + "color", + { + "effect_list": YEELIGHT_COLOR_EFFECT_LIST, + "supported_features": SUPPORT_YEELIGHT, + "min_mireds": color_temperature_kelvin_to_mired( + model_specs["color_temp"]["max"] + ), + "max_mireds": color_temperature_kelvin_to_mired( + model_specs["color_temp"]["min"] + ), + "brightness": current_brightness, + "color_mode": "hs", + "supported_color_modes": ["color_temp", "hs", "rgb"], + }, + { + "supported_features": 0, + "color_mode": "onoff", + "supported_color_modes": ["onoff"], + }, + ) + + # Color - color mode RGB but no color + mocked_bulb.last_properties["color_mode"] = "1" # RGB + mocked_bulb.last_properties["rgb"] = None + model_specs = _MODEL_SPECS["color"] + await _async_test( + BulbType.Color, + "color", + { + "effect_list": YEELIGHT_COLOR_EFFECT_LIST, + "supported_features": SUPPORT_YEELIGHT, + "min_mireds": color_temperature_kelvin_to_mired( + model_specs["color_temp"]["max"] + ), + "max_mireds": color_temperature_kelvin_to_mired( + model_specs["color_temp"]["min"] + ), + "brightness": current_brightness, + "color_mode": "rgb", + "supported_color_modes": ["color_temp", "hs", "rgb"], + }, + { + "supported_features": 0, + "color_mode": "onoff", + "supported_color_modes": ["onoff"], + }, + ) + + # Color - unsupported color_mode + mocked_bulb.last_properties["color_mode"] = 4 # Unsupported + model_specs = _MODEL_SPECS["color"] + await _async_test( + BulbType.Color, + "color", + { + "effect_list": YEELIGHT_COLOR_EFFECT_LIST, + "supported_features": SUPPORT_YEELIGHT, + "min_mireds": color_temperature_kelvin_to_mired( + model_specs["color_temp"]["max"] + ), + "max_mireds": color_temperature_kelvin_to_mired( + model_specs["color_temp"]["min"] + ), + "color_mode": "unknown", + "supported_color_modes": ["color_temp", "hs", "rgb"], + }, + { + "supported_features": 0, + "color_mode": "onoff", + "supported_color_modes": ["onoff"], + }, + ) + assert "Light reported unknown color mode: 4" in caplog.text + # WhiteTemp model_specs = _MODEL_SPECS["ceiling1"] await _async_test( @@ -476,7 +697,7 @@ async def test_device_types(hass: HomeAssistant): "ceiling1", { "effect_list": YEELIGHT_TEMP_ONLY_EFFECT_LIST, - "supported_features": SUPPORT_YEELIGHT_WHITE_TEMP, + "supported_features": SUPPORT_YEELIGHT, "min_mireds": color_temperature_kelvin_to_mired( model_specs["color_temp"]["max"] ), @@ -509,7 +730,7 @@ async def test_device_types(hass: HomeAssistant): "effect_list": YEELIGHT_TEMP_ONLY_EFFECT_LIST, "flowing": False, "night_light": True, - "supported_features": SUPPORT_YEELIGHT_WHITE_TEMP, + "supported_features": SUPPORT_YEELIGHT, "min_mireds": color_temperature_kelvin_to_mired( model_specs["color_temp"]["max"] ), @@ -529,21 +750,62 @@ async def test_device_types(hass: HomeAssistant): "supported_color_modes": ["brightness"], }, ) + # Background light - color mode CT + mocked_bulb.last_properties["bg_lmode"] = "2" # CT await _async_test( BulbType.WhiteTempMood, "ceiling4", { "effect_list": YEELIGHT_COLOR_EFFECT_LIST, - "supported_features": SUPPORT_YEELIGHT_RGB, + "supported_features": SUPPORT_YEELIGHT, "min_mireds": color_temperature_kelvin_to_mired(6500), "max_mireds": color_temperature_kelvin_to_mired(1700), "brightness": bg_bright, "color_temp": bg_ct, + "color_mode": "color_temp", + "supported_color_modes": ["color_temp", "hs", "rgb"], + }, + name=f"{UNIQUE_NAME} ambilight", + entity_id=f"{ENTITY_LIGHT}_ambilight", + ) + + # Background light - color mode HS + mocked_bulb.last_properties["bg_lmode"] = "3" # HS + await _async_test( + BulbType.WhiteTempMood, + "ceiling4", + { + "effect_list": YEELIGHT_COLOR_EFFECT_LIST, + "supported_features": SUPPORT_YEELIGHT, + "min_mireds": color_temperature_kelvin_to_mired(6500), + "max_mireds": color_temperature_kelvin_to_mired(1700), + "brightness": bg_bright, "hs_color": bg_hs_color, - "rgb_color": bg_rgb_color, - "xy_color": bg_xy_color, + "rgb_color": color_hs_to_RGB(*bg_hs_color), + "xy_color": color_hs_to_xy(*bg_hs_color), "color_mode": "hs", - "supported_color_modes": ["color_temp", "hs"], + "supported_color_modes": ["color_temp", "hs", "rgb"], + }, + name=f"{UNIQUE_NAME} ambilight", + entity_id=f"{ENTITY_LIGHT}_ambilight", + ) + + # Background light - color mode RGB + mocked_bulb.last_properties["bg_lmode"] = "1" # RGB + await _async_test( + BulbType.WhiteTempMood, + "ceiling4", + { + "effect_list": YEELIGHT_COLOR_EFFECT_LIST, + "supported_features": SUPPORT_YEELIGHT, + "min_mireds": color_temperature_kelvin_to_mired(6500), + "max_mireds": color_temperature_kelvin_to_mired(1700), + "brightness": bg_bright, + "hs_color": color_RGB_to_hs(*bg_rgb_color), + "rgb_color": bg_rgb_color, + "xy_color": color_RGB_to_xy(*bg_rgb_color), + "color_mode": "rgb", + "supported_color_modes": ["color_temp", "hs", "rgb"], }, name=f"{UNIQUE_NAME} ambilight", entity_id=f"{ENTITY_LIGHT}_ambilight",