|
@@ -247,3 +247,57 @@ class audio_status(base):
|
247
|
247
|
|
248
|
248
|
class remote(base):
|
249
|
249
|
pass
|
|
250
|
+
|
|
251
|
+
|
|
252
|
+class my_ambient(base):
|
|
253
|
+ KEY_TEMPERATURE = 'temperature'
|
|
254
|
+ KEY_PRESSURE = 'pressure'
|
|
255
|
+ KEY_HUMIDITY = 'humidity'
|
|
256
|
+ #
|
|
257
|
+ LAST_MSG_WARNING = 20 * 60
|
|
258
|
+ LAST_MSG_ERROR = 30 * 60
|
|
259
|
+
|
|
260
|
+ def __init__(self, mqtt_client: mqtt.mqtt_client, topic):
|
|
261
|
+ super().__init__(mqtt_client, topic)
|
|
262
|
+ self.__last_value_rx__ = {
|
|
263
|
+ self.KEY_HUMIDITY: None,
|
|
264
|
+ self.KEY_PRESSURE: None,
|
|
265
|
+ self.KEY_TEMPERATURE: None
|
|
266
|
+ }
|
|
267
|
+
|
|
268
|
+ def __rx__(self, client, userdata, message):
|
|
269
|
+ try:
|
|
270
|
+ payload = json.loads(message.payload)
|
|
271
|
+ except json.decoder.JSONDecodeError:
|
|
272
|
+ pass
|
|
273
|
+ else:
|
|
274
|
+ key = message.topic.split('/')[-1]
|
|
275
|
+ if key in self.__last_value_rx__:
|
|
276
|
+ self.__last_value_rx__[key] = time.time()
|
|
277
|
+ return super().__rx__(client, userdata, message)
|
|
278
|
+
|
|
279
|
+ def status(self, key):
|
|
280
|
+ if key == DID_HEARTBEAT:
|
|
281
|
+ status = nagios.Nagios.OK
|
|
282
|
+ msg = ""
|
|
283
|
+ for key in self.__last_value_rx__:
|
|
284
|
+ last_value_rx = self.__last_value_rx__[key]
|
|
285
|
+ if len(msg) != 0:
|
|
286
|
+ msg += "; "
|
|
287
|
+ if last_value_rx is None:
|
|
288
|
+ target_status = nagios.Nagios.UNKNOWN
|
|
289
|
+ msg += "%s (never)" % key
|
|
290
|
+ else:
|
|
291
|
+ dt = time.time() - last_value_rx
|
|
292
|
+ msg += "%s (%.1f min ago)" % (key, dt / 60)
|
|
293
|
+ if dt > self.LAST_MSG_ERROR:
|
|
294
|
+ target_status = nagios.Nagios.ERROR
|
|
295
|
+ elif dt > self.LAST_MSG_WARNING:
|
|
296
|
+ target_status = nagios.Nagios.WARNING
|
|
297
|
+ else:
|
|
298
|
+ target_status = nagios.Nagios.OK
|
|
299
|
+ if target_status > status:
|
|
300
|
+ status = target_status
|
|
301
|
+ return self.__nagios_return__(DID_HEARTBEAT, status, msg)
|
|
302
|
+ else:
|
|
303
|
+ return super().status(key)
|