changeset 26:33b3eb24506e

wled (single bulb) support. more lights
author drewp@bigasterisk.com
date Sat, 03 Feb 2024 20:56:27 -0800
parents cee43f550577
children 32cfefe3155b
files light.py protocols.py
diffstat 2 files changed, 24 insertions(+), 2 deletions(-) [+]
line wrap: on
line diff
--- a/light.py	Fri Feb 02 20:52:09 2024 -0800
+++ b/light.py	Sat Feb 03 20:56:27 2024 -0800
@@ -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, ZigbeeTransport, espColorMessage, zbBrightnessMessage, zbRelayMessage, zbWhiteSpectrumMessage
+from protocols import ShellyGen1WebTransport, SonoffRelayTransport, TasmotaWebTransport, Transport, WledTransport, ZigbeeTransport, espColorMessage, zbBrightnessMessage, zbRelayMessage, zbWhiteSpectrumMessage
 
 log = logging.getLogger('lite')
 
@@ -104,6 +104,10 @@
                  transport=ZigbeeTransport(mqtt, name, '', topic=lambda *arg: topicPrefix + '/command', msg=espColorMessage))
 
 
+def makeWledSingleBulb(name: str, hostname: str) -> Light:
+    return Light(name=name, convertColor=twoWhitesConv, transport=WledTransport(hostname))
+
+
 class Lights:
     _d: dict[str, Light] = {}
 
@@ -116,6 +120,8 @@
         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(makeShellyRGW2('ki-ceiling', 'shellyrgbw2-e868e7f34c35'))
         self.add(makeShellyRGW2('ki-counter', 'shellyrgbw2-e868e7f34cb2'))
 
@@ -124,6 +130,7 @@
         self.add(makeZbIkeaWhiteTemp(mqtt, 'en', '0x000b57fffe988959'))
         self.add(makeZbIkeaWhiteTemp(mqtt, 'py', '0x000b57fffeaf42cd'))
         self.add(makeZbIkeaWhiteTemp(mqtt, 'rr-lamp', '0x000b57fffe32e5a5'))
+        self.add(makeZbIkeaWhiteTemp(mqtt, 'ft-ceiling', '0xd0cf5efffe28abcf'))
 
         self.add(makeZbBrightness(mqtt, 'go-high', '0x847127fffebb3efa'))
 
--- a/protocols.py	Fri Feb 02 20:52:09 2024 -0800
+++ b/protocols.py	Sat Feb 03 20:56:27 2024 -0800
@@ -51,7 +51,7 @@
 
 def espColorMessage(dc: DeviceColor) -> dict:
     return {
-        "state":'ON',
+        "state": 'ON',
         "color": {
             "r": to8(dc.r),
             "g": to8(dc.g),
@@ -116,6 +116,21 @@
             # {"POWER":"ON","Dimmer":21,"Color":"3636363600","HSBColor":"0,0,21","White":21,"CT":153,"Channel":[21,21,21,21,0]}
 
 
+class WledTransport(_WebTransport):
+
+    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]], [], []]
+            }]
+        }
+        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):
 
     async def send(self, dc: DeviceColor):