Modbus configuration for NIBE S series heatpumps

Note that this was done for a NIBE S1155 PC, but would expect the majority to work for other heatpumps from the S series as well.

After combining information from the modbus documentation from NIBE themselves, the exported CSV from the heatpump and a lot of trail and error (with the assistance of myuplink), I would like to share the current yaml I have for at least the majority of sensors as included in the ‘info’ menu.

More than willing to receive any feedback and or comments, particularly as I would not consider myself experienced with this kind of stuff yet, hence any best practices are welcome.

Added comments where possible, including some deviations (mainly data type) between the modbus reference and what I ended up using, in the comments you’ll find what is included in the most recent version of the reference document.

- name: "NIBE S1155"
  type: tcp
  host: 192.168.2.11
  port: 502

  sensors:
      # 3.1.2 Overview
    - name: "Operating Prioritisation"
      unique_id: "operating_prioritisation"
      data_type: int16  # int8
      # 10: Off, 20: Hot Water, 30: Heat, 40: Pool, 50: Cooling
      address: 1028
      input_type: input  # R/W
      scale: 1
      precision: 0
      state_class: measurement
      slave: 1
    - name: "Power Usage"
      unique_id: "power_usage"
      unit_of_measurement: "W"
      data_type: int16
      device_class: power
      address: 2166
      input_type: input
      scale: 1
      precision: 0
      slave: 1

      # 3.1.3 Heating
    - name: "Degree Minutes (Heating)"
      unique_id: "degree_minutes_heating"
      unit_of_measurement: "DM"
      data_type: int16
      address: 18
      input_type: holding  # R/W
      scale: 0.1
      precision: 1
      state_class: measurement
      slave: 1
    - name: "Room Temperature"  # BT50
      unique_id: "room_temperature_bt50"
      unit_of_measurement: "°C"
      data_type: int16
      device_class: temperature
      address: 116  # 116 for RMU S40, 26 for BT50
      input_type: input  # R
      scale: 0.1
      precision: 1
      state_class: measurement
      slave: 1
    - name: "Calculated Supply (Heating)"
      unique_id: "calculated_supply_heating"
      unit_of_measurement: "°C"
      data_type: int16
      device_class: temperature
      address: 1017
      input_type: input  # R
      scale: 0.1
      precision: 1
      state_class: measurement
      slave: 1
    - name: "Supply Line Temperature"  # BT2
      unique_id: "supply_line_temperature_bt2"
      unit_of_measurement: "°C"
      data_type: int16
      device_class: temperature
      address: 5
      input_type: input  # R
      scale: 0.1
      precision: 1
      state_class: measurement
      slave: 1
    - name: "Return Line Temperature"  # BT3
      unique_id: "return_line_temperature_bt3"
      unit_of_measurement: "°C"
      data_type: int16
      device_class: temperature
      address: 7
      input_type: input  # R
      scale: 0.1
      precision: 1
      state_class: measurement
      slave: 1
    - name: "Outdoor Temperature"  # BT1
      unique_id: "outdoor_temperature_bt1"
      unit_of_measurement: "°C"
      data_type: int16
      device_class: temperature
      address: 1
      input_type: input  # R
      scale: 0.1
      precision: 1
      state_class: measurement
      slave: 1
    - name: "Average Outdoor Temperature"
      unique_id: "average_outdoor_temperature"
      unit_of_measurement: "°C"
      data_type: int16
      device_class: temperature
      address: 37
      input_type: input  # R
      scale: 0.1
      precision: 1
      state_class: measurement
      slave: 1
    - name: "Condenser Supply"  # BT12
      unique_id: "condenser_supply_bt12"
      unit_of_measurement: "°C"
      data_type: int16
      device_class: temperature
      address: 12
      input_type: input  # R
      scale: 0.1
      precision: 1
      state_class: measurement
      slave: 1
    - name: "Brine In"  # BT10
      unique_id: "brine_in_bt10"
      unit_of_measurement: "°C"
      data_type: int16
      device_class: temperature
      address: 10
      input_type: input  # R
      scale: 0.1
      precision: 1
      state_class: measurement
      slave: 1
    - name: "Brine Out"  # BT11
      unique_id: "brine_out_bt11"
      unit_of_measurement: "°C"
      data_type: int16
      device_class: temperature
      address: 11
      input_type: input  # R
      scale: 0.1
      precision: 1
      state_class: measurement
      slave: 1
    - name: "Underfloor Drying Function"
      unique_id: "underfloor_drying_function"
      data_type: int16
      address: 120
      input_type: holding
      scale: 1
      precision: 0
      state_class: measurement
      slave: 1

      # 3.1.4 Hot Water
    - name: "Hot Water Demand"  # aka "Comfort Mode"
      unique_id: "hot_water_demand"
      data_type: int16  # int8
      # 0: Small, 1: Medium, 2: Large, 3: Smart Control
      address: 56
      input_type: holding  # R/W
      scale: 1
      precision: 0
      state_class: measurement
      slave: 1
    - name: "Hot Water Charging"  # BT6
      unique_id: "hot_water_charging_bt6"
      unit_of_measurement: "°C"
      data_type: int16
      device_class: temperature
      address: 9
      input_type: input  # R
      scale: 0.1
      precision: 1
      state_class: measurement
      slave: 1
    - name: "Hot Water Top"  # BT7
      unique_id: "hot_water_top_bt7"
      unit_of_measurement: "°C"
      data_type: int16
      device_class: temperature
      address: 8
      input_type: input  # R
      scale: 0.1
      precision: 1
      state_class: measurement
      slave: 1

      # 3.1.5 Cooling
    - name: "Calculated Supply (Cooling)"
      unique_id: "calculated_supply_cooling"
      unit_of_measurement: "°C"
      data_type: int16
      device_class: temperature
      address: 1567
      input_type: input  # R
      scale: 0.1
      precision: 1
      state_class: measurement
      slave: 1

      # 3.1.7 Compressor
    - name: "Compressor Frequency"
      unique_id: "compressor_frequency"
      unit_of_measurement: "Hz"
      data_type: int16  # uint16
      device_class: frequency
      address: 1046
      input_type: input  # R
      scale: 0.1
      precision: 0  # could be set to 1
      state_class: measurement
      slave: 1
    - name: "Requested Compressor Frequency"
      unique_id: "requested_compressor_frequency"
      unit_of_measurement: "Hz"
      data_type: int16
      device_class: frequency
      address: 140
      input_type: input  # R
      scale: 1
      precision: 0
      state_class: measurement
      slave: 1
    - name: "Minimum Compressor Frequency"
      unique_id: "minimum_compressor_frequency"
      unit_of_measurement: "Hz"
      data_type: int16
      device_class: frequency
      address: 1041
      input_type: input  # R
      scale: 1
      precision: 0
      state_class: measurement
      slave: 1
    - name: "Compressor Status"
      unique_id: "compressor_status"
      data_type: int16  # uint8
      # 0: Off, 1: On (Operate)
      address: 1100
      input_type: input  # R
      scale: 1
      precision: 0
      state_class: measurement
      slave: 1
    - name: "Discharge"  # BT14
      unique_id: "discharge_bt14"
      unit_of_measurement: "°C"
      data_type: int16
      device_class: temperature
      address: 13
      input_type: input  # R
      scale: 0.1
      precision: 1
      state_class: measurement
      slave: 1
    - name: "Liquid Line"  # BT15
      unique_id: "liquid_line_bt15"
      unit_of_measurement: "°C"
      data_type: int16
      device_class: temperature
      address: 14
      input_type: input  # R
      scale: 0.1
      precision: 1
      state_class: measurement
      slave: 1
    - name: "Suction Gas"  # BT17
      unique_id: "suction_gas_bt17"
      unit_of_measurement: "°C"
      data_type: int16
      device_class: temperature
      address: 16
      input_type: input  # R
      scale: 0.1
      precision: 1
      state_class: measurement
      slave: 1
    - name: "Inverter Temperature"
      unique_id: "inverter_temperature"
      unit_of_measurement: "°C"
      data_type: int16
      device_class: temperature
      address: 1047
      input_type: input
      scale: 0.1
      precision: 1
      state_class: measurement
      slave: 1

      # 3.1.9 Additional Heating
    - name: "Status Additional Heating"
      unique_id: "status_additional_heating"
      data_type: int16
      address: 1029
      input_type: input
      scale: 1
      precision: 0
      state_class: measurement
      slave: 1
    - name: "Power Usage Additional Heating"
      unique_id: "power_usage_additional_heating"
      unit_of_measurement: "kW"
      data_type: int16
      device_class: power
      address: 1027
      input_type: input  # R
      scale: 0.01
      precision: 1
      state_class: measurement
      slave: 1
    - name: "Maximum Power Usage Additional Heating"
      unique_id: "maximum_power_usage_additional_heating"
      unit_of_measurement: "kW"
      data_type: int16
      device_class: power
      address: 102
      input_type: holding  # R
      scale: 0.01
      precision: 1
      state_class: measurement
      slave: 1
    - name: "Fuse Size"
      unique_id: "fuze_size"
      unit_of_measurement: "A"
      data_type: int16
      device_class: current
      address: 103
      input_type: holding
      scale: 1
      precision: 0
      slave: 1
    - name: "Current Phase 1"  # BE1
      unique_id: "current_be1"
      unit_of_measurement: "A"
      data_type: uint32
      device_class: current
      address: 50
      input_type: input  # R
      scale: 0.1
      precision: 1
      state_class: measurement
      slave: 1
    - name: "Current Phase 2"  # BE2
      unique_id: "current_be2"
      unit_of_measurement: "A"
      data_type: uint32
      device_class: current
      address: 48
      input_type: input  # R
      scale: 0.1
      precision: 1
      state_class: measurement
      slave: 1
    - name: "Current Phase 3"  # BE3
      unique_id: "current_be3"
      unit_of_measurement: "A"
      data_type: uint32
      device_class: current
      address: 46
      input_type: input  # R
      scale: 0.1
      precision: 1
      state_class: measurement
      slave: 1

      # 3.1.10 Circulation Pumps
    - name: "Operating Mode Heating Pump"
      unique_id: "operating_mode_heating_pump"
      data_type: int16
      # 0: Auto, 1: Manual
      address: 853
      input_type: input  # R
      scale: 1
      precision: 0
      state_class: measurement
      slave: 1
    - name: "Heating Pump Speed"  # GP1
      unique_id: "heating_pump_speed"
      unit_of_measurement: "%"
      data_type: int16
      device_class: power_factor
      address: 1102
      input_type: input  # R
      scale: 1
      precision: 0.1
      state_class: measurement
      slave: 1
    - name: "Heating Pump Speed (Manual)"
      unique_id: "heating_pump_speed_manual"
      unit_of_measurement: "%"
      data_type: int16
      device_class: power_factor
      address: 218
      input_type: input  # R
      scale: 1
      precision: 0.1
      state_class: measurement
      slave: 1
    - name: "Brine Pump Speed"  # GP2
      unique_id: "brine_pump_speed"
      unit_of_measurement: "%"
      data_type: int16
      device_class: power_factor
      address: 1104
      input_type: input  # R
      scale: 1
      precision: 0.1
      state_class: measurement
      slave: 1
    - name: "Brine Pump Speed (Manual)"
      unique_id: "brine_pump_speed_manual"
      unit_of_measurement: "%"
      data_type: int16
      device_class: power_factor
      address: 222
      input_type: input  # R
      scale: 1
      precision: 0.1
      state_class: measurement
      slave: 1

      # 3.1.12 Statistics
    - name: "Number Of Starts (Compressor)"
      unique_id: "number_of_starts_compressor"
      data_type: int16
      address: 1534
      input_type: input
      scale: 1
      precision: 0
      state_class: total_increasing
      slave: 1
    - name: "Operating Time (Total)"
      unique_id: "operating_time_total"
      data_type: int16
      address: 1536
      input_type: input
      scale: 1
      precision: 0
      state_class: total_increasing
      slave: 1
    - name: "Operating Time (Hot Water)"
      unique_id: "operating_time_hot_water"
      data_type: int16
      address: 1538
      input_type: input
      scale: 1
      precision: 0
      state_class: total_increasing
      slave: 1
    - name: "Flow Hot Water (Compressor)"
      unique_id: "flow_hot_water_compressor"
      unit_of_measurement: "kWh"
      data_type: int16
      device_class: energy
      address: 1583
      input_type: input
      scale: 0.1
      precision: 1
      state_class: total_increasing
      slave: 1
    - name: "Flow Hot Water (Total)"
      unique_id: "flow_hot_water_total"
      unit_of_measurement: "kWh"
      data_type: int16
      device_class: energy
      address: 1575
      input_type: input
      scale: 0.1
      precision: 1
      state_class: total_increasing
      slave: 1
    - name: "Flow Heating (Compressor)"
      unique_id: "flow_heating_compressor"
      unit_of_measurement: "kWh"
      data_type: int16  # No idea what this should be
      device_class: energy
      address: 1585
      input_type: input
      scale: 0.1
      precision: 1
      state_class: total_increasing
      slave: 1
    - name: "Flow Heating (Total)"
      unique_id: "flow_heating_total"
      unit_of_measurement: "kWh"
      data_type: int16  # No idea what this should be
      device_class: energy
      address: 1577
      input_type: input
      scale: 0.1
      precision: 1
      state_class: total_increasing
      slave: 1

      # To bo categorised
    - name: "Active Alarm"
      unique_id: "active_alarm"
      data_type: int16  # uint8
      address: 2195
      input_type: input
      scale: 1
      precision: 0
      state_class: measurement
      slave: 1
    - name: "Alarm Number"
      unique_id: "alarm_number"
      data_type: int16  # uint16
      address: 1975
      input_type: input
      scale: 1
      precision: 0
      state_class: measurement
      slave: 1
    - name: "Start Compressor"
      unique_id: "start_compressor"
      unit_of_measurement: "DM"
      data_type: int16
      address: 159
      input_type: holding
      scale: 1
      precision: 1
      state_class: measurement
      slave: 1
    - name: "Start Additional Heat"
      unique_id: "start_additional_heat"
      unit_of_measurement: "DM"
      data_type: int16
      address: 97
      input_type: holding
      scale: 1
      precision: 1
      state_class: measurement
      slave: 1
    - name: "Degree Minutes Cooling"
      unique_id: "degree_minutes_cooling"
      unit_of_measurement: "DM"
      data_type: int16
      address: 20
      input_type: holding
      scale: 1
      precision: 1
      state_class: measurement
      slave: 1
    - name: "Reset Alarm"
      unique_id: "reset_alarm"
      data_type: int16  # int8
      address: 22
      input_type: holding
      scale: 1
      precision: 0
      state_class: measurement
      slave: 1
    - name: "Heating Curve"  # 1.30.1
      unique_id: "heating_curve"
      data_type: int16  # int8
      address: 26
      input_type: holding
      scale: 1
      precision: 0
      state_class: measurement
      slave: 1
    - name: "Heating Curve Offset"  # 1.30.1
      unique_id: "heating_curve_offset"
      data_type: int16  # int8
      address: 30
      input_type: holding
      scale: 1
      precision: 0
      state_class: measurement
      slave: 1
    - name: "Supply Temperature Min"  # 1.30.4
      unique_id: "supply_temperature_min"
      unit_of_measurement: "°C"
      data_type: int16  # int8
      device_class: temperature
      address: 34
      input_type: holding
      scale: 0.1
      precision: 1
      state_class: measurement
      slave: 1
    - name: "Supply Temperature Max"  # 1.30.6
      unique_id: "supply_temperature_max"
      unit_of_measurement: "°C"
      data_type: int16  # int8
      device_class: temperature
      address: 38
      input_type: holding
      scale: 0.1
      precision: 1
      state_class: measurement
      slave: 1
    - name: "Own Curve"  # 1.30.7
      unique_id: "own_curve"
      data_type: int16  # int8
      address: 39  # 39-45
      input_type: holding
      scale: 1
      precision: 0
      state_class: measurement
      slave: 1
    - name: "Flow Sensor (BF1)"
      unique_id: "flow_sensor_bf1"
      unit_of_measurement: "l/min"
      data_type: int16
      address: 40
      input_type: input
      scale: 0.1
      precision: 1
      state_class: measurement
      slave: 1
    - name: "Start Temperature Hot Water"
      unique_id: "start_temperature_hot_water"
      unit_of_measurement: "°C"
      data_type: int16  # int8
      device_class: temperature
      address: 59
      input_type: holding
      scale: 0.1
      precision: 1
      state_class: measurement
      slave: 1
    - name: "Stop Temperature Hot Water"
      unique_id: "stop_temperature_hot_water"
      unit_of_measurement: "°C"
      data_type: int16  # int8
      device_class: temperature
      address: 63
      input_type: holding
      scale: 0.1
      precision: 1
      state_class: measurement
      slave: 1
    - name: "Period Time Heating"  # unclear unit, hours per day?
      unique_id: "period_time_heating"
      unit_of_measurement: "h"
      data_type: int16  # int8
      address: 92
      input_type: holding
      scale: 0.1
      precision: 1
      state_class: measurement
      slave: 1
    - name: "Period Time Hot Water"  # unclear unit, hours per day?
      unique_id: "period_time_hot_water"
      unit_of_measurement: "h"
      data_type: int16  # int8
      address: 93
      input_type: holding
      scale: 0.1
      precision: 1
      state_class: measurement
      slave: 1
    - name: "Period Time Cooling"  # unclear unit, hours per day?
      unique_id: "period_time_cooling"
      unit_of_measurement: "h"
      data_type: int16  # int8
      address: 94
      input_type: holding
      scale: 0.1
      precision: 1
      state_class: measurement
      slave: 1
    - name: "Start Temperature Cooling"
      unique_id: "start_temperature_cooling"
      unit_of_measurement: "°C"
      data_type: int16  # int8
      device_class: temperature
      address: 183
      input_type: holding
      scale: 0.1
      precision: 1
      state_class: measurement
      slave: 1
    - name: "Stop Temperature Heating"
      unique_id: "stop_temperature_heating"
      unit_of_measurement: "°C"
      data_type: int16  # int8
      device_class: temperature
      address: 184
      input_type: holding
      scale: 0.1
      precision: 1
      state_class: measurement
      slave: 1
    - name: "Stop Temperature Additional Heating"
      unique_id: "stop_temperature_additional_heating"
      unit_of_measurement: "°C"
      data_type: int16  # int8
      device_class: temperature
      address: 185
      input_type: holding
      scale: 0.1
      precision: 1
      state_class: measurement
      slave: 1
    - name: "Lower Room Temperature Alarm"
      unique_id: "lower_room_temperature_alarm"
      data_type: int16  # uint8
      address: 196
      input_type: holding
      scale: 1
      precision: 0
      state_class: measurement
      slave: 1
    - name: "Lower Hot Water Temperature Alarm"
      unique_id: "lower_hot_water_temperature_alarm"
      data_type: int16  # uint8
      address: 197
      input_type: holding
      scale: 1
      precision: 0
      state_class: measurement
      slave: 1
    - name: "Operating Mode"  # 4.1
      # 0: auto, 1: manual, 2: additional heating only
      unique_id: "operating_mode"
      data_type: int16  # uint8
      address: 237
      input_type: holding
      scale: 1
      precision: 0
      state_class: measurement
      slave: 1
    - name: "Allow Additional Heating (Manual)"  # 4.1
      unique_id: "allow_additional_heating_manual"
      data_type: int16  # uint8
      address: 180
      input_type: holding
      scale: 1
      precision: 0
      state_class: measurement
      slave: 1
    - name: "Allow Heating (Manual)"  # 4.1
      unique_id: "allow_heating_manual"
      data_type: int16  # uint8
      address: 181
      input_type: holding
      scale: 1
      precision: 0
      state_class: measurement
      slave: 1
    - name: "Allow Cooling (Manual)"  # 4.1
      unique_id: "allow_cooling_manual"
      data_type: int16  # uint8
      address: 182
      input_type: holding
      scale: 1
      precision: 0
      state_class: measurement
      slave: 1
    - name: "Total Run Time Additional Heat"  # Value does not align with UpLink?
      unique_id: "total_run_time_additional_heat"
      data_type: int32
      address: 1025
      input_type: input
      scale: 0.1
      precision: 1
      state_class: measurement
      slave: 1
    - name: "Compressor Statistics (EP14)"
      unique_id: "compressor_statistics_ep14"
      data_type: int32
      address: 1087
      input_type: input
      scale: 1
      precision: 0
      state_class: measurement
      slave: 1
