Add Proxon Heating System to HA via Modbus

Hello and good morning,
I need your help!
For about half a year now, I’ve been trying to integrate my heating / ventilation system via Modbus in Home Assistant every now and then. After I was now yesterday again in vain until 1:30 clock awake I must admit to myself, I need help…

I have now already performed several Google searches, rummaged through various forums and installed the felt the hundredth software.

What exactly do I want to do?
I have a heating / ventilation system in our new building from the company Proxon Zimmermann from Germany. This has a Modbus connection for a building control system which I want to use. For this purpose I bought a RS485 to Ethernet adapter for the DIN rail from Waveshare and connected the system to it. But no matter what I do, I get no values in Home Assistant. Worse, Waveshare also offers various software. But even with this I get no values or no connection at all.

Here is some general info:
Heating system Proxon: https://www.zimmermann-lueftung.de/
Connection Modbus heating system: https://github.com/ioBroker/AdapterRequests/files/6814112/Kurzbeschreibung.GLT_Schnittstelle.FWT2.0.pdf
Modbus settings: Modbus Liste FWT2.0 ver2 - für Kunden.xlsx - Google Drive
Waveshare adapter: https://www.waveshare.com/wiki/RS485_TO_ETH_(B)#Introduction

How did I proceed?
I installed the Waveshare Adapter into my power distribution board and supplied it with power via power supply. And then of course I put it into the Ethernet network. With the WebGui I assigned an IP address and set the protocol to “Modbus TCP to RTU”. More should not be necessary according to various instructions.
The heating system I have then connected via KNX cable to the Waveshare. On the board of the heater is the port x6 with A, B and GND (see instructions above). At the Waveshare accordingly A to A, B to B and GNG to GND.

From a participant of the IO-Brocker forum I got the YAML for Home Assistant (of course he also uses Home Assistant and already has the whole thing running via RS485 to USB adapter).

See here:

- name: proxon
  type: rtuovertcp
  host: 10.10.10.126
  port: 8888
  switches:
    - name: "Heizelemente Global"
      unique_id: proxon_heizelemente_global
      scan_interval: 15
      slave: 41
      address: 325
      verify:
        delay: 1
    - name: "Heizelement Wohnzimmer (Zone1)"
      unique_id: proxon_heizelement_wohnzimmer_zone1
      scan_interval: 15
      slave: 41
      address: 187
      verify:
        delay: 1
    - name: "Heizelement Büro KG (Zone2)"
      unique_id: proxon_heizelement_buero_kg_zone2
      scan_interval: 15
      slave: 41
      address: 253
      verify:
        delay: 1
    - name: "Heizelement Küche"
      unique_id: proxon_heizelement_kueche
      scan_interval: 15
      slave: 41
      address: 254
      verify:
        delay: 1
    - name: "Heizelement Diele"
      unique_id: proxon_heizelement_diele
      scan_interval: 15
      slave: 41
      address: 255
      verify:
        delay: 1
    - name: "Heizelement Büro EG"
      unique_id: proxon_heizelement_buero_eg
      scan_interval: 15
      slave: 41
      address: 256
      verify:
        delay: 1
    - name: "Heizelement Schlafzimmer"
      unique_id: proxon_heizelement_schlafzimmer
      scan_interval: 15
      slave: 41
      address: 257
      verify:
        delay: 1
    - name: "Heizelement Martha"
      unique_id: proxon_heizelement_martha
      scan_interval: 15
      slave: 41
      address: 258
      verify:
        delay: 1
    - name: "Heizelement Marlene"
      unique_id: proxon_heizelement_marlene
      scan_interval: 15
      slave: 41
      address: 259
      verify:
        delay: 1
    - name: "Heizelement Keller 2"
      unique_id: proxon_heizelement_keller2
      scan_interval: 15
      slave: 41
      address: 261
      verify:
        delay: 1

