KWB Modbus Integration

Hello

Could someone help me how to write a Yaml file correctly to using this Modbus protocol?
I don’t understand the data_type CHAR.
I World like, how to write that correctly.
DHCW 1 Temperature
DHCW 1 program Read/ write. Change
Sorry my English is very bad🙈

Thank you very much

Symbol „Von der Community überprüft“
Feedback

Hi,
as I understand, the CHAR type is used instead of a string with handling only 1 character (“0”, “1”, … for example).

Can you also provide a bit more information about the hardware used to connect HA with KWB modbus? Did you only connect the KWB unit to internet and then use modbus via TCP? Or is there any other components that are needed to set it up?

Thank you in advance.

Hello
My heater has an interface called “comfort online”.
There I should be able to read port 502 via Modbus TCP.

I’ve tried a lot using the configuration.yaml, but it fails.
Buffer temperatures above and below are also read out somehow, but there is no change in the values.

Thanks.

Can you please provide configuration.yaml file so I can see how you configured the modbus connection? I will then try to work with that registers and let you know the result.

Hi Poelzl1994,

did you get it running?

Having the same problem, that the register in the excel from kwb seems to be wrong.

Kind regards
Michael

Hi,
i played a bit with it and you need to activate the intercom mode than you recieve the correct values.
br

@jurijg98

  • name: KWB
    type: tcp
    port: 502
    host: 192.168.178.102

    sensors:

    Blatt Heizkreise

    ok mit cco

    • name: “Heizkreis 3 Vorlauf IST (2501)”
      address: 2501
      scan_interval: 30
      slave: 1
      data_type: int16
      input_type: input
      scale: 0.01
      precision: 1
      unit_of_measurement: °C
      device_class: temperature
      state_class: measurement
      unique_id: 1

    Vorlauftemperatur IST

    ok mit cco

    • name: “Heizkreis 4 Vorlauf IST (2504)”
      address: 2504
      scan_interval: 30
      slave: 1
      data_type: int16
      input_type: input
      scale: 0.01
      precision: 1
      unit_of_measurement: °C
      device_class: temperature
      state_class: measurement
      unique_id: 2

    Raumtemperatur HK3

    ok mit cco

    • name: “Heizkreis 3 Raumtemperatur (2501)”
      address: 2501
      scan_interval: 30
      slave: 1
      data_type: uint16
      input_type: input
      scale: 0.01
      precision: 1
      unit_of_measurement: °C
      device_class: temperature
      state_class: measurement
      unique_id: 3

    Raumtemperatur HK4

    • name: “Heizkreis 4 Raumtemperatur (2503)”
      address: 2503
      scan_interval: 30
      slave: 1
      data_type: int16
      input_type: input
      scale: 0.01
      precision: 2
      unit_of_measurement: °C
      device_class: temperature
      state_class: measurement
      unique_id: 4

hallo leute, hatte wieder mal etwas zeit für mein modbus problem.
Einige Adressen konnte ich mittlerweile schon auslesen. Im Anhang unten habe ich meine “modbus configuration” und im Anhang oben habe ich meine “Templates” zum trennen vom High Byte und Low Byte.
Einige Parameter habe ich auch schon im Dashboard verknüpft und mit ein paar anderen konnte ich schon “Scripte” erstellen um mit (modbus.write_register) meiner Heizung Befehle zu geben bzw Werte ändern.
Momentan häng ich wieder am Problem, das ich zB bei Puffer 1 das Programm ändern möchte mit einem Script.
“Puffer 1 Programm” ändern wäre Register Adresse 2620 High Byte.
Wenn ich den Befehl gebe ändert sich die Puffer Temperatur , was aber Register Adresse 2620 Low Byte ist.
Dieses Problem hab ich auch bei einigen Heizkreisen, wo ich Programm ändern möchte.
HK3 und HK5 im High Byte funktionieren nicht.
HK4 und HK6 im Low Byte funktioniert.
Mir kommt es so vor das ich die LowByte Werte ändern kann und die HighByte Werte nicht. Was mach ich falsch?

Hi everyone, I had some time again to work on my Modbus problem.

I’ve already been able to read some addresses. My Modbus configuration is attached below, and my templates for separating the high and low bytes are attached above.

I’ve also linked some parameters in the dashboard, and with a few others, I’ve been able to create scripts to send commands or change values ​​using (modbus.write_register) on my heating system.