4 Likes

Hey this great! By far very extensive. I too have a similar heat pump. However I didn’t use all the registers as some are not necessary for my purposes.

Have you been able to write to the Pump?

I have some different values for some of the registers, maybe because I have the S1255?

  - name: "Heatpump - Priority"
    unique_id: "operating_prioritisation"
    data_type: int16  # int8
    # 10: Off, 20: Hot Water, 30: Heat, 40: Pool, 60: Cooling
    address: 1028
    input_type: input  # R/W
    scale: 1
    precision: 0
    state_class: measurement
    slave: 1

You have 50 for Cooling.

  - name: "Heatpump - Hot Water Demand"
    unique_id: "hot_water_demand"
    data_type: int16 
    # 0: Small, 1: Medium, 2: Large, 4: Smart Control
    address: 56
    input_type: holding  # R/W
    scale: 1
    precision: 0
    state_class: measurement
    slave: 1

I get 4 for Smart Control.

Check this list of Modbus registers. At least some from the common registers should work for you. https://partner.nibe.eu/nibedocuments/29795/M12676EN.pdf

I’ve been able to get a good amount of data from my Nibe S2125 now into home assistant; purely using modbus and the NIBE SMO S40 control unit.
You can enable modbus in menu 7.5.9 - set setting to “on” and your control unit will communicate modbus via the LAN. check the ip via DHCP (this can be found in menu 5.2.2).