Since I don’t get any data in Home Assistant I tried the software Modbus Slave. But no matter what I do, I get no values. Worse. The Modbus Slave software tells me that it can’t connect to the Waveshare. “Modbus/TCP Connection Failed. Cannot assign requested address -error 10049. Check if the requestetd IP address exists on your PC.”
But the IP address is exactly the one I use to connect to the WebGui of the Waveshare. Of course with the correct port.

In my desperation I bought the Digitus DA-70157 RS485 to USB Converter and tried it directly with my laptop. Here I get in the software Modbus Slave no error message but also no values.

I haven’t tried with Home Assistant and the converter yet because I don’t have a cable that goes to my Home Assistant server.
Okay, I have written a lot now. I have much more information, but I think up to here for now.
I would really appreciate your help.

Thanks a lot

Joe

1 Like

Hello,
I think I have figured it out myself.

Instead of “rtuovertcp” I used now only “tcp” and of course the appropriate port. For me, the port “502” was already preset in the waveshare. Therefore I used this port again in the config.

Now it looks like this:

- name: proxon
  type: tcp
  host: 10.10.10.126
  port: 502
  switches:
    - name: "Heizelemente Global"
      unique_id: proxon_heizelemente_global
      scan_interval: 15
      slave: 41
      address: 325
      verify:
        delay: 1
    - name: "Heizelement Wohnzimmer (Zone1)"
      unique_id: proxon_heizelement_wohnzimmer_zone1
      scan_interval: 15
      slave: 41
      address: 187
      verify:
        delay: 1

Now you only have to search the respective address for the values you want to read out from the Excel table.

I can even switch my heating elements on or off via Home Assistant. Only the target temperatures are still a bit of a headache for me. These are calculated with offset values from a central temperature.
So for example, my main control is in the living room. This gives a general base temperature for the entire house. Let’s say 20 °C. But in each room there is also a secondary control. I can use this to set the temperature in the respective room, but only within a limited range. Internally, this secondary control then reports an offset value of say -3 to get a temperature of 17 °C for the room. General temperature at the main control 20°C + offset value from the secondary control -3 = room temperature for this secondary control of 17 °C.

It took me a while to understand and read this, but now it works via a template in Home Assistant.
Unfortunately, I still do not know how to set a target temperature for a secondary control via Home Assistant? After all, I do not want to enter offset values in Home Assistant, but correct temperatures…

Maybe this will help someone.

Greeting
Joe

Hello @JAD funny timing. I orderer this device last month:

I orderer exactly this device cause my excle file from zimmermann aims at RTU over TCP and in some forums they are talking about “rtuovertcp”.

Till now i had no time to test it. We had a power cut today so my proxon FWT 1 had no power. I decided to connect CTS Modbus X6 with my RS485_TO_ETH linked above. Gave it a static ip, i can see the connection from homeassistant. I can see TX/RX so i think the connection from RS485 to Proxon FWT1 is working but im not able to get values. Can you doublecheck my settings please?

image

modbus:
  - name: proxon
    type: rtuovertcp
    host: 1.2.3.4
    port: 502
    sensors:
      - name: "Proxon Kompressor Leistung RPM"
        unique_id: proxon_kompressor_leistung_rpm
        scan_interval: 15
        slave: 41
        address: 71
      - name: "Proxon CO2 PPM Gesamt"
        unique_id: proxon_co2_ppm_gesamt
        scan_interval: 15
        slave: 41
        address: 132
      - name: "Proxon T1 Zuluft"
        unique_id: proxon_t1_zuluft
        scan_interval: 15
        slave: 41
        address: 195
        data_type: uint16
        state_class: measurement
        unit_of_measurement: °C
        device_class: temperature
      - name: "Proxon T7 Abluft"
        unique_id: proxon_t7_abluft
        scan_interval: 15
        slave: 41
        address: 196
        data_type: uint16
      - name: "Proxon T4 Fortluft"
        unique_id: proxon_t4_fortluft
        scan_interval: 15
        slave: 41
        address: 197
        data_type: uint16
      - name: "Proxon T3 Frischluft"
        unique_id: proxon_t3_frischluft
        scan_interval: 15
        slave: 41
        address: 198
        data_type: uint16
      - name: "Proxon CO2 PPM Sensor 1"
        unique_id: proxon_co2_ppm_sensor1
        scan_interval: 15
        slave: 41
        address: 21
    switches:
      - name: "Poxon Kuehlung"
        unique_id: proxon_kuehlung
        scan_interval: 15
        slave: 41
        address: 62
        verify:
          delay: 1