Currently, I’m stuck again on the problem that I want to change the program for buffer tank 1 using a script.

Changing the “Buffer Tank 1 Program” would involve register address 2620, high byte.

When I issue the command, the buffer tank temperature changes, but that’s registered at register address 2620, low byte.

I’m also having this problem with some heating circuits where I want to change the program.

HK3 and HK5 in the high byte don’t work.

HK4 and HK6 in the low byte work.

It seems to me that I can change the low byte values ​​but not the high byte values. What am I doing wrong?

Template:
sensor:
- name: “Modbus_Register_2500_High_Byte”
unique_id: modbus_reg_2500_high byte
state: >
{% set raw_value = states(‘sensor.Register_2500’) | int(default=0) %}
{{ (raw_value / 256) | int }}
- name: “Modbus_Register_2500_Low_Byte”
unique_id: modbus_reg_2500_low_byte
state: >
{% set raw_value = states(‘sensor Register_2500’) | int(default=0) %}
{{ raw_value % 256 }}

  - name: "Modbus_Register_2501_High_Byte"
    unique_id: modbus_reg_2501_high_byte
    state: >
      {% set raw_value = states('sensor.Register_2501') | int(default=0) %}
      {{ (raw_value / 256) | int }}
  - name: "Modbus_Register_2501_Low_Byte"
    unique_id: modbus_reg_2501_low_byte
    state: >
      {% set raw_value = states('sensor.Register_2501') | int(default=0) %}
      {{ raw_value % 256 }}
  
  - name: "Modbus_Register_2502_High_Byte"
    unique_id: modbus_reg_2502_high_byte
    state: >
      {% set raw_value = states('sensor.Register_2502') | int(default=0) %}
      {{ (raw_value / 256) | int }}
  - name: "Modbus_Register_2502_Low_Byte"
    unique_id: modbus_reg_2502_low_byte
    state: >
      {% set raw_value = states('sensor.Register_2502') | int(default=0) %}
      {{ raw_value % 256 }}
      
  - name: "Modbus_Register_2503_High_Byte"
    unique_id: modbus_reg_2503_high_byte
    state: >
      {% set raw_value = states('sensor.Register_2503') | int(default=0) %}
      {{ (raw_value / 256) | int }}
  - name: "Modbus_Register_2503_Low_Byte"
    unique_id: modbus_reg_2503_low_byte
    state: >
      {% set raw_value = states('sensor.Register_2503') | int(default=0) %}
      {{ raw_value % 256 }}
      
  - name: "Modbus_Register_2504_High_Byte"
    unique_id: modbus_reg_2504_high_byte
    state: >
      {% set raw_value = states('sensor.Register_2504') | int(default=0) %}
      {{ (raw_value / 256) | int }}
  - name: "Modbus_Register_2504_Low_Byte"
    unique_id: modbus_reg_2504_low_byte
    state: >
      {% set raw_value = states('sensor.Register_2504') | int(default=0) %}
      {{ raw_value % 256 }}
      
  - name: "Modbus_Register_2505_High_Byte"
    unique_id: modbus_reg_2505_high_byte
    state: >
      {% set raw_value = states('sensor.Register_2505') | int(default=0) %}
      {{ (raw_value / 256) | int }}
  - name: "Modbus_Register_2505_Low_Byte"
    unique_id: modbus_reg_2505_low_byte
    state: >
      {% set raw_value = states('sensor.Register_2505') | int(default=0) %}
      {{ raw_value % 256 }}
  
  - name: "Modbus_Register_2506_High_Byte"
    unique_id: modbus_reg_2506_high_byte
    state: >
      {% set raw_value = states('sensor.Register_2506') | int(default=0) %}
      {{ (raw_value / 256) | int }}
  - name: "Modbus_Register_2506_Low_Byte"
    unique_id: modbus_reg_2506_low_byte
    state: >
      {% set raw_value = states('sensor.Register_2506') | int(default=0) %}
      {{ raw_value % 256 }}
      
  - name: "Modbus_Register_2506,7_High_Byte"
    unique_id: modbus_reg_2506,7_high_byte
    state: >
      {% set raw_value = states('sensor.Register_2506.7') | int(default=0) %}
      {{ (raw_value / 256) | int }}
  - name: "Modbus_Register_2507,2_Low_Byte"
    unique_id: modbus_reg_2507,2_low_byte
    state: >
      {% set raw_value = states('sensor.Register_2507.2') | int(default=0) %}
      {{ raw_value % 256 }}
      
  - name: "Modbus_Register_2507,7_High_Byte"
    unique_id: modbus_reg_2507,7_high_byte
    state: >
      {% set raw_value = states('sensor.Register_2507.7') | int(default=0) %}
      {{ (raw_value / 256) | int }}
  - name: "Modbus_Register_2508,2_Low_Byte"
    unique_id: modbus_reg_2508,2_low_byte
    state: >
      {% set raw_value = states('sensor.Register_2508.2') | int(default=0) %}
      {{ raw_value % 256 }}
      
  - name: "Modbus_Register_2508,7_High_Byte"
    unique_id: modbus_reg_2508,7_high_byte
    state: >
      {% set raw_value = states('sensor.Register_2508.7') | int(default=0) %}
      {{ (raw_value / 256) | int }}
  - name: "Modbus_Register_2509,2_Low_Byte"
    unique_id: modbus_reg_2509,2_low_byte
    state: >
      {% set raw_value = states('sensor.Register_2509.2') | int(default=0) %}
      {{ raw_value % 256 }}
  
  - name: "Modbus_Register_2620_High_Byte"
    unique_id: modbus_reg_2620_high_byte
    state: >
      {% set raw_value = states('sensor.Register_2620') | int(default=0) %}
      {{ (raw_value / 256) | int }}
  - name: "Modbus_Register_2620_Low_Byte"
    unique_id: modbus_reg_2620_low_byte
    state: >
      {% set raw_value = states('sensor.Register_2620') | int(default=0) %}
      {{ raw_value % 256 }}
      
  - name: "Modbus_Register_2621_High_Byte"
    unique_id: modbus_reg_2621_high_byte
    state: >
      {% set raw_value = states('sensor.Register_2621') | int(default=0) %}
      {{ (raw_value / 256) | int }}
  - name: "Modbus_Register_2621_Low_Byte"
    unique_id: modbus_reg_2621_low_byte
    state: >
      {% set raw_value = states('sensor.Register_2621') | int(default=0) %}
      {{ raw_value % 256 }}
      
  - name: "Modbus_Register_2622_High_Byte"
    unique_id: modbus_reg_2622_high_byte
    state: >
      {% set raw_value = states('sensor.Register_2622') | int(default=0) %}
      {{ (raw_value / 256) | int }}
  - name: "Modbus_Register_2622_Low_Byte"
    unique_id: modbus_reg_2622_low_byte
    state: >
      {% set raw_value = states('sensor.Register_2622') | int(default=0) %}
      {{ raw_value % 256 }}
      
  - name: "Modbus_Register_2580_High_Byte"
    unique_id: modbus_reg_2580_high_byte
    state: >
      {% set raw_value = states('sensor.Register_2580') | int(default=0) %}
      {{ (raw_value / 256) | int }}
  - name: "Modbus_Register_2580_Low_Byte"
    unique_id: modbus_reg_2580_low_byte
    state: >
      {% set raw_value = states('sensor.Register_2580') | int(default=0) %}
      {{ raw_value % 256 }}
  
  - name: "Modbus_Register_2581_High_Byte"
    unique_id: modbus_reg_2581_high_byte
    state: >
      {% set raw_value = states('sensor.Register_2581') | int(default=0) %}
      {{ (raw_value / 256) | int }}
  - name: "Modbus_Register_2581_Low_Byte"
    unique_id: modbus_reg_2581_low_byte
    state: >
      {% set raw_value = states('sensor.Register_2581') | int(default=0) %}
      {{ raw_value % 256 }}
      
  - name: "Modbus_Register_2582_High_Byte"
    unique_id: modbus_reg_2582_high_byte
    state: >
      {% set raw_value = states('sensor.Register_2582') | int(default=0) %}
      {{ (raw_value / 256) | int }}
  - name: "Modbus_Register_2582_Low_Byte"
    unique_id: modbus_reg_2582_low_byte
    state: >
      {% set raw_value = states('sensor.Register_2582') | int(default=0) %}
      {{ raw_value % 256 }}

