view service/powerEagle/plugs/powermeter_exporter.py @ 1753:add4ce853035

another sensor
author drewp@bigasterisk.com
date Sun, 05 May 2024 17:59:05 -0700
parents 3cf5333f2f30
children 92999dfbf321
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'),
]:  # yapf: disable
    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'),
    subscribe_to_sensor(topic="tele/ki-fridge/SENSOR", sensor_label='ki_fridge'),
    subscribe_to_sensor(topic="tt-console-power/SENSOR", sensor_label='tt_console'),
])