diff --git a/mqtt2prometheus.py b/mqtt2prometheus.py --- a/mqtt2prometheus.py +++ b/mqtt2prometheus.py @@ -2,8 +2,7 @@ import json import time import paho.mqtt.client as mqtt - -from prometheus_client import start_http_server, Gauge +from prometheus_client import Gauge, start_http_server CONFIG = json.load(open("/etc/mqtt2prometheus.json", mode="r", encoding="utf-8")) @@ -51,64 +50,61 @@ energy_consumption = Gauge( ) -def on_connect(client, userdata, flags, rc): - client.publish("availability/mqtt2prometheus", "online", 2, True) +class Mqtt2Prometheus(mqtt.Client): + def on_connect(self, client, userdata, flags, rc): + self.publish("availability/mqtt2prometheus", "online", 2, True) - topics_handler = { - "availability/#": handle_availability, - "space/status": handle_space_status, - "space/member_count": handle_member_count, - "sensors/people_now_present": handle_people_now_present, - "sensors/#": handle_sensor, - } + topics_handler = { + "availability/#": self.handle_availability, + "space/status": self.handle_space_status, + "space/member_count": self.handle_member_count, + "sensors/people_now_present": self.handle_people_now_present, + "sensors/#": self.handle_sensor, + } - for topic, handler in topics_handler.items(): - client.message_callback_add(topic, handler) - client.subscribe(topic) - + for topic, handler in topics_handler.items(): + self.message_callback_add(topic, handler) + self.subscribe(topic) -def handle_people_now_present(client, userdata, msg): - people_now_present.set(json.loads(msg.payload)) - + def handle_people_now_present(self, client, userdata, msg): + people_now_present.set(json.loads(msg.payload)) -def handle_space_status(client, userdata, msg): - state = json.loads(msg.payload) - space_state.set(int(state["open"])) - space_lastchange.set(state["lastchange"]) - + def handle_space_status(self, client, userdata, msg): + state = json.loads(msg.payload) + space_state.set(int(state["open"])) + space_lastchange.set(state["lastchange"]) -def handle_member_count(client, userdata, msg): - count = json.loads(msg.payload) - member_count.labels(count["name"]).set(count["value"]) + def handle_member_count(self, client, userdata, msg): + count = json.loads(msg.payload) + member_count.labels(count["name"]).set(count["value"]) + def handle_availability(self, client, userdata, msg): + t = msg.topic.split("/") + if len(t) == 2: + c = t[-1] + else: + c = "_".join(t[1:]) + v = 1 if msg.payload == b"online" else 0 + availability.labels(c).set(v) -def handle_availability(client, userdata, msg): - t = msg.topic.split("/") - if len(t) == 2: - c = t[-1] - else: - c = "_".join(t[1:]) - v = 1 if msg.payload == b"online" else 0 - availability.labels(c).set(v) + def handle_sensor(self, client, userdata, msg): + t = msg.topic.split("/") + if t[1] == "people_now_present": + return -def handle_sensor(client, userdata, msg): - t = msg.topic.split("/") - location = "-".join(t[2:]) - if t[1] == "people_now_present": - return - metric = globals().get(t[1], None) - if metric is not None: - try: - metric.labels(location).set(float(msg.payload)) - except: - pass + metric = globals().get(t[1], None) + if metric is not None: + try: + location = "-".join(t[2:]) + metric.labels(location).set(float(msg.payload)) + except: + pass def main(): - client = mqtt.Client("mqtt2prometheus") - client.on_connect = on_connect + client = Mqtt2Prometheus("mqtt2prometheus") client.username_pw_set(CONFIG["mqtt"]["username"], CONFIG["mqtt"]["password"]) client.will_set("availability/mqtt2prometheus", "offline", 2, True)