annotate sensor_bridge.py @ 1:087b57dd3587 default tip

if dimcurve request times out, abort so we get its new address
author drewp@bigasterisk.com
date Sat, 14 Dec 2024 21:39:44 -0800
parents 62cca1da7955
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
0
drewp@bigasterisk.com
parents:
diff changeset
1 import logging
drewp@bigasterisk.com
parents:
diff changeset
2 import os
drewp@bigasterisk.com
parents:
diff changeset
3 from typing import cast
drewp@bigasterisk.com
parents:
diff changeset
4
drewp@bigasterisk.com
parents:
diff changeset
5 import aiomqtt
drewp@bigasterisk.com
parents:
diff changeset
6 import httpx
drewp@bigasterisk.com
parents:
diff changeset
7 from rdferry import StarletteServer
drewp@bigasterisk.com
parents:
diff changeset
8
drewp@bigasterisk.com
parents:
diff changeset
9 logging.basicConfig(level=logging.INFO)
drewp@bigasterisk.com
parents:
diff changeset
10 log = logging.getLogger()
drewp@bigasterisk.com
parents:
diff changeset
11
drewp@bigasterisk.com
parents:
diff changeset
12 DIMCURVE_SERVICE_HOST = os.environ['DIMCURVE_SERVICE_HOST']
drewp@bigasterisk.com
parents:
diff changeset
13
drewp@bigasterisk.com
parents:
diff changeset
14 httpClient = httpx.AsyncClient()
drewp@bigasterisk.com
parents:
diff changeset
15
drewp@bigasterisk.com
parents:
diff changeset
16
drewp@bigasterisk.com
parents:
diff changeset
17 def faderValueUrl(faderName: str):
drewp@bigasterisk.com
parents:
diff changeset
18 return f'http://{DIMCURVE_SERVICE_HOST}/dimcurve/api/faders/{faderName}/value'
drewp@bigasterisk.com
parents:
diff changeset
19
drewp@bigasterisk.com
parents:
diff changeset
20
drewp@bigasterisk.com
parents:
diff changeset
21 async def sendValue(faderName: str, value: float):
1
087b57dd3587 if dimcurve request times out, abort so we get its new address
drewp@bigasterisk.com
parents: 0
diff changeset
22 try:
087b57dd3587 if dimcurve request times out, abort so we get its new address
drewp@bigasterisk.com
parents: 0
diff changeset
23 await httpClient.put(faderValueUrl(faderName), content=str(value).encode('ascii'), timeout=2)
087b57dd3587 if dimcurve request times out, abort so we get its new address
drewp@bigasterisk.com
parents: 0
diff changeset
24 except Exception:
087b57dd3587 if dimcurve request times out, abort so we get its new address
drewp@bigasterisk.com
parents: 0
diff changeset
25 log.warning("put failed - restarting service", exc_info=True)
087b57dd3587 if dimcurve request times out, abort so we get its new address
drewp@bigasterisk.com
parents: 0
diff changeset
26 os.abort()
0
drewp@bigasterisk.com
parents:
diff changeset
27
drewp@bigasterisk.com
parents:
diff changeset
28
drewp@bigasterisk.com
parents:
diff changeset
29 async def onMessage(message):
drewp@bigasterisk.com
parents:
diff changeset
30 log.info(f'{message.topic}: {message.payload}')
drewp@bigasterisk.com
parents:
diff changeset
31 payloadMap = {
drewp@bigasterisk.com
parents:
diff changeset
32 b'1_single': 1,
drewp@bigasterisk.com
parents:
diff changeset
33 b'2_single': 0.50,
drewp@bigasterisk.com
parents:
diff changeset
34 b'3_single': 0.25,
drewp@bigasterisk.com
parents:
diff changeset
35 b'4_single': 0,
drewp@bigasterisk.com
parents:
diff changeset
36 }
drewp@bigasterisk.com
parents:
diff changeset
37 value = payloadMap.get(cast(bytes, message.payload))
drewp@bigasterisk.com
parents:
diff changeset
38 if value is None:
drewp@bigasterisk.com
parents:
diff changeset
39 raise ValueError(str(message.payload))
drewp@bigasterisk.com
parents:
diff changeset
40 await sendValue('tr', value)
drewp@bigasterisk.com
parents:
diff changeset
41
drewp@bigasterisk.com
parents:
diff changeset
42
drewp@bigasterisk.com
parents:
diff changeset
43 async def watchMqtt():
drewp@bigasterisk.com
parents:
diff changeset
44 client = aiomqtt.Client('mqtt2.bigasterisk.com')
drewp@bigasterisk.com
parents:
diff changeset
45 async with client:
drewp@bigasterisk.com
parents:
diff changeset
46 await client.subscribe('zigbee/tr-4button-1/action')
drewp@bigasterisk.com
parents:
diff changeset
47 await client.subscribe('zigbee/tr-4button-2/action')
drewp@bigasterisk.com
parents:
diff changeset
48 async for message in client.messages:
drewp@bigasterisk.com
parents:
diff changeset
49 try:
drewp@bigasterisk.com
parents:
diff changeset
50 await onMessage(message)
drewp@bigasterisk.com
parents:
diff changeset
51 except Exception:
drewp@bigasterisk.com
parents:
diff changeset
52 log.warning("onMessage failed", exc_info=True)
drewp@bigasterisk.com
parents:
diff changeset
53
drewp@bigasterisk.com
parents:
diff changeset
54
drewp@bigasterisk.com
parents:
diff changeset
55 async def watchMqttReconnect():
drewp@bigasterisk.com
parents:
diff changeset
56 while True:
drewp@bigasterisk.com
parents:
diff changeset
57 try:
drewp@bigasterisk.com
parents:
diff changeset
58 await watchMqtt()
drewp@bigasterisk.com
parents:
diff changeset
59 except Exception:
drewp@bigasterisk.com
parents:
diff changeset
60 log.warning("watchMqtt restarting", exc_info=True)
drewp@bigasterisk.com
parents:
diff changeset
61
drewp@bigasterisk.com
parents:
diff changeset
62
drewp@bigasterisk.com
parents:
diff changeset
63 def main():
drewp@bigasterisk.com
parents:
diff changeset
64
drewp@bigasterisk.com
parents:
diff changeset
65 server = StarletteServer()
drewp@bigasterisk.com
parents:
diff changeset
66 server.serve(startup_tasks=[watchMqttReconnect()])
drewp@bigasterisk.com
parents:
diff changeset
67
drewp@bigasterisk.com
parents:
diff changeset
68 return app
drewp@bigasterisk.com
parents:
diff changeset
69
drewp@bigasterisk.com
parents:
diff changeset
70
drewp@bigasterisk.com
parents:
diff changeset
71 app = main()