Mercurial > code > home > repos > homeauto
diff service/powerEagle/plugs/exporter.py @ 1749:4b29ce991e59
cloudfree plug sends mqtt metrics, which we export to victoriametrics
author | drewp@bigasterisk.com |
---|---|
date | Sun, 28 Apr 2024 16:01:38 -0700 |
parents | |
children |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/service/powerEagle/plugs/exporter.py Sun Apr 28 16:01:38 2024 -0700 @@ -0,0 +1,37 @@ +import json +import logging + +from aiomqtt import Client +from prometheus_client import Counter, Gauge +from rdferry import StarletteServer + +logging.basicConfig(level=logging.DEBUG) +log = logging.getLogger() + +powermeter_reports = Counter('powermeter_reports', 'mqtt messages from powermeter', labelnames=['sensor']) +metrics = {} +for sensor_field, metric_name in [ + ('Power', 'powermeter_w'), + ('ApparentPower', 'powermeter_apparent_power_va'), + ('ReactivePower', 'powermeter_reactive_power_var'), + ('Factor', 'powermeter_factor'), + ('Voltage', 'powermeter_voltage_v'), + ('Current', 'powermeter_current_a'), +]: + metrics[sensor_field] = Gauge(metric_name, documentation='', labelnames=['sensor']) + + +async def subscribe_to_sensor(topic, sensor_label): + async with Client("mqtt2") as client: + await client.subscribe(topic) + async for message in client.messages: + msg = (json.loads(message.payload)) + for sf, m in metrics.items(): + m.labels(sensor=sensor_label).set(msg['ENERGY'][sf]) + powermeter_reports.labels(sensor=sensor_label).inc() + + +server = StarletteServer() +server.serve(startup_tasks=[ + subscribe_to_sensor(topic="tele/st-wall-power/SENSOR", sensor_label='st_wall'), +])