Systemübersicht
| Anlage | KWB USV06 (Multifire) |
| Protokoll | Modbus TCP |
| IP-Adresse | 192.168.0.150 |
| Port | 502 |
| Unit-ID / Slave | 10 |
| Datenskalierung | ÷ 10 für Temperaturen (int16) |
| Max. Polling-Rate | 5 Anfragen/Sekunde (250 ms Pause) |
Die KWB-Anlage kommuniziert intern über eine SPS, die Modbus TCP als Slave bereitstellt. Alle Werte liegen ausschließlich als Holding Registers vor – ausgelesen über Funktionscode FC03.
Was lässt sich auslesen?
Kessel
- Rauchgas-, Kessel- und Rücklauftemperatur
- Sauerstoffgehalt im Abgas (%)
- Unterdruck im Brennraum (mBar)
- Kesselleistung (%)
- Kesselpumpen-Status
- Kessel-Status (Enum): Bereitschaft, Betrieb, Nachlauf, Ausbrennen, Anheizen Phase 1–6
Pufferspeicher
- Temperatur oben und unten
- Soll-Temperaturen
- Anforderungsstatus
- Wärmeleistung (kW) und Energiezähler (MWh, kumuliert)
Boiler (Warmwasser)
- Ist- und Soll-Temperatur
- Pumpen-Status
- Betriebsprogramm, Min/Max-Temperaturen, Legionellenschutz
Heizkreise (HK3 + HK4)
- Außentemperatur, Raumtemperatur Ist/Soll
- Vorlauftemperatur Ist/Soll
- Heizprogramm-Status (Aus / Heizprogramm 1 / Heizprogramm 2)
- Heizkurven-Steigung
Modbus-Verbindung einrichten
In der Home Assistant Konfiguration (z. B. packages/kwb.yaml) wird zunächst die Verbindung definiert:
modbus:
- name: "kwb"
type: tcp
host: 192.168.0.150
port: 502
timeout: 2
delay: 1 # Pflicht: gibt KWB-SPS Zeit nach Verbindungsaufbau Wichtig: delay: 1
Ohne diese Pause von 1 Sekunde nach dem Verbindungsaufbau können die ersten Modbus-Anfragen fehlschlagen. Die KWB-SPS braucht diese Anlaufzeit.
Sensoren definieren
Alle Werte liegen als Holding Registers vor. Temperaturen werden als
int16 mit dem Faktor 0.1 übertragen –
ein Registerwert von 234 entspricht 23.4 °C.
Alle Sensoren starten mit scan_interval: 3600 (1 Stunde);
der Live-Modus (Schritt 3) übernimmt die aktive Abfrage.
Kessel-Temperaturen
sensors:
- name: "KWB Kesseltemperatur"
slave: 10
address: 1402
input_type: holding
data_type: int16
scale: 0.1
precision: 1
unit_of_measurement: "°C"
device_class: temperature
state_class: measurement
scan_interval: 3600
- name: "KWB Rauchgastemperatur"
slave: 10
address: 1401
input_type: holding
data_type: int16
scale: 0.1
precision: 1
unit_of_measurement: "°C"
device_class: temperature
state_class: measurement
scan_interval: 3600 Kessel-Status (Enum)
- name: "KWB Kessel Status"
slave: 10
address: 1412
input_type: holding
data_type: uint16
precision: 0
unit_of_measurement: ""
scan_interval: 3600 Enum-Werte des Kessel-Status:
| Wert | Bedeutung |
|---|---|
| 0 | Unbekannt |
| 1 | Bereitschaft |
| 2 | Betrieb |
| 3 | Nachlauf |
| 100 | Ausbrennen |
| 101–106 | Anheizen Phase 1–6 |
Pufferspeicher-Temperaturen
- name: "KWB Puffer Oben"
slave: 10
address: 2089
input_type: holding
data_type: int16
scale: 0.1
precision: 1
unit_of_measurement: "°C"
device_class: temperature
state_class: measurement
scan_interval: 3600
- name: "KWB Puffer Unten"
slave: 10
address: 2102
input_type: holding
data_type: int16
scale: 0.1
precision: 1
unit_of_measurement: "°C"
device_class: temperature
state_class: measurement
scan_interval: 3600 Energiezähler (uint32, zwei Register)
- name: "KWB Energiezaehler"
slave: 10
address: 3977
input_type: holding
data_type: uint32 # belegt Register 3977 + 3978
scale: 0.001 # ÷ 1000 → MWh
precision: 3
unit_of_measurement: "MWh"
device_class: energy
state_class: total_increasing
scan_interval: 3600
Mit state_class: total_increasing und device_class: energy
wird dieser Wert automatisch im HA-Energie-Dashboard berücksichtigt.
Live-Modus für Diagnose
Das größte Problem bei der KWB-Integration: 5 Anfragen/Sekunde Maximum.
Bei 29 operativen Sensoren und 250 ms Pause zwischen Anfragen ergibt sich ein Gesamtzyklus von ~7,25 Sekunden.
Für den Normalbetrieb genügt scan_interval: 3600 –
beim Anheizen oder für Diagnose gibt es einen zuschaltbaren Live-Modus.
Live-Modus Schalter
input_boolean:
kwb_live_modus:
name: "KWB Live-Modus"
icon: mdi:update Automation: Live-Modus Abfrageschleife
automation:
- id: kwb_live_modus_loop
alias: "KWB Live-Modus Abfrage"
trigger:
- platform: state
entity_id: input_boolean.kwb_live_modus
to: "on"
action:
- repeat:
while:
- condition: state
entity_id: input_boolean.kwb_live_modus
state: "on"
sequence:
- action: homeassistant.update_entity
target:
entity_id: sensor.kwb_kesseltemperatur
- delay: milliseconds: 250
- action: homeassistant.update_entity
target:
entity_id: sensor.kwb_rauchgastemperatur
- delay: milliseconds: 250
# ... weitere Sensoren mit je 250 ms Pause
mode: restart
- id: kwb_live_modus_auto_off
alias: "KWB Live-Modus Auto-Off nach 10 Min"
trigger:
- platform: state
entity_id: input_boolean.kwb_live_modus
to: "on"
for:
minutes: 10
action:
- action: input_boolean.turn_off
target:
entity_id: input_boolean.kwb_live_modus
mode: single Auto-Off nach 10 Minuten
Verhindert, dass der Live-Modus versehentlich dauerhaft läuft und die KWB-SPS überlastet.
Dashboard in Lovelace
Entities Card
Kessel-Status, Temperaturen, Pumpen auf einen Blick
History Graph
Temperaturverläufe Puffer oben/unten über 24 h
Gauge
Kesselleistung 0–100 % als Anzeige
Energy Dashboard
Kumulierter Energiezähler in MWh automatisch integriert
Template-Sensor: Kessel-Status in lesbaren Text
template:
- sensor:
- name: "KWB Kessel Status Text"
state: >
{% set v = states('sensor.kwb_kessel_status') | int %}
{% if v == 1 %} Bereitschaft
{% elif v == 2 %} Betrieb
{% elif v == 3 %} Nachlauf
{% elif v == 100 %} Ausbrennen
{% elif v >= 101 and v <= 106 %} Anheizen Phase {{ v - 100 }}
{% else %} Unbekannt
{% endif %}
icon: >
{% set v = states('sensor.kwb_kessel_status') | int %}
{% if v == 2 %} mdi:fire
{% elif v == 3 %} mdi:timer-sand
{% elif v >= 101 %} mdi:fire-circle
{% else %} mdi:power-sleep
{% endif %} Bekannte Einschränkungen
Keine offizielle API
KWB dokumentiert die Modbus-Register nicht öffentlich. Die hier verwendeten Adressen wurden durch Wireshark-Mitschnitte ermittelt und mit den Display-Werten abgeglichen. Bei Firmware-Updates kann sich die Register-Map ändern.
Nur Lesezugriff
Alle Register sind schreibgeschützt. Sollwerte (z. B. Raumtemperatur) können ausgelesen, aber nicht über Modbus verändert werden – dafür bleibt die KWB-Regelung zuständig.
Polling-Limit 5 req/s
Die KWB-SPS verarbeitet maximal 5 Modbus-Anfragen pro Sekunde. Schnelleres Polling führt zu Verbindungsfehlern. Im Live-Modus werden 250 ms Pause zwischen Anfragen eingehalten.
Ergebnis: Was bringt die Integration?
Ist der Kessel gerade aktiv?
Kessel-Status + Kesseltemperatur
Wie voll ist der Puffer?
Puffer oben/unten Temperaturen
Warmwasser bereit?
Boiler Ist/Soll-Vergleich
Läuft die Heizung effizient?
Rauchgastemperatur, O₂-Gehalt, Kesselleistung
Wie viel Energie produziert?
Kumulierter Energiezähler in MWh
Dazu kommen Automationsmöglichkeiten: Benachrichtigung bei Störung (Status „Unbekannt"), Alarm wenn Puffer unter 40 °C fällt, oder Protokollierung der Energieerzeugung für die Heizkostenabrechnung.
Fazit
Die KWB-Integration in Home Assistant über Modbus TCP ist technisch möglich und im Alltagsbetrieb sehr nützlich – erfordert aber etwas Detektivarbeit, da KWB keine offizielle Dokumentation bereitstellt. Mit der hier beschriebenen Konfiguration (verifiziert an einer KWB USV06 / Multifire) lassen sich alle wesentlichen Betriebsparameter zuverlässig auslesen.
Der Live-Modus als Kompromiss:
- Im Normalbetrieb: scan_interval: 3600 schont die KWB-SPS
- Bei Diagnose: Live-Modus aktiv → sekundengenaue Einblicke
- Auto-Off nach 10 Minuten → kein dauerhafter Polling-Stress
- delay: 1 in der Verbindung → stabile Erstkommunikation
Dieser Beitrag basiert auf einer realen KWB USV06 Installation in Kärnten. Die Register-Map wurde durch Wireshark-Mitschnitte und Display-Korrelation erarbeitet – ohne Gewähr für andere Modelle oder Firmware-Versionen.