Changeset - 65eb8f0a25d4
[Not reviewed]
tip default
0 1 0
Dennis Fink - 4 years ago 2021-07-07 20:52:43
dennis.fink@c3l.lu
Use a custom class
1 file changed with 43 insertions and 47 deletions:
0 comments (0 inline, 0 general)
mqtt2prometheus.py
Show inline comments
 
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"))
 

	
 
people_now_present = Gauge(
 
    "people_now_present", "People currently present in the space"
 
)
 

	
 
space_state = Gauge("space_state", "The current space state")
 
space_lastchange = Gauge(
 
    "space_lastchange", "The lastchange timestamp of the current space state"
 
)
 

	
 
member_count = Gauge(
 
    "member_count", "The current count of members", labelnames=["name"]
 
)
 

	
 
availability = Gauge(
 
    "availability",
 
    "The availability status of different MQTT clients",
 
    labelnames=["clientname"],
 
)
 

	
 
temperature = Gauge(
 
    "temperature_celsius", "The current temperature", labelnames=["location"]
 
)
 

	
 
humidity = Gauge("humidity_percent", "The current humidity", labelnames=["location"])
 

	
 
barometer = Gauge(
 
    "barometer_hectopascal", "The current air pressure", labelnames=["location"]
 
)
 

	
 
power_consumption = Gauge(
 
    "power_consumption_watt", "The current power used", labelnames=["location"]
 
)
 

	
 
co2_emission = Gauge(
 
    "co2_emission_kilogramm", "The CO2 emission in kilogramm", labelnames=["location"]
 
)
 

	
 
energy_consumption = Gauge(
 
    "energy_consumption_kilowatthour",
 
    "The energy consumption in kilowatthour",
 
    labelnames=["location"],
 
)
 

	
 

	
 
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)
 

	
 
    client.connect(CONFIG["mqtt"]["host"])
 
    client.loop_start()
 
    start_http_server(CONFIG["prometheus"]["port"])
 
    while True:
 
        time.sleep(1)
 

	
 

	
 
if __name__ == "__main__":
 
    main()
0 comments (0 inline, 0 general)