TapHome

Nibe SMO S40 Heat Pump Controller

Modbus TCP
Submitted by
Last updated: 03. 2026
Nibe SMO S40 Heat Pump Controller

The NIBE SMO S40 is a wall-mounted control module for NIBE air/water heat pump systems (F2040, F2120, F2030, F2300, HBS 05, AMS 10). It features a touchscreen display, WiFi and Ethernet connectivity, and a built-in Modbus TCP server. TapHome connects directly over the local network — no additional gateway is required.

The template provides 26 devices covering temperature monitoring (outdoor, room, supply, return, hot water), heating system control (heating curve, offset curve, degree minutes), hot water demand selection, operating mode and priority monitoring, flow monitoring, load monitor current sensors, pump status, and alarm management.

Hardware connection

The SMO S40 has an RJ45 Ethernet port (XF8) on the display unit (AA4) and built-in WiFi (2.4 GHz). Connect it to the same local network as TapHome Core using either a standard Ethernet cable or WiFi.

  • Protocol: Modbus TCP
  • Port: 502
  • Default Slave ID: 1
  • Network: Ethernet (XF8) or WiFi (2.4 GHz, 802.11)

The RS-485 terminal block X9 (pins 4=A, 5=B, 6=GND) is used exclusively for communication between the SMO S40 and connected NIBE heat pumps. Do not use X9 for TapHome — use the Ethernet port (XF8) or WiFi for Modbus TCP.

Component layout
Nibe SMO S40 component positions and terminal block layout

Key connectors relevant for TapHome integration:

ConnectorLocationFunction
XF8Display unit (AA4)Ethernet — Modbus TCP communication with TapHome
X9:4–6Joint card (AA100)RS-485 bus to connected heat pumps (A, B, GND) — not for TapHome
X10Joint card (AA100)Sensor inputs (BT1, BT50, BT6, BT7, BT25, BT71, AUX)
X11Joint card (AA100)Common GND for all sensor inputs
X14Joint card (AA100)Load monitor current sensors (BE1, BE2, BE3)
Sensor wiring
Nibe SMO S40 charge pump and sensor wiring — outdoor sensor BT1, hot water charging BT6
Nibe SMO S40 sensor wiring — BT7, BT25, BT71, BT50, energy meter, load monitor

All temperature sensors connect to terminal block X10 with common GND on X11. Use min 0.5 mm² cable up to 50 m (EKKX, LiYY or equivalent). Do not route sensor and communication cables alongside power cables.

Pin (X10)SensorRegisterDescription
1BT1A:1Outdoor temperature — place in shade on north/north-west wall
2BT50A:26Room temperature — activate in menu 1.3, place 1.5 m above floor
3BT6A:9Hot water charging — placed in submerged tube on water heater
4BT7A:8Hot water top — at top of tank
5BT25A:39External supply line temperature
6BT71A:88External return line temperature

Load monitor current sensors (BE1–BE3) are connected to terminal block X14 with GND on X13. Each sensor is a CT clamp installed on an incoming phase conductor.

Configuration

Enabling Modbus communication

Modbus TCP is activated through the installer menu. The following steps are required:

  1. Connect to network — plug in an Ethernet cable to XF8, or configure WiFi in menu 5.2.1
  2. Configure TCP/IP settings — in menu 5.2, select Automatic (DHCP) or Manual (static IP, netmask, gateway, DNS)
  3. Enable Modbus TCP/IP — navigate to menu 7.5.9 and set Modbus TCP/IP to On
  4. Verify network status — check menu 3.1.13 (“Connections”) for the assigned IP address

Software version 2.2.1 or later is required for Modbus TCP support. The available registers depend on the installed and activated accessories.

When importing the template in TapHome, provide:

  • IP Address — the SMO S40’s IP on the local network
  • Slave ID — Modbus slave address (default: 1)