i tried baudrate 9600, tcp client, tcp server, also only tcp on homeassistant. it is complicated as hell to debug. can’t see anything.

Ath the moment:
Baud Rate:19200
Data Size: 8 bit
Parity: Even
Stop Bits: 1
Local Port Number:502
Work Mode:TCP Server

Hi
so with me I have as Baud Rate 19200 and as Workmode: TCP Server.
In addition, I have a setting “Protocol”. There I can choose between “none” and “Modbus TCP to RTU”.
I have with me “Modbus TCP to RTU”.

In Home Assistant necessarily only “tcp” and not “rtuovertcp”. I had also first wrong and exactly therefore it has not worked with me.
The rest looks quite good… :slight_smile:
Greetings
Joe

Hello @JAD i can reply only three times, dont know why, that is not very good to communicate and solve problems together. I hope you read this message. The connection already worked with the old and now with my new device, so, the new one goes back to amazon. Anyway, i tried the switch for the cooling function. I can turn off the cooling and i can turn it on again. But no Sensor was working. I got the correct settings now, watch below!

This is my working config now…for sensors you have to set input_type: holding or input_type: input otherwise register is not polled correctly:

modbus:
  - name: proxon
    type: tcp
    host: 1.2.3.4
    port: 502
    switches:
      - name: "Proxon Kuehlung"
        unique_id: proxon_kuehlung
        slave: 41
        address: 62
        scan_interval: 5
        verify:
          delay: 1
    sensors:
      - name: "Proxon Kompressor Leistung RPM"
        unique_id: proxon_kompressor_leistung_rpm
        input_type: holding
        slave: 41
        address: 71
        scan_interval: 5
      - name: "Proxon T4 Fortluft"
        unique_id: proxon_t4_fortluft
        input_type: input
        slave: 41
        address: 198
        scan_interval: 5

41 as slave is correct, i downloaded a modbus tool and polled both RS485 to ETH devices. Both work. One with Modbus TCP Server the other with tcpovertu on homeassistant side. That means it is not device related, just a configuration problem on homeassistant side.

Hi,
this is my WebUI. As you can see there is a part called “Protocol”.

This is the link for the wiki page of my adapter:

Hope this helps…

Greetings Joe

Hi,

Has anyone successfully integrated a thermostat yet?

thanks

Dear Joe,

Awesome work! I always wanted to integrate my Proxon heating to HA but never found a basis to work from. You motivated me to finally get started. Is there any change you can share with me how you set the “main temperature”?

Thank you in advance,

best regards,
Paul

Hi Joe,
may I ask you where the modbus interface is located? Is it in the electric control cabinet or on top of the fwt itself?
Thanks
Steffen

Hello,
sorry for the late reply. I’ve not been so active on the subject lately and generally have very little time for Home Assistant, children and so on… :slight_smile:
But why don’t you tell me exactly what you want to do? I don’t quite understand what you’re trying to do.
Greetings
Joe

Hello,
the ModBus interface is on top of the FWT. The connection should be “X6”. I hope I can take a photo later.
Greetings
Joe

Hi Joe,

Thanks for your reply. Let me start by saying I fully understand the kids situation. Same here ;-). That is why this “project” keeps being shifted backwards. I would like to set a temperature over HA for the main living room and my challenge is that I do not fully understand the excel you refer to as I can’t find any address for setting the temperature (or the “Heizelemente”). It seems you have more another excel file. Is it possible you can share your YAML file with the addresses you use or share where you got these addresses from? I would greatly appreciate it. No hurries… kids have priority! Thank you in advance for your help!

best regards,

Paul

Danke Joe,

