annotate doorbell_to_mqtt.py @ 5:696a46a1b239

logging and minor refactors
author drewp@bigasterisk.com
date Sun, 05 Feb 2023 14:26:04 -0800
parents f822e7fe7120
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
2
f822e7fe7120 rewrite to use telemetrix (localized)
drewp@bigasterisk.com
parents: 0
diff changeset
1 import asyncio
0
drewp@bigasterisk.com
parents:
diff changeset
2 import logging
drewp@bigasterisk.com
parents:
diff changeset
3 import sys
drewp@bigasterisk.com
parents:
diff changeset
4
2
f822e7fe7120 rewrite to use telemetrix (localized)
drewp@bigasterisk.com
parents: 0
diff changeset
5 import asyncio_mqtt
f822e7fe7120 rewrite to use telemetrix (localized)
drewp@bigasterisk.com
parents: 0
diff changeset
6 import uvicorn
f822e7fe7120 rewrite to use telemetrix (localized)
drewp@bigasterisk.com
parents: 0
diff changeset
7 from starlette.applications import Starlette
f822e7fe7120 rewrite to use telemetrix (localized)
drewp@bigasterisk.com
parents: 0
diff changeset
8 from starlette.requests import Request
f822e7fe7120 rewrite to use telemetrix (localized)
drewp@bigasterisk.com
parents: 0
diff changeset
9 from starlette.responses import HTMLResponse, RedirectResponse
f822e7fe7120 rewrite to use telemetrix (localized)
drewp@bigasterisk.com
parents: 0
diff changeset
10 from starlette.routing import Route
f822e7fe7120 rewrite to use telemetrix (localized)
drewp@bigasterisk.com
parents: 0
diff changeset
11 from typing import Optional
f822e7fe7120 rewrite to use telemetrix (localized)
drewp@bigasterisk.com
parents: 0
diff changeset
12 import telemetrix_local as telemetrix_aio
0
drewp@bigasterisk.com
parents:
diff changeset
13
2
f822e7fe7120 rewrite to use telemetrix (localized)
drewp@bigasterisk.com
parents: 0
diff changeset
14 DIGITAL_PIN = 2 # arduino pin number
f822e7fe7120 rewrite to use telemetrix (localized)
drewp@bigasterisk.com
parents: 0
diff changeset
15 KILL_TIME = 5 # sleep time to keep forever loop open
f822e7fe7120 rewrite to use telemetrix (localized)
drewp@bigasterisk.com
parents: 0
diff changeset
16 MQTT_RECONNECT_SEC = 5
f822e7fe7120 rewrite to use telemetrix (localized)
drewp@bigasterisk.com
parents: 0
diff changeset
17 MIN_REPEAT_SEC = 2
0
drewp@bigasterisk.com
parents:
diff changeset
18
2
f822e7fe7120 rewrite to use telemetrix (localized)
drewp@bigasterisk.com
parents: 0
diff changeset
19 logging.basicConfig(level=logging.DEBUG)
0
drewp@bigasterisk.com
parents:
diff changeset
20 log = logging.getLogger()
drewp@bigasterisk.com
parents:
diff changeset
21
drewp@bigasterisk.com
parents:
diff changeset
22 dev, = sys.argv[1:]
drewp@bigasterisk.com
parents:
diff changeset
23
drewp@bigasterisk.com
parents:
diff changeset
24
2
f822e7fe7120 rewrite to use telemetrix (localized)
drewp@bigasterisk.com
parents: 0
diff changeset
25 async def digital_in_pullup(my_board, pin):
f822e7fe7120 rewrite to use telemetrix (localized)
drewp@bigasterisk.com
parents: 0
diff changeset
26 last_report = 0
0
drewp@bigasterisk.com
parents:
diff changeset
27
2
f822e7fe7120 rewrite to use telemetrix (localized)
drewp@bigasterisk.com
parents: 0
diff changeset
28 async def cb(data):
f822e7fe7120 rewrite to use telemetrix (localized)
drewp@bigasterisk.com
parents: 0
diff changeset
29 nonlocal last_report
f822e7fe7120 rewrite to use telemetrix (localized)
drewp@bigasterisk.com
parents: 0
diff changeset
30 _pinmode, _pin, value, t = data
f822e7fe7120 rewrite to use telemetrix (localized)
drewp@bigasterisk.com
parents: 0
diff changeset
31 pressed = not value
f822e7fe7120 rewrite to use telemetrix (localized)
drewp@bigasterisk.com
parents: 0
diff changeset
32 if pressed:
f822e7fe7120 rewrite to use telemetrix (localized)
drewp@bigasterisk.com
parents: 0
diff changeset
33 if last_report < t - MIN_REPEAT_SEC:
f822e7fe7120 rewrite to use telemetrix (localized)
drewp@bigasterisk.com
parents: 0
diff changeset
34 log.info(f'press {t}')
f822e7fe7120 rewrite to use telemetrix (localized)
drewp@bigasterisk.com
parents: 0
diff changeset
35 await press()
f822e7fe7120 rewrite to use telemetrix (localized)
drewp@bigasterisk.com
parents: 0
diff changeset
36 last_report = t
0
drewp@bigasterisk.com
parents:
diff changeset
37
2
f822e7fe7120 rewrite to use telemetrix (localized)
drewp@bigasterisk.com
parents: 0
diff changeset
38 await my_board.set_pin_mode_digital_input_pullup(pin, cb)
f822e7fe7120 rewrite to use telemetrix (localized)
drewp@bigasterisk.com
parents: 0
diff changeset
39 await board.enable_digital_reporting(2)
f822e7fe7120 rewrite to use telemetrix (localized)
drewp@bigasterisk.com
parents: 0
diff changeset
40 while True:
f822e7fe7120 rewrite to use telemetrix (localized)
drewp@bigasterisk.com
parents: 0
diff changeset
41 await asyncio.sleep(KILL_TIME)
0
drewp@bigasterisk.com
parents:
diff changeset
42
drewp@bigasterisk.com
parents:
diff changeset
43
2
f822e7fe7120 rewrite to use telemetrix (localized)
drewp@bigasterisk.com
parents: 0
diff changeset
44 board = telemetrix_aio.TelemetrixAIO(com_port=dev, autostart=False)
f822e7fe7120 rewrite to use telemetrix (localized)
drewp@bigasterisk.com
parents: 0
diff changeset
45
f822e7fe7120 rewrite to use telemetrix (localized)
drewp@bigasterisk.com
parents: 0
diff changeset
46 cli: Optional[asyncio_mqtt.Client] =None
f822e7fe7120 rewrite to use telemetrix (localized)
drewp@bigasterisk.com
parents: 0
diff changeset
47
f822e7fe7120 rewrite to use telemetrix (localized)
drewp@bigasterisk.com
parents: 0
diff changeset
48 async def press():
f822e7fe7120 rewrite to use telemetrix (localized)
drewp@bigasterisk.com
parents: 0
diff changeset
49 await cli.publish('doorbell/button', 'pressed')
f822e7fe7120 rewrite to use telemetrix (localized)
drewp@bigasterisk.com
parents: 0
diff changeset
50
f822e7fe7120 rewrite to use telemetrix (localized)
drewp@bigasterisk.com
parents: 0
diff changeset
51 async def status(request: Request) -> HTMLResponse:
f822e7fe7120 rewrite to use telemetrix (localized)
drewp@bigasterisk.com
parents: 0
diff changeset
52 return HTMLResponse("""<doctype HTML>
f822e7fe7120 rewrite to use telemetrix (localized)
drewp@bigasterisk.com
parents: 0
diff changeset
53 <html>
f822e7fe7120 rewrite to use telemetrix (localized)
drewp@bigasterisk.com
parents: 0
diff changeset
54 <head><title>doorbell</title></head>
f822e7fe7120 rewrite to use telemetrix (localized)
drewp@bigasterisk.com
parents: 0
diff changeset
55 <body>
f822e7fe7120 rewrite to use telemetrix (localized)
drewp@bigasterisk.com
parents: 0
diff changeset
56 <form method="POST" action="press">
f822e7fe7120 rewrite to use telemetrix (localized)
drewp@bigasterisk.com
parents: 0
diff changeset
57 <button type="submit">test ring</button>
f822e7fe7120 rewrite to use telemetrix (localized)
drewp@bigasterisk.com
parents: 0
diff changeset
58 </form>
f822e7fe7120 rewrite to use telemetrix (localized)
drewp@bigasterisk.com
parents: 0
diff changeset
59 </body>
f822e7fe7120 rewrite to use telemetrix (localized)
drewp@bigasterisk.com
parents: 0
diff changeset
60 </html>
f822e7fe7120 rewrite to use telemetrix (localized)
drewp@bigasterisk.com
parents: 0
diff changeset
61 """)
f822e7fe7120 rewrite to use telemetrix (localized)
drewp@bigasterisk.com
parents: 0
diff changeset
62
f822e7fe7120 rewrite to use telemetrix (localized)
drewp@bigasterisk.com
parents: 0
diff changeset
63 async def post_press(request: Request) -> RedirectResponse:
f822e7fe7120 rewrite to use telemetrix (localized)
drewp@bigasterisk.com
parents: 0
diff changeset
64 await press()
f822e7fe7120 rewrite to use telemetrix (localized)
drewp@bigasterisk.com
parents: 0
diff changeset
65 return RedirectResponse('.', status_code=303)
f822e7fe7120 rewrite to use telemetrix (localized)
drewp@bigasterisk.com
parents: 0
diff changeset
66
0
drewp@bigasterisk.com
parents:
diff changeset
67
drewp@bigasterisk.com
parents:
diff changeset
68
2
f822e7fe7120 rewrite to use telemetrix (localized)
drewp@bigasterisk.com
parents: 0
diff changeset
69 app = Starlette(routes=[
f822e7fe7120 rewrite to use telemetrix (localized)
drewp@bigasterisk.com
parents: 0
diff changeset
70 Route('/', status),
f822e7fe7120 rewrite to use telemetrix (localized)
drewp@bigasterisk.com
parents: 0
diff changeset
71 Route('/press', post_press, methods=['POST']),
f822e7fe7120 rewrite to use telemetrix (localized)
drewp@bigasterisk.com
parents: 0
diff changeset
72 ])
f822e7fe7120 rewrite to use telemetrix (localized)
drewp@bigasterisk.com
parents: 0
diff changeset
73
f822e7fe7120 rewrite to use telemetrix (localized)
drewp@bigasterisk.com
parents: 0
diff changeset
74
f822e7fe7120 rewrite to use telemetrix (localized)
drewp@bigasterisk.com
parents: 0
diff changeset
75 async def main():
f822e7fe7120 rewrite to use telemetrix (localized)
drewp@bigasterisk.com
parents: 0
diff changeset
76 global cli
f822e7fe7120 rewrite to use telemetrix (localized)
drewp@bigasterisk.com
parents: 0
diff changeset
77 config = uvicorn.Config(app, host='0.0.0.0', port=8000, log_level="info")
f822e7fe7120 rewrite to use telemetrix (localized)
drewp@bigasterisk.com
parents: 0
diff changeset
78 server = uvicorn.Server(config)
f822e7fe7120 rewrite to use telemetrix (localized)
drewp@bigasterisk.com
parents: 0
diff changeset
79
f822e7fe7120 rewrite to use telemetrix (localized)
drewp@bigasterisk.com
parents: 0
diff changeset
80 online = 'doorbell/online'
f822e7fe7120 rewrite to use telemetrix (localized)
drewp@bigasterisk.com
parents: 0
diff changeset
81 will = asyncio_mqtt.Will(topic=online, payload='0')
f822e7fe7120 rewrite to use telemetrix (localized)
drewp@bigasterisk.com
parents: 0
diff changeset
82 async with asyncio_mqtt.Client(
f822e7fe7120 rewrite to use telemetrix (localized)
drewp@bigasterisk.com
parents: 0
diff changeset
83 "bang",
f822e7fe7120 rewrite to use telemetrix (localized)
drewp@bigasterisk.com
parents: 0
diff changeset
84 keepalive=10, # don't go below firmata startup time of 5sec
f822e7fe7120 rewrite to use telemetrix (localized)
drewp@bigasterisk.com
parents: 0
diff changeset
85 will=will) as client:
f822e7fe7120 rewrite to use telemetrix (localized)
drewp@bigasterisk.com
parents: 0
diff changeset
86 log.debug(f'with {client=}')
f822e7fe7120 rewrite to use telemetrix (localized)
drewp@bigasterisk.com
parents: 0
diff changeset
87 cli=client
f822e7fe7120 rewrite to use telemetrix (localized)
drewp@bigasterisk.com
parents: 0
diff changeset
88 await board.start_aio()
f822e7fe7120 rewrite to use telemetrix (localized)
drewp@bigasterisk.com
parents: 0
diff changeset
89
f822e7fe7120 rewrite to use telemetrix (localized)
drewp@bigasterisk.com
parents: 0
diff changeset
90 t1 = asyncio.create_task(server.serve())
f822e7fe7120 rewrite to use telemetrix (localized)
drewp@bigasterisk.com
parents: 0
diff changeset
91 t2 = asyncio.create_task(digital_in_pullup(board, 2))
f822e7fe7120 rewrite to use telemetrix (localized)
drewp@bigasterisk.com
parents: 0
diff changeset
92 await client.publish(online, '1')
f822e7fe7120 rewrite to use telemetrix (localized)
drewp@bigasterisk.com
parents: 0
diff changeset
93 while True:
f822e7fe7120 rewrite to use telemetrix (localized)
drewp@bigasterisk.com
parents: 0
diff changeset
94 await asyncio.sleep(KILL_TIME)
f822e7fe7120 rewrite to use telemetrix (localized)
drewp@bigasterisk.com
parents: 0
diff changeset
95
f822e7fe7120 rewrite to use telemetrix (localized)
drewp@bigasterisk.com
parents: 0
diff changeset
96
f822e7fe7120 rewrite to use telemetrix (localized)
drewp@bigasterisk.com
parents: 0
diff changeset
97 asyncio.run(main(), debug=True)