modbus:
- name: kwb
type: tcp
host: 192.168.178.102
port: 502
sensors:
- name: Anlage Ein/AUS
address: 2300
slave: 1
input_type: input
unique_id: Anlage Ein/Aus

  - name: Kessel Temperatur Soll
    address: 2301
    device_class: temperature
    state_class: measurement
    unit_of_measurement: "°C"
    slave: 1
    scale: 1.0
    input_type: input
    precision: 1
    unique_id: Kessel Temperatur Soll
    
    
  - name: Betriebsstunden
    address: 2337
    slave: 1
    input_type: input
    data_type: uint16
    unit_of_measurement: "h"
    state_class: measurement
    unique_id: Betriebsstunden
    
  - name: Kesselleistung
    address: 2338
    slave: 1
    state_class: measurement
    unit_of_measurement: "%"
    scale: 1.0
    input_type: input
    unique_id: Kesselleistung
    
  - name: Kesselstatus
    address: 2339
    slave: 1
    input_type: input
    unique_id: Kesselstatus
    
  - name: Flamtemperatur
    address: 2350
    device_class: temperature
    state_class: measurement
    unit_of_measurement: "°C"
    slave: 1
    scale: 1.0
    input_type: input
    precision: 1
    unique_id: Flammtempertur
    
  - name: Kessel VL IST
    address: 2347
    device_class: temperature
    state_class: measurement
    unit_of_measurement: "°C"
    slave: 1
    scale: 1.0
    input_type: input
    precision: 1
    unique_id: Kessel VL Ist
    
  - name: Kessel RL IST
    address: 2348
    device_class: temperature
    state_class: measurement
    unit_of_measurement: "°C"
    slave: 1
    scale: 1.0
    input_type: input
    precision: 1
    unique_id: Kessel RL Ist
    
  - name: Sauerstoff Ist
    address: 2349
    state_class: measurement
    unit_of_measurement: "%"
    slave: 1
    scale: 0.1
    input_type: input
    precision: 1
    unique_id: Sauerstoff ist
    
  - name: Unterdruck
    address: 2351
    state_class: measurement
    unit_of_measurement: "mbar"
    slave: 1
    scale: 0.01
    input_type: input
    precision: 1
    unique_id: Unterdruck 
    
  - name: Hauptantrieb Strom
    address: 2354
    state_class: measurement
    unit_of_measurement: "A"
    slave: 1
    scale: 0.1
    input_type: input
    precision: 1
    unique_id: Hauptantrieb Strom
    
  - name: Reinigungsmotor Ein/Aus
    address: 2359
    state_class: measurement
    slave: 1
    scale: 1.0
    input_type: input
    precision: 0
    unique_id: Reinigungsmotor
    
  - name: Zundung Heizung Ein/Aus
    address: 2361
    state_class: measurement
    slave: 1
    scale: 1.0
    input_type: input
    precision: 0
    unique_id: Zündung
    
  - name: Mischer RL Aus/Auf/Zu
    address: 2362
    state_class: measurement
    slave: 1
    scale: 1.0
    input_type: input
    precision: 0
    unique_id: Mischer RLA
    
  - name: Sekundärgebläße
    address: 2383
    state_class: measurement
    unit_of_measurement: "%"
    slave: 1
    scale: 1.0
    input_type: input
    precision: 0
    unique_id: Sekundärgebläße 
    
  - name: Primärgebläse 
    address: 2382
    state_class: measurement
    unit_of_measurement: "%"
    slave: 1
    scale: 1.0
    input_type: input
    precision: 0
    unique_id: Primkundärgebläße 
    
  - name: Saugzugstufe
    address: 2384
    state_class: measurement
    unit_of_measurement: "%"
    slave: 1
    scale: 1.0
    input_type: input
    precision: 0
    unique_id: Saugzug 
    
  - name: Hauptantrieb Einschubzeit
    address: 2386
    state_class: measurement
    unit_of_measurement: "s"
    slave: 1
    scale: 1.0
    input_type: input
    precision: 1
    unique_id: Hauptantrieb Einschub Zeit 
    
  - name: Hauptantrieb Periodendauer
    address: 2387
    state_class: measurement
    unit_of_measurement: "s"
    slave: 1
    scale: 1.0
    input_type: input
    precision: 1
    unique_id: Hauptantrieb Dauer
    
  - name: Brennstofffaktor
    address: 2391
    state_class: measurement
    unit_of_measurement: "%"
    slave: 1
    scale: 1.0
    input_type: input
    precision: 0
    unique_id: Brennstofffaktor
    
  - name: Kessel Solltemperatur
    address: 2392
    device_class: temperature
    state_class: measurement
    unit_of_measurement: "°C"
    slave: 1
    scale: 1.0
    input_type: input
    precision: 1
    unique_id: Kessel Temperatur Soll
    
  - name: Sauerstoff Soll
    address: 2395
    state_class: measurement
    unit_of_measurement: "%"
    slave: 1
    scale: 0.1
    input_type: input
    precision: 1
    unique_id: Sauerstoff soll
    
    
  - name: Einschub Stocker
    address: 2430
    state_class: measurement
    unit_of_measurement: "%"
    slave: 1
    scale: 1.0
    input_type: input
    precision: 1
    unique_id: Einschub Stocker 
    
  - name: Glutbettniveau
    address: 2342
    scan_interval: 30
    device_class: temperature
    state_class: measurement
    slave: 1
    scale: 1.0
    input_type: input
    precision: 0
    unique_id: Glutbettniveau
    
    
    
  - name: Puffer0 oben
    address: 2440
    device_class: temperature
    state_class: measurement
    unit_of_measurement: "°C"
    slave: 1
    input_type: input
    precision: 1
    unique_id: Puffer0 oben
    
  - name: Puffer0 unten
    address: 2441
    device_class: temperature
    state_class: measurement
    unit_of_measurement: "°C"
    slave: 1
    input_type: input
    precision: 0
    unique_id: Puffer0 unten
    
  - name: Puffer0 Temperatur Maximum
    address: 2307
    device_class: temperature 
    state_class: measurement
    unit_of_measurement: "°C"
    slave: 1
    input_type: input
    precision: 0
    unique_id: Puffer0 Max 
    
  - name: Puffer0 Temperatur Minimum 
    address: 2308
    device_class: temperature
    unit_of_measurement: "°C"
    slave: 1
    input_type: input
    precision: 0
    unique_id: Puffer0 Min
    
  - name: Puffer0 Programm
    address: 2309
    state_class: measurement
    slave: 1
    input_type: input
    precision: 0
    unique_id: Puffer0 Programm 
    
  - name: Register_2500
    address: 2500
    slave: 1
    input_type: input
    data_type: uint16
    unique_id: r1
    
  - name: Register_2501
    address: 2501
    slave: 1
    input_type: input
    data_type: uint16
    unique_id: r2
    
  - name: Register_2502
    address: 2502
    slave: 1
    input_type: input
    data_type: uint16
    unique_id: r3
    
  - name: Register_2503
    address: 2503
    slave: 1
    input_type: input
    data_type: uint16
    unique_id: r4
    
  - name: Register_2504
    address: 2504
    slave: 1
    input_type: input
    data_type: uint16
    unique_id: r5
    
  - name: Register_2505
    address: 2505
    slave: 1
    input_type: input
    data_type: uint16
    unique_id: r6
    
  - name: Register_2506
    address: 2506
    slave: 1
    input_type: input
    data_type: uint16
    unique_id: r7
    
  - name: Register_2506.7
    address: 2506.7
    slave: 1
    input_type: input
    data_type: uint16
    unique_id: r8
    
  - name: Register_2507.2
    address: 2507.2
    slave: 1
    input_type: input
    data_type: uint16
    unique_id: r9
    
  - name: Register_2507.7
    address: 2507.7
    slave: 1
    input_type: input
    data_type: uint16
    unique_id: r10
    
  - name: Register_2508.2
    address: 2508.2
    slave: 1
    input_type: input
    data_type: uint16
    unique_id: r11
    
  - name: Register_2508.7
    address: 2508.7
    slave: 1
    input_type: input
    data_type: uint16
    unique_id: r12
    
  - name: Register_2509.2
    address: 2509.2
    slave: 1
    input_type: input
    data_type: uint16
    unique_id: r13
    
  - name: Register_2620
    address: 2620
    slave: 1
    input_type: holding
    data_type: uint16
    unique_id: r14
    
  - name: Register_2621
    address: 2621
    slave: 1
    input_type: holding
    data_type: uint16
    unique_id: r15
    
  - name: Register_2622
    address: 2622
    slave: 1
    input_type: holding
    data_type: uint16
    unique_id: r16
    
  - name: Register_2580
    address: 2580
    slave: 1
    input_type: input
    data_type: uint16
    unique_id: r17
    
  - name: Register_2581
    address: 2581
    slave: 1
    input_type: input
    data_type: uint16
    unique_id: r18
    
  - name: Register_2582
    address: 2582
    slave: 1
    input_type: input
    data_type: uint16
    unique_id: r19