annotate protocols.py @ 29:35affd4d37d4 default tip

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