IoT-Automatisierung

Smarte Steckdose mit MQTT: Leistungsdaten erfassen und Tagesverbrauch grafisch darstellen

Erfassen Sie Leistungs- und Energiewerte von MQTT-fähigen smarten Steckdosen, speichern Sie sie mit einem kleinen Python-Subscriber in SQLite und erstellen Sie daraus tägliche kWh-Diagramme pro Gerät, die Neustarts und Zählerrücksetzungen überstehen.

Smarte Steckdosen an Küchengeräten, die ein Balkendiagramm des Tagesverbrauchs speisen, in einem Projekt mit smarter Steckdose und MQTT
Probieren Sie es auf Ihrem eigenen MQTT-Broker ausHolen Sie sich im Free-Tarif einen privaten, verwalteten MQTT-Broker und starten Sie mit fertigen Codebeispielen.
Kostenlos testen Codebeispiele Keine Kreditkarte erforderlich

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:

  1. Beide Steckdosenformate mit Wildcards abonnieren.
  2. Jede Nachricht in (time, plug, power_w, total_kwh) normalisieren.
  3. Jeden Messwert in SQLite speichern.
  4. Den Tagesverbrauch aus der Differenz aufeinanderfolgender Gesamtzählerstände berechnen und negative Sprünge durch Zählerrücksetzungen ignorieren.
  5. 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_w pro 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 off an 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.

Verwandte Artikel

Zigbee2MQTT einrichten: Vom Koordinator bis zum Dashboard

Installieren Sie Zigbee2MQTT mit Docker, konfigurieren Sie Koordinator und MQTT-Verbindung, lernen Sie Geräte an und benennen Sie sie um, steuern Sie sie per MQTT und zeigen Sie ihre Zustände auf einem Dashboard an, zuerst getestet auf einem kostenlosen öffentlichen MQTT-Broker.

8 Min. Lesezeit

Alle Artikel →

Ihr privater MQTT-Broker ist nur wenige Klicks entfernt

Konto anlegen, Broker-Zugangsdaten erhalten und das erste Gerät verbinden — ohne Server, die installiert, gepatcht oder skaliert werden müssen.