IoT-Automatisierung

Wallbox-MQTT-Integration: OCPP vs. MQTT und PV-Überschussladen zu Hause

OCPP verbindet Ladestationen mit Backend-Systemen, MQTT verbindet sie mit dem Rest Ihres Zuhauses. Erfahren Sie, wie beide zusammenpassen, welcher Integrationsweg zu Ihrer Wallbox passt und wie Sie PV-Überschussladen auf Basis von MQTT aufbauen.

Wallbox zu Hause, die ein Elektroauto lädt, mit Solarmodulen und einem Energieflussdiagramm für die Wallbox-MQTT-Integration
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

Mit einer Wallbox-MQTT-Integration wird Ihre Ladestation Teil Ihres gesamten Energiesystems zu Hause: laden, wenn die Sonne scheint, pausieren, wenn Backofen und Wärmepumpe laufen, und den Status auf demselben Dashboard anzeigen wie alles andere. Diese Anleitung erklärt, wie sich OCPP und MQTT unterscheiden, zeigt die drei praktischen Wege, eine Wallbox an MQTT anzubinden, ein sauberes Topic-Design und einen funktionierenden PV-Überschussregler in Python. Am Ende wissen Sie, welcher Weg zu Ihrer Wallbox passt und wie Sie sicher darauf aufbauen.

OCPP und MQTT lösen unterschiedliche Probleme

Häufig wird gefragt, ob eine Wallbox OCPP oder MQTT verwenden sollte. In der Praxis bedienen beide unterschiedliche Beziehungen, und ein gutes Setup zu Hause nutzt oft beide.

OCPP (Open Charge Point Protocol) ist die Standardsprache zwischen einer Ladestation und einem Charging Station Management System (CSMS), dem Backend, das Autorisierung, Ladevorgänge und Abrechnung übernimmt. OCPP 1.6J und 2.0.1 übertragen JSON-Nachrichten über einen WebSocket, den die Ladestation zum CSMS öffnet. Zu den Nachrichten gehören BootNotification, StatusNotification, MeterValues, Start und Ende von Transaktionen sowie SetChargingProfile für intelligentes Laden. Jede Ladestation ist jeweils mit genau einem CSMS verbunden.

MQTT ist ein universelles Publish/Subscribe-Protokoll. Eine Ladestation oder eine Bridge veröffentlicht ihren Zustand an einen Broker, und beliebig viele Abnehmer (Dashboard, Home Assistant, Energiemanager, Smartphone-App) abonnieren ihn, ohne dass die Ladestation sie kennen muss. Wenn Ihnen das Prinzip neu ist, erklärt der Beitrag was ein MQTT-Broker macht die Grundlagen.

Aspekt OCPP MQTT
Zweck Ladestation zum Backend: Ladevorgänge, Autorisierung, Abrechnung, intelligentes Laden Beliebiges Gerät an beliebig viele Abnehmer
Transport WebSocket, Ladestation verbindet sich mit einem CSMS TCP oder WebSocket zu einem Broker, viele Subscriber
Nachrichtenschema Je OCPP-Version streng definiert Topics und Payloads gestalten Sie selbst
Typische Nutzer Ladepunktbetreiber, Flotten, Laden am Arbeitsplatz Hausautomation, Energiemanagement, Dashboards
Steuerung Fernstart/-stopp, Ladeprofile Alles, was das Gerät oder die Bridge bereitstellt
Mehrere Abnehmer Nein, ein CSMS pro Verbindung Ja, eingebaut

Wenn Sie öffentliche Ladepunkte oder Ladestationen am Arbeitsplatz betreiben, ist OCPP zu einem CSMS der richtige Kern. Soll eine Wallbox zu Hause mit Solarmodulen, Batteriespeicher und Haushaltsverbrauchern zusammenarbeiten, ist MQTT die praktische Integrationsschicht, manchmal im Hintergrund von OCPP gespeist.

Drei Wege, eine Wallbox an MQTT anzubinden