Below the general registry list I could pull from the unit:

Titel	Type register	Register	Deel­factor	Eenheid	Grootte van varia­bele	Min. waarde	Max. waarde	Stan­daard­waarde
Huidige buiten­tempe­ratuur (BT1)	MODBUS_INPUT_REGISTER	**1**	10	°C	2	0	0	0
Graad­minuten	MODBUS_HOLDING_REGISTER	**11**	10	GRD MIN	3	-30000	30000	0
Roomsensor 1-1	MODBUS_INPUT_REGISTER	**26**	10	°C	2	0	0	0
Gemid­delde tempera­tuur (BT1)	MODBUS_INPUT_REGISTER	**37**	10	°C	2	0	0	0
Externe aanvoer­leiding (BT25)	MODBUS_INPUT_REGISTER	**39**	10	°C	2	0	0	0
Retour­leiding (BT71)	MODBUS_INPUT_REGISTER	**88**	10	°C	2	0	0	0
Be­rekende toevoer klimaat­systeem 1	MODBUS_INPUT_REGISTER	**1017**	10	°C	2	0	0	0
Be­drijfs­stand interne bijver­warming	MODBUS_INPUT_REGISTER	**1029**	1		4	0	0	0
Externe cv-pomp­ (GP10) status	MODBUS_INPUT_REGISTER	**1066**	1		4	0	0	0
Retour­leiding (EB101-BT3)	MODBUS_INPUT_REGISTER	**1475**	10	°C	2	0	0	0
Aanvoer­leiding (EB101-BT12)	MODBUS_INPUT_REGISTER	**1478**	10	°C	2	0	0	0
Buiten­temp. (EB101-BT28)	MODBUS_INPUT_REGISTER	**1621**	10	°C	2	0	0	0
Verdam­per (EB101-BT16)	MODBUS_INPUT_REGISTER	**1622**	10	°C	2	0	0	0
Snel­heid circu­latie­pomp verwarmings­systeem (GP1)	MODBUS_INPUT_REGISTER	**1636**	1	%	4	0	0	0
Lage druk (EB101-BP8)	MODBUS_INPUT_REGISTER	**1802**	10	bar	2	0	0	0
Huidige compres­sorfre­quentie (EB101)	MODBUS_INPUT_REGISTER	**1803**	10	Hz	2	0	0	0
Beveiligingsmodus (EB101)	MODBUS_INPUT_REGISTER	**1804**	1		5	0	0	0
Gewen­ste compres­sorfre­quentie (EB101)	MODBUS_INPUT_REGISTER	**1854**	1	Hz	4	0	0	0
Alarm­nummer	MODBUS_INPUT_REGISTER	**1975**	1		2	0	0	0

