fix rgb order

This commit is contained in:
Викторов Андрей Германович
2023-10-10 22:58:25 +03:00
parent 00e62ee83f
commit 21bc277b78

View File

@@ -16,7 +16,9 @@ from homeassistant.components.light import (
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 @@ from .const import (
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 @@ PLATFORM_SCHEMA = LIGHT_SCHEMA.extend(
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 @@ class MegaRGBW(LightEntity, BaseMegaEntity):
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 @@ class MegaRGBW(LightEntity, BaseMegaEntity):
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 @@ class MegaRGBW(LightEntity, BaseMegaEntity):
@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 @@ class MegaRGBW(LightEntity, BaseMegaEntity):
@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 @@ class MegaRGBW(LightEntity, BaseMegaEntity):
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 @@ class MegaRGBW(LightEntity, BaseMegaEntity):
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 @@ class MegaRGBW(LightEntity, BaseMegaEntity):
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 @@ class MegaRGBW(LightEntity, BaseMegaEntity):
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 @@ class MegaRGBW(LightEntity, BaseMegaEntity):
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 @@ class MegaRGBW(LightEntity, BaseMegaEntity):
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 @@ class MegaRGBW(LightEntity, BaseMegaEntity):
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 @@ class MegaRGBW(LightEntity, BaseMegaEntity):
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 @@ class MegaRGBW(LightEntity, BaseMegaEntity):
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 @@ class MegaRGBW(LightEntity, BaseMegaEntity):
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 @@ class MegaRGBW(LightEntity, BaseMegaEntity):
ret = r
else:
ret = max([r, ret])
return ret
return ret