Assign a static IP address or create a DHCP reservation for the SMO S40 in the router settings. The unit does not support mDNS, so a changing IP address will break the connection.

The SMO S40 can export its register list to a USB drive. Insert a USB memory stick and go to menu 7.5.9 → “Export most used registers” or “Export all registers” (CSV format). This is useful for verifying which registers are available on the specific installation.

Device capabilities

The template exposes 26 devices organised into six functional groups: temperature monitoring, heating system control, hot water management, system status, flow and pump monitoring, and electrical monitoring.

Temperature monitoring

Six temperature sensors provide a complete thermal picture of the heating system:

  • Outdoor Temperature (BT1) — outdoor air temperature from the BT1 sensor (register A:1, Int16, factor 10). Place the sensor in shade on a north or north-west facing wall.
  • Room Temperature (BT50) — room air temperature (register A:26, Int16, factor 10). Must be activated in menu 1.3. Place 1.5 m above floor on a free inner wall.
  • External Supply Line Temperature (BT25) — supply line temperature after the heat pump (register A:39, Int16, factor 10). Tells the heat pump when to start producing heating or cooling.
  • Return Temperature (BT71) — return line temperature (register A:88, Int16, factor 10). Used to verify the climate system is correctly adjusted.
  • Hot Water Top Temperature (BT7) — temperature at the top of the hot water tank (register A:8, Int16, factor 10). Indicates available hot water temperature.
  • Hot Water Charging Temperature (BT6) — charging sensor temperature in the submerged tube (register A:9, Int16, factor 10). Controls hot water production start/stop.

Two calculated temperatures are also available:

  • Calculated Supply Temperature — the target supply line temperature calculated by the controller (register A:1017, Int16, factor 10).
  • Calculated Supply Temperature (Cooling) — target supply temperature for cooling mode (register A:1567, Int16, factor 10). Only relevant when cooling is active.
Heating system control

The template provides direct control over the heating curve parameters:

  • Heating Curve — read/write coefficient that determines the relationship between outdoor temperature and supply temperature (register H:26, Int16). A higher value produces a steeper curve and higher supply temperatures at low outdoor temperatures.
  • Offset Curve — read/write parallel offset for the heating curve (register H:30, Int16). A positive offset shifts the supply temperature up, resulting in warmer rooms.
  • Degree Minutes — read/write heating demand indicator (register H:18, Int16, factor 10). Negative values indicate heat demand; the compressor starts at a configurable threshold (default -60 DM). Range: -3000 to 100.
  • Degree Minutes (Cooling) — read/write cooling demand indicator (register H:20, Int16). Positive values indicate cooling demand.
  • Supply Temperature Min — lower limit for supply line temperature (register H:34, Int16, factor 10). Read-only.
  • Supply Temperature Max — upper limit for supply line temperature (register H:38, Int16, factor 10). Read-only. Protects underfloor heating from overheating.
Hot water management
  • Hot Water Demand — read/write multi-value selector for hot water demand level (register H:56, Int16). Values: 0 = Small, 1 = Medium, 2 = Large, 3 = Smart control. Small/Medium/Large control hot water temperature setpoints; Smart control uses an adaptive algorithm.
System status and control
  • Operating Mode — read-only indicator of the current operating mode (register H:237, Int16). Values: 0 = Auto, 1 = Manual, 2 = Add. heat only. Auto mode uses outdoor temperature and degree minutes to control heating, cooling, and hot water automatically.
  • Operating Prioritisation — read-only indicator of the current system priority (register A:1028, Int16). Values: 10 = Off, 20 = Hot Water, 30 = Heat, 40 = Pool, 60 = Cooling.
  • Alarm Number — read-only active alarm code (register A:1975, UInt16). A value of 0 means no alarm. Alarm codes are device-specific — refer to the NIBE installer manual for code definitions.
  • Reset Alarm — read/write switch to acknowledge and clear the active alarm (register H:22, Bool). The value resets automatically after writing. Always investigate the alarm cause before resetting.
