# HG changeset patch # User drewp@bigasterisk.com # Date 1706600487 28800 # Node ID 7d9a056e29feb3057f5ea80361f122bab77e3d0e # Parent 178e020289c196129bbba97fc7827df6f16af03f esp rgbw output; cleanup diff -r 178e020289c1 -r 7d9a056e29fe light.py --- 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 diff -r 178e020289c1 -r 7d9a056e29fe protocols.py --- 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}