Below the configuration.yaml for it. (power consumption does not seem to work on the s2125)

modbus:
   - name: "Nibe2125"
     type: tcp
     host: xxx.xxx.xxx.xxx
     port: 502
     
     sensors:
          # 3.1.2 Overview
        - name: "wp Operating Prioritisation"
          unique_id: "wp_operating_prioritisation"
          data_type: int16  # int8
          # 10: Off, 20: Hot Water, 30: Heat, 40: Pool, 50: Cooling
          address: 1028
          input_type: input  # R/W
          scale: 1
          precision: 0
          state_class: measurement
          slave: 1
        - name: "wp Power Usage"
          unique_id: "wp_power_usage"
          unit_of_measurement: "W"
          data_type: int16
          device_class: power
          address: 2166
          input_type: input
          scale: 1
          precision: 0
          slave: 1
        - name: "wp Outdoortemperatur (BT1)"
          unique_id: "wp_outdoor_temp_bt1" 
          device_class: temperature
          unit_of_measurement: "°C"
          data_type: int16
          state_class: measurement
          address: 1
          count: 1
          slave: 1
          precision: 1
          input_type: input
          scale: 0.1
          scan_interval: 60
        - name: "wp AVG Outdoortemperatur (BT1)"
          unique_id: "wp_avg_outdoor_temp_bt1" 
          device_class: temperature
          unit_of_measurement: "°C"
          data_type: int16
          state_class: measurement
          address: 37
          count: 1
          slave: 1
          precision: 1
          input_type: input
          scale: 0.1
          scan_interval: 60
        - name: "wp Room temperature 1 (BT50)"
          unique_id: "wp_room_temp_bt50"
          device_class: temperature
          unit_of_measurement: "°C"
          data_type: int16
          state_class: measurement
          address: 26
          count: 1
          slave: 1
          precision: 1
          input_type: input
          scale: 0.1
          scan_interval: 60
          # To be categorised
        - name: "wp Externe cv-pomp status"
          unique_id: "wp_Externe_cv-pomp_status"
          data_type: int16  # uint8
          address: 1066
          input_type: input
          scale: 1
          precision: 0
          state_class: measurement
          slave: 1
        - name: "wp Active Alarm"
          unique_id: "wp_active_alarm"
          data_type: int16  # uint8
          address: 2195
          input_type: input
          scale: 1
          precision: 0
          state_class: measurement
          slave: 1
        - name: "wp Alarm Number"
          unique_id: "wp_alarm_number"
          data_type: int16  # uint16
          address: 1975
          input_type: input
          scale: 1
          precision: 0
          state_class: measurement
          slave: 1       
        - name: "wp Hot water Top (BT7)"
          unique_id: "wp_hot_water_top_bt7"
          device_class: temperature
          unit_of_measurement: "°C"
          data_type: int16
          state_class: measurement
          address: 8
          count: 1
          slave: 1
          precision: 1
          input_type: input
          scale: 0.1
          scan_interval: 60
        - name: "wp Hot water charging (BT6)"
          unique_id: "wp_hot_water_charging_bt6"
          device_class: temperature
          unit_of_measurement: "°C"
          data_type: int16
          state_class: measurement
          address: 9
          count: 1
          slave: 1
          precision: 1
          input_type: input
          scale: 0.1
          scan_interval: 60
        - name: "wp External supply line (BT25)"
          unique_id: "wp_external_supply_line_bt25"
          device_class: temperature
          unit_of_measurement: "°C"
          data_type: int16
          state_class: measurement
          address: 39
          count: 1
          slave: 1
          precision: 1
          input_type: input
          scale: 0.1
          scan_interval: 60
        - name: "wp Return temperature (BT71)"
          unique_id: "wp_return_temp_bt71"
          device_class: temperature
          unit_of_measurement: "°C"
          data_type: int16
          state_class: measurement
          address: 88
          count: 1
          slave: 1
          precision: 1
          input_type: input
          scale: 0.1
          scan_interval: 60          
        - name: "wp Flow sensor (BF1)"
          unique_id: "wp_flowsensor_bf1" 
          data_type: int16
          state_class: measurement
          address: 40
          count: 1
          slave: 1
          precision: 1
          input_type: input
          scale: 0.1
          scan_interval: 60             
        - name: "wp Compressor Status"
          unique_id: "wp_compressor_status"
          data_type: int16  # uint8
          # 0: Off, 1: On (Operate)
          address: 1100
          input_type: input  # R
          scale: 1
          precision: 0
          state_class: measurement
          slave: 1
        - name: "wp Snelheid circulatiepomp verwarmingssysteem (GP1)"
          unique_id: "wp_Snelheid_circulatiepomp_verwarmingssysteem_(GP1)"
          device_class: power_factor
          unit_of_measurement: "%"
          data_type: int16
          state_class: measurement
          address: 1636
          count: 1
          slave: 1
          precision: 1
          input_type: input
          scale: 1
          scan_interval: 60                    
        - name: "wp Degree minutes"
          unique_id: "wp_degree_minutes"
          unit_of_measurement: "DM"
          data_type: int16
          address: 11
          input_type: holding  # R/W
          scale: 0.1
          precision: 1
          state_class: measurement
          slave: 1   
        - name: "wp Limit Degree minutes"
          unique_id: "wp_limit_degree_minutes"
          unit_of_measurement: "DM"
          data_type: int16
          address: 18
          input_type: holding  # R/W
          scale: 0.1
          precision: 1
          state_class: measurement
          slave: 1   
