changeset 23:7d9a056e29fe

esp rgbw output; cleanup
author drewp@bigasterisk.com
date Mon, 29 Jan 2024 23:41:27 -0800
parents 178e020289c1
children ecbbf76318bb
files light.py protocols.py
diffstat 2 files changed, 32 insertions(+), 10 deletions(-) [+]
line wrap: on
line diff
--- a/light.py	Mon Jan 29 13:01:23 2024 -0800
+++ b/light.py	Mon Jan 29 23:41: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, zbBrightnessMessage, zbRelayMessage, zbWhiteSpectrumMessage
+from protocols import ShellyGen1WebTransport, SonoffRelayTransport, TasmotaWebTransport, Transport, ZigbeeTransport, espColorMessage, zbBrightnessMessage, zbRelayMessage, zbWhiteSpectrumMessage
 
 log = logging.getLogger('lite')
 
@@ -98,6 +98,12 @@
                  transport=ZigbeeTransport(mqtt, name, '', topic=lambda *arg: topicPrefix + '/command', msg=zbBrightnessMessage))
 
 
+def makeEspRgbw(mqtt: MqttIo, name: str, topicPrefix: str) -> Light:
+    return Light(name=name,
+                 convertColor=oneWhiteConv,
+                 transport=ZigbeeTransport(mqtt, name, '', topic=lambda *arg: topicPrefix + '/command', msg=espColorMessage))
+
+
 class Lights:
     _d: dict[str, Light] = {}
 
@@ -136,6 +142,8 @@
         self.add(makeEspBrightness(mqtt, 'ws-kid', 'workshop/light/kid'))
         self.add(makeEspBrightness(mqtt, 'ws-sewing', 'workshop/light/sewing'))
 
+        self.add(makeEspRgbw(mqtt, 'br-headboard', 'bed/light/headboard'))
+
         # ft-ceil
         # li-toys
         # sh-top
--- a/protocols.py	Mon Jan 29 13:01:23 2024 -0800
+++ b/protocols.py	Mon Jan 29 23:41:27 2024 -0800
@@ -44,19 +44,34 @@
         # temperature todo
     }
 
+
 def zbRelayMessage(dc: DeviceColor) -> dict:
     return {'state': 'ON' if dc.brightness else 'OFF'}
 
+
+def espColorMessage(dc: DeviceColor) -> dict:
+    return {
+        "state":'ON',
+        "color": {
+            "r": to8(dc.r),
+            "g": to8(dc.g),
+            "b": to8(dc.b),
+            "w": to8(dc.w)
+        },
+    }
+
+
 def z2mSet(name):
     return f'zigbee/{name}/set'
 
+
 class ZigbeeTransport(Transport):
 
     def __init__(self, mqtt: MqttIo, name: str, ieee: str, topic=z2mSet, msg=zbColorMessage):
         self.mqtt = mqtt
         self.name = name
         self.ieee = ieee
-        self.topic=topic
+        self.topic = topic
         self.msg = msg
 
     def linked(self):
@@ -95,7 +110,7 @@
 class TasmotaWebTransport(_WebTransport):
 
     async def send(self, dc: DeviceColor):
-        cmnd = 'Color ' + ','.join(str(int(x * 255)) for x in (dc.r, dc.g, dc.b, dc.cw, dc.ww))
+        cmnd = 'Color ' + ','.join(str(to8(x)) for x in (dc.r, dc.g, dc.b, dc.cw, dc.ww))
         async with self._session.get(f'http://{self.hostname}/cm', params={'cmnd': cmnd}) 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]}
@@ -105,12 +120,11 @@
 
     async def send(self, dc: DeviceColor):
         # also see https://shelly-api-docs.shelly.cloud/gen1/#shelly-rgbw2-color-status for metrics
-        async with self._session.get(f'http://{self.hostname}/light/0',
-                                     params={
-                                         'red': int(dc.r * 255),
-                                         'green': int(dc.g * 255),
-                                         'blue': int(dc.b * 255),
-                                         'white': int(dc.w * 255),
-                                     }) as resp:
+        async with self._session.get(f'http://{self.hostname}/light/0', params={
+                'red': to8(dc.r),
+                'green': to8(dc.g),
+                'blue': to8(dc.b),
+                'white': to8(dc.w),
+        }) as resp:
             await resp.text()
             # {..."mode":"color","red":255,"green":242,"blue":0,"white":255,"gain":59,"effect":0,"transition":0,"power":18.00,"overpower":false}