Ich habe vor einiger Zeit einen intelligenten, smarten Stromzähler bekommen. Über ein Portal kann ich da meine Verbrauchsdaten analysieren und vergleiche anstellen, allerdings nur für den Vortag. Es gibt sogar einen sog. HAN (Home Area Network) Port, der aber kaum nutzbar ist. Eine Verbindung bekommt man mit dem Zähler hin, aber dann bekommt man Zertifikatsprobleme und beim Verteilernetzbetreiber kann man nicht helfen.
Dann kam die Idee auf, Messungen über einen WattWächter zu realisieren. Der WattWächter (ich werde ihn mit WW künftig abkürzen) sitzt auf dem Stromzähler und kann über die optische Schnittstelle Daten empfangen. Senden und empfangen erfolgt über ein WLAN Modul. Kaufen kann man den WW überall, sogar selber bauen. (WattWächter Wi-Fi/USB, IR Lesekopf für Stromzähler/SmartMeter/EHZ, Tasmota vorinstalliert, WLAN, Volkszähler) Wichtig für die Nutzung ist, dass der Stromzähler Landis + Gyr E320 eine optische Schnittstelle hat, die aber über einen PIN gesperrt ist. Den PIN (z.B. 9475) muss man sich über den Netzstellenbetreiber (bei mir LVN) telefonisch geben lassen.

Das Aufsetzen des WW ist einfach. Mit dem iPhone auf dem WLAN Punkt verbinden, schon kann man das WLAN Netz und Passwort hinterlegen, in dem sich der WW anmelden soll. Danach über die IP des WW den Web-Server aufrufen und man ist im Tasmota Menü.
Unbedingt das Skript zur Abfrage der Daten für diesen Stromzähler einbauen! Hier der Link: https://www.smartcircuits.de/skripte/#Landis
Dann ging bei mir das Drama los. Den PIN konnte ich mit der Taschenlampe „eingeben“ aber das Interface nicht aktivieren! Deshalb konnte ich Daten im Display des Stromzählers sehen, aber nicht über die Tasmota Console empfangen. Befehle wie status 1 oder status 10 blieben erfolglos. Dann fand ich diese kleine App (edl21-controll), mit der dann alles ganz einfach ging. Einfach im entsprechenden App Store runterladen. Mit ihr, kann man den PIN „morsen“ und auch weitere Einstellungen durchführen. So habe ich es dann geschafft:
- PIN in der App definieren: z.B. 9475. Dann das iPhone vor den Zähler mit dem optischen Sensor halten.
- Über den Punkt „Entsperren“ in der App wird der Stromzähler geweckt und die PIN gemorst.
- Dann müssen weitere Einstellungen durchgeführt werden, ansonsten wird die PIN vergessen und es kommen keine Daten an! -Der entscheidende Punkt!-
Im Menü des Stromzählers muss der Parameter PIN auf Off und der Parameter Inf auf On gestellt werden, damit der vollständige Datensatz übertragen wird. Das kann man in der App über den Reiter „Aktionen“ tun! Wenn man nach der PIN-Einfabe auf „Weiter“ tippt, erscheint der nächste Menü-Punkt im Display des Stromzählers. Über den Knopf „Aktion“ kann man zwischen den Zuständen „on/off“ etc. umschalten. Ist etwas frickelig, aber es geht mit dem iPhone ganz gut.
Dann ab in die Tasomota Console und TelePeriod 10 setzen. Die Daten sollen alle 10s gesendet werden. Da sind sie dann auch schon! DATEN!!!
Mein Zielbild
-
Live-Leistung des Hauses sehen
-
Energieverbrauch verfolgen
-
Historie aufbauen
-
Basis für Optimierungen (Grundlast, Lastspitzen)
-
Vollständig lokal und kontrollierbar

