annotate protocols.py @ 23:7d9a056e29fe

esp rgbw output; cleanup
author drewp@bigasterisk.com
date Mon, 29 Jan 2024 23:41:27 -0800
parents b8201490c731
children 33b3eb24506e
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 {
7d9a056e29fe esp rgbw output; cleanup
drewp@bigasterisk.com
parents: 21
diff changeset
54 "state":'ON',
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
24a574108365 more protocols; bugs in setColor
drewp@bigasterisk.com
parents: 15
diff changeset
119 class ShellyGen1WebTransport(_WebTransport):
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 async def send(self, dc: DeviceColor):
24a574108365 more protocols; bugs in setColor
drewp@bigasterisk.com
parents: 15
diff changeset
122 # 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
123 async with self._session.get(f'http://{self.hostname}/light/0', params={
7d9a056e29fe esp rgbw output; cleanup
drewp@bigasterisk.com
parents: 21
diff changeset
124 'red': to8(dc.r),
7d9a056e29fe esp rgbw output; cleanup
drewp@bigasterisk.com
parents: 21
diff changeset
125 'green': to8(dc.g),
7d9a056e29fe esp rgbw output; cleanup
drewp@bigasterisk.com
parents: 21
diff changeset
126 'blue': to8(dc.b),
7d9a056e29fe esp rgbw output; cleanup
drewp@bigasterisk.com
parents: 21
diff changeset
127 'white': to8(dc.w),
7d9a056e29fe esp rgbw output; cleanup
drewp@bigasterisk.com
parents: 21
diff changeset
128 }) as resp:
20
24a574108365 more protocols; bugs in setColor
drewp@bigasterisk.com
parents: 15
diff changeset
129 await resp.text()
24a574108365 more protocols; bugs in setColor
drewp@bigasterisk.com
parents: 15
diff changeset
130 # {..."mode":"color","red":255,"green":242,"blue":0,"white":255,"gain":59,"effect":0,"transition":0,"power":18.00,"overpower":false}