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:
- 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.
- 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.
- Das Minimum von 6 A respektieren. Darunter pausieren Sie den Ladevorgang, statt einen ungültigen Strom anzufordern.
- 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.
- 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.
- 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.