I was just wondering, because the PTC model has also a Modbus and it would be much closer to the network as the FWT.
Means I have to remove the screws and the plate to connect to the Modbus on top of the FWT. If my kids are allowing, I will check it tomorrow :grinning:

Best
Steffen

Hi,
I have taken a photo of this.
Black = GND
White = 485B
Yellow = 485A

Please double check this with your wiring diagram.

Greetings
JAD

Thanks JAD!!! It works now.
May I ask if anyone has meanwhile a valid configuration in configuration.yaml?
For example the Lüfterstufen. From my POV it should be a binary sensor, but it doesn’t work for me.

binary_sensors:
      - name: "Proxon Lüfterstufe"
        unique_id: proxon_luefterstufe
        scan_interval: 15
        address: 22

to the temperatures are not shown correctly. I guess there is an offset.

- name: "Proxon T1 Zuluft"
        unique_id: proxon_t1_zuluft
        scan_interval: 15
        input_type: input
        slave: 41
        address: 195
        data_type: uint16
        state_class: measurement
        unit_of_measurement: °C

where is my mistake?

Thanks Steffen

Hi,
I have posted my configuration here.

- name: "Heizelemente Global"
  unique_id: proxon_heizelemente_global
  scan_interval: 15
  slave: 41
  address: 325
  verify:
    delay: 1
    
- name: "Heizelement Wohnzimmer"
  unique_id: proxon_heizelement_wohnzimmer
  scan_interval: 15
  slave: 41
  address: 187 
  verify:
    delay: 1
    
- name: "Heizelement Benjamin"
  unique_id: proxon_heizelement_benjamin
  scan_interval: 15
  slave: 41
  address: 253
  verify:
    delay: 1
    
- name: "Heizelement Diele"
  unique_id: proxon_heizelement_diele
  scan_interval: 15
  slave: 41
  address: 254
  verify:
    delay: 1
    
- name: "Heizelement Büro"
  unique_id: proxon_heizelement_buero
  scan_interval: 15
  slave: 41
  address: 255
  verify:
    delay: 1
    
- name: "Heizelement Schlafzimmer"
  unique_id: proxon_heizelement_schlafzimmer
  scan_interval: 15
  slave: 41
  address: 256
  verify:
    delay: 1
    
- name: "Heizelement Maximilian"
  unique_id: proxon_heizelement_maximilian
  scan_interval: 15
  slave: 41
  address: 258
  verify:
    delay: 1
    
- name: "Heizelement Wasser"
  unique_id: proxon_heizelement_wasser
  scan_interval: 15
  slave: 41
  address: 2001
  verify:
    delay: 1
    
- name: "Kühlung Global"
  unique_id: proxon_kuehlung_global
  scan_interval: 15
  slave: 41
  address: 62
  verify:
    delay: 1
    
- name: "Ist-Temperatur Wohnzimmer"
  unique_id: ist_temperatur_wohnzimmer
  scan_interval: 30
  slave: 41
  address: 41
  input_type: input
  unit_of_measurement: °C
  scale: 0.01
  precision: 1
  data_type: int16
  
- name: "Ist-Temperatur Benjamin"
  unique_id: ist_temperatur_benjamin
  scan_interval: 30
  slave: 41
  address: 590
  input_type: input
  unit_of_measurement: °C
  scale: 0.1
  precision: 1
  data_type: int16
  
- name: "Ist-Temperatur Diele"
  unique_id: ist_temperatur_diele
  scan_interval: 30
  slave: 41
  address: 593
  input_type: input
  unit_of_measurement: °C
  scale: 0.1
  precision: 1
  data_type: int16
  
- name: "Ist-Temperatur Büro"
  unique_id: ist_temperatur_buero
  scan_interval: 30
  slave: 41
  address: 596
  input_type: input
  unit_of_measurement: °C
  scale: 0.1
  precision: 1
  data_type: int16
  
- name: "Ist-Temperatur Schlafzimmer"
  unique_id: ist_temperatur_schlafzimmer
  scan_interval: 30
  slave: 41
  address: 599
  input_type: input
  unit_of_measurement: °C
  scale: 0.1
  precision: 1
  data_type: int16
  