Architekturübersicht
Smart Meter (Landis+Gyr E320) │ │ IR (SML / D0) ▼ WattWächter (Tasmota) │ │ MQTT (tele/.../SENSOR) ▼ Mosquitto Broker (Docker) │ ▼ Telegraf (mqtt_consumer → prometheus_client) │ ▼ Prometheus (Scrape /metrics) │ ▼ Grafana (Dashboards)
Datenfluss erklärt:
1. Der Zähler sendet Messwerte über die optische Schnittstelle.
2. Tasmota dekodiert SML und veröffentlicht Werte per MQTT.
3. Telegraf liest MQTT und stellt Prometheus-Metrics bereit.
4. Prometheus speichert Zeitreihen.
5. Grafana visualisiert.
⸻
Hardware
• Smart Meter: Landis+Gyr E320
• Lesekopf: WattWächter Wi-Fi (Tasmota vorinstalliert)
• Server: Docker-Host (bei mir Home Monitoring Server)
Schritt 2 — Tasmota konfigurieren
Telemetrieintervall setzen
In der Tasmota Console – wie schon geschrieben: TelePeriod 10 setzen
Damit werden alle 10 Sekunden Werte gesendet.
MQTT konfigurieren
-
Broker: mosquitto
-
Topic: automatisch z. B.

