From 21bc277b78cbdc35c7d0f100958ae66022f6fa52 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=92=D0=B8=D0=BA=D1=82=D0=BE=D1=80=D0=BE=D0=B2=20=D0=90?= =?UTF-8?q?=D0=BD=D0=B4=D1=80=D0=B5=D0=B9=20=D0=93=D0=B5=D1=80=D0=BC=D0=B0?= =?UTF-8?q?=D0=BD=D0=BE=D0=B2=D0=B8=D1=87?= Date: Tue, 10 Oct 2023 22:58:25 +0300 Subject: [PATCH 1/2] fix rgb order --- custom_components/mega/light.py | 114 ++++++++++++++++++-------------- 1 file changed, 64 insertions(+), 50 deletions(-) diff --git a/custom_components/mega/light.py b/custom_components/mega/light.py index 5e2b7a6..daee0fb 100644 --- a/custom_components/mega/light.py +++ b/custom_components/mega/light.py @@ -16,7 +16,9 @@ SUPPORT_BRIGHTNESS, LightEntity, SUPPORT_TRANSITION, - SUPPORT_COLOR, ColorMode, LightEntityFeature, + SUPPORT_COLOR, + ColorMode, + LightEntityFeature, # SUPPORT_WHITE_VALUE ) from homeassistant.config_entries import ConfigEntry @@ -36,7 +38,15 @@ CONF_SWITCH, DOMAIN, CONF_CUSTOM, - CONF_SKIP, CONF_LED, CONF_WS28XX, CONF_PORTS, CONF_WHITE_SEP, CONF_SMOOTH, CONF_ORDER, CONF_CHIP, RGB, + CONF_SKIP, + CONF_LED, + CONF_WS28XX, + CONF_PORTS, + CONF_WHITE_SEP, + CONF_SMOOTH, + CONF_ORDER, + CONF_CHIP, + RGB, ) from .tools import int_ignore, map_reorder_rgb @@ -64,13 +74,17 @@ async def async_setup_platform(hass, config, add_entities, discovery_info=None): - lg.warning('mega integration does not support yaml for lights, please use UI configuration') + lg.warning( + "mega integration does not support yaml for lights, please use UI configuration" + ) return True -async def async_setup_entry(hass: HomeAssistant, config_entry: ConfigEntry, async_add_devices): +async def async_setup_entry( + hass: HomeAssistant, config_entry: ConfigEntry, async_add_devices +): mid = config_entry.data[CONF_ID] - hub: MegaD = hass.data['mega'][mid] + hub: MegaD = hass.data["mega"][mid] devices = [] customize = hass.data.get(DOMAIN, {}).get(CONF_CUSTOM, {}).get(mid, {}) skip = [] @@ -78,23 +92,29 @@ async def async_setup_entry(hass: HomeAssistant, config_entry: ConfigEntry, asyn for entity_id, conf in customize[CONF_LED].items(): ports = conf.get(CONF_PORTS) or [conf.get(CONF_PORT)] skip.extend(ports) - devices.append(MegaRGBW( - mega=hub, - port=ports, - name=entity_id, - customize=conf, - id_suffix=entity_id, - config_entry=config_entry - )) - for port, cfg in config_entry.data.get('light', {}).items(): + devices.append( + MegaRGBW( + mega=hub, + port=ports, + name=entity_id, + customize=conf, + id_suffix=entity_id, + config_entry=config_entry, + ) + ) + for port, cfg in config_entry.data.get("light", {}).items(): port = int_ignore(port) c = customize.get(port, {}) - if c.get(CONF_SKIP, False) or port in skip or c.get(CONF_DOMAIN, 'light') != 'light': + if ( + c.get(CONF_SKIP, False) + or port in skip + or c.get(CONF_DOMAIN, "light") != "light" + ): continue for data in cfg: - hub.lg.debug(f'add light on port %s with data %s', port, data) + hub.lg.debug(f"add light on port %s with data %s", port, data) light = MegaLight(mega=hub, port=port, config_entry=config_entry, **data) - if '<' in light.name: + if "<" in light.name: continue devices.append(light) @@ -102,17 +122,14 @@ async def async_setup_entry(hass: HomeAssistant, config_entry: ConfigEntry, asyn class MegaLight(MegaOutPort, LightEntity): - @property def supported_features(self): - return ( - (SUPPORT_BRIGHTNESS if self.dimmer else 0) | - (SUPPORT_TRANSITION if self.dimmer else 0) + return (SUPPORT_BRIGHTNESS if self.dimmer else 0) | ( + SUPPORT_TRANSITION if self.dimmer else 0 ) class MegaRGBW(LightEntity, BaseMegaEntity): - def __init__(self, *args, **kwargs): super().__init__(*args, **kwargs) self._is_on = None @@ -123,7 +140,7 @@ def __init__(self, *args, **kwargs): self._task: asyncio.Task = None self._restore = None self.smooth: timedelta = self.customize[CONF_SMOOTH] - self._color_order = self.customize.get(CONF_ORDER, 'rgb') + self._color_order = self.customize.get(CONF_ORDER, "rgb") self._last_called: float = 0 self._max_values = None @@ -146,12 +163,11 @@ def chip(self) -> int: def is_ws(self): return self.customize.get(CONF_WS28XX) - @property def supported_color_modes(self) -> set[ColorMode] | set[str] | None: return { ColorMode.BRIGHTNESS, - ColorMode.RGB if len(self.port) != 4 else ColorMode.RGBW + ColorMode.RGB if len(self.port) != 4 else ColorMode.RGBW, } @property @@ -164,7 +180,7 @@ def color_mode(self) -> ColorMode | str | None: @property def white_value(self): # if self.supported_features & SUPPORT_WHITE_VALUE: - return float(self.get_attribute('white_value', 0)) + return float(self.get_attribute("white_value", 0)) @property def rgb_color(self) -> tuple[int, int, int] | None: @@ -177,15 +193,15 @@ def rgbw_color(self) -> tuple[int, int, int, int] | None: @property def brightness(self): - return float(self.get_attribute('brightness', 0)) + return float(self.get_attribute("brightness", 0)) @property def hs_color(self): - return self.get_attribute('hs_color', [0, 0]) + return self.get_attribute("hs_color", [0, 0]) @property def is_on(self): - return self.get_attribute('is_on', False) + return self.get_attribute("is_on", False) @property def supported_features(self): @@ -195,7 +211,7 @@ def get_rgbw(self): if not self.is_on: return [0 for x in range(len(self.port))] if not self.is_ws else [0] * 3 rgb = colorsys.hsv_to_rgb( - self.hs_color[0]/360, self.hs_color[1]/100, self.brightness / 255 + self.hs_color[0] / 360, self.hs_color[1] / 100, self.brightness / 255 ) rgb = [x for x in rgb] if self.white_value is not None: @@ -203,9 +219,7 @@ def get_rgbw(self): if not self.customize.get(CONF_WHITE_SEP): white = white * (self.brightness / 255) rgb.append(white / 255) - rgb = [ - round(x * self.max_values[i]) for i, x in enumerate(rgb) - ] + rgb = [round(x * self.max_values[i]) for i, x in enumerate(rgb)] if self.is_ws: # восстанавливаем мэпинг rgb = map_reorder_rgb(rgb, RGB, self._color_order) @@ -215,7 +229,7 @@ async def async_turn_on(self, **kwargs): if (time.time() - self._last_called) < 0.1: return self._last_called = time.time() - self.lg.debug(f'turn on %s with kwargs %s', self.entity_id, kwargs) + self.lg.debug(f"turn on %s with kwargs %s", self.entity_id, kwargs) if self._restore is not None: self._restore.update(kwargs) kwargs = self._restore @@ -231,9 +245,9 @@ async def async_turn_off(self, **kwargs): return self._last_called = time.time() self._restore = { - 'hs_color': self.hs_color, - 'brightness': self.brightness, - 'white_value': self.white_value, + "hs_color": self.hs_color, + "brightness": self.brightness, + "white_value": self.white_value, } _before = self.get_rgbw() self._is_on = False @@ -242,13 +256,13 @@ async def async_turn_off(self, **kwargs): self._task = asyncio.create_task(self.set_color(_before, **kwargs)) async def set_color(self, _before, **kwargs): - transition = kwargs.get('transition') + transition = kwargs.get("transition") update_state = transition is not None and transition > 3 _after = None for item, value in kwargs.items(): - setattr(self, f'_{item}', value) - if item == 'rgb_color': - _after = value + setattr(self, f"_{item}", value) + if item == "rgb_color": + _after = map_reorder_rgb(value, RGB, self._color_order) _after = _after or self.get_rgbw() self._rgb_color = tuple(_after[:3]) if transition is None: @@ -256,7 +270,7 @@ async def set_color(self, _before, **kwargs): ratio = self.calc_speed_ratio(_before, _after) transition = transition * ratio self.async_write_ha_state() - ports = self.port if not self.is_ws else self.port*3 + ports = self.port if not self.is_ws else self.port * 3 config = [(port, _before[i], _after[i]) for i, port in enumerate(ports)] try: await self.mega.smooth_dim( @@ -272,7 +286,7 @@ async def set_color(self, _before, **kwargs): except asyncio.CancelledError: return except: - self.lg.exception('while dimming') + self.lg.exception("while dimming") async def async_will_remove_from_hass(self) -> None: await super().async_will_remove_from_hass() @@ -287,10 +301,10 @@ def _update_from_rgb(self, rgbw, update_state=False): w = None rgb = rgbw if self.is_ws: - rgb = map_reorder_rgb( - rgb, self._color_order, RGB - ) - h, s, v = colorsys.rgb_to_hsv(*[x/self.max_values[i] for i, x in enumerate(rgb)]) + rgb = map_reorder_rgb(rgb, self._color_order, RGB) + h, s, v = colorsys.rgb_to_hsv( + *[x / self.max_values[i] for i, x in enumerate(rgb)] + ) h *= 360 s *= 100 v *= 255 @@ -299,7 +313,7 @@ def _update_from_rgb(self, rgbw, update_state=False): self._brightness = v if w is not None: if not self.customize.get(CONF_WHITE_SEP): - w = w/(self._brightness / 255) + w = w / (self._brightness / 255) else: w = w w = w / (self.max_values[-1] / 255) @@ -324,7 +338,7 @@ async def async_update(self): return data = data.get(x, None) if isinstance(data, dict): - data = data.get('value') + data = data.get("value") data = safe_int(data) if data is None: return @@ -341,4 +355,4 @@ def calc_speed_ratio(self, _before, _after): ret = r else: ret = max([r, ret]) - return ret \ No newline at end of file + return ret From 082c647110b2009650907fc253d0cbc41272c265 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=92=D0=B8=D0=BA=D1=82=D0=BE=D1=80=D0=BE=D0=B2=20=D0=90?= =?UTF-8?q?=D0=BD=D0=B4=D1=80=D0=B5=D0=B9=20=D0=93=D0=B5=D1=80=D0=BC=D0=B0?= =?UTF-8?q?=D0=BD=D0=BE=D0=B2=D0=B8=D1=87?= Date: Tue, 10 Oct 2023 23:01:09 +0300 Subject: [PATCH 2/2] =?UTF-8?q?Bump=20version:=201.1.8b0=20=E2=86=92=201.1?= =?UTF-8?q?.8b1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .bumpversion.cfg | 2 +- custom_components/mega/manifest.json | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/.bumpversion.cfg b/.bumpversion.cfg index 16dfd2b..192b013 100644 --- a/.bumpversion.cfg +++ b/.bumpversion.cfg @@ -1,5 +1,5 @@ [bumpversion] -current_version = 1.1.8b0 +current_version = 1.1.8b1 parse = (?P\d+)(\.(?P\d+))(\.(?P\d+))(?P[bf]*)(?P\d*) commit = True tag = True diff --git a/custom_components/mega/manifest.json b/custom_components/mega/manifest.json index 4acd29e..c2d49ba 100644 --- a/custom_components/mega/manifest.json +++ b/custom_components/mega/manifest.json @@ -15,5 +15,5 @@ "@andvikt" ], "issue_tracker": "https://github.com/andvikt/mega_hacs/issues", - "version": "v1.1.8b0" + "version": "v1.1.8b1" } \ No newline at end of file