Mercurial > code > home > repos > front-door-lock
comparison front_door_lock.py @ 5:9eaa993ed373
monitoring
author | drewp@bigasterisk.com |
---|---|
date | Sun, 15 Oct 2023 18:47:45 -0700 |
parents | d0fa3638de2a |
children | 18c0dbfab73a |
comparison
equal
deleted
inserted
replaced
4:d0fa3638de2a | 5:9eaa993ed373 |
---|---|
29 from starlette.exceptions import HTTPException | 29 from starlette.exceptions import HTTPException |
30 from starlette.requests import Request | 30 from starlette.requests import Request |
31 from starlette.responses import JSONResponse | 31 from starlette.responses import JSONResponse |
32 from starlette.routing import Route | 32 from starlette.routing import Route |
33 from starlette_exporter import PrometheusMiddleware, handle_metrics | 33 from starlette_exporter import PrometheusMiddleware, handle_metrics |
34 | 34 from prometheus_client import Gauge |
35 from get_agent import getFoafAgent | 35 from get_agent import getFoafAgent |
36 | 36 |
37 logging.basicConfig(level=logging.INFO) | 37 logging.basicConfig(level=logging.INFO) |
38 log = logging.getLogger() | 38 log = logging.getLogger() |
39 | 39 |
40 ROOM = Namespace('http://projects.bigasterisk.com/room/') | 40 ROOM = Namespace('http://projects.bigasterisk.com/room/') |
41 ctx = ROOM['frontDoorLockGraph'] | 41 ctx = ROOM['frontDoorLockGraph'] |
42 lockUri = ROOM['frontDoorLock'] | 42 lockUri = ROOM['frontDoorLock'] |
43 | 43 |
44 MQTT_CONNECTED = Gauge('mqtt_connected', 'mqtt is connected') | |
45 HW_CONNECTED = Gauge('hw_connected', 'esp is connected') | |
44 | 46 |
45 def output(graph: PatchableGraph, request: Request) -> JSONResponse: | 47 def output(graph: PatchableGraph, request: Request) -> JSONResponse: |
46 return JSONResponse({"demo": "hello"}) | 48 return JSONResponse({"demo": "hello"}) |
47 | 49 |
48 | 50 |
118 async def _go(self): | 120 async def _go(self): |
119 self.client = aiomqtt.Client("mosquitto-frontdoor", 10210, client_id="lock-service-%s" % time.time(), keepalive=6) | 121 self.client = aiomqtt.Client("mosquitto-frontdoor", 10210, client_id="lock-service-%s" % time.time(), keepalive=6) |
120 while True: | 122 while True: |
121 try: | 123 try: |
122 async with self.client: | 124 async with self.client: |
125 MQTT_CONNECTED.set(1) | |
123 await self._handleMessages() | 126 await self._handleMessages() |
124 except aiomqtt.MqttError: | 127 except aiomqtt.MqttError: |
128 MQTT_CONNECTED.set(0) | |
125 log.error('mqtt reconnecting', exc_info=True) | 129 log.error('mqtt reconnecting', exc_info=True) |
126 await asyncio.sleep(5) | 130 await asyncio.sleep(5) |
131 finally: | |
132 MQTT_CONNECTED.set(0) | |
127 | 133 |
128 async def _handleMessages(self): | 134 async def _handleMessages(self): |
129 async with self.client.messages() as messages: | 135 async with self.client.messages() as messages: |
130 await self.client.subscribe(self.topicRoot + '/#') | 136 await self.client.subscribe(self.topicRoot + '/#') |
131 async for message in messages: | 137 async for message in messages: |
138 async def sendStrikeCommand(self, value: bool): | 144 async def sendStrikeCommand(self, value: bool): |
139 await self.client.publish(self.topicRoot + '/switch/strike/command', 'ON' if value else 'OFF', qos=0, retain=False) | 145 await self.client.publish(self.topicRoot + '/switch/strike/command', 'ON' if value else 'OFF', qos=0, retain=False) |
140 | 146 |
141 def _stateFromMqtt(self, payload: str) -> URIRef: | 147 def _stateFromMqtt(self, payload: str) -> URIRef: |
142 return { | 148 return { |
149 '': ROOM['unknownState'], | |
143 'OFF': ROOM['locked'], | 150 'OFF': ROOM['locked'], |
144 'ON': ROOM['unlocked'], | 151 'ON': ROOM['unlocked'], |
145 }[payload] | 152 }[payload] |
146 | 153 |
147 def _onMessage(self, message: aiomqtt.Message): | 154 def _onMessage(self, message: aiomqtt.Message): |
153 case 'switch/strike/state': | 160 case 'switch/strike/state': |
154 log.info(f'hw reports strike state = {payload}') | 161 log.info(f'hw reports strike state = {payload}') |
155 self.hw.writeHwLockStateToGraph(self._stateFromMqtt(payload)) | 162 self.hw.writeHwLockStateToGraph(self._stateFromMqtt(payload)) |
156 case 'status': | 163 case 'status': |
157 self.hw.setOnline(payload == 'online') | 164 self.hw.setOnline(payload == 'online') |
165 HW_CONNECTED.set(payload == 'online') | |
158 case 'debug': | 166 case 'debug': |
159 log.info(f'hw debug: {payload}') # note: may include ansi colors | 167 log.info(f'hw debug: {payload}') # note: may include ansi colors |
160 case _: | 168 case _: |
161 raise NotImplementedError(subtopic) | 169 raise NotImplementedError(subtopic) |
162 | 170 |