Modbus configuration for NIBE S series heatpumps

Id like to change ”heating curve offset” value from dashboard, what is simpliest way to do it? Now i have made automations to write holding registers most used temperatures, but it would be nice to have some slider or enter a numeric state.

Edit: maybe moving ”heating curve offset” from sensor config to a climate is what i looking for?

@Toni_Karja - For which model. Is this? And Can you share your modbus conf and automation yaml code?
Thanks!

1 Like

I have SMO S40 + F2040. how can I provide them info or volunteer for testing?

Hi,

got my fs2021 including SMO 40s installed this week. Fine to have some fellows with nibe heatpump around. Hello to you all!

At first I was very disappointed with the myuplink stuff. Premium subscription etc. But since I found this thread I mad a lot of progress. I can read and write registers using HA modbus integration (to write I have to call the modbus write service).

One question though: How can I write form the UI e.g. set a temperature?

Kind Regards,

Marco

2 Likes

Hi Marco, you can probably use a thermostat card to set temperature.

How are you connected to the heat pump? Modbus TCP?

Hi Waleed,

Yes Modbus TCP. Thanks got it. Works like that:


    climates:
      - name: "Start Brauchwasser"
        address: 9
        input_type: input
        count: 1
        data_type: int16
        max_temp: 50
        min_temp: 40
        offset: 0
        precision: 1
        scale: 0.1
        target_temp_register: 60
        temp_step: 1
        temperature_unit: C
1 Like

Hi Marco,
Could you share your modbus setup in configuration.yaml?

You wrote to use ‘modbus write service’, how did you do this?

Here you are.

modbus:
  - name: Nibe
    type: tcp
    host: # put in your server ip address here
    port: 502
    climates:
      - name: "Start Brauchwasser"
        address: 9
        input_type: input
        count: 1
        data_type: int16
        max_temp: 50
        min_temp: 40
        offset: 0
        precision: 1
        scale: 0.1
        target_temp_register: 60
        temp_step: 1
        temperature_unit: C
      - name: "Stop Brauchwasser"
        address: 9
        input_type: input
        count: 1
        data_type: int16
        max_temp: 60
        min_temp: 40
        offset: 0
        precision: 1
        scale: 0.1
        target_temp_register: 64
        temp_step: 1
        temperature_unit: C
    sensors:
      - name: "NI Außentemperatur"
        unique_id: "ni_bt1"
        unit_of_measurement: °C
        data_type: int16
        device_class: temperature
        address: 1
        input_type: input
        scale: 0.1
        precision: 1
        state_class: measurement
        slave: 1
      - name: "NI Brauchwasser oben"
        unique_id: "ni_bt7"
        unit_of_measurement: °C
        data_type: int16
        device_class: temperature
        address: 8
        input_type: input
        scale: 0.1
        precision: 1
        state_class: measurement
        slave: 1
      - name: "NI Brauchwasser unten"
        unique_id: "ni_bt6"
        unit_of_measurement: °C
        data_type: int16
        device_class: temperature
        address: 9
        input_type: input
        scale: 0.1
        precision: 1
        state_class: measurement
        slave: 1
      - name: "NI Externer Vorlauf"
        unique_id: "ni_bt25"
        unit_of_measurement: °C
        data_type: int16
        device_class: temperature
        address: 39
        input_type: input
        scale: 0.1
        precision: 1
        state_class: measurement
        slave: 1
      - name: "NI Drehzahl Ladepumpe"
        unique_id: "ni_gp12"
        unit_of_measurement: "%"
        data_type: int16
        address: 1589
        input_type: input
        scale: 1
        precision: 1
        state_class: measurement
        slave: 1
      - name: "NI Umschaltventil"
        unique_id: "ni_gp10"
        data_type: int16
        address: 2196
        input_type: input
        scale: 1
        precision: 1
        state_class: measurement
        slave: 1
      - name: "NI Umwaelzpumpe"
        unique_id: "ni_gp10"
        data_type: int16
        address: 2196
        input_type: input
        scale: 1
        precision: 1
        state_class: measurement
        slave: 1
      - name: "NI Heizkurve"
        unique_id: "ni_heat_curve"
        data_type: int16
        address: 26
        input_type: holding
        scale: 1
        precision: 1
        state_class: measurement
        slave: 1
      - name: "NI Start Temp Brauchwasser niedrig"
        unique_id: "ni_start_hotwater_low"
        unit_of_measurement: °C
        data_type: int16
        device_class: temperature
        address: 60
        input_type: holding
        scale: 0.1
        precision: 1
        state_class: measurement
        slave: 1
      - name: "NI Stop Temp Brauchwasser niedrig"
        unique_id: "ni_stop_hotwater_low"
        unit_of_measurement: °C
        data_type: int16
        device_class: temperature
        address: 64
        input_type: holding
        scale: 0.1
        precision: 1
        state_class: measurement
        slave: 1