Pump status
  • External Heating Pump (GP10) — read-only on/off status of the external heating medium circulation pump (register A:1066, Bool). GP10 is connected to terminal X5:2.
  • Charge Pump Speed (GP12) — read-only charge pump speed for heat pump EB100 (register A:1636, Int16). GP12 is the circulation pump between the SMO S40 and the connected air/water heat pump.
Flow monitoring
  • Flow Sensor (BF1) — read-only heating medium flow rate from flow sensor BF1 (register A:40, Int16, factor 10, l/m). Optional sensor useful for monitoring heating system performance and COP estimation.
Electrical monitoring (load monitor)

Three current sensors monitor the incoming phase conductors:

  • Current Phase 1 (BE1) — phase 1 current from CT sensor BE1 (register A:50, UInt32, factor 10).
  • Current Phase 2 (BE2) — phase 2 current from CT sensor BE2 (register A:48, UInt32, factor 10).
  • Current Phase 3 (BE3) — phase 3 current from CT sensor BE3 (register A:46, UInt32, factor 10).

The load monitor prevents the property’s main fuse from tripping by reducing additional heat steps when current consumption is high. Configure the fuse size in menu 7.1.9.

Run time statistics
  • Total Run Time Additional Heat — cumulative operating hours of the electric additional heater (register A:1025, Int32, factor 10). Useful for monitoring additional heat usage and energy efficiency.
Additional capabilities

The SMO S40 exposes over 1400 registers in total. Beyond the 26 devices in the template, the unit also provides compressor status and run time (EB100), compressor start count, current status bitmask (heating/hot water/cooling flags), energy flow measurements (hot water, heating, pool — both compressor-only and compressor + additional heat), pulse energy meter readings (BE6/BE7), degree minutes thresholds for compressor and additional heat start, alarm action configuration, and holiday function control. These can be added to the TapHome template in a future update.

Troubleshooting

No Modbus communication
  1. Verify the Ethernet cable is connected to the XF8 port on the display unit (not the X9 RS-485 terminal block)
  2. Check menu 7.5.9 — Modbus TCP/IP must be set to On
  3. Verify the IP address in menu 3.1.13 (“Connections”)
  4. Ensure TapHome Core and the SMO S40 are on the same network/subnet
  5. Confirm no firewall is blocking port 502
  6. Check that firmware version is 2.2.1 or later
IP address changes after reboot

The SMO S40 does not support mDNS. If using DHCP, the IP address may change after a power cycle or lease renewal. Create a DHCP reservation in the router or configure a static IP in menu 5.2.

Missing sensor readings

Not all sensors are installed by default. BT50 (room sensor) must be activated in menu 1.3 after physical installation. BT6, BT7, BT25, and BT71 require the corresponding sensor to be connected to terminal block X10. If a sensor is not installed, the register will return a default or error value.

Register addressing note

The TapHome template uses NIBE’s native register numbering. Community libraries (e.g., the nibe Python library) use a +1 offset for input registers — for example, BT1 is register 1 in TapHome but register 30002 in the library. This is a known NIBE convention difference, not an error.

Available devices

Nibe SMO S40 Module
Alarm Number Variable Read-only

Active alarm code — 0 means no alarm; refer to NIBE installer manual for code definitions

Register: A:1975 UInt16 numeric

Alarm Number

Read
MODBUSR(A, 1975, UInt16)
Calculated Supply Temperature Temperature Sensor Read-only
Register: A:1017 (implicit) Int16 Unit: °C numeric

Calculated Supply Temperature

Read temperature
MODBUSR(A, 1017, Int16) / 10
Calculated Supply Temperature (Cooling) Temperature Sensor Read-only

Target supply line temperature for cooling mode — only relevant when cooling is active

Register: A:1567 (implicit) Int16 Unit: °C numeric

Calculated Supply Temperature (Cooling)

