Voraussetzungen
Hardware
- Wago SPS: z. B. Wago 750-880 (Ethernet-Koppler mit Modbus TCP)
- Netzwerk: SPS und Home Assistant im selben LAN
- Home Assistant: aktuell installiert (Raspberry Pi, Proxmox oder NAS)
Kenntnisse
- Grundlegende Modbus-Kenntnisse (Register, Coils)
- YAML-Konfiguration in Home Assistant
- Zugang zur Wago-Programmierung (CODESYS / Wago e!COCKPIT)
Modbus TCP – kurz erklärt
Modbus TCP ist ein industrielles Kommunikationsprotokoll über Ethernet. Es kennt vier Objekttypen. Die Wago 750-880 arbeitet als Modbus TCP Slave, Home Assistant als Master.
| Typ | Beschreibung | Zugriff |
|---|---|---|
| Coils | 1-Bit Ausgänge (TRUE/FALSE) | Lesen + Schreiben |
| Discrete Inputs | 1-Bit Eingänge | Nur Lesen |
| Holding Registers | 16-Bit Wertregister | Lesen + Schreiben |
| Input Registers | 16-Bit Messwerte | Nur Lesen |
Wago SPS vorbereiten
Modbus TCP aktivieren
In Wago e!COCKPIT bzw. im Koppler-Webinterface muss Modbus TCP aktiviert sein. Die Standardeinstellungen:
Speicheradressen festlegen
In der Wago-SPS werden Variablen über Speicheradressen angesprochen:
-
%MX0.xBit-Merker (werden als Coils über Modbus lesbar/schreibbar) -
%MD1, %MD2 ...Double-Word Merker (32-Bit, als Holding Registers verfügbar)
Wichtig: Float32 und Word-Swap
Wago-Floatwerte (REAL) werden als Float32 über zwei aufeinanderfolgende
Holding Register übertragen – in Wago-eigener Bytereihenfolge: Word-Swap (höheres Word zuerst).
Adressberechnung
%MDn entspricht der Modbus-Registeradresse 12288 + n×2.
Beispiel für 15 Raffstore-Positionen:
%MD1 → Adresse 12290 (Position Raffstore 1, REAL 0.0–100.0 %) %MD2 → Adresse 12292 (Position Raffstore 2) %MD3 → Adresse 12294 (Position Raffstore 3) ... %MD15 → Adresse 12318 (Position Raffstore 15)
Für die genaue Coil-Adressberechnung steht unser kostenloser Online-Rechner bereit.
Wandtaster & Home Assistant konfliktfrei kombinieren
Sollen klassische Wandtaster und Home Assistant dieselbe Jalousie ansteuern können, ohne sich gegenseitig zu blockieren, liegt die Lösung nicht in Home Assistant, sondern im CFC-Programm der Wago (der grafischen Funktionsbausteinsprache). Die Eingänge werden dort über ein OR-Gatter zusammengeführt, bevor sie auf den Funktionsbaustein der Jalousie treffen:
// zusätzliche Merker für den Home-Assistant-Befehl
VAR_GLOBAL
IN_BueroSued_auf_HA AT %MX0.0: BOOL; // Coil – "AUF"-Befehl von HA
IN_BueroSued_zu_HA AT %MX0.1: BOOL; // Coil – "ZU"-Befehl von HA
END_VAR Der Eingang des Jalousie-Funktionsbausteins ist damit die Oder-Verknüpfung aus lokalem Taster, zentralem Sammeltaster und dem Home-Assistant-Coil. Jeder der drei Wege löst dieselbe Fahrt aus – Home Assistant überschreibt die SPS-Logik nicht, sondern reiht sich gleichberechtigt ein.
Home Assistant konfigurieren
Modbus-Verbindung in configuration.yaml
In configuration.yaml (oder einer eingebundenen Paketdatei) wird die Verbindung definiert:
# configuration.yaml
modbus:
- name: wago_sps
type: tcp
host: 192.168.0.111
port: 502
timeout: 5
delay: 0 Positions-Sensoren (Float32, Holding Registers)
Rückmeldung der Raffstore-Position aus der SPS – der Parameter
swap: word ist bei Wago-Steuerungen zwingend erforderlich:
sensors:
- name: "Position OG Zimmer Süd"
address: 12290
slave: 1
input_type: holding
data_type: float32
swap: word # Pflicht bei Wago!
scan_interval: 5
unit_of_measurement: "%"
- name: "Position OG Bad"
address: 12298
slave: 1
input_type: holding
data_type: float32
swap: word
scan_interval: 5
unit_of_measurement: "%" Hinweis zu device_class
Bei Prozentwerten kein device_class: distance verwenden – das erzeugt Warnmeldungen in den HA-Logs. Einfach weglassen.
Steuer-Switches (Coils, Hoch/Runter)
Fahrbefehle an die SPS werden als Modbus-Coils definiert:
switches:
- name: "Raffstore OG Süd Hoch"
address: 12289
slave: 1
write_type: coil
- name: "Raffstore OG Süd Runter"
address: 12290
slave: 1
write_type: coil Besonderheit: überlappende Adressen
Coils und Holding Registers können bei Wago dieselben Zahlenadressen tragen – das ist kein Fehler. Beide liegen in eigenen Adressräumen und überlappen sich nicht.
Scripts für die Motorsteuerung
Ein einfacher switch.turn_on / turn_off reicht nicht aus –
die Motoren müssen nach der Fahrzeit wieder abgeschaltet werden.
Das erledigen Scripts mit delay:
Komplett Runter + Lamellen verstellen
script:
raffstore_og_sued_zu:
alias: "OG Süd – Komplett Runter"
sequence:
- service: switch.turn_on
target:
entity_id: switch.raffstore_og_sued_runter
- delay:
milliseconds: 1200 # Anlauf-Impuls
- delay:
seconds: 30 # Volle Fahrzeit
- service: switch.turn_off
target:
entity_id: switch.raffstore_og_sued_runter
raffstore_og_sued_lamellen:
alias: "OG Süd – Lamellen verstellen"
sequence:
- service: switch.turn_on
target:
entity_id: switch.raffstore_og_sued_runter
- delay:
milliseconds: 150 # Kurzer Impuls für Lamellen
- service: switch.turn_off
target:
entity_id: switch.raffstore_og_sued_runter Stop-Funktion mit input_boolean
Um einen intelligenten Stopp-Taster zu realisieren, wird der Fahrstatus mit einem input_boolean verfolgt.
Das Script prüft dann: Fährt der Raffstore gerade → kurzer Stopp-Impuls (0,1 s).
Steht er → normale Fahrt starten.
input_boolean:
raffstore_og_sued_faehrt:
name: "OG Süd – fährt gerade"
initial: false Fast-Poll während der Fahrt
Der reguläre scan_interval: 5 genügt im Ruhezustand, wirkt während einer aktiven Fahrt aber träge. Eine kleine Automation setzt den Scan-Intervall der Positions-Sensoren beim Start eines Fahr-Scripts kurzzeitig auf 1 Sekunde herunter und danach wieder zurück – so bleibt die Positionsanzeige während der Bewegung nah an Echtzeit, ohne die SPS im Ruhezustand unnötig mit Anfragen zu belasten.
Packages für Übersichtlichkeit
Bei 15 oder mehr Raffstores wird die Konfiguration schnell unübersichtlich. Home Assistant unterstützt Packages – damit kann jeder Raffstore in eine eigene YAML-Datei ausgelagert werden.
Verzeichnisstruktur
packages/ ├── raffstore_gesamt.yaml # Modbus-Verbindung + alle Sensoren ├── raffstore_og_sued.yaml # OG Zimmer Süd: input_boolean + scripts ├── raffstore_og_bad.yaml # OG Bad ├── raffstore_ug_wohnzimmer.yaml # UG Wohnzimmer └── ...
Packages in configuration.yaml einbinden
homeassistant:
packages: !include_dir_named packages/ Ausblick: Von Switches zu Cover-Entities
Die hier gezeigte Switch-Lösung ist der pragmatische Einstieg. Sobald Grundintegration und Fahrzeiten sauber laufen, lohnt sich mittelfristig die Umstellung auf echte cover-Entities in Home Assistant:
- Positionssteuerung per Slider statt nur Auf/Zu
- Lamellenwinkel direkt einstellbar, ohne separates Impuls-Script
- Bessere Einbindung in Automatisierungen, etwa eine sonnenstandsabhängige Beschattung
Datenfluss im Überblick
Steuerung (Befehl)
Rückmeldung (Position)
Häufige Probleme und Lösungen
Falscher Positionswert (z. B. −0.0 oder riesige Zahl)
Ursache: swap: word fehlt oder ist falsch gesetzt
Lösung: In der Sensor-Definition swap: word ergänzen
Sensor zeigt immer 0
Ursache: Falsche Slave-ID oder Register-Adresse
Lösung: Mit modpoll oder einem Online-Tester Adresse / Slave-ID direkt an der SPS verifizieren
Warnmeldungen im HA-Log (distance + %)
Ursache: device_class: distance ist mit % inkompatibel
Lösung: device_class weglassen oder explizit auf None setzen
Coil bleibt dauerhaft aktiv – Motor läuft endlos
Ursache: switch.turn_off im Script wird nicht ausgeführt (Fehler oder HA-Neustart)
Lösung: Watchdog in der SPS: Ausgang nach max. 60 s automatisch abschalten
Erweiterungen: Automationen
Sobald die Grundintegration funktioniert, lassen sich komfortabel Automationen ergänzen:
Sonnenschutz
Raffstore automatisch schließen, wenn Sonne über X° und Außentemperatur > 25 °C.
Windschutz
Alle Raffstores öffnen bei Windgeschwindigkeit > 50 km/h – Sensor z. B. via Wetterstation.
Zeitprogramm
Morgens automatisch öffnen, abends schließen – angepasst an Sonnenauf- und -untergang.
Präsenzsteuerung
Beschattung nur aktivieren, wenn niemand auf dem Balkon oder der Terrasse ist.
Fazit
Die Kombination Wago SPS + Home Assistant via Modbus TCP ist eine leistungsstarke und zuverlässige Lösung für die Gebäudeautomation. Die Wago-Anlage läuft als industrielle Steuerung weiterhin unabhängig, Home Assistant ergänzt eine moderne Benutzeroberfläche, Sprachsteuerung und Automationslogik.
Die wichtigsten Punkte zum Merken:
- swap: word bei allen Float32-Werten von Wago-Steuerungen
- Coils und Holding Registers haben eigene Adressräume – keine Verwechslung
- OR-Verknüpfung im CFC hält Wandtaster und Home Assistant konfliktfrei nebeneinander
- Scripts mit delay für die Motorsteuerung statt einfacher Schalter
- Packages für übersichtliche Konfiguration bei vielen Aktoren
- Watchdog in der SPS als Sicherheitsnetz gegen hängende Ausgänge
Dieser Beitrag entstand auf Basis einer realen Raffstore-Installation mit Wago 750-880 und Home Assistant.