view 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 source

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