Read temperature
MODBUSR(A, 1567, Int16) / 10
Charge Pump Speed (GP12) Variable Read-only

Circulation pump speed between SMO S40 and the connected air/water heat pump

Register: A:1636 Int16 Unit: % numeric

Charge Pump Speed (GP12)

Read
MODBUSR(A, 1636, Int16)
Current Phase 1 (BE1) Variable Read-only
Register: A:50 UInt32 Unit: A numeric

Current Phase 1 (BE1)

Read
MODBUSR(A, 50, UInt32)
Current Phase 2 (BE2) Variable Read-only
Register: A:48 UInt32 Unit: A numeric

Current Phase 2 (BE2)

Read
MODBUSR(A, 48, UInt32)
Current Phase 3 (BE3) Variable Read-only
Register: A:46 UInt32 Unit: A numeric

Current Phase 3 (BE3)

Read
MODBUSR(A, 46, UInt32)
Degree Minutes Variable

Heating demand indicator — negative value means heat demand; compressor starts at configurable threshold (default -60 DM)

Register: H:18 Int16 Unit: DM numeric

Degree Minutes

Read
MODBUSR(H, 18, Int16)
Write
MODBUSWNE(H, 18, Int16, Va)
Degree Minutes (Cooling) Variable

Cooling demand indicator — positive value means cooling demand

Register: H:20 Int16 Unit: DM numeric

Degree Minutes (Cooling)

Read
MODBUSR(H, 20, Int16)
Write
MODBUSWNE(H, 20, Int16, Va)
External Heating Pump (GP10) Switch Read-only

On/off status of the external heating medium circulation pump

Register: A:1066 Bool

External Heating Pump (GP10)

Read switch state
MODBUSR(A, 1066, Bool)
External Supply Line Temperature (BT25) Temperature Sensor Read-only
Register: A:39 (implicit) Int16 Unit: °C numeric

External Supply Line Temperature (BT25)

Read temperature
MODBUSR(A, 39, Int16) / 10
Flow Sensor (BF1) Temperature Sensor Read-only

Heating medium flow rate — useful for monitoring system performance and COP estimation

Register: A:40 (implicit) Int16 Unit: l/m numeric

Flow Sensor (BF1)

Read temperature
MODBUSR(A, 40, Int16) / 10
Heating Curve Variable

Heating curve coefficient — higher value means steeper curve and higher supply temperature at low outdoor temperatures

Register: H:26 Int16 numeric

Heating Curve

Read
MODBUSR(H, 26, Int16)
Write
MODBUSWNE(H, 26, Int16, Va)
Hot Water Charging Temperature (BT6) Temperature Sensor Read-only
Register: A:9 (implicit) Int16 Unit: °C numeric

Hot Water Charging Temperature (BT6)

Read temperature
MODBUSR(A, 9, Int16) / 10
Hot Water Demand Multi-value Switch

Hot water demand level — Small, Medium, Large, Smart control

Register: H:56 Int16 numeric
Values / States: Small · Medium · Large · Smart control

Hot Water Demand

Read switch state
MODBUSR(H, 56, Int16)
Write switch state
MODBUSWNE(H, 56, Int16, Mu)
Hot Water Top Temperature (BT7) Temperature Sensor Read-only
Register: A:8 (implicit) Int16 Unit: °C numeric

Hot Water Top Temperature (BT7)

Read temperature
MODBUSR(A, 8, Int16) / 10
Offset Curve Variable

Parallel offset for the heating curve — positive value shifts supply temperature up for warmer rooms

Register: H:30 Int16 numeric

Offset Curve

Read
MODBUSR(H, 30, Int16)
Write
MODBUSWNE(H, 30, Int16, Va)
Operating Mode Multi-value Switch Read-only

Current operating mode — Auto, Manual, Add. heat only

Register: H:237 Int16 numeric
Values / States: Auto · Manual · Add. heat only

