Files
@ b2ba6517bd31
Branch filter:
Location: ChaosStuff/mqtt2prometheus/mqtt2prometheus.py
b2ba6517bd31
3.2 KiB
text/x-python
Fix handle_sensor
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 | import json
import time
import paho.mqtt.client as mqtt
from prometheus_client import start_http_server, Gauge
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)
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,
}
for topic, handler in topics_handler.items():
client.message_callback_add(topic, handler)
client.subscribe(topic)
def handle_people_now_present(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_member_count(client, userdata, msg):
count = json.loads(msg.payload)
member_count.labels(count["name"]).set(count["value"])
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(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
def main():
client = mqtt.Client("mqtt2prometheus")
client.on_connect = on_connect
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()
|