# HG changeset patch # User Dennis Fink # Date 2019-01-01 22:10:50 # Node ID e7d80ef02af287a167f0eb94413eb3e022cf5f32 Added current running version diff --git a/mqtt2prometheus.py b/mqtt2prometheus.py new file mode 100644 --- /dev/null +++ b/mqtt2prometheus.py @@ -0,0 +1,75 @@ +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']) + + +def on_connect(client, userdata, flags, rc): + client.publish('availability/mqtt2prometheus', 'online', 2, True) + + client.message_callback_add('sensors/people_now_present', handle_people_now_present) + client.message_callback_add('space/status', handle_space_status) + client.message_callback_add('space/member_count', handle_member_count) + client.message_callback_add('availability/#', handle_availability) + + client.subscribe('sensors/people_now_present') + client.subscribe('space/status') + client.subscribe('space/member_count') + client.subscribe('availability/+') + client.subscribe('availability/shutdown/+') + + +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 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()