Mercurial > code > home > repos > light-bridge
diff light.py @ 9:9f427d8073c3
redo data model; add ui colors
author | drewp@bigasterisk.com |
---|---|
date | Sun, 28 Jan 2024 16:53:08 -0800 |
parents | fc8ed0efcd72 |
children | 028ed39aa78f |
line wrap: on
line diff
--- a/light.py Sun Jan 28 16:51:36 2024 -0800 +++ b/light.py Sun Jan 28 16:53:08 2024 -0800 @@ -1,42 +1,69 @@ import asyncio import logging -from dataclasses import dataclass +from dataclasses import dataclass, field from color import Color log = logging.getLogger('light') +@dataclass(frozen=True) +class DeviceColor: + """neutral representation of the adjusted color that we send to a device""" + r: float = 0 + g: float = 0 + b: float = 0 + w: float = 0 + x: float = 0 + y: float = 0 + + def summary(self) -> dict: + return dict([(k, round(v, 3)) for k, v in self.__dict__.items() if v > 0]) + + @dataclass class Light: name: str address: str - online: bool - colorRequest: Color - colorMessage: dict - colorCurrent: Color - latencyMs: float + + requestingColor: Color = Color.fromHex('#000000') + requestingDeviceColor: DeviceColor = DeviceColor() + + emittingColor: Color = Color.fromHex('#000000') + online: bool | None = None + latencyMs: float | None = None + + def __post_init__(self): + self.requestingDeviceColor = self.deviceColor(self.requestingColor) def to_dict(self): - return { - 'light': { - 'name': self.name, - 'address': self.address, - 'online': self.online, - 'colorRequest': self.colorRequest.to_js(), - 'colorMessage': self.colorMessage, - 'colorCurrent': self.colorCurrent.to_js(), - 'latencyMs': self.latencyMs, - } + d = { + 'name': self.name, + 'address': self.address, + 'requestingColor': self.requestingColor.hex(), + 'requestingDeviceColor': self.requestingDeviceColor.summary(), + 'emittingColor': self.emittingColor.hex(), + 'online': self.online, + 'latencyMs': self.latencyMs, } + return {'light': d} + + def deviceColor(self, c: Color) -> DeviceColor: + # do LUT here + return DeviceColor(r=c.r, g=c.g, b=c.b) + + async def setColor(self, c: Color): + self.requestingColor = c + self.requestingDeviceColor = self.deviceColor(self.requestingColor) + class Lights: _d: dict[str, Light] = {} def __init__(self): - self.add(Light('do-desk', 'topic1', True, Color('#ff0000'), {'r': 255}, Color('#000000'), 100)) - self.add(Light('do-desk2', 'topic2', True, Color('#ff00ff'), {'r': 255}, Color('#000000'), 200)) + self.add(Light('do-desk', 'topic1')) + self.add(Light('do-desk2', 'topic2')) def add(self, d: Light): self._d[d.name] = d