From e7476d442826e7770ff6ede98707740c13e2d8a3 Mon Sep 17 00:00:00 2001 From: Krzysztof Sasiak Date: Thu, 17 Aug 2023 15:46:09 +0200 Subject: [PATCH 1/3] * Fix unique entity ID * Add support for cool and warm white LEDs --- .../custom_components/dohome/light.py | 34 ++++++++++++++----- 1 file changed, 25 insertions(+), 9 deletions(-) diff --git a/DoHome_HassAssistant_Component/custom_components/dohome/light.py b/DoHome_HassAssistant_Component/custom_components/dohome/light.py index b53b23a..963e93d 100644 --- a/DoHome_HassAssistant_Component/custom_components/dohome/light.py +++ b/DoHome_HassAssistant_Component/custom_components/dohome/light.py @@ -13,11 +13,12 @@ ATTR_BRIGHTNESS, ATTR_COLOR_TEMP, ATTR_EFFECT, - ATTR_HS_COLOR, + ATTR_RGBWW_COLOR, PLATFORM_SCHEMA, SUPPORT_BRIGHTNESS, SUPPORT_COLOR, LightEntity, + ColorMode ) from . import (DOHOME_GATEWAY, DoHomeDevice) @@ -43,7 +44,7 @@ def __init__(self, hass, device): self._device = device self._state = False - self._rgb = (255, 255, 255) + self._rgb = (255, 255, 255, 255, 255) self._brightness = 100 self._socket = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) @@ -55,9 +56,9 @@ def brightness(self): return self._brightness @property - def hs_color(self): + def rgbww_color(self): """Return the color property.""" - return color_util.color_RGB_to_hs(*self._rgb) + return self._rgb @property def is_on(self): @@ -69,10 +70,24 @@ def supported_features(self): """Return the supported features.""" return SUPPORT_BRIGHTNESS | SUPPORT_COLOR + @property + def supported_color_modes(self): + """Return the supported color modes.""" + return [ColorMode.RGBWW] + + @property + def color_mode(self): + """Return the supported color modes.""" + return ColorMode.RGBWW + + @property + def unique_id(self): + return self._device["name"] + def turn_on(self, **kwargs): """Turn the light on.""" - if ATTR_HS_COLOR in kwargs: - self._rgb = color_util.color_hs_to_RGB(*kwargs[ATTR_HS_COLOR]) + if ATTR_RGBWW_COLOR in kwargs: + self._rgb = kwargs[ATTR_RGBWW_COLOR] if ATTR_BRIGHTNESS in kwargs: self._brightness = int(100 * kwargs[ATTR_BRIGHTNESS] / 255) @@ -83,8 +98,9 @@ def turn_on(self, **kwargs): "r":int(50 * self._rgb[0] / 255)*self._brightness, "g":int(50 * self._rgb[1] / 255)*self._brightness, "b":int(50 * self._rgb[2] / 255)*self._brightness, - "w":0, - "m":0} + "w":int(50 * self._rgb[3] / 255)*self._brightness, + "m":int(50 * self._rgb[4] / 255)*self._brightness + } op = json.dumps(data) self._send_cmd(self._device,'cmd=ctrl&devices={[' + self._device["sid"] + ']}&op=' + op + '}', 6) @@ -123,4 +139,4 @@ def _send_cmd(self, device, cmd, rtn_cmd): return resp else: _LOGGER.debug("Non matching response. device %s, but got %s", device["sid"], dic["dev"][8:12]) - return None \ No newline at end of file + return None From a09b5562d2a8738289d1289ef8182b80aa05b3c4 Mon Sep 17 00:00:00 2001 From: Krzysztof Sasiak Date: Mon, 21 Aug 2023 02:32:12 +0200 Subject: [PATCH 2/3] Fix bulb status synchronization --- .../custom_components/dohome/light.py | 13 ++++++++++++- 1 file changed, 12 insertions(+), 1 deletion(-) diff --git a/DoHome_HassAssistant_Component/custom_components/dohome/light.py b/DoHome_HassAssistant_Component/custom_components/dohome/light.py index 963e93d..ca33569 100644 --- a/DoHome_HassAssistant_Component/custom_components/dohome/light.py +++ b/DoHome_HassAssistant_Component/custom_components/dohome/light.py @@ -44,7 +44,7 @@ def __init__(self, hass, device): self._device = device self._state = False - self._rgb = (255, 255, 255, 255, 255) + self._rgb = (0, 0, 0, 0, 0) self._brightness = 100 self._socket = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) @@ -63,6 +63,17 @@ def rgbww_color(self): @property def is_on(self): """Return true if light is on.""" + data = { "cmd":25 } + op = json.dumps(data) + + try: + resp = self._send_cmd(self._device,'cmd=ctrl&devices={[' + self._device["sid"] + ']}&op=' + op + '}', 25) + self._rgb = (resp["r"], resp["g"], resp["b"], resp["w"], resp["m"]) + self._state = (sum(self._rgb) > 0) + + except: + _LOGGER.debug("Error when reading device state: %s", resp) + return self._state @property From f22d559f8030a05769bfe382da7612c869e04c2b Mon Sep 17 00:00:00 2001 From: Krzysztof Sasiak <142749040+krz-sas@users.noreply.github.com> Date: Tue, 22 Sep 2026 21:33:26 +0200 Subject: [PATCH 3/3] Adjust DoHome to latest HASS changes from 2026 --- .../custom_components/dohome/light.py | 94 +++++++++++++++---- .../custom_components/dohome/sensor.py | 4 +- 2 files changed, 77 insertions(+), 21 deletions(-) diff --git a/DoHome_HassAssistant_Component/custom_components/dohome/light.py b/DoHome_HassAssistant_Component/custom_components/dohome/light.py index ca33569..e1c1938 100644 --- a/DoHome_HassAssistant_Component/custom_components/dohome/light.py +++ b/DoHome_HassAssistant_Component/custom_components/dohome/light.py @@ -11,18 +11,45 @@ import homeassistant.util.color as color_util from homeassistant.components.light import ( ATTR_BRIGHTNESS, - ATTR_COLOR_TEMP, ATTR_EFFECT, ATTR_RGBWW_COLOR, - PLATFORM_SCHEMA, - SUPPORT_BRIGHTNESS, - SUPPORT_COLOR, LightEntity, + LightEntityFeature, ColorMode ) from . import (DOHOME_GATEWAY, DoHomeDevice) +EFFECTS_DICT = { +"Colorful gradient": 1, +"red gradient": 2, +"Green gradient": 3, +"blue gradient": 4, +"yellow gradient": 5, +"Cyan gradient": 6, +"Purple gradient": 7, +"White gradient": 8, +"Red strobe": 9, +"Green strobe": 10, +"Blue strobe": 11, +"yellow strobe": 12, +"Red-green gradient": 13, +"red and blue gradient": 14, +"Green-blue gradient": 15, +"Red-green jump": 16, +"Red and blue jump": 17, +"Green-blue transition": 18, +"Red and green strobe": 19, +"red and blue strobe": 20, +"Green and blue strobe": 21, +"Colorful jump": 22, +"Colorful strobe": 23, +"White strobe": 24, +"Three-color gradient": 25, +"Three color jump": 26, +"Three-color strobe": 27 +} + _LOGGER = logging.getLogger(__name__) def setup_platform(hass, config, add_devices, discovery_info=None): @@ -45,7 +72,7 @@ def __init__(self, hass, device): self._device = device self._state = False self._rgb = (0, 0, 0, 0, 0) - self._brightness = 100 + self._brightness = 255 self._socket = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) DoHomeDevice.__init__(self, device['name'], device) @@ -62,24 +89,37 @@ def rgbww_color(self): @property def is_on(self): + return self._state + + def update(self): """Return true if light is on.""" data = { "cmd":25 } op = json.dumps(data) try: resp = self._send_cmd(self._device,'cmd=ctrl&devices={[' + self._device["sid"] + ']}&op=' + op + '}', 25) - self._rgb = (resp["r"], resp["g"], resp["b"], resp["w"], resp["m"]) + self._rgb = (int(resp["r"]/self.brightness), + int(resp["g"]/self.brightness), + int(resp["b"]/self.brightness), + int(resp["w"]*255/5000), + int(resp["m"]*255/5000)) self._state = (sum(self._rgb) > 0) except: _LOGGER.debug("Error when reading device state: %s", resp) - return self._state + _LOGGER.debug("Color values: %s", str(self._rgb)) + _LOGGER.debug("update: %s", str(self._state)) @property def supported_features(self): """Return the supported features.""" - return SUPPORT_BRIGHTNESS | SUPPORT_COLOR + return LightEntityFeature.EFFECT | LightEntityFeature.FLASH + + @property + def effect_list(self): + """Return the supported effects.""" + return list(EFFECTS_DICT.keys()) @property def supported_color_modes(self): @@ -97,23 +137,39 @@ def unique_id(self): def turn_on(self, **kwargs): """Turn the light on.""" + _LOGGER.debug("Turn on params: %s", kwargs) + if ATTR_RGBWW_COLOR in kwargs: self._rgb = kwargs[ATTR_RGBWW_COLOR] if ATTR_BRIGHTNESS in kwargs: - self._brightness = int(100 * kwargs[ATTR_BRIGHTNESS] / 255) + self._brightness = kwargs[ATTR_BRIGHTNESS] self._state = True - data = { - "cmd":6, - "r":int(50 * self._rgb[0] / 255)*self._brightness, - "g":int(50 * self._rgb[1] / 255)*self._brightness, - "b":int(50 * self._rgb[2] / 255)*self._brightness, - "w":int(50 * self._rgb[3] / 255)*self._brightness, - "m":int(50 * self._rgb[4] / 255)*self._brightness - } - op = json.dumps(data) - self._send_cmd(self._device,'cmd=ctrl&devices={[' + self._device["sid"] + ']}&op=' + op + '}', 6) + + if ATTR_EFFECT in kwargs: + data = { + "cmd":7, + "index":EFFECTS_DICT[kwargs[ATTR_EFFECT]], + } + op = json.dumps(data) + self._send_cmd(self._device,'cmd=ctrl&devices={[' + self._device["sid"] + ']}&op=' + op + '}', 7) + + else: + #empty kwargs means that turn on button has pressed without any color specification + if len(kwargs) == 0: + self._rgb = (0, 0, 0, 255, 0) + + data = { + "cmd":6, + "r":int(self._rgb[0] * self._brightness * 5000 / 65025), + "g":int(self._rgb[1] * self._brightness * 5000 / 65025), + "b":int(self._rgb[2] * self._brightness * 5000 / 65025), + "w":int(self._rgb[3] * 5000 / 255), + "m":int(self._rgb[4] * 5000 / 255) + } + op = json.dumps(data) + self._send_cmd(self._device,'cmd=ctrl&devices={[' + self._device["sid"] + ']}&op=' + op + '}', 6) def turn_off(self, **kwargs): """Turn the light off.""" diff --git a/DoHome_HassAssistant_Component/custom_components/dohome/sensor.py b/DoHome_HassAssistant_Component/custom_components/dohome/sensor.py index 52f6ae3..6583dc4 100644 --- a/DoHome_HassAssistant_Component/custom_components/dohome/sensor.py +++ b/DoHome_HassAssistant_Component/custom_components/dohome/sensor.py @@ -9,7 +9,7 @@ from datetime import timedelta from homeassistant.helpers.event import track_time_interval -from homeassistant.const import TEMP_CELSIUS +from homeassistant.const import ATTR_UNIT_OF_MEASUREMENT, UnitOfTemperature from . import (DOHOME_GATEWAY, DoHomeDevice) @@ -84,7 +84,7 @@ def state(self): def unit_of_measurement(self): """Return the unit of measurement of this entity, if any.""" if self._is_temperature and self.current_value != 100: - return TEMP_CELSIUS + return UnitOfTemperature.CELSIUS elif self._is_humidity and self.current_value != 0: return '%' elif self._is_illumination and self.current_value != -1: