annotate protocols.py @ 21:b8201490c731

more light types
author drewp@bigasterisk.com
date Mon, 29 Jan 2024 12:27:08 -0800
parents 24a574108365
children 7d9a056e29fe
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
b8201490c731 more light types
drewp@bigasterisk.com
parents: 20
diff changeset
47 def zbRelayMessage(dc: DeviceColor) -> dict:
b8201490c731 more light types
drewp@bigasterisk.com
parents: 20
diff changeset
48 return {'state': 'ON' if dc.brightness else 'OFF'}
b8201490c731 more light types
drewp@bigasterisk.com
parents: 20
diff changeset
49
b8201490c731 more light types
drewp@bigasterisk.com
parents: 20
diff changeset
50 def z2mSet(name):
b8201490c731 more light types
drewp@bigasterisk.com
parents: 20
diff changeset
51 return f'zigbee/{name}/set'
15
61d4ccecfed8 rough refactor
drewp@bigasterisk.com
parents:
diff changeset
52
61d4ccecfed8 rough refactor
drewp@bigasterisk.com
parents:
diff changeset
53 class ZigbeeTransport(Transport):
61d4ccecfed8 rough refactor
drewp@bigasterisk.com
parents:
diff changeset
54
21
b8201490c731 more light types
drewp@bigasterisk.com
parents: 20
diff changeset
55 def __init__(self, mqtt: MqttIo, name: str, ieee: str, topic=z2mSet, msg=zbColorMessage):
15
61d4ccecfed8 rough refactor
drewp@bigasterisk.com
parents:
diff changeset
56 self.mqtt = mqtt
61d4ccecfed8 rough refactor
drewp@bigasterisk.com
parents:
diff changeset
57 self.name = name
61d4ccecfed8 rough refactor
drewp@bigasterisk.com
parents:
diff changeset
58 self.ieee = ieee
21
b8201490c731 more light types
drewp@bigasterisk.com
parents: 20
diff changeset
59 self.topic=topic
b8201490c731 more light types
drewp@bigasterisk.com
parents: 20
diff changeset
60 self.msg = msg
15
61d4ccecfed8 rough refactor
drewp@bigasterisk.com
parents:
diff changeset
61
61d4ccecfed8 rough refactor
drewp@bigasterisk.com
parents:
diff changeset
62 def linked(self):
20
24a574108365 more protocols; bugs in setColor
drewp@bigasterisk.com
parents: 15
diff changeset
63 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
64
61d4ccecfed8 rough refactor
drewp@bigasterisk.com
parents:
diff changeset
65 async def send(self, dc: DeviceColor):
21
b8201490c731 more light types
drewp@bigasterisk.com
parents: 20
diff changeset
66 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
67
24a574108365 more protocols; bugs in setColor
drewp@bigasterisk.com
parents: 15
diff changeset
68
24a574108365 more protocols; bugs in setColor
drewp@bigasterisk.com
parents: 15
diff changeset
69 class SonoffRelayTransport(Transport):
24a574108365 more protocols; bugs in setColor
drewp@bigasterisk.com
parents: 15
diff changeset
70
24a574108365 more protocols; bugs in setColor
drewp@bigasterisk.com
parents: 15
diff changeset
71 def __init__(self, mqtt: MqttIo, name: str):
24a574108365 more protocols; bugs in setColor
drewp@bigasterisk.com
parents: 15
diff changeset
72 self.mqtt = mqtt
24a574108365 more protocols; bugs in setColor
drewp@bigasterisk.com
parents: 15
diff changeset
73 self.name = name
24a574108365 more protocols; bugs in setColor
drewp@bigasterisk.com
parents: 15
diff changeset
74
24a574108365 more protocols; bugs in setColor
drewp@bigasterisk.com
parents: 15
diff changeset
75 def linked(self):
24a574108365 more protocols; bugs in setColor
drewp@bigasterisk.com
parents: 15
diff changeset
76 return {'label': self.name}
24a574108365 more protocols; bugs in setColor
drewp@bigasterisk.com
parents: 15
diff changeset
77
24a574108365 more protocols; bugs in setColor
drewp@bigasterisk.com
parents: 15
diff changeset
78 async def send(self, dc: DeviceColor):
24a574108365 more protocols; bugs in setColor
drewp@bigasterisk.com
parents: 15
diff changeset
79 topic = f'{self.name}/switch/sonoff_basic_relay/command'
24a574108365 more protocols; bugs in setColor
drewp@bigasterisk.com
parents: 15
diff changeset
80 msg = 'ON' if dc.brightness else 'OFF'
24a574108365 more protocols; bugs in setColor
drewp@bigasterisk.com
parents: 15
diff changeset
81 log.info(f'sonoff {topic=} {msg=}')
24a574108365 more protocols; bugs in setColor
drewp@bigasterisk.com
parents: 15
diff changeset
82 await self.mqtt.publish(topic, msg)
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
24a574108365 more protocols; bugs in setColor
drewp@bigasterisk.com
parents: 15
diff changeset
85 class _WebTransport(Transport):
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 def __init__(self, hostname: str):
24a574108365 more protocols; bugs in setColor
drewp@bigasterisk.com
parents: 15
diff changeset
88 self.hostname = hostname
24a574108365 more protocols; bugs in setColor
drewp@bigasterisk.com
parents: 15
diff changeset
89 self._session = aiohttp.ClientSession()
24a574108365 more protocols; bugs in setColor
drewp@bigasterisk.com
parents: 15
diff changeset
90
24a574108365 more protocols; bugs in setColor
drewp@bigasterisk.com
parents: 15
diff changeset
91 def linked(self):
24a574108365 more protocols; bugs in setColor
drewp@bigasterisk.com
parents: 15
diff changeset
92 return {'url': f'http://{self.hostname}/', 'label': self.hostname}
24a574108365 more protocols; bugs in setColor
drewp@bigasterisk.com
parents: 15
diff changeset
93
24a574108365 more protocols; bugs in setColor
drewp@bigasterisk.com
parents: 15
diff changeset
94
24a574108365 more protocols; bugs in setColor
drewp@bigasterisk.com
parents: 15
diff changeset
95 class TasmotaWebTransport(_WebTransport):
24a574108365 more protocols; bugs in setColor
drewp@bigasterisk.com
parents: 15
diff changeset
96
24a574108365 more protocols; bugs in setColor
drewp@bigasterisk.com
parents: 15
diff changeset
97 async def send(self, dc: DeviceColor):
24a574108365 more protocols; bugs in setColor
drewp@bigasterisk.com
parents: 15
diff changeset
98 cmnd = 'Color ' + ','.join(str(int(x * 255)) for x in (dc.r, dc.g, dc.b, dc.cw, dc.ww))
24a574108365 more protocols; bugs in setColor
drewp@bigasterisk.com
parents: 15
diff changeset
99 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
100 await resp.text()
24a574108365 more protocols; bugs in setColor
drewp@bigasterisk.com
parents: 15
diff changeset
101 # {"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
102
24a574108365 more protocols; bugs in setColor
drewp@bigasterisk.com
parents: 15
diff changeset
103
24a574108365 more protocols; bugs in setColor
drewp@bigasterisk.com
parents: 15
diff changeset
104 class ShellyGen1WebTransport(_WebTransport):
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 async def send(self, dc: DeviceColor):
24a574108365 more protocols; bugs in setColor
drewp@bigasterisk.com
parents: 15
diff changeset
107 # also see https://shelly-api-docs.shelly.cloud/gen1/#shelly-rgbw2-color-status for metrics
24a574108365 more protocols; bugs in setColor
drewp@bigasterisk.com
parents: 15
diff changeset
108 async with self._session.get(f'http://{self.hostname}/light/0',
24a574108365 more protocols; bugs in setColor
drewp@bigasterisk.com
parents: 15
diff changeset
109 params={
24a574108365 more protocols; bugs in setColor
drewp@bigasterisk.com
parents: 15
diff changeset
110 'red': int(dc.r * 255),
24a574108365 more protocols; bugs in setColor
drewp@bigasterisk.com
parents: 15
diff changeset
111 'green': int(dc.g * 255),
24a574108365 more protocols; bugs in setColor
drewp@bigasterisk.com
parents: 15
diff changeset
112 'blue': int(dc.b * 255),
24a574108365 more protocols; bugs in setColor
drewp@bigasterisk.com
parents: 15
diff changeset
113 'white': int(dc.w * 255),
24a574108365 more protocols; bugs in setColor
drewp@bigasterisk.com
parents: 15
diff changeset
114 }) 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 # {..."mode":"color","red":255,"green":242,"blue":0,"white":255,"gain":59,"effect":0,"transition":0,"power":18.00,"overpower":false}