Feature request for Nilan Ventilation system (Danish brand)

Hi Poul

Strange … seems like it worked yesterday.

I can’t seem to post the link, even if it downloads fine from my end… alternative link:

https://bit.ly/2QPtFx9

“My” documentation doesn’t contain the “Allow active cooling” entry …

/jakob

Hi Jakob,
Thanks, just what i needed.
yeah only thing i can find about activating cooling is the register 3284

Regards
Poul

Hi again

Just tested it - state is “Unavailable” for that register … so no luck there :confused:

/jakob

Did you ever get this working?
I have all the parts as i ordered double while creating similar solution for my Wavin AHC 9000.

Well its kinda works, but i got some issues with my Nilan system panel, its not working, but i can update ventilation speed :slight_smile:

Hello,

I have also a Nilan Compact P Geo - CTS700. Can perfectly read and write data like in Jakob Moll his project (Thx!).

But have no success to write data for the Setpoint supply flow temperature in the floor heating.
Reading the data (T18) from the modbus key: 5169 is not a problem. (It’s a Read only key).
And the displayed value is correct.

Someone a idea what the modbus key is for changing this Setpoint value for the sensor?

Thanks in advanced!

Did you check the dokumentation from Nilan?

Normally the .pdf file will show you.

Hi DkAutomater,

Yes i have checked the pdf files from Nilan. Can find only a read only modbus key :frowning:

Meaby there is none?

I have a Nilan Compact P GEO3 and I’m trying to set everything up. The Nilan is connected to my network and I’m using TCP modbus. The registers that are in the code of Jakob Moll work, but I’m trying to add others like CO2 (register 4712), floor temperature setpoint (T18, register 5169) and others. CO2 and T18 both return 0.

EDIT: The CO2 sensor is an option that I probably don’t have. The floor tmperature setpoint is on slave 4 instead of slave 1. So this is solved! Below you can see my correct config.

stream:
modbus:
  - name: nilanmodbus
    type: tcp
    host: 192.168.0.254
    port: 502
    sensors:
      - name: nilan_floor_temperature_setpoint
        unit_of_measurement: '°C'
        slave: 4
        address: 5169
        scale: 0.1
        count: 1
        data_type: int
      - name: nilan_humidity
        unit_of_measurement: '%'
        slave: 1
        address: 4716
...

I have another question:
I can’t seem to change any values. For example the air temperature setpoint. Below you can see the config of that one. When I add that entity as a card on my dashboard, I can’t change it. Any idea on how to do that?

EDIT: also solved. See below how I did this. This allows me to put a slider. The slider is not set automatically to the right value at start so I should find a way to do that.

automation:
    - id: Ventilation_speed
      alias: Ventilation speed
      trigger:
        platform: state
        entity_id: input_number.slider1
      action:
        service: modbus.write_register
        data_template:
          hub: nilanmodbus
          unit: 1
          address: 4747
          value: "{{ states.input_number.slider1.state|int }}"
    - id: Room_temperature
      alias: Room temperature
      trigger:
        platform: state
        entity_id: input_number.setpoint_room
      action:
        service: modbus.write_register
        data_template:
          hub: nilanmodbus
          unit: 1
          address: 4746
          value: "{{ states.input_number.setpoint_room.state|int * 10 }}"

      
input_number:
  slider1:
    name: Ventilation speed
    initial: 25
    min: 20
    max: 100
    step: 1
    unit_of_measurement: '%'
  setpoint_room:
    name: Room temperature
    min: 18
    max: 26
    step: 1
    unit_of_measurement: '°C'

There are broken links in this thread to the nilan modbus documentation. This is a link that does work atm: https://symlink.dk/stuff/CTS700_MODBUS-rev%202.01.pdf

This is what my cards look like now:

You can see three different temps for the floor, I’m not sure what each one means yet (T16 temp before condensor, T17 temperature flow outdoor unit and T18 supply temp central heating)

hi @jenro

Maybe you would like to share your whole config?

When I set the fan speed, I can set the speed at the panel anymore.
The fan have a red line over it.

Would the system still do it automatic regulations, when a user fan speed has been set?

I didn’t realise the fan is no longer automatic after you have control over it in HA. That sucks indeed, I have no idea on how to enable automatic regulations.