1. Natives MQTT in der Wallbox. Manche Ladestationen, vor allem Open-Hardware- und auf Enthusiasten ausgerichtete Modelle, veröffentlichen ihren Status direkt per MQTT und nehmen Befehle entgegen. Sie tragen Broker-Host, Port und Zugangsdaten in der Weboberfläche der Wallbox ein. Das ist der einfachste Weg, sofern verfügbar, allerdings unterscheiden sich Topic-Namen und Payloads je nach Hersteller.

2. Ein lokaler OCPP-Server mit Bridge zu MQTT. Viele kommerzielle Wallboxen sprechen nur OCPP (plus die Herstellercloud). Richten Sie die OCPP-URL der Wallbox auf einen lokalen OCPP-Server, zum Beispiel die OCPP-Integration für Home Assistant oder ein Open-Source-CSMS, und lassen Sie diesen Server Status und Zählerwerte per MQTT weiterveröffentlichen. Sie behalten die Standard-Semantik von OCPP und gewinnen MQTT für alles andere. Der Nachteil: Die Cloud-Funktionen des Herstellers funktionieren möglicherweise nicht mehr, solange die Wallbox mit Ihrem Server spricht.

3. Ein Energiemanager dazwischen. Open-Source-Energiemanager wie evcc sprechen mit vielen Wallboxen über deren native Protokolle und veröffentlichen ihren eigenen Zustand per MQTT, darunter Netzleistung, PV-Leistung und Ladeleistung pro Ladepunkt, und nehmen Modusänderungen über MQTT-Topics an. Das ist oft der schnellste Weg zum PV-Überschussladen, weil die Regellogik bereits fertig und getestet ist.

Für welchen Weg Sie sich auch entscheiden: Ziel ist auf dem Broker immer dasselbe Ergebnis, ein stabiler Topic-Baum, der sich nicht ändert, wenn Sie die Wallbox austauschen. Betreiben Sie Ladepunkte auf einem Firmen- oder Werksgelände, hängen Sie sie in den Unified Namespace (UNS) des Standorts ein, dessen Topics der ISA-95-Hierarchie folgen, etwa acme/werk-muenchen/parkhaus/ladepunkte/lp-04/state; so sehen Energiemonitoring und Lastmanagement die Ladeleistung direkt neben den Maschinen.

Den Wallbox-MQTT-Topic-Baum gestalten

Trennen Sie Zustand und Befehle, retainen Sie den Zustand und niemals Befehle:

home/ev/charger1/state            retained  {"status":"charging","power_w":7210,"current_a":10.4,"phases":3,"session_kwh":12.8}
home/ev/charger1/status           retained  online / offline (Last Will)
home/ev/charger1/set/current_a    command   6..16
home/ev/charger1/set/enabled      command   true / false
home/energy/grid/telemetry        retained  {"net_w": -2350, ...}

Verwenden Sie Statuswerte im OCPP-Stil (available, preparing, charging, suspended_ev, suspended_evse, finishing, faulted), auch wenn die Quelle kein OCPP ist. Sie sind allgemein verständlich und unterscheiden „das Auto ist voll“ (suspended_ev) von „die Wallbox hat pausiert“ (suspended_evse), was für Automatisierungen wichtig ist.

Einen Befehl wie set/current_a zu retainen, ist ein klassischer Fehler: Nach einem Stromausfall verbindet sich die Wallbox oder Bridge neu und spielt einen alten Wert erneut ab. Befehle sollten nicht retained sein; die Bridge veröffentlicht den tatsächlich wirksamen Wert auf dem retained Zustands-Topic zurück.

Ein PV-Überschussregler in Python

Der folgende Regler abonniert den Wert net_w des Netzzählers (negativ bedeutet Einspeisung, wie im Tutorial zum Energiemonitor für Zuhause veröffentlicht) sowie den Zustand der Wallbox und veröffentlicht dann einen Ladestrom, der dem Überschuss folgt. Er funktioniert mit jeder Wallbox oder Bridge, die einen Stromsollwert auf einem Topic annimmt. Testen Sie ihn mit simulierten Nachrichten auf dem öffentlichen MQTT-Broker, bevor Sie echte Hardware anschließen.

pip install "paho-mqtt>=2.0"
import json
import time
import paho.mqtt.client as mqtt