1 Like

Hey Victor, have you been able to “write” to the pump or just get values?

What seems to be the power consumption issue?

I created a “Riemann sum integral” integration and it shows up in my energy tab.

The S2125 icw the SMO40 does not seem to have it available; I do not see it in my exported registry, and the ‘common registry’ list address in the pdf does not provide any value.
I also do not see it in the display interface on the SMO40.

I’d love to have it.

Do you have a power consumption display in the SMO40?

My system is different and doesn’t have an SMO40

Seems on my setup the power measurement points were not enabled. But there seems to be a menu under 3.3

@RemonG Thanks. copied/pasted your yaml for my SMO S40 + S2125 and it mostly worked.
However, some show as unavailable. Two if the more interesting ones amoung them.

PS: I just activated the NIBE today. Spent all evenings last week hooking it up.
I would not mind having someone experienced to PM some torrent of questions on settings.

I never got the power working, doesn’t seem part of the default internals.

The Compressor state you can use this:

- name: “wp Compressor Status”
unique_id: “wp_compressor_status”
data_type: int16 # uint8
# 0: Off, 1: On (Operate)
address: 1484
input_type: input # R
scale: 1
precision: 0
state_class: measurement
slave: 1

Tip start all your unique id’s with ‘wp’.

Thanks. That new address also gives unavailable.
How do you get those RAW modbus details dumped like you have on your first post in this thread?
Edit: the 1484 did work, but copy/pasting it from the text above give left-right (open/close) high double quotes instead of the programmes straight quotes.