- name: "Ist-Temperatur Maximilian"
  unique_id: ist_temperatur_maximilian
  scan_interval: 30
  slave: 41
  address: 605
  input_type: input
  unit_of_measurement: °C
  scale: 0.1
  precision: 1
  data_type: int16
  
- name: "Temperatur Wasser"
  unique_id: proxon_temperatur_wasser
  scan_interval: 30
  slave: 41
  address: 814
  input_type: input
  scale: 0.1
  offset: -100
  precision: 1
  unit_of_measurement: °C
  data_type: uint16
  
- name: "Soll-Temperatur Wasser"
  unique_id: proxon_soll_temperatur_wasser
  scan_interval: 30
  slave: 41
  address: 2000
  input_type: holding
  scale: 0.1
  precision: 1
  unit_of_measurement: °C
  data_type: int16 #das muss noch verifiziert werden
  
- name: "Temperatur-Schwelle Heizstab Wasser"
  unique_id: proxon_temperatur_schwelle_heizstab_wasser
  scan_interval: 30
  slave: 41
  address: 2003
  input_type: holding
  scale: 0.1
  precision: 1
  unit_of_measurement: °C
  data_type: int16 #das muss noch verifiziert werden
       
- name: "Lüftungsstufe Ventilator Zuluft"
  unique_id: proxon_lueftungsstufe_ventilator_zuluft
  scan_interval: 30
  slave: 41
  address: 154
  input_type: input
  data_type: int16
  
- name: "Betriebsart"
  unique_id: proxon_betriebsart
  scan_interval: 30
  slave: 41
  address: 16
  input_type: holding
  data_type: uint16
  
- name: "Restzeit Intensivlüftung"
  unique_id: proxon_restzeit_intensivlueftung
  scan_interval: 30
  slave: 41
  address: 133
  input_type: holding
  unit_of_measurement: min
  data_type: uint16
  
- name: "Zeit FWT Online"
  unique_id: proxon_zeit_fwt_online
  scan_interval: 30
  slave: 41
  address: 467
  input_type: holding
  unit_of_measurement: std
  data_type: uint16
  
- name: "Standzeit FWT Gerätefilter"
  unique_id: proxon_standzeit_fwt_geraetefilter
  scan_interval: 30
  slave: 41
  address: 460
  input_type: holding
  unit_of_measurement: std
  data_type: uint16
  
- name: "Nutzzeit FWT Gerätefilter"
  unique_id: proxon_nutzzeit_fwt_geraetefilter
  scan_interval: 30
  slave: 41
  address: 469
  input_type: holding
  unit_of_measurement: std
  data_type: uint16
        
- name: "Offsettemperatur Wohnzimmer"
  unique_id: proxon_offsettemperatur_wohnzimmer
  scan_interval: 30
  slave: 41
  address: 70
  input_type: holding
  unit_of_measurement: °C
  scale: 0.01
  precision: 1
  data_type: int16
  
- name: "Offsettemperatur Benjamin"
  unique_id: proxon_offsettemperatur_benjamin
  scan_interval: 30
  slave: 41
  address: 213
  input_type: holding
  #unit_of_measurement: °C
  data_type: int16
  
- name: "Offsettemperatur Diele"
  unique_id: proxon_offsettemperatur_diele
  scan_interval: 30
  slave: 41
  address: 214
  input_type: holding
  #unit_of_measurement: °C
  data_type: int16
  
- name: "Offsettemperatur Büro"
  unique_id: proxon_offsettemperatur_buero
  scan_interval: 30
  slave: 41
  address: 215
  input_type: holding
  #unit_of_measurement: °C
  data_type: int16
  
- name: "Offsettemperatur Schlafzimmer"
  unique_id: proxon_offsettemperatur_schlafzimmer
  scan_interval: 30
  slave: 41
  address: 216
  input_type: holding
  #unit_of_measurement: °C
  data_type: int16
  
