Smart Home · KWB · Modbus TCP · Kärnten

KWB Hackschnitzelheizung mit Home Assistant überwachen

Eine KWB Hackschnitzelheizung arbeitet still und zuverlässig im Heizraum – aber wie läuft der Kessel gerade wirklich? Mit Home Assistant und Modbus TCP bekommt man dauerhaften Überblick über alle Betriebsparameter – ohne Cloudanbindung, direkt über das lokale Netzwerk.

Hinweis: Die Register-Map wurde durch Wireshark-Mitschnitte und Korrelation mit den Display-Werten erarbeitet. Es gibt keine offizielle Dokumentation von KWB dazu. Die Adressen wurden für die KWB USV06 / Multifire verifiziert – bei anderen Modellen können sie abweichen.

Ing. Dipl.-Ing. Thomas Kohlweiss
Mai 2026
ca. 8 Min. Lesezeit
Praxis-Anleitung
Heizraum mit Rohren und Armaturen – KWB Hackschnitzelheizung Modbus TCP Integration, Kärnten

Foto: Immo Wegmann / Unsplash

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
01

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.

02

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.

03

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.

04

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.

KWB + Home Assistant in Kärnten umsetzen?

Bei Fragen zur Umsetzung stehe ich als IT-Dienstleister in Kärnten gerne zur Verfügung – vor Ort oder per Fernwartung.

Hilfe & Support

Nicht gefunden, wonach Sie suchen?

Falls die Angebote auf dieser Seite Ihre Frage nicht beantwortet haben, kontaktieren Sie uns direkt – wir helfen persönlich weiter.

Direkt erreichbar

Rückruf-Service

Wir rufen Sie zurück – teilen Sie uns Ihre Telefonnummer und die gewünschte Anrufzeit mit.

Rückruf anfordern

Erreichbar

Mo – Do:  08:00 – 18:00

Fr:         08:00 – 15:00