Beispiel Payload:
{
"Time":"2026-02-20T10:15:55",
"E320":{
"E_in":4005.654,
"Power":457
}
}
Schritt 3 — Docker Stack
docker-compose.yml
services:
mosquitto:
image: eclipse-mosquitto
ports:
- "1883:1883"
volumes:
- ./mosquitto.conf:/mosquitto/config/mosquitto.conf
- mosquitto-data:/mosquitto/data
- mosquitto-log:/mosquitto/log
telegraf:
image: telegraf
volumes:
- ./telegraf.conf:/etc/telegraf/telegraf.conf:ro
ports:
- "9273:9273"
prometheus:
image: prom/prometheus
volumes:
- ./prometheus.yml:/etc/prometheus/prometheus.yml:ro
ports:
- "9090:9090"
grafana:
image: grafana/grafana
ports:
- "3000:3000"
volumes:
mosquitto-data:
mosquitto-log:
Schritt 4 — Mosquitto Config
mosquitto.conf
listener 1883 allow_anonymous true
Schritt 5 — Telegraf Config
telegraf.conf
[[inputs.mqtt_consumer]] servers = ["tcp://mosquitto:1883"] topics = ["tele/+/SENSOR"] data_format = "json" [[outputs.prometheus_client]] listen = ":9273"
Schritt 6 — Prometheus Config
prometheus.yml
scrape_configs:
- job_name: telegraf
static_configs:
- targets: ['telegraf:9273']
Prometheus scrapt dann:
tasmota_Power tasmota_E_in
Schritt 7 — Funktion prüfen
MQTT testen:
docker exec -it mosquitto mosquitto_sub -v -t '#'
Prometheus prüfen:
curl http://localhost:9273/metrics
Für grafana habe ich ein JSON, mit dem alle relevanten Werte über den WW visualisiert werden können:
{
"annotations": {
"list": [
{
"builtIn": 1,
"datasource": {
"type": "grafana",
"uid": "-- Grafana --"
},
"enable": true,
"hide": true,
"iconColor": "rgba(0, 211, 255, 1)",
"name": "Annotations & Alerts",
"type": "dashboard"
}
]
},
"editable": true,
"fiscalYearStartMonth": 0,
"graphTooltip": 1,
"id": 32,
"links": [],
"panels": [
{
"fieldConfig": {
"defaults": {
"mappings": [],
"thresholds": {
"mode": "absolute",
"steps": [
{
"color": "green",
"value": 0
},
{
"color": "red",
"value": 500
}
]
},
"unit": "watt"
},
"overrides": []
},
"gridPos": {
"h": 5,
"w": 6,
"x": 0,
"y": 0
},
"id": 1,
"options": {
"colorMode": "value",
"graphMode": "none",
"justifyMode": "auto",
"orientation": "horizontal",
"percentChangeColorMode": "standard",
"reduceOptions": {
"calcs": [
"lastNotNull"
],
"fields": "",
"values": false
},
"showPercentChange": false,
"textMode": "auto",
"wideLayout": true
},
"pluginVersion": "12.3.0",
"targets": [
{
"expr": "tasmota_Power{topic=\"tele/WattWaechter_BE6691/SENSOR\"}",
"refId": "A"
}
],
"title": "Aktuelle Leistung",
"type": "stat"
},
{
"fieldConfig": {
"defaults": {
"mappings": [],
"thresholds": {
"mode": "absolute",
"steps": [
{
"color": "green",
"value": 0
},
{
"color": "red",
"value": 500
}
]
},
"unit": "watt"
},
"overrides": []
},
"gridPos": {
"h": 5,
"w": 6,
"x": 6,
"y": 0
},
"id": 4,
"options": {
"colorMode": "value",
"graphMode": "none",
"justifyMode": "auto",
"orientation": "horizontal",
"percentChangeColorMode": "standard",
"reduceOptions": {
"calcs": [
"lastNotNull"
],
"fields": "",
"values": false
},
"showPercentChange": false,
"textMode": "auto",
"wideLayout": true
},
"pluginVersion": "12.3.0",
"targets": [
{
"expr": "avg_over_time(tasmota_Power{topic=\"tele/WattWaechter_BE6691/SENSOR\"}[5m])",
"refId": "A"
}
],
"title": "Ø Leistung 5min",
"type": "stat"
},
{
"fieldConfig": {
"defaults": {
"mappings": [],
"thresholds": {
"mode": "absolute",
"steps": [
{
"color": "green",
"value": 0
},
{
"color": "red",
"value": 80
}
]
},
"unit": "kwh"
},
"overrides": []
},
"gridPos": {
"h": 5,
"w": 6,
"x": 12,
"y": 0
},
"id": 3,
"options": {
"colorMode": "value",
"graphMode": "none",
"justifyMode": "auto",
"orientation": "horizontal",
"percentChangeColorMode": "standard",
"reduceOptions": {
"calcs": [
"lastNotNull"
],
"fields": "",
"values": false
},
"showPercentChange": false,
"textMode": "auto",
"wideLayout": true
},
"pluginVersion": "12.3.0",
"targets": [
{
"expr": "increase(tasmota_E_in{topic=\"tele/WattWaechter_BE6691/SENSOR\"}[1d])",
"refId": "A"
}
],
"title": "Verbrauch heute",
"type": "stat"
},
{
"datasource": {
"type": "prometheus",
"uid": "ef5wtj8wqo000e"
},
"fieldConfig": {
"defaults": {
"decimals": 2,
"mappings": [],
"thresholds": {
"mode": "absolute",
"steps": [
{
"color": "green",
"value": 0
},
{
"color": "yellow",
"value": 10
},
{
"color": "red",
"value": 20
}
]
},
"unit": "kwatth"
},
"overrides": []
},
"gridPos": {
"h": 5,
"w": 6,
"x": 18,
"y": 0
},
"id": 108,
"options": {
"colorMode": "value",
"graphMode": "none",
"justifyMode": "auto",
"orientation": "horizontal",
"percentChangeColorMode": "standard",
"reduceOptions": {
"calcs": [
"lastNotNull"
],
"fields": "",
"values": false
},
"showPercentChange": false,
"textMode": "auto",
"wideLayout": true
},
"pluginVersion": "12.3.0",
"targets": [
{
"expr": "increase(tasmota_E_in{topic=~\"$topic\"}[24h])",
"legendFormat": "24h",
"refId": "A"
}
],
"title": "Verbrauch letzte 24h",
"type": "stat"
},
{
"fieldConfig": {
"defaults": {
"color": {
"mode": "palette-classic"
},
"custom": {
"axisBorderShow": false,
"axisCenteredZero": false,
"axisColorMode": "text",
"axisLabel": "",
"axisPlacement": "auto",
"barAlignment": 0,
"barWidthFactor": 0.6,
"drawStyle": "line",
"fillOpacity": 0,
"gradientMode": "none",
"hideFrom": {
"legend": false,
"tooltip": false,
"viz": false
},
"insertNulls": false,
"lineInterpolation": "linear",
"lineWidth": 1,
"pointSize": 5,
"scaleDistribution": {
"type": "linear"
},
"showPoints": "auto",
"showValues": false,
"spanNulls": false,
"stacking": {
"group": "A",
"mode": "none"
},
"thresholdsStyle": {
"mode": "off"
}
},
"mappings": [],
"thresholds": {
"mode": "absolute",
"steps": [
{
"color": "green",
"value": 0
},
{
"color": "red",
"value": 80
}
]
},
"unit": "watt"
},
"overrides": []
},
"gridPos": {
"h": 10,
"w": 24,
"x": 0,
"y": 5
},
"id": 5,
"options": {
"legend": {
"calcs": [],
"displayMode": "list",
"placement": "bottom",
"showLegend": true
},
"tooltip": {
"hideZeros": false,
"mode": "single",
"sort": "none"
}
},
"pluginVersion": "12.3.0",
"targets": [
{
"expr": "tasmota_Power{topic=\"tele/WattWaechter_BE6691/SENSOR\"}",
"refId": "A"
}
],
"title": "Leistung Verlauf",
"type": "timeseries"
},
{
"datasource": {
"type": "prometheus",
"uid": "ef5wtj8wqo000e"
},
"fieldConfig": {
"defaults": {
"decimals": 0,
"mappings": [],
"thresholds": {
"mode": "absolute",
"steps": [
{
"color": "green",
"value": 0
},
{
"color": "yellow",
"value": 300
},
{
"color": "red",
"value": 600
}
]
},
"unit": "watt"
},
"overrides": []
},
"gridPos": {
"h": 5,
"w": 6,
"x": 0,
"y": 15
},
"id": 107,
"options": {
"colorMode": "value",
"graphMode": "none",
"justifyMode": "auto",
"orientation": "horizontal",
"percentChangeColorMode": "standard",
"reduceOptions": {
"calcs": [
"lastNotNull"
],
"fields": "",
"values": false
},
"showPercentChange": false,
"textMode": "auto",
"wideLayout": true
},
"pluginVersion": "12.3.0",
"targets": [
{
"expr": "quantile_over_time(0.1, tasmota_Power{topic=~\"$topic\"}[1h])",
"legendFormat": "Grundlast",
"refId": "A"
}
],
"title": "Grundlast (10%-Perzentil, letzte 1h)",
"type": "stat"
},
{
"fieldConfig": {
"defaults": {
"mappings": [],
"thresholds": {
"mode": "absolute",
"steps": [
{
"color": "green",
"value": 0
},
{
"color": "red",
"value": 8000
}
]
},
"unit": "kwh"
},
"overrides": []
},
"gridPos": {
"h": 5,
"w": 6,
"x": 6,
"y": 15
},
"id": 2,
"options": {
"colorMode": "value",
"graphMode": "none",
"justifyMode": "auto",
"orientation": "horizontal",
"percentChangeColorMode": "standard",
"reduceOptions": {
"calcs": [
"lastNotNull"
],
"fields": "",
"values": false
},
"showPercentChange": false,
"textMode": "auto",
"wideLayout": true
},
"pluginVersion": "12.3.0",
"targets": [
{
"expr": "tasmota_E_in{topic=\"tele/WattWaechter_BE6691/SENSOR\"}",
"refId": "A"
}
],
"title": "Gesamtverbrauch",
"type": "stat"
},
{
"datasource": {
"type": "prometheus",
"uid": "ef5wtj8wqo000e"
},
"fieldConfig": {
"defaults": {
"decimals": 0,
"mappings": [],
"thresholds": {
"mode": "absolute",
"steps": [
{
"color": "green",
"value": 0
},
{
"color": "yellow",
"value": 1500
},
{
"color": "red",
"value": 2500
}
]
},
"unit": "watt"
},
"overrides": []
},
"gridPos": {
"h": 5,
"w": 6,
"x": 12,
"y": 15
},
"id": 109,
"options": {
"colorMode": "value",
"graphMode": "none",
"justifyMode": "auto",
"orientation": "horizontal",
"percentChangeColorMode": "standard",
"reduceOptions": {
"calcs": [
"lastNotNull"
],
"fields": "",
"values": false
},
"showPercentChange": false,
"textMode": "auto",
"wideLayout": true
},
"pluginVersion": "12.3.0",
"targets": [
{
"expr": "max_over_time(tasmota_Power{topic=~\"$topic\"}[24h])",
"legendFormat": "Peak",
"refId": "A"
}
],
"title": "Lastspitze (Max, letzte 24h)",
"type": "stat"
},
{
"datasource": {
"type": "prometheus",
"uid": "ef5wtj8wqo000e"
},
"fieldConfig": {
"defaults": {
"decimals": 2,
"mappings": [],
"max": 100,
"min": 0,
"thresholds": {
"mode": "absolute",
"steps": [
{
"color": "green",
"value": 0
},
{
"color": "yellow",
"value": 1
},
{
"color": "red",
"value": 5
}
]
},
"unit": "percent"
},
"overrides": []
},
"gridPos": {
"h": 5,
"w": 6,
"x": 18,
"y": 15
},
"id": 110,
"options": {
"colorMode": "value",
"graphMode": "none",
"justifyMode": "auto",
"orientation": "horizontal",
"percentChangeColorMode": "standard",
"reduceOptions": {
"calcs": [
"lastNotNull"
],
"fields": "",
"values": false
},
"showPercentChange": false,
"textMode": "auto",
"wideLayout": true
},
"pluginVersion": "12.3.0",
"targets": [
{
"expr": "100 * sum_over_time((tasmota_Power{topic=~\"$topic\"} > 1500)[24h]) / count_over_time(tasmota_Power{topic=~\"$topic\"}[24h])",
"legendFormat": "% Zeit > 1.5kW",
"refId": "A"
}
],
"title": "Lastspitzen-Rate (Anteil > 1.5 kW, letzte 24h)",
"type": "stat"
},
{
"datasource": {
"type": "prometheus",
"uid": "ef5wtj8wqo000e"
},
"fieldConfig": {
"defaults": {
"custom": {
"hideFrom": {
"legend": false,
"tooltip": false,
"viz": false
},
"scaleDistribution": {
"type": "linear"
}
},
"unit": "watt"
},
"overrides": []
},
"gridPos": {
"h": 10,
"w": 24,
"x": 0,
"y": 20
},
"id": 106,
"options": {
"calculate": true,
"calculation": {
"xBuckets": {
"mode": "size",
"value": "1h"
},
"yBuckets": {
"mode": "count",
"value": 25
}
},
"cellGap": 1,
"color": {
"exponent": 0.5,
"fill": "dark-orange",
"mode": "opacity",
"reverse": false,
"scale": "exponential",
"scheme": "Oranges",
"steps": 64
},
"exemplars": {
"color": "rgba(255,0,255,0.7)"
},
"filterValues": {
"le": 1e+99
},
"legend": {
"show": true
},
"rowsFrame": {
"layout": "auto"
},
"tooltip": {
"mode": "single",
"showColorScale": false,
"yHistogram": true
},
"yAxis": {
"axisPlacement": "left",
"reverse": false,
"unit": "watt"
}
},
"pluginVersion": "12.3.0",
"targets": [
{
"expr": "avg_over_time(tasmota_Power{topic=~\"$topic\"}[10m])",
"legendFormat": "P (10m)",
"refId": "A"
}
],
"title": "Tagesprofil Heatmap (10-Min-Mittel)",
"type": "heatmap"
}
],
"preload": false,
"refresh": "10s",
"schemaVersion": 42,
"tags": [
"strom",
"tasmota",
"mqtt",
"prometheus"
],
"templating": {
"list": [
{
"current": {
"text": "tele/WattWaechter_BE6691/SENSOR",
"value": "tele/WattWaechter_BE6691/SENSOR"
},
"hide": 2,
"label": "MQTT Topic",
"name": "topic",
"query": "tele/WattWaechter_BE6691/SENSOR",
"skipUrlSync": true,
"type": "constant"
}
]
},
"time": {
"from": "now-24h",
"to": "now"
},
"timepicker": {},
"timezone": "browser",
"title": "Hausstrom - Strommonitoring (WattWächter)",
"uid": "3b65b006-22c3-41df-9618-60a5330bcec3",
"version": 10
}
Erkenntnisse unterwegs
1 — PIN ist Pflicht
Ohne PIN sendet der Zähler keine Livewerte.
2 — MQTT ist ideal als Bus
Sehr flexibel, einfach zu debuggen.
3 — Telegraf spart Arbeit
Kein eigener Exporter nötig.
4 — Prometheus passt perfekt
Zeitreihen + einfache Queries.
Lessons Learned
-
Erst Datenfluss stabilisieren, dann Dashboard bauen
-
MQTT Logs sind Gold wert
-
Kleine TelePeriod für feinere Auflösung
-
PromQL eröffnet viele Analyse-Möglichkeiten
Nächste Ausbaustufen
Geplant:
-
Grundlast Analyse
-
Lastspitzen Alarm
-
Geräteerkennung
-
PV Integration
-
Kostenberechnung
Fazit
Der Stack hat sich als stabil und transparent erwiesen. Besonders überzeugend ist die vollständige Kontrolle über alle Daten und die Erweiterbarkeit.
Vom ersten IR-Signal bis zum fertigen Dashboard war der Weg überraschend geradlinig — und bietet eine perfekte Grundlage für tiefergehende Energieoptimierung.
Wenn du ein ähnliches Setup planst: Es lohnt sich. Die Einblicke in den eigenen Verbrauch sind enorm — und plötzlich werden Optimierungen messbar.