Operating Mode

Read switch state
MODBUSR(H, 237, Int16)
Operating Prioritisation Variable Read-only

Current system priority — Off, Hot Water, Heat, Pool, Cooling

Register: A:1028 Int16 numeric

Operating Prioritisation

Read
MODBUSR(A, 1028, Int16)
Outdoor Temperature (BT1) Temperature Sensor Read-only
Register: A:1 (implicit) Int16 Unit: °C numeric

Outdoor Temperature (BT1)

Read temperature
MODBUSR(A, 1, Int16) / 10
Reset Alarm Switch

Acknowledge and clear the active alarm — investigate cause before resetting

Register: H:22 Bool

Reset Alarm

Read switch state
MODBUSR(H, 22, Bool)
Write switch state
MODBUSWNE(H, 22, Bool, St)
Return Temperature (BT71) Temperature Sensor Read-only
Register: A:88 (implicit) Int16 Unit: °C numeric

Return Temperature (BT71)

Read temperature
MODBUSR(A, 88, Int16) / 10
Room Temperature (BT50) Temperature Sensor Read-only
Register: A:26 (implicit) Int16 Unit: °C numeric

Room Temperature (BT50)

Read temperature
MODBUSR(A, 26, Int16) / 10
Supply Temperature Max Temperature Sensor Read-only

Upper limit for supply line temperature — protects underfloor heating from overheating

Register: H:38 (implicit) Int16 Unit: °C numeric

Supply Temperature Max

Read temperature
MODBUSR(H, 38, Int16) / 10
Supply Temperature Min Temperature Sensor Read-only
Register: H:34 (implicit) Int16 Unit: °C numeric

Supply Temperature Min

Read temperature
MODBUSR(H, 34, Int16) / 10
Total Run Time Additional Heat Variable Read-only

Cumulative operating hours of the electric additional heater

Register: A:1025 Int32 Unit: h numeric

Total Run Time Additional Heat

Read
MODBUSR(A, 1025, Int32)/10
Connection: Modbus TCP • Slave ID: $[SlaveId]
Possible improvements (15)
  • A:5 (S1155 only) Supply Temperature (BT2) — Supply line temperature — available on S1155/S1255, not in SMO S40 register set (uses BT25 external supply instead)
  • A:87 Outgoing Hot Water (BT70) — Int16, /10, °C — hot water circulation outlet temperature
  • H:97 DM Start Additional Heat — Int16, R/W — degree minutes threshold for starting additional electric heater
  • H:159 DM Start Compressor — Int16, R/W — degree minutes threshold for starting compressor
  • H:196 Alarm Action Lower Room Temperature — UInt8, R/W — alarm action when room temperature drops below threshold
  • H:197 Alarm Action Lower HW Temperature — UInt8, R/W — alarm action when hot water temperature drops below threshold
  • A:396 Pulse Energy Meter (BE7/BF3) — UInt32, /100, kWh — energy meter reading
  • A:398 Pulse Energy Meter (BE6/BF2) — UInt32, /100, kWh — energy meter reading
  • A:1083 Compressor Starts (EP14) — Int32 — total compressor start count
  • A:1087 Compressor Runtime (EP14) — Int32, hours — total compressor operating time
  • A:1575 Flow Measurement Hot Water (Cpr + Add) — UInt32, /10, kWh — total hot water energy including compressor and additional heat
  • A:1577 Flow Measurement Total (Cpr + Add) — UInt32, /10, kWh — total heating energy including compressor and additional heat
  • A:1585 Flow Measurement Heat (Cpr only) — UInt32, /10, kWh — heating energy from compressor only
  • A:1121 (library 31121) Current Status Bitmask — UInt32 — bitmask: bit 12=Heating, bit 13=Hot Water, bit 14=HW Boost, bit 20=Cooling
  • H:20 (library 40020) Holiday Function Status — Int8, R/W — enable/disable holiday function

Sources