Ein sofort startbarer Monitoring-Stack für die lokale IOmeter-API:
- 📡 Ein fertiges Exporter-Image aus der GitHub Container Registry liest
/v1/reading,/v1/jsonund optional/v1/status. - 🗄️ Prometheus speichert die Messwerte standardmäßig 90 Tage.
- 📊 Grafana wird automatisch mit Datenquelle und drei fertigen Dashboards eingerichtet.
Es sind weder manuelle Grafana-Einstellungen noch eine Cloud-Verbindung erforderlich.
flowchart LR
I["IOmeter-Bridge<br/>/v1/*"] -->|HTTP im LAN| E["IOmeter-Exporter"]
P["Prometheus<br/>Abfrage alle 3 Sekunden"] -->|Messwerte abrufen| E
G["Grafana<br/>3 Dashboards"] -->|PromQL| P
Benötigt werden Docker Engine beziehungsweise Docker Desktop mit Docker Compose.
Zuerst das Repository laden und die lokale Konfiguration anlegen:
git clone https://github.com/DasCanard/iometer-dashboard.git
cd iometer-dashboard
cp .env.example .envAnschließend IOMETER_HOST in .env auf die IP-Adresse oder einen per DNS auflösbaren Hostnamen der eigenen Bridge setzen:
IOMETER_HOST=iometer.localDanach den Stack starten:
docker compose up -dCompose lädt den IOmeter-Exporter automatisch als ghcr.io/dascanard/iometer-dashboard:latest. Ein lokaler Image-Build ist für den Betrieb nicht erforderlich. Das Repository wird weiterhin benötigt, weil es die Compose-Datei sowie die provisionierten Prometheus- und Grafana-Konfigurationen enthält.
Die Oberflächen sind anschließend hier erreichbar:
- Grafana: http://localhost:3000
- Prometheus: http://localhost:9090
Die initialen Grafana-Zugangsdaten lauten admin / admin, sofern sie nicht in .env geändert wurden. Vor einer Freigabe außerhalb eines vertrauenswürdigen lokalen Netzes muss GRAFANA_ADMIN_PASSWORD vor dem ersten Start auf ein starkes Passwort gesetzt werden.
| Live-Übersicht | Energie & Lastprofil | Gerätegesundheit |
|---|---|---|
![]() |
![]() |
![]() |
Die Live-Übersicht zeigt:
- Erreichbarkeit des IOmeter und Alter des letzten Messwerts,
- den aktuellen Energiefluss als eindeutige Live-Leistungsanzeige,
- das vom IOmeter gelieferte Kurzzeitmittel,
- durchschnittliche Bezugs- und Einspeiseleistung für den gewählten Zeitraum,
- Leistung und Energiefluss im Zeitverlauf,
- kumulierte Zählerstände,
- Zustand aller drei lokalen API-Endpunkte.
Die historische Analyse enthält:
- Netzbezug, Einspeisung und Netto-Energie für den gewählten Zeitraum,
- mittlere Leistung sowie Bezugs- und Einspeisespitzen,
- Momentanleistung und 15-Minuten-Mittel,
- rollierende 24-Stunden-Energie,
- Zählerstände im Zeitverlauf,
- alle vom Stromzähler gelieferten OBIS-Rohregister.
Die Diagnoseansicht trennt Fehler entlang der gesamten Messkette:
- Prometheus → Exporter,
- Exporter → IOmeter,
/v1/reading,/v1/jsonund/v1/status,- Messwertalter und API-Abfragedauer,
- Fehlerverlauf und HTTP-Status,
- Funkqualität, Akku, Core-Zustand und Firmware, sofern
/v1/statusdiese Daten liefert.
Alle Laufzeitwerte werden aus .env gelesen:
| Variable | Standard/Beispiel | Bedeutung |
|---|---|---|
IOMETER_HOST |
erforderlich | IP-Adresse oder DNS-Hostname der Bridge |
IOMETER_SCHEME |
http |
http oder https |
IOMETER_PORT |
80 |
API-Port |
IOMETER_TIMEOUT_SECONDS |
3 |
Zeitlimit je API-Abfrage |
GRAFANA_PORT |
3000 |
Grafana-Port auf dem Docker-Host |
PROMETHEUS_PORT |
9090 |
Prometheus-Port auf dem Docker-Host |
GRAFANA_ADMIN_USER |
admin |
initialer Grafana-Administrator |
GRAFANA_ADMIN_PASSWORD |
admin |
initiales Grafana-Passwort |
PROMETHEUS_RETENTION |
90d |
Aufbewahrungsdauer der Messhistorie |
IOMETER_HOST akzeptiert außerdem einen vollständigen Ursprung wie https://iometer.example:8443. Ein darin angegebener Port hat Vorrang vor IOMETER_PORT.
Nach Änderungen an .env wird die Konfiguration so übernommen:
docker compose up -dPROMETHEUS_RETENTION legt fest, wie lange Prometheus die Messhistorie im benannten Docker-Volume aufbewahrt. Unterstützt werden die Einheiten y, w, d, h, m, s und ms.
| Gewünschte Dauer | Einstellung in .env |
|---|---|
| 90 Tage | PROMETHEUS_RETENTION=90d |
| 1 Jahr | PROMETHEUS_RETENTION=1y oder PROMETHEUS_RETENTION=365d |
| 2 Jahre | PROMETHEUS_RETENTION=2y oder PROMETHEUS_RETENTION=730d |
| 10 Jahre | PROMETHEUS_RETENTION=10y |
Ein Prometheus-Jahr ist immer genau 365 Tage lang; Schaltjahre werden dabei nicht berücksichtigt.
Die lokale Prometheus-Datenbank besitzt keinen echten Modus für unbegrenzte Aufbewahrung. Ein leerer Wert verwendet in diesem Stack wieder den Standard von 90d; 0 beziehungsweise 0s bedeutet ebenfalls nicht „unbegrenzt“. Ohne wirksame Zeit- oder Größenregel fällt Prometheus auf seine eigene Standardaufbewahrung von 15 Tagen zurück.
Für eine praktisch unbegrenzte lokale Historie kann ein bewusst sehr großer Wert gesetzt werden:
PROMETHEUS_RETENTION=100yDamit wird die Festplattenkapazität zur tatsächlichen Grenze. Der freie Speicher des Docker-Volumes sollte deshalb überwacht und regelmäßig gesichert werden. Für dauerhaft wachsende Installationen ist eine realistische Aufbewahrungsdauer oder ein externes Langzeitspeichersystem sicherer als eine formal sehr große Zeitspanne.
Beim Verkürzen der Aufbewahrungsdauer entfernt Prometheus abgelaufene Datenblöcke im Hintergrund; das kann bis zu etwa zwei Stunden dauern. Gelöschte Messwerte lassen sich durch eine spätere Verlängerung nicht wiederherstellen.
Der Exporter bildet bekannte OBIS-Werte auf stabile Prometheus-Metriken ab. Zusätzlich wird jedes Register generisch als iometer_register_value{obis="…", unit="…"} bereitgestellt. Weitere Tarife oder Phasenwerte erscheinen dadurch ohne Exporter-Änderung in Prometheus und in der Rohregister-Tabelle.
| Prometheus-Metrik | Quelle | Bedeutung |
|---|---|---|
iometer_power_watts |
OBIS 01-00:10.07.00*ff |
Nettoleistung; positiv = Netzbezug, negativ = Einspeisung |
iometer_power_average_watts |
/v1/json |
vom IOmeter geliefertes Kurzzeitmittel der Nettoleistung |
iometer_energy_import_watthours_total |
OBIS 01-00:01.08.00*ff |
kumulierter Netzbezug |
iometer_energy_export_watthours_total |
OBIS 01-00:02.08.00*ff |
kumulierte Einspeisung |
iometer_reading_age_seconds |
Zeitstempel aus /v1/reading |
Alter des letzten Zählermesswerts |
iometer_endpoint_up |
alle API-Endpunkte | gültige JSON-Antwort je Endpunkt |
iometer_status_available |
/v1/status |
optionale Statusdaten sind verfügbar |
Die Energiezähler werden als Prometheus-Counter exportiert. Zeitraum-Summen in den Dashboards verwenden increase(...); dadurch werden auch Zähler- oder Geräteneustarts berücksichtigt.
In der IOmeter-App lässt sich das Messintervall beispielsweise auf Echtzeit, eine Minute oder 15 Minuten einstellen. Ein größeres Messwertalter ist deshalb nicht automatisch ein Fehler.
Die Dashboards zeigen den aktuellen Wert und seinen Verlauf bewusst mit neutralen Farben und ohne feste Warnschwellen. So lässt sich die beobachtete Aktualisierung mit dem individuell eingestellten Intervall vergleichen. Die Erreichbarkeit der API-Endpunkte bleibt davon unabhängig das Signal für einen tatsächlichen Verbindungs- oder API-Fehler.
Status und Logs anzeigen:
docker compose ps
docker compose logs -f --tail=200Den Exporter-Zustand in Prometheus prüfen:
http://localhost:9090/targets
Den Stack stoppen und alle Daten behalten:
docker compose downGrafana und Prometheus verwenden benannte Docker-Volumes. docker compose down -v löscht diese Historie dauerhaft und sollte nur bewusst ausgeführt werden.
Das ist nicht zwangsläufig ein vollständiger Geräteausfall. Manche Geräte- oder Firmwarezustände antworten dort mit 404 und melden, dass der Gerätestatus aktuell nicht verfügbar ist. Der Exporter behandelt diesen Fall als fehlende optionale Zusatzfunktion. Messwerte aus /v1/reading beziehungsweise /v1/json laufen weiter.
Die API zuerst vom Docker-Host testen:
curl http://DEIN-IOMETER-HOST/v1/readingDanach prüfen, ob Docker auf das lokale Netz zugreifen kann. Namen mit .local können innerhalb von Docker Desktop anders aufgelöst werden; in diesem Fall ist die vom Router vergebene IP-Adresse oder ein normaler DNS-Eintrag zuverlässiger.
Prometheus benötigt mindestens zwei Zählerstände, bevor increase(...) eine Zeitraum-Summe berechnen kann. Live-Leistung und absolute Zählerstände erscheinen bereits nach der ersten erfolgreichen Abfrage.
make test
make validateDer Exporter verwendet ausschließlich die Python-Standardbibliothek. Die enthaltenen Tests prüfen das IOmeter-Payload-Schema, den Fallback für den optionalen Status-Endpunkt und die Host-Konfiguration.
GitHub Actions baut das Exporter-Image automatisch für linux/amd64 und linux/arm64. Ein Push auf main veröffentlicht latest unter ghcr.io/dascanard/iometer-dashboard.
Ein Git-Tag nach dem Muster v1.2.3 veröffentlicht zusätzlich die Image-Tags 1.2.3, 1.2 und 1.
Weiterführend: Offizielle IOmeter-Anleitung zur lokalen API.