Does anyone know how to get decimal temperature numbers? The CTS700 unit shows decimal numbers in the settings so I guess it should be possible.

Is it possible to set the floor heating temperature over modbus? @ delputtet, did you find how to do this?

Sure I can share my config, see below:
Nilan card as shown in my post above:

type: picture-elements
elements:
  - entity: sensor.nilan_t1_outdoor
    style:
      color: white
      font-size: 150%
      left: 30.5%
      top: 7.0%
    type: state-label
  - entity: sensor.nilan_t4_after_heateexchange
    style:
      color: white
      font-size: 150%
      left: 71.5%
      top: 7.0%
    type: state-label
  - entity: sensor.nilan_t3_room
    style:
      color: white
      font-size: 150%
      left: 30.5%
      top: 66.5%
    type: state-label
  - entity: sensor.nilan_t2_inlet_room
    style:
      color: white
      font-size: 150%
      left: 71.5%
      top: 66.5%
    type: state-label
  - entity: sensor.nilan_humidity
    style:
      color: white
      font-size: 130%
      left: 51.0%
      top: 79.2%
    type: state-label
  - entity: sensor.nilan_t16_before_condensor
    style:
      color: white
      font-size: 130%
      left: 70.0%
      top: 91%
    type: state-label
  - entity: sensor.nilan_t17_flow_outdoor_unit
    style:
      color: white
      font-size: 130%
      left: 51.0%
      top: 91%
    type: state-label
  - entity: sensor.nilan_t18_floor_supply
    style:
      color: white
      font-size: 130%
      left: 30.0%
      top: 91%
    type: state-label
  - entity: sensor.nilan_temp_diff
    style:
      color: white
      font-size: 100%
      left: 50.0%
      top: 60.0%
    type: state-label
  - entity: sensor.nilan_fan_speed_in
    style:
      color: white
      font-size: 100%
      left: 76.0%
      top: 55.0%
    type: state-label
  - entity: sensor.nilan_fan_speed_out
    style:
      color: white
      font-size: 100%
      left: 24.0%
      top: 55.0%
    type: state-label
  - entity: sensor.nilan_filter_in_days
    style:
      color: white
      font-size: 100%
      left: 49.0%
      top: 25.2%
    type: state-label
  - entity: sensor.nilan_mode_text
    style:
      color: white
      font-size: 100%
      left: 50.0%
      top: 55.2%
    type: state-label
image: /local/ventilation.png

My configuration.yaml:

