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.
Praxisbeispiel: Register-Korrelation an einer echten KWB Multifire 06
Wie die „Detektivarbeit" aus den Einschränkungen oben konkret abläuft, zeigt diese Auswertung von einer realen Anlage: Eine Bildschirmaufnahme der KWB Comfort Visio 5 Bedienoberfläche wurde parallel mit einem Wireshark-Mitschnitt des Modbus-Traffics aufgezeichnet. Über Zeit- und Wertabgleich lässt sich so jedem GUI-Feld ein Holding-Register zuordnen.
| Anlage | KWB Multifire 06 · Modbus/TCP · Unit 10 · 192.168.0.150:502 |
| Video-Start | 16:03:55 CEST |
| PCAP-Start | 16:04:21,695 CEST |
| Offset | video_t − 26,7 s |
| Genauigkeit | ± 1 s |
Kessel
Heizraum → Kessel
Statusseite des Kessels. Werte bei „Bereitschaft" (Standby, nicht feuernd) mitgeschnitten – Kesselleistung und Kesselpumpe standen deshalb durchgehend auf 0 %.
| Feld | GUI-Wert | Register | Skalierung | Status | Beleg |
|---|---|---|---|---|---|
| Rauchgastemperatur | 52 °C | 1401 | ×10 °C | bestätigt | Rohwert 522 |
| Kesseltemperatur Ist | 54 °C | 1402 | ×10 °C | bestätigt | Rohwert 543 |
| Rücklauftemperatur Ist | 51 °C | 1403 | ×10 °C | bestätigt | Rohwert 509 |
| Sauerstoff | 31,4 % | 1404 | ×10 % | bestätigt | Rohwert 314, exakt |
| Unterdruck | 0,23 mBar | 1409 | ×1000 mBar | bestätigt | Rohwert 230 |
| Kesselleistung | 0 % | 1081? | roh, % | offen | Rohwert blieb bei 100 – passt nicht zu 0 %, neu prüfen |
| Kesselpumpe | 0 % | — | — | offen | kein wertstabiler Kandidat gefunden |
| Kessel Status | Bereitschaft | 797? | Enum | offen | Register immer 0 in dieser Aufnahme, „Aus"-Zustand lag vor PCAP-Start |
Der Enum-Sensor „KWB Kessel Status" aus Schritt 2 (Register 1412) stammt aus einer separaten Erhebung. In dieser Aufnahme blieb der Kessel durchgehend in Bereitschaft, weshalb sich ein Statuswechsel hier nicht zusätzlich verifizieren ließ.
Boiler
Boiler → 01 Boiler Haus
Warmwasserboiler-Detailseite inkl. Programmparameter.
| Feld | GUI-Wert | Register | Skalierung | Status | Beleg |
|---|---|---|---|---|---|
| Boilertemperatur Ist | 58 °C | 2003 | ×10 °C | bestätigt | Rohwert 578 |
| Boilertemperatur Soll | 60 °C | 2004 | ×10 °C | bestätigt | Rohwert 600, exakt |
| Temperatur Maximum | 60 °C | 9515 | ×10 °C | bestätigt | Rohwert 600, exakt |
| Temperatur Minimum | 45 °C | 9516 | ×10 °C | bestätigt | Rohwert 450, exakt |
| Boilerprogramm | Temperatur | 9514 | Enum | wahrscheinlich | Rohwert 256 = „Temperatur" |
| Urlaub Beginn / Ende / Legionellenschutz | 1.8. / 1.9. / Montag | 9520–9522 | gepackt, Tag/Monat je Byte (unsicher) | wahrscheinlich | Rohwerte 264 / 769 / 2307 |
| Schnellladung, Pumpe, Anforderung | Aus | — | — | offen | kein eindeutiger Kandidat (Wert durchgehend „Aus") |
Puffer
Puffer → 00 Puffer Heizraum · auch: Regelung-Übersicht
Pufferspeicher mit zwei Fühlern (oben/unten). Auf der Regelung-Übersichtsseite erscheint derselbe Oben-Wert zusätzlich unter Register 2061 – vermutlich ein gespiegelter/älterer Dashboard-Wert.
| Feld | GUI-Wert | Register | Skalierung | Status | Beleg |
|---|---|---|---|---|---|
| Temperatur 1 Ist (oben) | 70 °C | 2100 (auch 2061) | ×10 °C | bestätigt | Rohwert 695 |
| Temperatur 1 Soll | 20 °C | 2101 | ×10 °C | bestätigt | Rohwert 200, exakt |
| Temperatur 2 Ist (unten) | 58 °C | 2102 | ×10 °C | bestätigt | Rohwert 580, exakt |
| Temperatur 2 Soll | 20 °C | 2103 | ×10 °C | bestätigt | Rohwert 200, exakt |
| Temperatur Maximum | 60 °C | 10504 | ×10 °C | bestätigt | Rohwert 600, exakt |
| Temperatur Minimum | 45 °C | 10505 | ×10 °C | bestätigt | Rohwert 450, exakt |
| Pufferprogramm | Temperatur | 10506 | Enum | wahrscheinlich | Rohwert 1 = „Temperatur" |
| Gruppentemperatur | 70 °C | 3433 | ×10 °C | wahrscheinlich | ein Kandidat, Rohwert 700 |
| Temperatur 3 | 130 °C | — | — | offen | 5 gleichwertige Kandidaten (2000, 1319, 1406, 2105, 2107 = je 1300) |
Die Adresse 2100 weicht von der in Schritt 2 gelisteten „Puffer Oben" (2089) ab – vermutlich zwei unterschiedliche Fühler-Register. Vor produktivem Einsatz beide Kandidaten gegen die Anzeige verifizieren.
Heizkreismodul
Heizkreismodule → 01 01
Übersicht Weiche/HK3/HK4/Boiler an einem Modul. HK3-Vorlauf konnte nicht zugeordnet werden – die dedizierte Unterseite „HK 3 – Heizkörper" wurde in der Aufnahme nicht besucht.
| Feld | GUI-Wert | Register | Skalierung | Status | Beleg |
|---|---|---|---|---|---|
| HK4 Vorlauftemperatur Ist (Fußbodenheizung) | 29 °C | 3165 | ×10 °C | bestätigt | Rohwert 290, exakt |
| HK3 Vorlauftemperatur Ist (Heizkörper) | 30 °C | — | — | offen | nicht in den mitgeschnittenen Blöcken enthalten |
| Boiler-Temperatur (Anzeige im Modul) | 58 °C | 2003 | ×10 °C | bestätigt | identisch mit Boiler-Seite |
Leistungsmessung
Leistungsmessung → 00 (Kessel) / 01
Zwei unabhängige Analogeingangs-Kanäle für externe Leistungsmessung. Kanal 00 war aktiv (390,40 kW), Kanal 01 stand auf „Funktion: Aus".
| Feld | GUI-Wert | Register | Skalierung | Status | Beleg |
|---|---|---|---|---|---|
| Messleistung, Kanal 00 | 390,40 kW | 2601 | ×10 kW | bestätigt | Rohwert 3904, exakt |
| Messleistung, Kanal 01 | 0,00 kW | 2603 | ×10 kW | wahrscheinlich | Rohwert 0 – schwacher Beleg, da 0 mehrdeutig |
| Leistung max, Kanal 01 | 150,0 kW | — | — | offen | kein Treffer (Reg. 2602 = 57620, unklare Kodierung) |
| Energie (MWh, beide Kanäle) | 0,000 MWh | 2600? | unklar | offen | Rohwert 9385 passt nicht zu 0 – evtl. Zähler/anderer Bezug |
Offene Punkte & nächste Aufnahme
Stabile Werte (durchgehend 0 % oder unverändert) lassen sich per Zeit-/Wertabgleich nicht sicher trennen. Für die nächste Aufnahme hilft aktives Ändern statt nur Betrachten:
HK3 – Heizkörper
Separate Unterseite „HK 3 – Heizkörper" kurz aufrufen (nicht nur die Modul-Übersicht) – löst vermutlich auch den Vorlauftemperatur-Register auf.
Kesselleistung / Kesselpumpe
Kessel kurz in Betrieb nehmen (Leistung > 0 %), damit sich Register mit Wertänderung von den umliegenden Nullen unterscheiden lassen. Bisheriger Kandidat 1081 passt nicht mehr sauber und sollte neu verifiziert werden.
Zeitprogramm-Schaltzeiten
Eine Schaltzeit testweise ändern (z. B. 06:00 → 07:00) und dabei mitschneiden – Change-Detection statt Wertabgleich. Zusatzblöcke (10,90) und (349,75) erscheinen exakt in den Zeitprogramm-Zeitfenstern, sind aber inhaltlich noch nicht dekodiert.
Temperatur 3 (Puffer) & Energie-Register
Mehrere gleichwertige oder unplausible Kandidaten – hier hilft nur eine gezielte Wertänderung oder ein zweiter Blick ins KWB-Handbuch/Parameterliste.
Quelle: Parallele Bildschirm- und Netzwerkaufnahme einer KWB Multifire 06, ausgewertet am 14. Juli 2026 durch Zeit- und Wertkorrelation der Register-Blöcke mit den angezeigten GUI-Werten.
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.