Energiemonitoring mit smarten Steckdosen über MQTT ist der günstigste Weg herauszufinden, was jedes Gerät in Ihrem Haushalt im Betrieb wirklich kostet. In diesem Tutorial verbinden Sie Tasmota- und Shelly-Steckdosen mit einem Broker, vereinheitlichen ihre unterschiedlichen Payloads, speichern die Messwerte mit einem Python-Subscriber in SQLite und erzeugen ein tägliches kWh-Diagramm pro Gerät. Der Ansatz kommt mit Neustarts und Zählerrücksetzungen zurecht, und genau dort gehen die meisten selbstgebauten Energielogger unbemerkt schief.
Welche smarten Steckdosen MQTT sprechen
Sie benötigen eine Steckdose, die an einen Broker Ihrer Wahl senden kann, nicht nur an eine Hersteller-Cloud. Drei Familien decken für diesen Zweck den Großteil des Marktes ab:
| Steckdosenfamilie | So wird MQTT aktiviert | Energiefelder | Hinweise |
|---|---|---|---|
| Steckdosen mit Tasmota-Firmware (viele ESP-basierte Modelle) | In der Tasmota-Firmware integriert | ENERGY.Power (W), ENERGY.Total (kWh), Today, Yesterday |
Manche Modelle werden mit Tasmota ausgeliefert, andere müssen geflasht werden |
| Shelly Plug S Gen3 / Plus Plug | Lokale Weboberfläche, Settings > MQTT | apower (W), aenergy.total (Wh) |
Gen2/Gen3-JSON-RPC-API |
| ESPHome-basierte Steckdosen | mqtt:-Block im ESPHome-YAML |
Ein Topic pro Sensor | Flexibel, aber Topics pro Entität |
Prüfen Sie vor dem Kauf, ob die Steckdose eine Leistungsmessung hat; viele günstige Modelle schalten nur. Vergleichen Sie außerdem den Nennstrom mit dem Gerät, denn Wasserkocher, Heizlüfter und Trockner liegen bei den meisten Steckdosen nahe am Limit.
Eine Tasmota-Steckdose verbinden
Öffnen Sie die Tasmota-Weboberfläche und dann Configuration > Configure MQTT, oder nutzen Sie für eine schnellere Einrichtung die Konsole. Der Befehl Backlog wendet mehrere Einstellungen in einem Schritt an und startet die Steckdose neu:
Backlog MqttHost broker.connectmq.com; MqttPort 1883; MqttClient plug-kitchen-kettle-9f2; Topic kettle; FullTopic connectmq/demo/p4w8/%prefix%/%topic%/; TelePeriod 60
Damit veröffentlicht die Steckdose ihre Telemetrie alle 60 Sekunden an connectmq/demo/p4w8/tele/kettle/SENSOR, mit einem Payload wie diesem:
{
"Time": "2026-10-16T07:31:12",
"ENERGY": {
"TotalStartTime": "2025-11-02T18:04:51",
"Total": 48.215,
"Yesterday": 0.412,
"Today": 0.197,
"Period": 3,
"Power": 0,
"ApparentPower": 0,
"ReactivePower": 0,
"Factor": 0.00,
"Voltage": 231,
"Current": 0.000
}
}
Total ist die Gesamtenergie seit Inbetriebnahme in kWh, Power die momentane Wirkleistung in Watt. Verwenden Sie ein zufälliges Pfadsegment wie p4w8, denn der öffentliche MQTT-Broker wird geteilt, ist für alle lesbar und nur für Tests und Prototypen gedacht. Die Tasmota-spezifischen Details, einschließlich TLS-Builds, behandelt der Tasmota-MQTT-Leitfaden.
Eine Shelly-Steckdose verbinden
Öffnen Sie bei einem Shelly Plus Plug oder Plug S Gen3 die lokale Weboberfläche, gehen Sie zu Settings > MQTT, aktivieren Sie MQTT, setzen Sie den Server auf broker.connectmq.com:1883 und das Präfix auf connectmq/demo/p4w8/shelly/fridge und aktivieren Sie Generic status update over MQTT. Die Steckdose veröffentlicht dann vollständige Snapshots auf connectmq/demo/p4w8/shelly/fridge/status/switch:0, wobei apower in Watt und aenergy.total die Gesamtenergie in Wattstunden angibt, nicht in kWh. Diese Einheiten zu verwechseln ist der häufigste Fehler, wenn man Marken kombiniert. Die Anleitung zur Shelly-MQTT-Einrichtung erklärt die vollständige Topic- und RPC-Struktur.
Die Datenpipeline für smarte Steckdosen mit MQTT entwerfen
Jede Steckdose veröffentlicht bereits an den Broker; was fehlt, ist etwas, das zuhört und eine Historie anlegt. Broker liefern Live-Nachrichten und retained Werte aus, sind aber keine Datenbanken. Der Logger ist daher ein eigener MQTT-Client. Der Plan:
- Beide Steckdosenformate mit Wildcards abonnieren.
- Jede Nachricht in
(time, plug, power_w, total_kwh)normalisieren. - Jeden Messwert in SQLite speichern.
- Den Tagesverbrauch aus der Differenz aufeinanderfolgender Gesamtzählerstände berechnen und negative Sprünge durch Zählerrücksetzungen ignorieren.
- Pro Steckdose und Tag eine Balkenreihe zeichnen.
Warum aus den Gesamtzählerständen rechnen statt die Leistung zu integrieren? Weil die Leistung nur einmal pro Minute erfasst wird, und ein Wasserkocher, der 90 Sekunden zwischen zwei Messungen läuft, könnte als null erscheinen. Der Energiezähler der Steckdose misst kontinuierlich, daher sind die Differenzen der Zählerstände auch bei seltenen Messungen genau. Geht eine Nachricht verloren, deckt die nächste Differenz einfach einen längeren Zeitraum ab. Dasselbe Verfahren nutzt das industrielle Energiemonitoring mit Unterzählern an Maschinen und Kompressoren, etwa im Rahmen eines Energiemanagements nach ISO 50001: Zählerstände sind die verlässliche Quelle, Leistungswerte die Momentaufnahme.
Der Python-Logger
pip install "paho-mqtt>=2.0" matplotlib
import json
import sqlite3
import sys
from datetime import datetime
import paho.mqtt.client as mqtt
PREFIX = "connectmq/demo/p4w8"
DB = sqlite3.connect("plugs.db", check_same_thread=False)
DB.execute("""CREATE TABLE IF NOT EXISTS samples (
ts TEXT, plug TEXT, power_w REAL, total_kwh REAL)""")
DB.commit()
def normalize(topic, payload):
parts = topic.split("/")
data = json.loads(payload)
if "/tele/" in topic and topic.endswith("/SENSOR"):
e = data.get("ENERGY")
if not e:
return None
return parts[-2], float(e["Power"]), float(e["Total"])
if "/shelly/" in topic and topic.endswith("/status/switch:0"):
if "aenergy" not in data:
return None
plug = parts[parts.index("shelly") + 1]
return plug, float(data.get("apower", 0)), float(data["aenergy"]["total"]) / 1000.0
return None
def on_connect(client, userdata, flags, reason_code, properties):
print("Connected:", reason_code)
client.subscribe(f"{PREFIX}/tele/+/SENSOR", qos=1)
client.subscribe(f"{PREFIX}/shelly/+/status/switch:0", qos=1)
def on_message(client, userdata, msg):
try:
row = normalize(msg.topic, msg.payload)
except (ValueError, KeyError) as exc:
print("Skipping", msg.topic, exc)
return
if row is None:
return
plug, power, total = row
DB.execute("INSERT INTO samples VALUES (?, ?, ?, ?)",
(datetime.now().isoformat(timespec="seconds"), plug, power, total))
DB.commit()
print(f"{plug:12s} {power:8.1f} W {total:10.3f} kWh")
def daily_kwh():
rows = DB.execute("SELECT ts, plug, total_kwh FROM samples ORDER BY plug, ts").fetchall()
result, last = {}, {}
for ts, plug, total in rows:
day = ts[:10]
prev = last.get(plug)
last[plug] = total
if prev is None:
continue
delta = total - prev
if delta < 0: # Zählerrücksetzung oder Steckdose getauscht: Intervall überspringen
continue
result.setdefault(plug, {}).setdefault(day, 0.0)
result[plug][day] += delta
return result
def plot():
import matplotlib.pyplot as plt
data = daily_kwh()
days = sorted({d for per in data.values() for d in per})
width = 0.8 / max(len(data), 1)
fig, ax = plt.subplots(figsize=(10, 5))
for i, (plug, per_day) in enumerate(sorted(data.items())):
xs = [n + i * width for n in range(len(days))]
ax.bar(xs, [per_day.get(d, 0) for d in days], width, label=plug)
ax.set_xticks([n + 0.4 - width / 2 for n in range(len(days))])
ax.set_xticklabels(days, rotation=45, ha="right")
ax.set_ylabel("kWh per day")
ax.legend()
fig.tight_layout()
fig.savefig("daily_kwh.png", dpi=120)
for plug, per_day in sorted(data.items()):
print(plug, {d: round(v, 3) for d, v in sorted(per_day.items())})
if __name__ == "__main__":
if sys.argv[1:] == ["plot"]:
plot()
else:
client = mqtt.Client(mqtt.CallbackAPIVersion.VERSION2, client_id="plug-logger-3391")
client.on_connect = on_connect
client.on_message = on_message
client.connect("broker.connectmq.com", 1883, keepalive=60)
client.loop_forever()
Lassen Sie python plug_logger.py laufen und führen Sie nach ein bis zwei Tagen python plug_logger.py plot aus, um daily_kwh.png zu erzeugen und die Zahlen auszugeben. Die Tage werden nach der lokalen Zeit des Loggers gruppiert, was für Haushaltsauswertungen in der Regel gewünscht ist.
Die Zahlen richtig deuten
Sobald Sie Daten für eine Woche haben, fallen meist einige Muster auf:
- Standby-Verbrauch. Fernseher, Spielkonsolen und Netzwerkgeräte, die nie unter einige Watt fallen, summieren sich über ein Jahr. Betrachten Sie das Minimum von
power_wpro Steckdose, nicht nur die Tagessumme. - Kühl- und Gefrierschränke zeigen einen regelmäßigen Arbeitszyklus. Steigt der Tagesverbrauch bei gleicher Raumtemperatur, kann das auf eine undichte Dichtung oder einen verschmutzten Verflüssiger hinweisen.
- Kurze hohe Lasten wie Wasserkocher und Kaffeemaschinen tauchen in den Leistungsmessungen kaum auf, werden aber vom Energiezähler erfasst, was die Differenzmethode bestätigt.
- Jährliche Kosten ergeben sich aus kWh pro Tag mal 365 mal Ihrem Tarif. Rechnen Sie pro Steckdose, damit Sie wissen, welche Änderung sich lohnt.
Eine Gesamtansicht für das ganze Haus zum Vergleich finden Sie im Tutorial zum Energiemonitor für zu Hause mit MQTT.
MQTT-Daten smarter Steckdosen in Alarme verwandeln
Die Historie zeigt, was passiert ist; Alarme melden sich, solange es noch passiert. Da jeder Messwert ohnehin über den Broker läuft, können Sie Alarme ergänzen, ohne die Steckdosen anzufassen:
- Gefrierschrank ausgefallen. Meldet die Steckdose eines Gefrierschranks länger als eine Stunde weniger als einige Watt, bedeutet das meist einen ausgelösten Thermostat oder eine offen gelassene Tür. Die Schwellenwert-Alarmregeln im ConnectMQ-Portal können ein numerisches Feld auf einem Topic überwachen, und ein Python- oder Node-RED-Subscriber kann die Bedingung „länger als eine Stunde“ ergänzen.
- Vergessenes Gerät. Ein Bügeleisen, Heizlüfter oder Glätteisen, das länger als üblich Strom zieht, ist ein klassischer Fall für eine Automatisierung mit smarter Steckdose und MQTT: Nach einem Timeout
offan das Command-Topic der Steckdose senden. - Waschmaschine fertig. Fällt die Leistung von mehreren hundert Watt auf nahezu null und bleibt dort einige Minuten, ist das ein zuverlässiges Signal „Programm beendet“ für eine Push-Nachricht aufs Handy.
Halten Sie die Logik in einem einzigen Subscriber, statt sie auf mehrere Geräte zu verteilen, damit Sie Schwellenwerte ändern können, ohne etwas neu zu flashen.
Checkliste zur Fehlerbehebung
| Problem | Ursache | Lösung |
|---|---|---|
| Tagessummen sind 1000-mal zu groß | Shelly-Wh als kWh behandelt | aenergy.total durch 1000 teilen |
| Minutenlang keine Tasmota-Daten | TelePeriod zu lang |
TelePeriod 60 oder kleiner setzen (Minimum 10) |
| Steckdosen trennen sich gegenseitig | Doppelte MQTT-Client-IDs | Eindeutiger MqttClient pro Steckdose |
| Negative Tageswerte | Zählerrücksetzung nicht behandelt | Negative Differenzen wie oben überspringen |
| Leistungswerte wirken falsch | Steckdose nicht kalibriert | In Tasmota mit PowerSet, VoltageSet, CurrentSet kalibrieren |
Umzug auf einen privaten Broker
Der öffentliche MQTT-Broker eignet sich perfekt für dieses Experiment, aber Energiedaten verraten, wann Sie zu Hause sind, und wer Ihr Präfix errät, kann auch Ihre Steckdosen schalten. Bevor Sie den Aufbau dauerhaft laufen lassen, wechseln Sie zu einem Cloud-MQTT-Broker mit Zugangsdaten und TLS. Bei ConnectMQ erstellen Sie im Portal einen Broker und geben dann jeder Steckdose eigenen Benutzernamen, Passwort und Client-ID. In Tasmota bedeutet das einen TLS-fähigen Build und MqttPort 8883; bei Shelly aktivieren Sie SSL mit dem eingebauten CA-Bundle. Ergänzen Sie im Logger:
client = mqtt.Client(mqtt.CallbackAPIVersion.VERSION2, client_id="YOUR_CLIENT_ID")
client.username_pw_set("YOUR_USERNAME", "YOUR_PASSWORD")
client.tls_set()
client.connect("broker.connectmq.com", 8883, keepalive=60)
Die 25 Verbindungen des kostenlosen Serverless-Plans reichen für ein Dutzend Steckdosen, den Logger und ein Dashboard. Ein verwalteter MQTT-Broker bedeutet außerdem, dass der Broker von Ihrem Handy aus erreichbar ist, ohne Ports am Router zu öffnen. Der Leitfaden zur IoT-Automatisierung zeigt, wie Steckdosendaten auch Automatisierungen auslösen können.
Ihre Steckdosen mit ConnectMQ überwachen
ConnectMQ bietet Ihren smarten Steckdosen, Loggern und Dashboards einen privaten, TLS-gesicherten Broker mit Live-Topic-Explorer und Schwellenwert-Alarmregeln, zum Beispiel um Sie zu warnen, wenn die Steckdose eines Gefrierschranks zu lange null Watt meldet. Erstellen Sie unter app.connectmq.com einen kostenlosen Serverless-Broker, ganz ohne Kreditkarte.
Häufig gestellte Fragen
Kann jede smarte Steckdose MQTT-Daten senden?
Nein. Nur Steckdosen mit MQTT in der Firmware, etwa Tasmota-, Shelly-Gen2/Gen3- oder ESPHome-Geräte, können an einen Broker Ihrer Wahl senden. Reine Cloud-Steckdosen benötigen stattdessen eine Hersteller-Integration.
Wie genau sind die Energiewerte smarter Steckdosen?
Sie sind meist gut genug, um Geräte zu vergleichen und Verschwendung aufzuspüren, aber keine abrechnungsfähigen Zähler. Eine Kalibrierung mit einer bekannten ohmschen Last verbessert die Genauigkeit bei Tasmota-Steckdosen spürbar.
Warum den Energiezählerstand statt des Leistungswerts verwenden?
Die Steckdose integriert die Energie kontinuierlich, während die Leistung nur beim Senden einer Nachricht erfasst wird. Differenzen der Gesamtzählerstände erfassen auch kurze Lasten, die bei Leistungsmessungen untergehen.
Wie oft sollte eine smarte Steckdose senden?
Alle 30 bis 60 Sekunden ist ein guter Kompromiss für Historie und Dashboards. Kürzere Intervalle erhöhen den Datenverkehr, ohne die Tagessummen zu verbessern, denn diese stammen aus dem Energiezähler.