modbus:
  - name: nilanmodbus
    type: tcp
    host: 192.168.0.254
    port: 502
    sensors:
      - name: nilan_humidity
        unit_of_measurement: '%'
        slave: 1
        address: 4716
      - name: nilan_T1_outdoor
        # T1
        unit_of_measurement: '°C'
        slave: 1
        address: 5152
        scale: 0.1
        count: 1
        data_type: int16
      - name: nilan_T2_inlet_room
        # T2
        unit_of_measurement: '°C'
        slave: 1
        address: 5153
        scale: 0.1
        count: 1
        data_type: int16
      - name: nilan_T3_room
        # T3 - Room / extract air
        unit_of_measurement: '°C'
        slave: 1
        address: 5154
        scale: 0.1
        count: 1
        data_type: int
      - name: nilan_T4_after_heateexchange
        # T4
        unit_of_measurement: '°C'
        slave: 1
        address: 5155
        scale: 0.1
        count: 1
        data_type: int
      - name: nilan_T5_after_heatpump
        # T5 
        unit_of_measurement: '°C'
        slave: 1
        address: 5156
        scale: 0.1
        count: 1
        data_type: int
      - name: nilan_T6_heatpump_evaporator
        # T6
        unit_of_measurement: '°C'
        slave: 1
        address: 5157
        scale: 0.1
        count: 1
        data_type: int
      - name: nilan_T7_inlet_after_heater
        # T7 
        unit_of_measurement: '°C'
        slave: 1
        address: 5158
        scale: 0.1
        count: 1
        data_type: int
      - name: nilan_T8_outdoor_before_preheat
        # T8
        unit_of_measurement: '°C'
        slave: 1
        address: 5159
        scale: 0.1
        count: 1
        data_type: int
      - name: nilan_temperature_water_after_heater
        # T9
        unit_of_measurement: '°C'
        slave: 1
        address: 5160
        scale: 0.1
        count: 1
        data_type: int
      - name: nilan_T11_water_top
        # T11
        unit_of_measurement: '°C'
        slave: 1
        address: 5162
        scale: 0.1
        count: 1
        data_type: int
      - name: nilan_T12_water_bottom
        # T12
        unit_of_measurement: '°C'
        slave: 1
        address: 5163
        scale: 0.1
        count: 1
        data_type: int
      - name: nilan_T16_before_condensor
        unit_of_measurement: '°C'
        slave: 4
        address: 5167
        scale: 0.1
        count: 1
        data_type: int
      - name: nilan_t17_flow_outdoor_unit
        unit_of_measurement: '°C'
        slave: 4
        address: 5168
        scale: 0.1
        count: 1
        data_type: int
      - name: nilan_t18_floor_supply
        unit_of_measurement: '°C'
        slave: 4
        address: 5169
        scale: 0.1
        count: 1
        data_type: int
      - name: nilan_t20_outdoor
        unit_of_measurement: '°C'
        slave: 4
        address: 5171
        scale: 0.1
        count: 1
        data_type: int
      - name: nilan_water_setpoint
        unit_of_measurement: '°C'
        slave: 1
        address: 5548
        count: 1
        scale: 0.1 
      - name: nilan_fan_speed_in
        unit_of_measurement: '%'
        slave: 1
        address: 4699
        count: 1
        #scale: 0.1 
      - name: nilan_fan_speed_out
        unit_of_measurement: '%'
        slave: 1
        address: 4700
        count: 1
        # scale: 0.1 
      - name: nilan_air_setpoint
        unit_of_measurement: '°C'
        slave: 1
        address: 4746
        count: 1
        scale: 0.1
        input_type: input
      - name: nilan_fan_setpoint
        #unit_of_measurement: '%'
        slave: 1
        address: 4747
        count: 1
        offset: -100
      - name: nilan_dhw_supplement_active
        slave: 1
        address: 5285
        count: 1
      - name: nilan_dhw_supplement_enabled
        slave: 1
        address: 3938
        count: 1
      - name: nilan_dhw_supplement_max
        # max enable temp for elpatron 
        unit_of_measurement: '°C'
        slave: 1
        address: 2828
        count: 1
        scale: 0.1
      - name: nilan_dhw_supplement_min
        # min enable temp for elpatron 
        unit_of_measurement: '°C'
        slave: 1
        address: 3935
        count: 1
        scale: 0.1
      - name: nilan_air_mode
        # 0 = Auto mode
        # 1 = Cooling mode 
        # 2 = heating mode 
        slave: 1
        address: 2402
        count: 1
      - name: nilan_active_cooling
        # 0 = off
        # 1 = on
        slave: 1
        address: 5288
        count: 1        
      - name: nilan_mode
        # 0 = not defined
        # 1 = Cooling
        # 2 = Heating
        # 3 = Ventilation
        # 4 = Hot water
        # unit_of_measurement: '°C'
        slave: 1
        address: 5432
        count: 1
        # scale: 0.1
        # ------
        # filter
      - name: nilan_filter_in_limit 
        unit_of_measurement: 'days'
        slave: 1
        address: 1326
        count: 1
      - name: nilan_filter_out_limit 
        unit_of_measurement: 'days'
        slave: 1
        address: 1327
        count: 1
      - name: nilan_filter_in_days 
        unit_of_measurement: 'days'
        slave: 1
        address: 1328
        count: 1    
      - name: nilan_filter_out_days 
        unit_of_measurement: 'days'
        slave: 1
        address: 1329
        count: 1        
      - name: nilan_filter_compressor_control 
        #unit_of_measurement: 'days'
        slave: 1
        address: 1323
        count: 1        
        # compressor control
        # 1323
        # fourWayState
        # 4703
      - name: nilan_fourway_state 
        #unit_of_measurement: 'days'
        slave: 1
        address: 4703
        count: 1
        # bypass1State
        # 4704
      - name: nilan_bypass_1_state 
        #unit_of_measurement: 'days'
        slave: 1
        address: 4704
        count: 1        
        # water compressor level
        # 4706 = Compressor1
      - name: nilan_water_compressor_1 
        #unit_of_measurement: 'days'
        slave: 1
        address: 4706
        count: 1
        # 4707 = Compressor2
      - name: nilan_water_compressor_2 
        #unit_of_measurement: 'days'
        slave: 1
        address: 4707
        count: 1        
        # 4708 = Compressor3
      - name: nilan_water_compressor_3 
        #unit_of_measurement: 'days'
        slave: 1
        address: 4708
        count: 1        
        # 4709 = Compressor4
      - name: nilan_water_compressor_4 
        #unit_of_measurement: 'days'
        slave: 1
        address: 4709
        count: 1        
        # 4710 = Compressor5
      - name: nilan_water_compressor_5 
        #unit_of_measurement: 'days'
        slave: 1
        address: 4710
        count: 1        
        # 4711 = Compressor6
      - name: nilan_water_compressor_6 
        #unit_of_measurement: 'days'
        slave: 1
        address: 4711
        count: 1        