- name: "Offsettemperatur Maximilian"
  unique_id: proxon_offsettemperatur_maximilian
  scan_interval: 30
  slave: 41
  address: 218
  input_type: holding
  #unit_of_measurement: °C
  data_type: int16

- name: "Temperatur Frischluft"
  unique_id: proxon_temperatur_frischluft
  scan_interval: 30
  slave: 41
  address: 198
  input_type: input
  unit_of_measurement: °C
  scale: 0.01
  precision: 1
  data_type: int16
  
- name: "Temperatur Zuluft"
  unique_id: proxon_temperatur_zuluft
  scan_interval: 30
  slave: 41
  address: 195
  input_type: input
  unit_of_measurement: °C
  scale: 0.01
  precision: 1
  data_type: int16
  
- name: "Temperatur Fortluft"
  unique_id: proxon_temperatur_fortluft
  scan_interval: 30
  slave: 41
  address: 197
  input_type: input
  unit_of_measurement: °C
  scale: 0.01
  precision: 1
  data_type: int16
  
- name: "Temperatur Abluft"
  unique_id: proxon_temperatur_abluft
  scan_interval: 30
  slave: 41
  address: 196
  input_type: input
  unit_of_measurement: °C
  scale: 0.01
  precision: 1
  data_type: int16
  
- name: "CO2 Wohnzimmer"
  unique_id: proxon_co2_wohnzimmer
  scan_interval: 30
  slave: 41
  address: 21
  input_type: input
  device_class: aqi
  unit_of_measurement: ppm
  data_type: int16 #das muss noch verifiziert werden
  
- name: "Luftfeuchte Wohnzimmer"
  unique_id: proxon_luftfeuchte_wohnzimmer
  scan_interval: 30
  slave: 41
  address: 22
  input_type: input
  device_class: humidity
  unit_of_measurement: "%"
  data_type: int16 #das muss noch verifiziert werden

Please note that it is still far from complete and there may be some things that can be improved. I started with try and error and then didn’t have the time to continue.

Maybe you can help and enlighten me… :slight_smile:

Greetings
JAD

1 Like

Thanks JAD!

Only if someone is interested.
I created a slider for changing the fan speed. Just to see how it works.
First you need to create a “input_number” to get a slider

input_number:
  proxon_luefterstufe_slider:
    name: Proxon Lüfterstufe - Slider
    min: 1
    max: 4
    step: 1

Then you need an automation to write the value from the slider into the register

alias: Slider Lüfterstufe einstellen
description: ""
trigger:
  - platform: state
    entity_id: input_number.proxon_luefterstufe_slider
condition: []
action:
  - service: modbus.write_register
    data:
      slave: 41
      address: 22
      value: "{{ states('input_number.proxon_luefterstufe_slider') | int }}"
      hub: proxon
mode: single

Then - unfortunately - you need an automation to update the slider with the sensor value

alias: Slider Lüfterstufe aktualisieren
trigger:
  - platform: state
    entity_id: sensor.proxon_lufterstufe
action:
  - service: input_number.set_value
    target:
      entity_id: input_number.proxon_luefterstufe_slider
    data:
      value: "{{ states('sensor.proxon_lufterstufe') | int }}"

btw… this is my sensor

- name: "Proxon Lüfterstufe"
    unique_id: proxon_luefterstufe
    scan_interval: 30
    slave: 41
    address: 22
    input_type: holding
    data_type: uint16

I know, this is maybe not the best implementation. But for now it works.

Hope this helps somebody…
Best Steffen

2 Likes

Hi JAD,

Thanks for the config! really appreciate it! I will play around a bit and will keep you updated on any progress so you and Steffen might benefit from that.

best regards,

Paul

It helps me Steffen! Thanks

best regards,

Paul

So in general my implementation is working.
If it’s being used for fan or water temperature in T300, it’s fine.
But as soon as you need to implement it for few more, it’s a mess.
Too many automations!
Wanted to use it for the temperature offsets per room.

In case someone has another implementation/idea - highly welcome

Steffen