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'),
+])