comparison pi_mqtt.py @ 0:3989f073ed9e

start. hardcoded motion light in garage
author drewp@bigasterisk.com
date Thu, 24 Aug 2023 16:28:05 -0700
parents
children 0cc41259fddd
comparison
equal deleted inserted replaced
-1:000000000000 0:3989f073ed9e
1 import logging
2 import time
3 from dataclasses import dataclass
4
5 import background_loop
6 import pigpio
7 from prometheus_client import Gauge
8 from starlette.applications import Starlette
9 from starlette.requests import Request
10 from starlette.responses import JSONResponse
11 from starlette.routing import Route
12 from starlette_exporter import PrometheusMiddleware, handle_metrics
13
14 SENSOR_MOTION = Gauge('sensor_motion', 'motion detected', ['loc'])
15 OUTPUT_LIGHT = Gauge('output_light', 'light level', ['loc'])
16 logging.basicConfig(level=logging.INFO)
17 log = logging.getLogger()
18
19
20 def hello(request: Request) -> JSONResponse:
21 return JSONResponse({"demo": "hello"})
22
23
24 @dataclass
25 class Poller:
26 garage: pigpio.pi
27 last_motion = 0
28
29 def poll(self, first_run=False):
30 now = time.time()
31 mo = self.garage.read(4)
32 SENSOR_MOTION.labels(loc='ga').set(mo)
33 if mo:
34 self.last_motion = now
35
36 light_on = self.last_motion > now - 20 * 60
37 OUTPUT_LIGHT.labels(loc='ga').set(light_on)
38 self.garage.write(15, not light_on)
39
40
41 def main():
42 garage = pigpio.pi(host='garage5', port=8888)
43
44 poller = Poller(garage)
45 garage.set_mode(4, pigpio.INPUT)
46 garage.set_mode(15, pigpio.OUTPUT)
47 background_loop.loop_forever(poller.poll, 1)
48
49 app = Starlette(debug=True, routes=[
50 Route('/api/hello', hello),
51 ])
52
53 app.add_middleware(PrometheusMiddleware, app_name='pi_mqtt')
54 app.add_route("/metrics", handle_metrics)
55 return app
56
57
58 app = main()