Pity of the power use. I do also see in the manual you can get the AUX to generate a energy pulses. Both for electric energy and for heat energy, so you can calculate COP. I may build a ESP Home device for that later.

I wonder though, maybe if I already activate the AUX, it will show up in MODBUS. Again, how do you get those RAW modbus details dumped like you have on your first post in this thread?

Stick in an USB stick in the port (hidden behind the S40 plastic label), or remove the cover of the smo.

Insert a USB-stick in your SMO S40 display and go to meny 7.5.9 MODBUS TCP/IP.

Now you can export a list of all available Modbus addresses for your installation.

3 Likes

OK, strange. I have double quotes " in all my setup. That works fine.

Have you guys seen this???

https://www.home-assistant.io/integrations/nibe_heatpump

This is a new integration with the latest core update.

Supported devices:

  • F1145
  • F1155
  • F1245
  • F1255
  • F1345
  • F1355
  • F370
  • F470
  • F730
  • F750
  • SMO20
  • SMO40
  • VVM225
  • VVM310
  • VVM320
  • VVM325
  • VVM500

Sadly no S series!!! :cry:

2 Likes

That’s sad, ask the devs?

But you have the SMO40?
Why don’t you try it and post results. Maybe even the code and we can see what can be done.

I just upgraded to ha 2022. 10.1, now modbus is having issues connecting to the nibe IP (fixed address) .

Anyone else?

Mine is working fine. Post the yaml part for your heat pump configuration.