diff --git a/homeassistant/components/tuya/light.py b/homeassistant/components/tuya/light.py index 0dc59faac8e..69e7020f56c 100644 --- a/homeassistant/components/tuya/light.py +++ b/homeassistant/components/tuya/light.py @@ -114,7 +114,8 @@ class TuyaLightEntity(TuyaEntity, LightEntity): def turn_on(self, **kwargs: Any) -> None: """Turn on or control the light.""" commands = [] - _LOGGER.debug("light kwargs-> %s", kwargs) + work_mode = self._work_mode() + _LOGGER.debug("light kwargs-> %s; work_mode %s", kwargs, work_mode) if ( DPCode.LIGHT in self.tuya_device.status @@ -124,27 +125,11 @@ class TuyaLightEntity(TuyaEntity, LightEntity): else: commands += [{"code": DPCode.SWITCH_LED, "value": True}] - if ATTR_BRIGHTNESS in kwargs: - if self._work_mode().startswith(WORK_MODE_COLOUR): - colour_data = self._get_hsv() - v_range = self._tuya_hsv_v_range() - colour_data["v"] = int( - self.remap(kwargs[ATTR_BRIGHTNESS], 0, 255, v_range[0], v_range[1]) - ) - commands += [ - {"code": self.dp_code_colour, "value": json.dumps(colour_data)} - ] - else: - new_range = self._tuya_brightness_range() - tuya_brightness = int( - self.remap( - kwargs[ATTR_BRIGHTNESS], 0, 255, new_range[0], new_range[1] - ) - ) - commands += [{"code": self.dp_code_bright, "value": tuya_brightness}] + colour_data = self._get_hsv() + v_range = self._tuya_hsv_v_range() + send_colour_data = False if ATTR_HS_COLOR in kwargs: - colour_data = self._get_hsv() # hsv h colour_data["h"] = int(kwargs[ATTR_HS_COLOR][0]) # hsv s @@ -161,16 +146,16 @@ class TuyaLightEntity(TuyaEntity, LightEntity): ) # hsv v ha_v = self.brightness - v_range = self._tuya_hsv_v_range() colour_data["v"] = int(self.remap(ha_v, 0, 255, v_range[0], v_range[1])) commands += [ {"code": self.dp_code_colour, "value": json.dumps(colour_data)} ] - if self.tuya_device.status[DPCode.WORK_MODE] != "colour": - commands += [{"code": DPCode.WORK_MODE, "value": "colour"}] + if work_mode != WORK_MODE_COLOUR: + work_mode = WORK_MODE_COLOUR + commands += [{"code": DPCode.WORK_MODE, "value": work_mode}] - if ATTR_COLOR_TEMP in kwargs: + elif ATTR_COLOR_TEMP in kwargs: # temp color new_range = self._tuya_temp_range() color_temp = self.remap( @@ -190,8 +175,29 @@ class TuyaLightEntity(TuyaEntity, LightEntity): ) commands += [{"code": self.dp_code_bright, "value": int(tuya_brightness)}] - if self.tuya_device.status[DPCode.WORK_MODE] != "white": - commands += [{"code": DPCode.WORK_MODE, "value": "white"}] + if work_mode != WORK_MODE_WHITE: + work_mode = WORK_MODE_WHITE + commands += [{"code": DPCode.WORK_MODE, "value": WORK_MODE_WHITE}] + + if ATTR_BRIGHTNESS in kwargs: + if work_mode == WORK_MODE_COLOUR: + colour_data["v"] = int( + self.remap(kwargs[ATTR_BRIGHTNESS], 0, 255, v_range[0], v_range[1]) + ) + send_colour_data = True + elif work_mode == WORK_MODE_WHITE: + new_range = self._tuya_brightness_range() + tuya_brightness = int( + self.remap( + kwargs[ATTR_BRIGHTNESS], 0, 255, new_range[0], new_range[1] + ) + ) + commands += [{"code": self.dp_code_bright, "value": tuya_brightness}] + + if send_colour_data: + commands += [ + {"code": self.dp_code_colour, "value": json.dumps(colour_data)} + ] self._send_command(commands) @@ -232,6 +238,14 @@ class TuyaLightEntity(TuyaEntity, LightEntity): bright_value = json.loads(bright_item.values) return bright_value.get("min", 0), bright_value.get("max", 255) + @property + def color_mode(self) -> str: + """Return the color_mode of the light.""" + work_mode = self._work_mode() + if work_mode == WORK_MODE_WHITE: + return COLOR_MODE_COLOR_TEMP + return COLOR_MODE_HS + @property def hs_color(self) -> tuple[float, float] | None: """Return the hs_color of the light.""" @@ -320,6 +334,12 @@ class TuyaLightEntity(TuyaEntity, LightEntity): return self.tuya_device.status.get(DPCode.WORK_MODE, "") def _get_hsv(self) -> dict[str, int]: + if ( + self.dp_code_colour not in self.tuya_device.status + or len(self.tuya_device.status[self.dp_code_colour]) == 0 + ): + return {"h": 0, "s": 0, "v": 0} + return json.loads(self.tuya_device.status[self.dp_code_colour]) @property