changeset 28:fb2e91f230f4

new wled mode and more lights
author drewp@bigasterisk.com
date Mon, 02 Sep 2024 20:00:53 -0700
parents 32cfefe3155b
children 35affd4d37d4
files light.py protocols.py proxy.yaml
diffstat 3 files changed, 35 insertions(+), 12 deletions(-) [+]
line wrap: on
line diff
--- a/light.py	Sat Mar 23 15:25:02 2024 -0700
+++ b/light.py	Mon Sep 02 20:00:53 2024 -0700
@@ -6,7 +6,7 @@
 from color import Color
 from color_convert import DeviceColor, brightnessConv, ikeaWhiteConv, oneWhiteConv, relayConv, twoWhitesConv, zbConv
 from mqtt_io import MqttIo
-from protocols import ShellyGen1WebTransport, SonoffRelayTransport, TasmotaWebTransport, Transport, WledTransport, ZigbeeTransport, espColorMessage, zbBrightnessMessage, zbRelayMessage, zbWhiteSpectrumMessage
+from protocols import ShellyGen1WebTransport, SonoffRelayTransport, TasmotaWebTransport, Transport, WledControl, WledTransport, ZigbeeTransport, espColorMessage, zbBrightnessMessage, zbRelayMessage, zbWhiteSpectrumMessage
 
 log = logging.getLogger('lite')
 
@@ -105,8 +105,10 @@
 
 
 def makeWledSingleBulb(name: str, hostname: str) -> Light:
-    return Light(name=name, convertColor=twoWhitesConv, transport=WledTransport(hostname))
+    return Light(name=name, convertColor=twoWhitesConv, transport=WledTransport(hostname, WledControl.wholeStringColor))
 
+def makeWledStringBrightness(name: str, hostname: str) -> Light:
+    return Light(name=name, convertColor=brightnessConv, transport=WledTransport(hostname, WledControl.brightness))
 
 class Lights:
     _d: dict[str, Light] = {}
@@ -120,7 +122,11 @@
         self.add(makeTasmota('do-lamp', 'tasmota-9E2AB7-2743'))
         self.add(makeTasmota('li-high-shelf', 'light-li-ceil'))
         self.add(makeTasmota('tr-door', 'light-tr-door'))
+
         self.add(makeWledSingleBulb('ft-hanging', 'light-ft-ceil'))
+        self.add(makeWledSingleBulb('tr-ball', 'light-tr-ball'))
+        self.add(makeWledStringBrightness('hr-string', 'light-hr-string'))
+        self.add(makeWledStringBrightness('tr-string', 'light-tr-string'))
 
         self.add(makeShellyRGW2('ki-ceiling', 'shellyrgbw2-e868e7f34c35'))
         self.add(makeShellyRGW2('ki-counter', 'shellyrgbw2-e868e7f34cb2'))
@@ -131,6 +137,7 @@
         self.add(makeZbIkeaWhiteTemp(mqtt, 'py', '0x000b57fffeaf42cd'))
         self.add(makeZbIkeaWhiteTemp(mqtt, 'rr-lamp', '0x000b57fffe32e5a5'))
         self.add(makeZbIkeaWhiteTemp(mqtt, 'ft-ceiling', '0xd0cf5efffe28abcf'))
+        self.add(makeZbIkeaWhiteTemp(mqtt, 'di-ceiling', '0x000b57fffe8c0ad4'))
 
         self.add(makeZbBrightness(mqtt, 'go-high', '0x847127fffebb3efa'))
 
--- a/protocols.py	Sat Mar 23 15:25:02 2024 -0700
+++ b/protocols.py	Mon Sep 02 20:00:53 2024 -0700
@@ -1,6 +1,9 @@
+import json
 import logging
-import json
+from enum import Enum
+
 import aiohttp
+
 from color_convert import DeviceColor
 from mqtt_io import MqttIo
 
@@ -116,19 +119,32 @@
             # {"POWER":"ON","Dimmer":21,"Color":"3636363600","HSBColor":"0,0,21","White":21,"CT":153,"Channel":[21,21,21,21,0]}
 
 
+class WledControl(Enum):
+    wholeStringColor = 'wholeStringColor'
+    brightness = 'brightness'
+
+
 class WledTransport(_WebTransport):
 
+    def __init__(self, hostname: str, control: WledControl):
+        super().__init__(hostname)
+        self.control = control
+
     async def send(self, dc: DeviceColor):
-        # see https://kno.wled.ge/interfaces/json-api/
-        msg = {
-            'seg': [{
-                "cct": 128,  # 0 warm; 255 cool
-                "col": [[to8(x) for x in [dc.r, dc.g, dc.b, dc.cw]], [], []]
-            }]
-        }
+        if self.control == WledControl.wholeStringColor:
+            # see https://kno.wled.ge/interfaces/json-api/
+            msg = {
+                'seg': [{
+                    "cct": 128,  # 0 warm; 255 cool
+                    "col": [[to8(x) for x in [dc.r, dc.g, dc.b, dc.cw]], [], []]
+                }]
+            }
+        elif self.control == WledControl.brightness:
+            msg = {"bri": to8(dc.brightness)}
+        else:
+            raise NotImplementedError
         async with self._session.post(f'http://{self.hostname}/json/state', headers={'content-type': 'application/json'}, data=json.dumps(msg)) as resp:
             await resp.text()
-            # {"POWER":"ON","Dimmer":21,"Color":"3636363600","HSBColor":"0,0,21","White":21,"CT":153,"Channel":[21,21,21,21,0]}
 
 
 class ShellyGen1WebTransport(_WebTransport):
--- a/proxy.yaml	Sat Mar 23 15:25:02 2024 -0700
+++ b/proxy.yaml	Mon Sep 02 20:00:53 2024 -0700
@@ -7,7 +7,7 @@
     error_log /dev/stderr;
     pid /dev/null;
     events {
-      worker_connections 64;
+      worker_connections 256;
     }
     http {
       log_format main '[$time_local] code=$status bytes_sent=$bytes_sent req="$request"';