3 Likes

Have a look at mushroom cards on HACS. They have some very nice “buttons” compared to the standard HA buttons.

https://github.com/piitaya/lovelace-mushroom

The climate card could be useful and its minimalist

https://github.com/piitaya/lovelace-mushroom/blob/05c757562aff05682d6feddf1c4f2f3d81c2959b/docs/cards/climate.md

This is sort of anoying. Modbus platforms are not really working form me. It actually needs a different address for each card. In my example there are two climate cards configured but only one shows up, that is due to using the same address to read the value (current upper temperature).
Now I tried to use the same address for address and target_temp_register but it reads some weird value there…

Also, I’m still lacking the connection from the registers and its description and what the actual effect on the system is. Is there any sort of enumeration for the values in any doc?

I like to disable the time programs on my smo 40s and use HA to configure different scene’s but I’m totally lost with all the parameters… does anybody have some suggestions how to set which parameters on the heatpump to:

  • Only do hot water
  • Do hot water and heating

Many thanks,

Marco

Sorry, no help here but emotional support :pensive::stuck_out_tongue_winking_eye:.
I’ve asked aftersales support now twice about more details documentation on modbus parameters, but I only got the half baked documents back and the advice to export the register.
What needs to be clear is that the register (of smo s40) returns different sets based on features enabled and type of nibe heatpump attached.
Myself, smoS40+s2125—12, can’t see the register to read or set the target setpoint somehow.
Also the RMU-s40 sensor values do not appear.

So I have made a baby step progress. I created a switch to control the operating mode.

The operating mode has 3 positions; Automatic, Manual and Additional heat.

However I only know how to create a 2 way switch so can switch between Automatic and Manual only.

Anyone know how to create a switch with multiple states?

Are you talking about the Operating Priority?

Have you considered using a switch? You can turn on and off but you will not be able to set the temperature.

I have the following code for “More Hot Water”

