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