Ein Energiemonitor mit MQTT zeigt Ihnen Sekunde für Sekunde, was Ihr gesamtes Haus verbraucht, und stellt diesen Wert jedem Dashboard und jeder Automatisierung zur Verfügung. In dieser Anleitung entscheiden Sie sich zwischen einem Smart-Meter-Leser und Stromzangen, veröffentlichen den Verbrauch mit einem Python-Skript und speichern und visualisieren ihn mit Telegraf und InfluxDB. Außerdem erfahren Sie, welche Werte für den Solar-Eigenverbrauch wichtig sind und wie Sie die Daten privat halten.
Zwei Wege, das ganze Haus zu messen
Sie können am Zähler des Netzbetreibers oder an Ihrer Unterverteilung messen. Beides funktioniert gut; die richtige Wahl hängt von Ihrem Zähler ab und davon, wie vertraut Sie mit Elektroarbeiten sind.
| Ansatz | Was Sie brauchen | Misst | Aufwand und Sicherheit |
|---|---|---|---|
| Smart-Meter-Schnittstelle (P1 / DSMR, andere Kundenschnittstellen) | Zähler mit freigeschalteter Kundenschnittstelle, USB-Kabel oder ESP-basierter Leser | Bezug, Einspeisung, Tarife, Spannung, oft Gas | Einstecken, keine Elektroarbeiten |
| Fertiges Stromzangen-Messgerät (z. B. Shelly Pro 3EM, Shelly EM) | Gerät mit Klemmen im Verteiler montiert | Leistung pro Phase, Energie, Spannung | Einbau im Verteiler durch eine Fachkraft |
| DIY-Stromzangen (SCT-013 + ESP32) | Klemmen, Bürdenwiderstand, Bias-Schaltung | Strom pro Stromkreis, geschätzte Leistung | Die Klemmen sind berührungslos, ein Zugang zum Verteiler ist aber trotzdem nötig |
| Impuls-LED am Zähler | Lichtsensor, über die LED geklebt | Energie aus der Impulsrate | Keine Elektroarbeiten, geringere Auflösung |
In den Niederlanden, Belgien und Luxemburg haben die meisten Smart Meter einen P1-Port, der jede Sekunde (DSMR 5) oder alle zehn Sekunden (DSMR 4) ein textbasiertes „Telegramm“ sendet. Das ist die einfachste und genaueste Quelle, denn es sind genau die Werte, die Ihr Versorger abrechnet. In Deutschland, Österreich und der Schweiz gibt es meist keinen P1-Port; moderne Messeinrichtungen in Deutschland bieten stattdessen in der Regel eine optische Infrarot-Schnittstelle, die sich mit einem aufgesetzten Lesekopf auslesen lässt (oft im SML-Format, häufig erst nach Eingabe einer PIN mit vollständigen Werten). Das Prinzip bleibt gleich: Werte lesen, in JSON umwandeln, per MQTT veröffentlichen. Anderswo suchen Sie nach einer vergleichbaren Kundenschnittstelle oder greifen zu Stromzangen.
Alle Arbeiten in einem Verteilerkasten sollten von einer Elektrofachkraft ausgeführt werden. Aufsteckbare Sensoren durchtrennen zwar keine Leitungen, aber beim Öffnen des Verteilers liegen spannungsführende Teile frei.
Topic-Design für einen Energiemonitor-MQTT-Feed
Verwenden Sie ein Telemetrie-Topic pro Zähler mit einem kompakten JSON-Payload sowie einen retained Status:
connectmq/demo/<random-id>/energy/grid/telemetry (JSON, every 1-10 s)
connectmq/demo/<random-id>/energy/grid/status (online/offline, retained)
{
"import_w": 1193,
"export_w": 0,
"net_w": 1193,
"import_kwh_t1": 4182.517,
"import_kwh_t2": 3970.204,
"export_kwh_t1": 1520.110,
"export_kwh_t2": 3184.623,
"voltage_l1": 230.1,
"ts": 1760605123
}
Veröffentlichen Sie net_w (Bezug minus Einspeisung) als vorzeichenbehafteten Wert. Solar- und Batterieautomatisierungen interessiert genau diese eine Zahl: Ein negativer Wert bedeutet, dass Sie einspeisen.
Einen P1-Smart-Meter mit Python auslesen
Schließen Sie ein P1-zu-USB-Kabel an einen Raspberry Pi oder einen beliebigen Linux-Rechner an. DSMR-4- und DSMR-5-Zähler verwenden 115200 Baud, 8 Datenbits, keine Parität und 1 Stoppbit. Jedes Telegramm beginnt mit /, endet mit ! plus einer CRC und enthält Zeilen wie 1-0:1.7.0(01.193*kW). Diese OBIS-Kennzahlen benötigen Sie:
| OBIS-Kennzahl | Bedeutung | Einheit |
|---|---|---|
1-0:1.8.1 / 1-0:1.8.2 |
Bezogene Energie, Tarif 1 / 2 | kWh |
1-0:2.8.1 / 1-0:2.8.2 |
Eingespeiste Energie, Tarif 1 / 2 | kWh |
1-0:1.7.0 |
Aktuelle Bezugsleistung | kW |
1-0:2.7.0 |
Aktuelle Einspeiseleistung | kW |
1-0:32.7.0 |
Spannung L1 | V |
0-1:24.2.1 |
Gaszählerstand (mit Zeitstempel) | m3 |
Installieren Sie die Abhängigkeiten:
pip install "paho-mqtt>=2.0" pyserial
import json
import re
import time
import uuid
import serial
import paho.mqtt.client as mqtt
PORT = "/dev/ttyUSB0"
PREFIX = f"connectmq/demo/{uuid.uuid4().hex[:8]}/energy/grid"
PUBLISH_EVERY = 5 # Sekunden; DSMR 5 sendet jede Sekunde ein Telegramm
LINE = re.compile(r"^(\d+-\d+:\d+\.\d+\.\d+)\((.*)\)$")
VALUE = re.compile(r"([\d.]+)\*")
FIELDS = {
"1-0:1.8.1": ("import_kwh_t1", 1),
"1-0:1.8.2": ("import_kwh_t2", 1),
"1-0:2.8.1": ("export_kwh_t1", 1),
"1-0:2.8.2": ("export_kwh_t2", 1),
"1-0:1.7.0": ("import_w", 1000), # kW -> W
"1-0:2.7.0": ("export_w", 1000),
"1-0:32.7.0": ("voltage_l1", 1),
}
def parse(telegram):
out = {}
for line in telegram.splitlines():
m = LINE.match(line.strip())
if not m or m.group(1) not in FIELDS:
continue
name, factor = FIELDS[m.group(1)]
v = VALUE.search(m.group(2))
if v:
out[name] = round(float(v.group(1)) * factor, 3)
if "import_w" in out and "export_w" in out:
out["net_w"] = round(out["import_w"] - out["export_w"], 1)
return out
mq = mqtt.Client(mqtt.CallbackAPIVersion.VERSION2, client_id=f"p1-{uuid.uuid4().hex[:6]}")
mq.will_set(f"{PREFIX}/status", "offline", qos=1, retain=True)
mq.connect("broker.connectmq.com", 1883, keepalive=60)
mq.loop_start()
mq.publish(f"{PREFIX}/status", "online", qos=1, retain=True)
print("Publishing to", PREFIX)
ser = serial.Serial(PORT, 115200, bytesize=8, parity="N", stopbits=1, timeout=12)
buf, last_pub = [], 0.0
while True:
raw = ser.readline().decode("ascii", errors="ignore")
if not raw:
continue
if raw.startswith("/"):
buf = [raw]
elif buf:
buf.append(raw)
if raw.startswith("!"):
data = parse("".join(buf))
buf = []
if data and time.time() - last_pub >= PUBLISH_EVERY:
data["ts"] = int(time.time())
mq.publish(f"{PREFIX}/telemetry", json.dumps(data), qos=0, retain=True)
last_pub = time.time()
print(data)
Das Skript drosselt auf eine Nachricht alle fünf Sekunden. Das reicht für Dashboards völlig aus und liegt weit unter dem Limit des öffentlichen MQTT-Brokers von 10 Nachrichten pro Sekunde und Client. Für einen produktiven Aufbau sollten Sie zusätzlich die CRC16 jedes Telegramms prüfen; beschädigte Telegramme sind selten, kommen bei langen Kabeln aber vor.
Sie bevorzugen statt eines Raspberry Pi einen ESP-basierten P1-Leser? Mehrere offene Firmware-Projekte veröffentlichen DSMR-Daten direkt per MQTT; richten Sie sie einfach auf denselben Broker und dieselbe Topic-Struktur aus.
Der Weg über Stromzangen
Wenn Sie keine nutzbare Zählerschnittstelle haben, ist ein dreiphasiges Stromzangen-Messgerät wie der Shelly Pro 3EM die bequeme Option. Einmal konfiguriert, veröffentlicht er Leistung pro Phase und Summenwerte über MQTT; die Shelly-MQTT-Anleitung erklärt seine Topics und TLS-Einstellungen. Auch Eigenbauten mit einem ESP32 und SCT-013-Klemmen sind beliebt. Beachten Sie aber, dass eine Stromzange allein Bezug und Einspeisung nicht unterscheiden kann; Sie brauchen eine Spannungsreferenz, um die Wirkleistung und ihre Richtung zu berechnen. Für einzelne Geräte sind Steckdosen einfacher; siehe Energiemonitoring mit Smart-Plugs und MQTT.
Speichern und Visualisieren mit Telegraf und InfluxDB
Der Broker liefert Live-Werte, speichert aber keine Historie. Der mqtt_consumer-Input von Telegraf abonniert wie jeder andere Client und schreibt in InfluxDB, deren Daten Grafana oder die InfluxDB-eigene Oberfläche darstellen kann.
[[inputs.mqtt_consumer]]
servers = ["tcp://broker.connectmq.com:1883"]
topics = ["connectmq/demo/+/energy/+/telemetry"]
client_id = "telegraf-energy-5527"
qos = 0
data_format = "json"
name_override = "energy"
json_time_key = "ts"
json_time_format = "unix"
[[inputs.mqtt_consumer.topic_parsing]]
topic = "connectmq/demo/+/energy/+/telemetry"
tags = "_/_/_/_/meter/_"
[[outputs.influxdb_v2]]
urls = ["http://localhost:8086"]
token = "YOUR_INFLUX_TOKEN"
organization = "home"
bucket = "energy"
Der topic_parsing-Block macht aus dem Zählernamen im Topic ein Tag, sodass die Zähler grid, solar und heatpump in einer gemeinsamen Measurement mit einem meter-Tag landen. Diese Diagramme lohnen sich zuerst:
- Nettoleistung der letzten 24 Stunden, mit hervorgehobener Nulllinie, damit Einspeisung sofort sichtbar ist.
- Täglicher Bezug und täglich eingespeiste Energie aus der Differenz der kWh-Zähler pro Tag.
- Grundlast, die niedrigste Nettoleistung zwischen 2 und 5 Uhr morgens, die Dauerverbraucher sichtbar macht.
- Bezug nach Tarif, um zu prüfen, ob flexible Lasten wirklich im günstigen Zeitraum laufen.
Node-RED-Dashboards und Home Assistant funktionieren genauso gut; beide abonnieren einfach das Telemetrie-Topic.
Auf die Werte reagieren
Ein Live-Wert net_w per MQTT ist mehr als ein Diagramm; er ist ein Eingang für Automatisierungen. Einige Muster lohnen sich frühzeitig:
- Überschussschaltung. Bleibt
net_weinige Minuten unter einem negativen Schwellwert (Sie speisen ein), schalten Sie einen Warmwasserbereiter, die Spülmaschine oder die Wallbox ein und mit Hysterese wieder aus, sobald wieder Strom bezogen wird. - Spitzenbegrenzung. Nähert sich der Bezug dem, was Ihre Hauptsicherung oder Ihr Leistungstarif erlaubt, verschieben Sie flexible Lasten, statt eine Sicherung auszulösen oder einen Leistungspreis zu zahlen.
- Grundlast-Warnungen. Eine nächtliche Grundlast, die sich plötzlich verdoppelt, deutet oft auf ein defektes Gerät, eine hängende Pumpe oder eine vergessene Heizung hin.
Diese Regeln laufen gut in Node-RED, Home Assistant oder einem kurzen Python-Subscriber, die sich alle als normale Clients mit dem Broker verbinden und dasselbe Telemetrie-Topic lesen. Dasselbe Muster trägt übrigens bis ins betriebliche Energiemonitoring im Mittelstand: Dort ersetzen Hallen- und Linienzähler den Hausanschluss, und die Topics folgen der Anlagenhierarchie, etwa acme/werk-muenchen/halle-2/linie-1/energie.
Typische Fehler vermeiden
- Energie aus Leistungswerten aufsummieren. Die Integration gemessener Leistungswerte driftet mit der Zeit. Verwenden Sie für Tagessummen die kWh-Zähler des Zählers.
- kW und W vermischen. DSMR meldet Leistung in kW; rechnen Sie einmal an der Quelle um.
- Hochfrequente Daten unnötig retainen. Retain ist für den jeweils letzten Wert nützlich, aber sekündliche Daten müssen nicht auf separaten Topics retained werden.
- Abweichende Uhren. Verwenden Sie das Zeitstempelfeld des Publishers (
ts) als Messzeitpunkt, damit Verzögerungen bei der Zustellung die Diagramme nicht verfälschen. - Öffentlich veröffentlichen. Sekundengenaue Verbrauchsdaten verraten, wann Sie zu Hause oder unterwegs sind. Der öffentliche MQTT-Broker ist nur für Tests und Experimente gedacht, nicht für produktive Daten.
Umstieg auf einen privaten Broker
Für einen dauerhaften Energiemonitor veröffentlichen Sie an einen privaten Broker mit TLS. Ein verwalteter MQTT-Broker wie ConnectMQ bedeutet: kein Broker, den Sie auf dem Raspberry Pi pflegen müssen, und sicherer Fernzugriff vom Smartphone, ohne Ports am Router zu öffnen. Legen Sie im ConnectMQ-Portal einen Broker an und passen Sie dann die Client- und Telegraf-Einstellungen an:
mq = mqtt.Client(mqtt.CallbackAPIVersion.VERSION2, client_id="YOUR_CLIENT_ID")
mq.username_pw_set("YOUR_USERNAME", "YOUR_PASSWORD")
mq.tls_set()
mq.connect("broker.connectmq.com", 8883, keepalive=60)
servers = ["ssl://broker.connectmq.com:8883"]
username = "YOUR_USERNAME"
password = "YOUR_PASSWORD"
Jeder Client (der P1-Leser und Telegraf) braucht eigene Zugangsdaten und eine eigene Client ID. Um mit der Erzeugung zu vergleichen, ergänzen Sie das Monitoring des Solar-Wechselrichters; einen breiteren Überblick über energiebewusste Automatisierung bietet der IoT-Automatisierungsleitfaden. Wenn Sie noch entscheiden, wo der Broker laufen soll, vergleicht der Leitfaden zum Cloud-MQTT-Broker die Optionen.
Den Energieverbrauch Ihres Hauses live auf ConnectMQ verfolgen
ConnectMQ bietet Ihren Zählerlesern, Telegraf und Dashboards einen sicheren Broker mit TLS, WebSocket-Zugriff für Browser-Dashboards und Schwellwert-Alarmregeln, zum Beispiel wenn der Nettobezug das Budget Ihrer Hauptsicherung überschreitet. Erstellen Sie einen kostenlosen Serverless-Broker unter app.connectmq.com, ganz ohne Kreditkarte.
Häufig gestellte Fragen
Hat mein Smart Meter einen P1-Port?
Zähler in den Niederlanden, Belgien und Luxemburg haben in der Regel einen, und in manchen Ländern muss der Port vom Netzbetreiber freigeschaltet werden. Andere Regionen nutzen andere Kundenschnittstellen oder gar keine; dann sind Stromzangen oder ein Impuls-LED-Leser die Alternativen.
Wie oft sollte ein Energiemonitor per MQTT veröffentlichen?
Üblich sind 1 bis 10 Sekunden. Schnelle Updates helfen bei der Steuerung von Solarüberschuss, während Historie und Tagessummen auch mit niedrigeren Raten gut funktionieren, weil sie aus den kWh-Zählern stammen.
Können Stromzangen Solareinspeisung erkennen?
Nur wenn das Gerät auch die Spannung misst, um Wirkleistung und ihr Vorzeichen zu berechnen. Reine Strommessklemmen zeigen, wie viel Strom fließt, aber nicht in welche Richtung.
Ist InfluxDB zwingend nötig?
Nein. Jeder Subscriber kann die Daten speichern, etwa der Recorder von Home Assistant, ein Node-RED-Flow, der in eine Datenbank schreibt, oder ein einfaches Python-Skript, das CSV-Dateien anlegt.



