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