annotate protocols.py @ 26:33b3eb24506e

wled (single bulb) support. more lights
author drewp@bigasterisk.com
date Sat, 03 Feb 2024 20:56:27 -0800
parents 7d9a056e29fe
children fb2e91f230f4
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
20
24a574108365 more protocols; bugs in setColor
drewp@bigasterisk.com
parents: 15
diff changeset
1 import logging
15
61d4ccecfed8 rough refactor
drewp@bigasterisk.com
parents:
diff changeset
2 import json
20
24a574108365 more protocols; bugs in setColor
drewp@bigasterisk.com
parents: 15
diff changeset
3 import aiohttp
15
61d4ccecfed8 rough refactor
drewp@bigasterisk.com
parents:
diff changeset
4 from color_convert import DeviceColor
61d4ccecfed8 rough refactor
drewp@bigasterisk.com
parents:
diff changeset
5 from mqtt_io import MqttIo
61d4ccecfed8 rough refactor
drewp@bigasterisk.com
parents:
diff changeset
6
20
24a574108365 more protocols; bugs in setColor
drewp@bigasterisk.com
parents: 15
diff changeset
7 log = logging.getLogger('prot')
15
61d4ccecfed8 rough refactor
drewp@bigasterisk.com
parents:
diff changeset
8
21
b8201490c731 more light types
drewp@bigasterisk.com
parents: 20
diff changeset
9
15
61d4ccecfed8 rough refactor
drewp@bigasterisk.com
parents:
diff changeset
10 class Transport:
61d4ccecfed8 rough refactor
drewp@bigasterisk.com
parents:
diff changeset
11
61d4ccecfed8 rough refactor
drewp@bigasterisk.com
parents:
diff changeset
12 def linked(self):
61d4ccecfed8 rough refactor
drewp@bigasterisk.com
parents:
diff changeset
13 return {'label': str(self)}
61d4ccecfed8 rough refactor
drewp@bigasterisk.com
parents:
diff changeset
14
61d4ccecfed8 rough refactor
drewp@bigasterisk.com
parents:
diff changeset
15 async def send(self, dc: DeviceColor):
61d4ccecfed8 rough refactor
drewp@bigasterisk.com
parents:
diff changeset
16 raise TypeError
61d4ccecfed8 rough refactor
drewp@bigasterisk.com
parents:
diff changeset
17
61d4ccecfed8 rough refactor
drewp@bigasterisk.com
parents:
diff changeset
18
21
b8201490c731 more light types
drewp@bigasterisk.com
parents: 20
diff changeset
19 def to8(x: float):
b8201490c731 more light types
drewp@bigasterisk.com
parents: 20
diff changeset
20 return int(x * 255)
b8201490c731 more light types
drewp@bigasterisk.com
parents: 20
diff changeset
21
b8201490c731 more light types
drewp@bigasterisk.com
parents: 20
diff changeset
22
b8201490c731 more light types
drewp@bigasterisk.com
parents: 20
diff changeset
23 def zbColorMessage(dc: DeviceColor) -> dict:
b8201490c731 more light types
drewp@bigasterisk.com
parents: 20
diff changeset
24 return {
b8201490c731 more light types
drewp@bigasterisk.com
parents: 20
diff changeset
25 "transition": 0,
b8201490c731 more light types
drewp@bigasterisk.com
parents: 20
diff changeset
26 "brightness": to8(dc.brightness),
b8201490c731 more light types
drewp@bigasterisk.com
parents: 20
diff changeset
27 "color": {
b8201490c731 more light types
drewp@bigasterisk.com
parents: 20
diff changeset
28 "hex": "#%02x%02x%02x" % (to8(dc.r), to8(dc.g), to8(dc.b))
b8201490c731 more light types
drewp@bigasterisk.com
parents: 20
diff changeset
29 },
b8201490c731 more light types
drewp@bigasterisk.com
parents: 20
diff changeset
30 }
b8201490c731 more light types
drewp@bigasterisk.com
parents: 20
diff changeset
31
15
61d4ccecfed8 rough refactor
drewp@bigasterisk.com
parents:
diff changeset
32
21
b8201490c731 more light types
drewp@bigasterisk.com
parents: 20
diff changeset
33 def zbBrightnessMessage(dc: DeviceColor) -> dict:
b8201490c731 more light types
drewp@bigasterisk.com
parents: 20
diff changeset
34 return {
b8201490c731 more light types
drewp@bigasterisk.com
parents: 20
diff changeset
35 "transition": 0,
b8201490c731 more light types
drewp@bigasterisk.com
parents: 20
diff changeset
36 "brightness": to8(dc.brightness),
b8201490c731 more light types
drewp@bigasterisk.com
parents: 20
diff changeset
37 }
b8201490c731 more light types
drewp@bigasterisk.com
parents: 20
diff changeset
38
b8201490c731 more light types
drewp@bigasterisk.com
parents: 20
diff changeset
39
b8201490c731 more light types
drewp@bigasterisk.com
parents: 20
diff changeset
40 def zbWhiteSpectrumMessage(dc: DeviceColor) -> dict:
b8201490c731 more light types
drewp@bigasterisk.com
parents: 20
diff changeset
41 return {
b8201490c731 more light types
drewp@bigasterisk.com
parents: 20
diff changeset
42 "transition": 0,
b8201490c731 more light types
drewp@bigasterisk.com
parents: 20
diff changeset
43 "brightness": to8(dc.brightness),
b8201490c731 more light types
drewp@bigasterisk.com
parents: 20
diff changeset
44 # temperature todo
b8201490c731 more light types
drewp@bigasterisk.com
parents: 20
diff changeset
45 }
b8201490c731 more light types
drewp@bigasterisk.com
parents: 20
diff changeset
46
23
7d9a056e29fe esp rgbw output; cleanup
drewp@bigasterisk.com
parents: 21
diff changeset
47
21
b8201490c731 more light types
drewp@bigasterisk.com
parents: 20
diff changeset
48 def zbRelayMessage(dc: DeviceColor) -> dict:
b8201490c731 more light types
drewp@bigasterisk.com
parents: 20
diff changeset
49 return {'state': 'ON' if dc.brightness else 'OFF'}
b8201490c731 more light types
drewp@bigasterisk.com
parents: 20
diff changeset
50
23
7d9a056e29fe esp rgbw output; cleanup
drewp@bigasterisk.com
parents: 21
diff changeset
51
7d9a056e29fe esp rgbw output; cleanup
drewp@bigasterisk.com
parents: 21
diff changeset
52 def espColorMessage(dc: DeviceColor) -> dict:
7d9a056e29fe esp rgbw output; cleanup
drewp@bigasterisk.com
parents: 21
diff changeset
53 return {
26
33b3eb24506e wled (single bulb) support. more lights
drewp@bigasterisk.com
parents: 23
diff changeset
54 "state": 'ON',
23
7d9a056e29fe esp rgbw output; cleanup
drewp@bigasterisk.com
parents: 21
diff changeset
55 "color": {
7d9a056e29fe esp rgbw output; cleanup
drewp@bigasterisk.com
parents: 21
diff changeset
56 "r": to8(dc.r),
7d9a056e29fe esp rgbw output; cleanup
drewp@bigasterisk.com
parents: 21
diff changeset
57 "g": to8(dc.g),
7d9a056e29fe esp rgbw output; cleanup
drewp@bigasterisk.com
parents: 21
diff changeset
58 "b": to8(dc.b),
7d9a056e29fe esp rgbw output; cleanup
drewp@bigasterisk.com
parents: 21
diff changeset
59 "w": to8(dc.w)
7d9a056e29fe esp rgbw output; cleanup
drewp@bigasterisk.com
parents: 21
diff changeset
60 },
7d9a056e29fe esp rgbw output; cleanup
drewp@bigasterisk.com
parents: 21
diff changeset
61 }
7d9a056e29fe esp rgbw output; cleanup
drewp@bigasterisk.com
parents: 21
diff changeset
62
7d9a056e29fe esp rgbw output; cleanup
drewp@bigasterisk.com
parents: 21
diff changeset
63
21
b8201490c731 more light types
drewp@bigasterisk.com
parents: 20
diff changeset
64 def z2mSet(name):
b8201490c731 more light types
drewp@bigasterisk.com
parents: 20
diff changeset
65 return f'zigbee/{name}/set'
15
61d4ccecfed8 rough refactor
drewp@bigasterisk.com
parents:
diff changeset
66
23
7d9a056e29fe esp rgbw output; cleanup
drewp@bigasterisk.com
parents: 21
diff changeset
67
15
61d4ccecfed8 rough refactor
drewp@bigasterisk.com
parents:
diff changeset
68 class ZigbeeTransport(Transport):
61d4ccecfed8 rough refactor
drewp@bigasterisk.com
parents:
diff changeset
69
21
b8201490c731 more light types
drewp@bigasterisk.com
parents: 20
diff changeset
70 def __init__(self, mqtt: MqttIo, name: str, ieee: str, topic=z2mSet, msg=zbColorMessage):
15
61d4ccecfed8 rough refactor
drewp@bigasterisk.com
parents:
diff changeset
71 self.mqtt = mqtt
61d4ccecfed8 rough refactor
drewp@bigasterisk.com
parents:
diff changeset
72 self.name = name
61d4ccecfed8 rough refactor
drewp@bigasterisk.com
parents:
diff changeset
73 self.ieee = ieee
23
7d9a056e29fe esp rgbw output; cleanup
drewp@bigasterisk.com
parents: 21
diff changeset
74 self.topic = topic
21
b8201490c731 more light types
drewp@bigasterisk.com
parents: 20
diff changeset
75 self.msg = msg
15
61d4ccecfed8 rough refactor
drewp@bigasterisk.com
parents:
diff changeset
76
61d4ccecfed8 rough refactor
drewp@bigasterisk.com
parents:
diff changeset
77 def linked(self):
20
24a574108365 more protocols; bugs in setColor
drewp@bigasterisk.com
parents: 15
diff changeset
78 return {'url': f'https://bigasterisk.com/zigbee/console/#/device/{self.ieee}/info', 'label': self.name}
15
61d4ccecfed8 rough refactor
drewp@bigasterisk.com
parents:
diff changeset
79
61d4ccecfed8 rough refactor
drewp@bigasterisk.com
parents:
diff changeset
80 async def send(self, dc: DeviceColor):
21
b8201490c731 more light types
drewp@bigasterisk.com
parents: 20
diff changeset
81 await self.mqtt.publish(self.topic(self.name), json.dumps(self.msg(dc)))
20
24a574108365 more protocols; bugs in setColor
drewp@bigasterisk.com
parents: 15
diff changeset
82
24a574108365 more protocols; bugs in setColor
drewp@bigasterisk.com
parents: 15
diff changeset
83
24a574108365 more protocols; bugs in setColor
drewp@bigasterisk.com
parents: 15
diff changeset
84 class SonoffRelayTransport(Transport):
24a574108365 more protocols; bugs in setColor
drewp@bigasterisk.com
parents: 15
diff changeset
85
24a574108365 more protocols; bugs in setColor
drewp@bigasterisk.com
parents: 15
diff changeset
86 def __init__(self, mqtt: MqttIo, name: str):
24a574108365 more protocols; bugs in setColor
drewp@bigasterisk.com
parents: 15
diff changeset
87 self.mqtt = mqtt
24a574108365 more protocols; bugs in setColor
drewp@bigasterisk.com
parents: 15
diff changeset
88 self.name = name
24a574108365 more protocols; bugs in setColor
drewp@bigasterisk.com
parents: 15
diff changeset
89
24a574108365 more protocols; bugs in setColor
drewp@bigasterisk.com
parents: 15
diff changeset
90 def linked(self):
24a574108365 more protocols; bugs in setColor
drewp@bigasterisk.com
parents: 15
diff changeset
91 return {'label': self.name}
24a574108365 more protocols; bugs in setColor
drewp@bigasterisk.com
parents: 15
diff changeset
92
24a574108365 more protocols; bugs in setColor
drewp@bigasterisk.com
parents: 15
diff changeset
93 async def send(self, dc: DeviceColor):
24a574108365 more protocols; bugs in setColor
drewp@bigasterisk.com
parents: 15
diff changeset
94 topic = f'{self.name}/switch/sonoff_basic_relay/command'
24a574108365 more protocols; bugs in setColor
drewp@bigasterisk.com
parents: 15
diff changeset
95 msg = 'ON' if dc.brightness else 'OFF'
24a574108365 more protocols; bugs in setColor
drewp@bigasterisk.com
parents: 15
diff changeset
96 log.info(f'sonoff {topic=} {msg=}')
24a574108365 more protocols; bugs in setColor
drewp@bigasterisk.com
parents: 15
diff changeset
97 await self.mqtt.publish(topic, msg)
24a574108365 more protocols; bugs in setColor
drewp@bigasterisk.com
parents: 15
diff changeset
98
24a574108365 more protocols; bugs in setColor
drewp@bigasterisk.com
parents: 15
diff changeset
99
24a574108365 more protocols; bugs in setColor
drewp@bigasterisk.com
parents: 15
diff changeset
100 class _WebTransport(Transport):
24a574108365 more protocols; bugs in setColor
drewp@bigasterisk.com
parents: 15
diff changeset
101
24a574108365 more protocols; bugs in setColor
drewp@bigasterisk.com
parents: 15
diff changeset
102 def __init__(self, hostname: str):
24a574108365 more protocols; bugs in setColor
drewp@bigasterisk.com
parents: 15
diff changeset
103 self.hostname = hostname
24a574108365 more protocols; bugs in setColor
drewp@bigasterisk.com
parents: 15
diff changeset
104 self._session = aiohttp.ClientSession()
24a574108365 more protocols; bugs in setColor
drewp@bigasterisk.com
parents: 15
diff changeset
105
24a574108365 more protocols; bugs in setColor
drewp@bigasterisk.com
parents: 15
diff changeset
106 def linked(self):
24a574108365 more protocols; bugs in setColor
drewp@bigasterisk.com
parents: 15
diff changeset
107 return {'url': f'http://{self.hostname}/', 'label': self.hostname}
24a574108365 more protocols; bugs in setColor
drewp@bigasterisk.com
parents: 15
diff changeset
108
24a574108365 more protocols; bugs in setColor
drewp@bigasterisk.com
parents: 15
diff changeset
109
24a574108365 more protocols; bugs in setColor
drewp@bigasterisk.com
parents: 15
diff changeset
110 class TasmotaWebTransport(_WebTransport):
24a574108365 more protocols; bugs in setColor
drewp@bigasterisk.com
parents: 15
diff changeset
111
24a574108365 more protocols; bugs in setColor
drewp@bigasterisk.com
parents: 15
diff changeset
112 async def send(self, dc: DeviceColor):
23
7d9a056e29fe esp rgbw output; cleanup
drewp@bigasterisk.com
parents: 21
diff changeset
113 cmnd = 'Color ' + ','.join(str(to8(x)) for x in (dc.r, dc.g, dc.b, dc.cw, dc.ww))
20
24a574108365 more protocols; bugs in setColor
drewp@bigasterisk.com
parents: 15
diff changeset
114 async with self._session.get(f'http://{self.hostname}/cm', params={'cmnd': cmnd}) as resp:
24a574108365 more protocols; bugs in setColor
drewp@bigasterisk.com
parents: 15
diff changeset
115 await resp.text()
24a574108365 more protocols; bugs in setColor
drewp@bigasterisk.com
parents: 15
diff changeset
116 # {"POWER":"ON","Dimmer":21,"Color":"3636363600","HSBColor":"0,0,21","White":21,"CT":153,"Channel":[21,21,21,21,0]}
24a574108365 more protocols; bugs in setColor
drewp@bigasterisk.com
parents: 15
diff changeset
117
24a574108365 more protocols; bugs in setColor
drewp@bigasterisk.com
parents: 15
diff changeset
118
26
33b3eb24506e wled (single bulb) support. more lights
drewp@bigasterisk.com
parents: 23
diff changeset
119 class WledTransport(_WebTransport):
33b3eb24506e wled (single bulb) support. more lights
drewp@bigasterisk.com
parents: 23
diff changeset
120
33b3eb24506e wled (single bulb) support. more lights
drewp@bigasterisk.com
parents: 23
diff changeset
121 async def send(self, dc: DeviceColor):
33b3eb24506e wled (single bulb) support. more lights
drewp@bigasterisk.com
parents: 23
diff changeset
122 # see https://kno.wled.ge/interfaces/json-api/
33b3eb24506e wled (single bulb) support. more lights
drewp@bigasterisk.com
parents: 23
diff changeset
123 msg = {
33b3eb24506e wled (single bulb) support. more lights
drewp@bigasterisk.com
parents: 23
diff changeset
124 'seg': [{
33b3eb24506e wled (single bulb) support. more lights
drewp@bigasterisk.com
parents: 23
diff changeset
125 "cct": 128, # 0 warm; 255 cool
33b3eb24506e wled (single bulb) support. more lights
drewp@bigasterisk.com
parents: 23
diff changeset
126 "col": [[to8(x) for x in [dc.r, dc.g, dc.b, dc.cw]], [], []]
33b3eb24506e wled (single bulb) support. more lights
drewp@bigasterisk.com
parents: 23
diff changeset
127 }]
33b3eb24506e wled (single bulb) support. more lights
drewp@bigasterisk.com
parents: 23
diff changeset
128 }
33b3eb24506e wled (single bulb) support. more lights
drewp@bigasterisk.com
parents: 23
diff changeset
129 async with self._session.post(f'http://{self.hostname}/json/state', headers={'content-type': 'application/json'}, data=json.dumps(msg)) as resp:
33b3eb24506e wled (single bulb) support. more lights
drewp@bigasterisk.com
parents: 23
diff changeset
130 await resp.text()
33b3eb24506e wled (single bulb) support. more lights
drewp@bigasterisk.com
parents: 23
diff changeset
131 # {"POWER":"ON","Dimmer":21,"Color":"3636363600","HSBColor":"0,0,21","White":21,"CT":153,"Channel":[21,21,21,21,0]}
33b3eb24506e wled (single bulb) support. more lights
drewp@bigasterisk.com
parents: 23
diff changeset
132
33b3eb24506e wled (single bulb) support. more lights
drewp@bigasterisk.com
parents: 23
diff changeset
133
20
24a574108365 more protocols; bugs in setColor
drewp@bigasterisk.com
parents: 15
diff changeset
134 class ShellyGen1WebTransport(_WebTransport):
24a574108365 more protocols; bugs in setColor
drewp@bigasterisk.com
parents: 15
diff changeset
135
24a574108365 more protocols; bugs in setColor
drewp@bigasterisk.com
parents: 15
diff changeset
136 async def send(self, dc: DeviceColor):
24a574108365 more protocols; bugs in setColor
drewp@bigasterisk.com
parents: 15
diff changeset
137 # also see https://shelly-api-docs.shelly.cloud/gen1/#shelly-rgbw2-color-status for metrics
23
7d9a056e29fe esp rgbw output; cleanup
drewp@bigasterisk.com
parents: 21
diff changeset
138 async with self._session.get(f'http://{self.hostname}/light/0', params={
7d9a056e29fe esp rgbw output; cleanup
drewp@bigasterisk.com
parents: 21
diff changeset
139 'red': to8(dc.r),
7d9a056e29fe esp rgbw output; cleanup
drewp@bigasterisk.com
parents: 21
diff changeset
140 'green': to8(dc.g),
7d9a056e29fe esp rgbw output; cleanup
drewp@bigasterisk.com
parents: 21
diff changeset
141 'blue': to8(dc.b),
7d9a056e29fe esp rgbw output; cleanup
drewp@bigasterisk.com
parents: 21
diff changeset
142 'white': to8(dc.w),
7d9a056e29fe esp rgbw output; cleanup
drewp@bigasterisk.com
parents: 21
diff changeset
143 }) as resp:
20
24a574108365 more protocols; bugs in setColor
drewp@bigasterisk.com
parents: 15
diff changeset
144 await resp.text()
24a574108365 more protocols; bugs in setColor
drewp@bigasterisk.com
parents: 15
diff changeset
145 # {..."mode":"color","red":255,"green":242,"blue":0,"white":255,"gain":59,"effect":0,"transition":0,"power":18.00,"overpower":false}