PREFIX = "connectmq/demo/ev7k2"      # beim Testen ein eigenes zufälliges Präfix verwenden
GRID_TOPIC = f"{PREFIX}/energy/grid/telemetry"
STATE_TOPIC = f"{PREFIX}/ev/charger1/state"
SET_CURRENT = f"{PREFIX}/ev/charger1/set/current_a"
SET_ENABLED = f"{PREFIX}/ev/charger1/set/enabled"

VOLTAGE = 230
PHASES = 1            # für eine dreiphasige Wallbox auf 3 setzen
MIN_A, MAX_A = 6, 16  # 6 A ist der niedrigste Strom in der IEC-61851-Signalisierung
START_MARGIN_W = 300  # zusätzliche Einspeisung, die vor dem Start nötig ist
UPDATE_EVERY = 30     # Sekunden zwischen Sollwertänderungen
STOP_AFTER = 300      # Sekunden unter dem Minimum, bevor pausiert wird

state = {"net_w": None, "charger_current_a": 0.0, "status": "unknown"}
current_set = 0
below_since = None
last_update = 0.0


def on_connect(client, userdata, flags, reason_code, properties):
    print("Connected:", reason_code)
    client.subscribe(GRID_TOPIC, qos=1)
    client.subscribe(STATE_TOPIC, qos=1)


def on_message(client, userdata, msg):
    data = json.loads(msg.payload)
    if msg.topic == GRID_TOPIC:
        state["net_w"] = data.get("net_w")
    elif msg.topic == STATE_TOPIC:
        state["charger_current_a"] = data.get("current_a", 0.0)
        state["status"] = data.get("status", "unknown")


def control(client):
    global current_set, below_since, last_update
    if state["net_w"] is None or state["status"] in ("available", "faulted", "unknown"):
        return
    if time.time() - last_update < UPDATE_EVERY:
        return
    charger_w = state["charger_current_a"] * VOLTAGE * PHASES
    surplus_w = charger_w - state["net_w"]          # was wir ohne Netzbezug nutzen könnten
    if current_set == 0:
        surplus_w -= START_MARGIN_W
    target = int(surplus_w // (VOLTAGE * PHASES))

    if target >= MIN_A:
        below_since = None
        target = min(target, MAX_A)
        if current_set == 0:
            client.publish(SET_ENABLED, "true", qos=1)
        if target != current_set:
            client.publish(SET_CURRENT, str(target), qos=1)
            print(f"surplus {surplus_w:.0f} W -> {target} A")
            current_set = target
    elif current_set > 0:
        below_since = below_since or time.time()
        if time.time() - below_since > STOP_AFTER:
            client.publish(SET_ENABLED, "false", qos=1)
            print("Not enough surplus, pausing")
            current_set = 0
        elif current_set != MIN_A:
            client.publish(SET_CURRENT, str(MIN_A), qos=1)
            current_set = MIN_A
    last_update = time.time()


client = mqtt.Client(mqtt.CallbackAPIVersion.VERSION2, client_id="ev-surplus-6619")
client.on_connect = on_connect
client.on_message = on_message
client.connect("broker.connectmq.com", 1883, keepalive=60)
client.loop_start()
while True:
    control(client)
    time.sleep(1)

Simulieren Sie in einem zweiten Terminal einen sonnigen Nachmittag und beobachten Sie, wie der Regler reagiert:

mosquitto_pub -h broker.connectmq.com -p 1883 -i ev-sim-1 -t "connectmq/demo/ev7k2/ev/charger1/state" -m '{"status":"suspended_evse","current_a":0}'
mosquitto_pub -h broker.connectmq.com -p 1883 -i ev-sim-2 -t "connectmq/demo/ev7k2/energy/grid/telemetry" -m '{"net_w":-2600}'

Bei 2.600 W Einspeisung auf einer Phase startet der Regler nach Abzug der Startreserve mit 10 A.

Designregeln für eine sichere Wallbox-Steuerung

Ladehardware führt über Stunden hohe Ströme, gehen Sie also konservativ vor:

  1. Die Wallbox setzt ihre eigenen Grenzen durch. Ihr Regler fordert nur einen Sollwert an; das konfigurierte Maximum der Wallbox und die Schutzeinrichtungen der Installation müssen die letzte Instanz bleiben.
  2. Sollwerte langsam ändern. Häufige Stromänderungen und Start-Stopp-Zyklen belasten Schütze und manche Fahrzeuge. Ein Aktualisierungsintervall von 30 Sekunden und eine Stoppverzögerung von 5 Minuten sind sinnvolle Ausgangswerte.
  3. Das Minimum von 6 A respektieren. Darunter pausieren Sie den Ladevorgang, statt einen ungültigen Strom anzufordern.
  4. Phasenumschaltung mit Vorsicht behandeln. Das Umschalten zwischen ein- und dreiphasig setzt voraus, dass die Wallbox es unterstützt, und darf niemals erfolgen, während Strom fließt.
  5. Ausfallsicher handeln. Meldet der Netzzähler keine Werte mehr, hören Sie auf nachzuregeln und fallen auf einen festen oder pausierten Zustand zurück. Nutzen Sie dafür den retained Last-Will-Status des Zählers.
  6. Wallboxen niemals über einen öffentlichen MQTT-Broker steuern. Jeder könnte auf Ihr Befehls-Topic veröffentlichen. Der öffentliche MQTT-Broker ist nur für Simulationen und Tests gedacht.

Umstieg auf einen privaten Broker

Wenn sich die Simulation wie gewünscht verhält, verbinden Sie die echte Wallbox oder Bridge und den Regler mit einem privaten Broker mit TLS und eigenen Zugangsdaten pro Client. Ein verwalteter MQTT-Broker wie ConnectMQ bleibt online, ohne dass Sie einen Server pflegen müssen, und weil Wallbox, Zählerleser und Regler nur ausgehende Verbindungen aufbauen, muss an Ihrem Router nichts freigegeben werden. Legen Sie im ConnectMQ-Portal einen Broker an, erstellen Sie Zugangsdaten für jeden Client und verbinden Sie sich über Port 8883:

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)

