diff --git a/DoHome_HassAssistant_Component/custom_components/dohome/light.py b/DoHome_HassAssistant_Component/custom_components/dohome/light.py index b53b23a..e1c1938 100644 --- a/DoHome_HassAssistant_Component/custom_components/dohome/light.py +++ b/DoHome_HassAssistant_Component/custom_components/dohome/light.py @@ -11,17 +11,45 @@ import homeassistant.util.color as color_util from homeassistant.components.light import ( ATTR_BRIGHTNESS, - ATTR_COLOR_TEMP, ATTR_EFFECT, - ATTR_HS_COLOR, - PLATFORM_SCHEMA, - SUPPORT_BRIGHTNESS, - SUPPORT_COLOR, + ATTR_RGBWW_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): @@ -43,8 +71,8 @@ def __init__(self, hass, device): self._device = device self._state = False - self._rgb = (255, 255, 255) - self._brightness = 100 + self._rgb = (0, 0, 0, 0, 0) + self._brightness = 255 self._socket = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) DoHomeDevice.__init__(self, device['name'], device) @@ -55,38 +83,93 @@ 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): - """Return true if light is on.""" 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 = (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) + + _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): + """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]) + _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":0, - "m":0} - 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.""" @@ -123,4 +206,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 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: