diff protocols.py @ 21:b8201490c731

more light types
author drewp@bigasterisk.com
date Mon, 29 Jan 2024 12:27:08 -0800
parents 24a574108365
children 7d9a056e29fe
line wrap: on
line diff
--- a/protocols.py	Mon Jan 29 11:52:43 2024 -0800
+++ b/protocols.py	Mon Jan 29 12:27:08 2024 -0800
@@ -6,6 +6,7 @@
 
 log = logging.getLogger('prot')
 
+
 class Transport:
 
     def linked(self):
@@ -15,25 +16,54 @@
         raise TypeError
 
 
-def zigbeeHexMessage(dc: DeviceColor) -> dict:
-    msg: dict = {"transition": 0, "brightness": int(255 * dc.brightness)}
-    c = "#%02x%02x%02x" % (int(dc.r * 255), int(dc.g * 255), int(dc.b * 255))
-    msg["color"] = {"hex": c}
-    return msg
+def to8(x: float):
+    return int(x * 255)
+
+
+def zbColorMessage(dc: DeviceColor) -> dict:
+    return {
+        "transition": 0,
+        "brightness": to8(dc.brightness),
+        "color": {
+            "hex": "#%02x%02x%02x" % (to8(dc.r), to8(dc.g), to8(dc.b))
+        },
+    }
+
 
+def zbBrightnessMessage(dc: DeviceColor) -> dict:
+    return {
+        "transition": 0,
+        "brightness": to8(dc.brightness),
+    }
+
+
+def zbWhiteSpectrumMessage(dc: DeviceColor) -> dict:
+    return {
+        "transition": 0,
+        "brightness": to8(dc.brightness),
+        # temperature todo
+    }
+
+def zbRelayMessage(dc: DeviceColor) -> dict:
+    return {'state': 'ON' if dc.brightness else 'OFF'}
+
+def z2mSet(name):
+    return f'zigbee/{name}/set'
 
 class ZigbeeTransport(Transport):
 
-    def __init__(self, mqtt: MqttIo, name: str, ieee: str):
+    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.msg = msg
 
     def linked(self):
         return {'url': f'https://bigasterisk.com/zigbee/console/#/device/{self.ieee}/info', 'label': self.name}
 
     async def send(self, dc: DeviceColor):
-        await self.mqtt.publish(f'zigbee/{self.name}/set', json.dumps(zigbeeHexMessage(dc)))
+        await self.mqtt.publish(self.topic(self.name), json.dumps(self.msg(dc)))
 
 
 class SonoffRelayTransport(Transport):