# Switches

  switches:
  - name: "More Hot Water"
    unique_id: "More Hot Water"
    write_type: holding # R/W
    address: 697
    slave: 1
    command_on: 3
    command_off: 0`

Hello, I have SMO S40 with AMS 10-12 NIBE heat pump. I used configuration:

modbus:
  - name: Nibe
    type: tcp
    host: 192.168.1.8 # put in your server ip address here
    port: 502
    sensors:
      - name: nibe_smos40_bt1
        friendly_name: "BT1: Outdoor Temperature"
        unit_of_measurement: °C
        data_type: int16
        device_class: temperature
        address: 1
        input_type: input
        scale: 0.1
        precision: 1
        state_class: measurement
        slave: 1
      - name: nibe_smos40_bt7
        friendly_name: "BT7: Hot Water Top"
        unit_of_measurement: °C
        data_type: int16
        input_type: input
        scale: 0.1
        precision: 1
        address: 8
        slave: 1
      - name: nibe_smos40_bt6
        friendly_name: "BT6: Hot Water Charging"
        unit_of_measurement: °C
        address: 9
        slave: 1
        data_type: int16
        device_class: temperature
        input_type: input
        scale: 0.1
        precision: 1
        state_class: measurement
      - name: nibe_f2040_bt3
        friendly_name: "BT3: Heating medium return line temp"
        unit_of_measurement: °C
        slave: 1
        address: 1475
        data_type: int16
        device_class: temperature
        input_type: input
        scale: 0.1
        precision: 1
        state_class: measurement
      - name: nibe_f2040_bt14
        friendly_name: "BT14: Hot gas discharge temp"
        unit_of_measurement: °C
        slave: 1
        address: 1479
        data_type: int16
        device_class: temperature
        input_type: input
        scale: 0.1
        precision: 1
        state_class: measurement
      - name: nibe_f2040_bt15
        friendly_name: "BT15: Condenser fluid pipe"
        unit_of_measurement: °C
        slave: 1
        address: 1480
        data_type: int16
        device_class: temperature
        input_type: input
        scale: 0.1
        precision: 1
        state_class: measurement
      - name: nibe_f2040_bt17
        friendly_name: "BT17: Suction Gas"
        unit_of_measurement: °C
        slave: 1
        address: 1481
        data_type: int16
        device_class: temperature
        input_type: input
        scale: 0.1
        precision: 1
        state_class: measurement
      - name: nibe_f2040_bt12
        friendly_name: "BT12: Condenser supply line temp"
        unit_of_measurement: °C
        slave: 1
        address: 1478
        data_type: int16
        device_class: temperature
        input_type: input
        scale: 0.1
        precision: 1
        state_class: measurement
      - name: nibe_f2040_bt28
        friendly_name: "BT28: Outdoor ambient temp"
        unit_of_measurement: °C
        slave: 1
        address: 1621
        data_type: int16
        device_class: temperature
        input_type: input
        scale: 0.1
        precision: 1
        state_class: measurement
      - name: nibe_smos40_bt50
        friendly_name: "Room temperature"
        unit_of_measurement: °C
        slave: 1
        address: 26
        data_type: int16
        device_class: temperature
        input_type: input
        scale: 0.1
        precision: 1
        state_class: measurement
      - name: nibe_smos40_bt25
        friendly_name: "BT25: External supply line temp"
        unit_of_measurement: °C
        slave: 1
        address: 39
        data_type: int16
        device_class: temperature
        input_type: input
        scale: 0.1
        precision: 1
        state_class: measurement
      - name: nibe_f2040_bt16
        friendly_name: "BT16a: Evaporator"
        unit_of_measurement: °C
        slave: 1
        address: 1622
        data_type: int16
        device_class: temperature
        input_type: input
        scale: 0.1
        precision: 1
        state_class: measurement
      - name: nibe_f2040_bt16_2
        friendly_name: "BT16b: Evaporator"
        unit_of_measurement: °C
        slave: 1
        address: 1966
        data_type: int16
        device_class: temperature
        input_type: input
        scale: 0.1
        precision: 1
        state_class: measurement
      - name: nibe_smos40_bt71
        friendly_name: "BT71: Return temperature"
        unit_of_measurement: °C
        slave: 1
        address: 88
        data_type: int16
        device_class: temperature
        input_type: input
        scale: 0.1
        precision: 1
        state_class: measurement
      - name: nibe_f2040_bp4
        friendly_name: "BP4: Pressure" 
        unit_of_measurement: bar
        slave: 1
        address: 1801
        input_type: input
        scale: 0.1
        precision: 1
      - name: nibe_f2040_bp2
        friendly_name: "BP2: Low pressure switch"
        unit_of_measurement: bar
        slave: 1
        address: 1802
        input_type: input
        scale: 0.1
        precision: 1
      - name: nibe_f2040_ep14_total_time
        friendly_name: "Compressor total run time"
        unit_of_measurement: hours
        slave: 1
        address: 1491
      - name: nibe_f2040_compressor_freq
        friendly_name: "Compressor current frequency"
        unit_of_measurement: hz
        slave: 1
        address: 1803
      - name: nibe_smos40_eb100-gp12
        friendly_name: "Charge Pump (EB100-GP12)"
        slave: 1
        address: 1636
        unit_of_measurement: Percent
        data_type: int16
        device_class: power_factor
        input_type: input
        scale: 1
        precision: 1
        state_class: measurement
      - name: nibe_smos40_supply_temp_min
        unit_of_measurement: °C
        slave: 1
        address: 34
        data_type: int16
        device_class: temperature
        scale: 0.1
        precision: 1
        state_class: measurement
      - name: nibe_smos40_supply_temp_max
        unit_of_measurement: °C
        slave: 1
        address: 38
        data_type: int16
        device_class: temperature
        scale: 0.1
        precision: 1
        state_class: measurement
      - name: nibe_smos40_prioritisation
        friendly_name: "Operating prioritisation 1-off, 2-hot water 3- heat"
        slave: 1
        address: 1028
      - name: nibe_smos40_alarm
        slave: 1
        address: 1975
      - name: nibe_smos40_hot_water_demand
        friendly_name: "Hot Water Demand (Sm/Md/Lg/Smart)"
        slave: 1
        address: 56
        scan_interval: 60
      - name: nibe_smos40_bt70_outgoing_hot_water
        unit_of_measurement: °C
        slave: 1
        address: 87
        data_type: int16
        device_class: temperature
        input_type: input
        scale: 0.1
        precision: 1
        state_class: measurement
      - name: nibe_smos40_degree_minutes
        slave: 1
        address: 18
      - name: nibe_smos40_degree_minutes_cooling
        slave: 1
        address: 20
      - name: nibe_smos40_reset_alarm
        slave: 1
        address: 22
      - name: nibe_smos40_heating_curve
        slave: 1
        address: 26
      - name: nibe_smos40_offset_curve
        slave: 1
        address: 30
      - name: nibe_smos40_flow_sensor
        unit_of_measurement: "l/m"
        slave: 1
        address: 40
        scan_interval: 60
      - name: nibe_smos40_current_be3
        slave: 1
        address: 46
      - name: nibe_smos40_current_be2
        slave: 1
        address: 48
      - name: nibe_smos40_current_be1
        slave: 1
        address: 50
      - name: nibe_smos40_degree_minutes_start_additional_heat
        slave: 1
        address: 97
      - name: nibe_smos40_degree_minutes_start_compressor
        slave: 1
        address: 159
      - name: nibe_smos40_alarm_action_lower_room_temp
        slave: 1
        address: 196
      - name: nibe_smos40_alarm_action_lower_hw_temp
        slave: 1
        address: 197
      - name: nibe_smos40_operating_mode
        slave: 1
        address: 237
      - name: nibe_smos40_pulse_energy_meter_be7
        unit_of_measurement: kWh
        slave: 1
        address: 396
      - name: nibe_smos40_pulse_energy_meter_be6
        unit_of_measurement: kWh
        slave: 1
        address: 398
      - name: nibe_smos40_calculated_supply_temp
        friendly_name: "Calculated supply temp"
        unit_of_measurement: °C
        slave: 1
        address: 1017
        data_type: int16
        device_class: temperature
        input_type: input
        scale: 0.1
        precision: 1
        state_class: measurement

But all sensors are unavailable. It shows error Connection to (192.168.1.8, 502) failed: [Errno 111] Connection refused. MODBUS in SMOS40 is enabled. Is that I should do a dump of AMS10-12 registry and edit my config?
Now I tried config from this topic (the first one) and everything is also unavailable.

It seams every heatpump has it s own register mapping. So yes, you have to export the file.

2 Likes

Little update from my side:

So far I’m very satisfied with my HA Nibe integration. I do the follwing:

  • Automation to make warm water only during daytime (setting the hot water start temperature to lower values)
  • Switch off heating at nighttime
  • Control Hystereses/Degree Minutes

What I’m still missing:

  • Cant find the right register to read compressor start count
  • How can I influence which frequency the compressor will run in. I would prefer a lower setting an longer runtimes. I think it depends in the the actual demand…
2 Likes

Which register to you use to control the DM?

And are you able to set the target temp as well?

For me its register 11. But could be different for yours. You have to export the registers.

Which target temp do you mean? For heating it is calculated by the heat curve and offset. I can read and set those values too. For Hot water it is start and stop temperature.

You need to do some register digging and testing for that. I got the right registers by checking the UI of SMO 40s and searching the corresponding register value.