Binden Sie anschließend die Erzeugungsdaten aus dem Monitoring des Solar-Wechselrichters und den Speicher aus der Überwachung des Heimspeichers ein, um zu entscheiden, ob zuerst das Auto oder die Batterie den Überschuss bekommt. Der IoT-Automatisierungsleitfaden zeigt, wie sich diese Energieflüsse in ein größeres Setup zu Hause einfügen, und der Leitfaden zum Cloud-MQTT-Broker hilft bei der Wahl des Hostings.

Verbinden Sie Ihre Wallbox mit ConnectMQ

ConnectMQ bietet Ihrer Wallbox-Bridge, Ihrem Energiemanager und Ihren Dashboards einen privaten Broker mit TLS, WebSocket-Zugriff für Browser-Apps und einen Live-Topic-Explorer, mit dem Sie jede Zustandsänderung überprüfen können. Erstellen Sie einen kostenlosen Serverless-Broker unter app.connectmq.com, ganz ohne Kreditkarte.

Häufig gestellte Fragen

Sollte meine Wallbox zu Hause OCPP oder MQTT verwenden?

Nutzen Sie für die Kernverbindung das, was die Wallbox nativ unterstützt, und MQTT als Integrationsschicht für die Hausautomation. Viele Setups betreiben OCPP zu einem lokalen Server und veröffentlichen die Daten von dort per MQTT weiter.

Kann ich OCPP und die Herstellercloud gleichzeitig nutzen?

In der Regel nicht, weil eine Wallbox sich nur mit einem einzigen OCPP-Backend verbindet. Wenn Sie sie auf Ihren eigenen Server richten, ersetzt das meist das Backend des Herstellers; prüfen Sie also, welche Funktionen Sie verlieren würden.

Was ist der minimale Ladestrom?

Die IEC-61851-Control-Pilot-Signalisierung von AC-Ladestationen hat ein Minimum von 6 A. Darunter sollte der Regler den Ladevorgang pausieren, statt den Strom weiter zu senken.

Wie schnell sollte ein Überschussregler reagieren?

Alle 30 bis 60 Sekunden ist ein sinnvoller Standardwert. Schnellere Reaktionen jagen vor allem vorbeiziehenden Wolken hinterher und verursachen unnötige Schaltvorgänge.

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.