sensor:
  - platform: template
    sensors:
      nilan_temp_diff:
        unit_of_measurement: "°C"
        value_template: >-
          {% set inlet = states.sensor.nilan_t2_inlet_room.state|float %}
          {% set room = states.sensor.nilan_t3_room.state| float %}
          {{ (inlet - room)|round(2) }}
      nilan_mode_text:
        # 1 = Cooling
        # 2 = Heating
        # 3 = Ventilation
        # 4 = Hot water
        value_template: "{%if states.sensor.nilan_mode.state == '1' %}Cooling{% elif states.sensor.nilan_mode.state == '2' %}Heating{% elif states.sensor.nilan_mode.state == '3' %}Ventilation{% elif states.sensor.nilan_mode.state == '4' %}Hot water{% endif %}"

#for ventilation speed setting, see https://community.home-assistant.io/t/modbus-fan-speed-configuration-problem/211584
automation:
    - id: Ventilation_speed
      alias: Ventilation speed
      trigger:
        platform: state
        entity_id: input_number.slider1
      action:
        service: modbus.write_register
        data_template:
          hub: nilanmodbus
          unit: 1
          address: 4747
          value: "{{ states.input_number.slider1.state|int }}"
    - id: Room_temperature
      alias: Room temperature
      trigger:
        platform: state
        entity_id: input_number.setpoint_room
      action:
        service: modbus.write_register
        data_template:
          hub: nilanmodbus
          unit: 1
          address: 4746
          value: "{{ states.input_number.setpoint_room.state|int * 10 }}"

      
input_number:
  slider1:
    name: Ventilation speed
    initial: 25
    min: 20
    max: 100
    step: 1
    unit_of_measurement: '%'
  setpoint_room:
    name: Room temperature
    min: 18
    max: 26
    step: 1
    unit_of_measurement: '°C'

Hello Jenro,

First of all a nice layout!

I have not yet managed to get it working to set the floor heating temperature.
If there is someone who can help us with this, that would be great.

1 Like

Just figured out how to have more precise measurements. Just add precision: 1 to the configuration.
Example for inlet temperature:

      - name: nilan_T2_inlet_room
        # T2
        unit_of_measurement: '°C'
        slave: 1
        address: 5153
        scale: 0.1
        count: 1
        precision: 1
        data_type: int16

Hi Jenro,
can you attach the ventilation.png ?
I think it’s needed for you conf to work properly :wink:

Does anybody have the hvac image ? (Ventilation.png).
Would be nice to be able to use this configuration/layout !

Here you go
ventilation

Do you have it better quality ?
Maybee something went wrong in the upload here ?

It is a white image with transparant background, maybe that is why it looks weird. It renders just fine in the dark theme of the HA app.

Good evening
As our house also has a Nilan ventilation control, I would like to integrate it into hassio also.
I have obtained the necessary components and have already loaded the software onto the D1 from Wemos via Arduino.
However, I am at a loss when it comes to preparing hassio. Where exactly do I have to copy or save the files from the “Home Assistant” folder into my hassio setup?
Many thanks in advance for your expert support.
Kind regards and a good start to the week
Gregor