0
|
1 import logging
|
|
2 import os
|
|
3 from typing import cast
|
|
4
|
|
5 import aiomqtt
|
|
6 import httpx
|
|
7 from rdferry import StarletteServer
|
|
8
|
|
9 logging.basicConfig(level=logging.INFO)
|
|
10 log = logging.getLogger()
|
|
11
|
|
12 DIMCURVE_SERVICE_HOST = os.environ['DIMCURVE_SERVICE_HOST']
|
|
13
|
|
14 httpClient = httpx.AsyncClient()
|
|
15
|
|
16
|
|
17 def faderValueUrl(faderName: str):
|
|
18 return f'http://{DIMCURVE_SERVICE_HOST}/dimcurve/api/faders/{faderName}/value'
|
|
19
|
|
20
|
|
21 async def sendValue(faderName: str, value: float):
|
|
22 await httpClient.put(faderValueUrl(faderName), content=str(value).encode('ascii'))
|
|
23
|
|
24
|
|
25 async def onMessage(message):
|
|
26 log.info(f'{message.topic}: {message.payload}')
|
|
27 payloadMap = {
|
|
28 b'1_single': 1,
|
|
29 b'2_single': 0.50,
|
|
30 b'3_single': 0.25,
|
|
31 b'4_single': 0,
|
|
32 }
|
|
33 value = payloadMap.get(cast(bytes, message.payload))
|
|
34 if value is None:
|
|
35 raise ValueError(str(message.payload))
|
|
36 await sendValue('tr', value)
|
|
37
|
|
38
|
|
39 async def watchMqtt():
|
|
40 client = aiomqtt.Client('mqtt2.bigasterisk.com')
|
|
41 async with client:
|
|
42 await client.subscribe('zigbee/tr-4button-1/action')
|
|
43 await client.subscribe('zigbee/tr-4button-2/action')
|
|
44 async for message in client.messages:
|
|
45 try:
|
|
46 await onMessage(message)
|
|
47 except Exception:
|
|
48 log.warning("onMessage failed", exc_info=True)
|
|
49
|
|
50
|
|
51 async def watchMqttReconnect():
|
|
52 while True:
|
|
53 try:
|
|
54 await watchMqtt()
|
|
55 except Exception:
|
|
56 log.warning("watchMqtt restarting", exc_info=True)
|
|
57
|
|
58
|
|
59 def main():
|
|
60
|
|
61 server = StarletteServer()
|
|
62 server.serve(startup_tasks=[watchMqttReconnect()])
|
|
63
|
|
64 return app
|
|
65
|
|
66
|
|
67 app = main()
|