Aqotec RM360 over Modbus, Part 1: Read-Only Home Assistant Sensors

A safe read-only Home Assistant Modbus setup for an Aqotec RM360 district-heating controller, with short English sensor names.

Share
Aqotec RM360 over Modbus, Part 1: Read-Only Home Assistant Sensors

This is the first part of a short “zero to hero” series for connecting an Aqotec RM360 heating controller to Home Assistant via Modbus TCP.

The goal in this part is intentionally boring: read values only, name them clearly, and avoid writing to the controller.

Layout

In configuration.yaml I keep the Modbus setup in its own file:

modbus: !include modbus.yaml

That means modbus.yaml must start directly with the hub list. Do not add another top-level modbus: key inside that file.

A compact modbus.yaml

The names below are English and intentionally short. They are easier to use in dashboards, automations, and history charts.

- name: rm360
  type: tcp
  host: 10.0.0.5
  port: 502
  sensors:
    - name: rm360_outdoor_temp
      address: 43000
      unit_of_measurement: "°C"
      device_class: temperature
      scan_interval: 300
      data_type: int16
      scale: 0.1
      precision: 1

    - name: rm360_dh_flow_temp
      address: 43758
      unit_of_measurement: "°C"
      device_class: temperature
      scan_interval: 600
      data_type: int16
      scale: 0.01
      precision: 1

    - name: rm360_dh_return_temp
      address: 43759
      unit_of_measurement: "°C"
      device_class: temperature
      scan_interval: 600
      data_type: int16
      scale: 0.01
      precision: 1

    - name: rm360_hc_flow_temp
      address: 43054
      unit_of_measurement: "°C"
      device_class: temperature
      scan_interval: 60
      data_type: int16
      scale: 0.1
      precision: 1

    - name: rm360_hc_target_temp
      address: 43055
      unit_of_measurement: "°C"
      device_class: temperature
      scan_interval: 60
      data_type: int16
      scale: 0.1
      precision: 1

    - name: rm360_buffer_top_temp
      address: 43377
      unit_of_measurement: "°C"
      device_class: temperature
      scan_interval: 60
      data_type: int16
      scale: 0.1
      precision: 1

    - name: rm360_buffer_bottom_temp
      address: 43378
      unit_of_measurement: "°C"
      device_class: temperature
      scan_interval: 60
      data_type: int16
      scale: 0.1
      precision: 1

    - name: rm360_energy_raw
      unique_id: rm360_energy_raw
      address: 43750
      scan_interval: 720
      unit_of_measurement: "kWh"
      data_type: float32
      precision: 1

    - name: rm360_power
      address: 43754
      scan_interval: 60
      unit_of_measurement: "kW"
      data_type: float32
      precision: 1

    - name: rm360_flow_rate
      address: 43756
      scan_interval: 60
      unit_of_measurement: "l/h"
      data_type: float32

    - name: rm360_heating_pump
      address: 43058
      scan_interval: 10
      data_type: int16

    - name: rm360_heating_state
      address: 43060
      scan_interval: 10
      data_type: int16

    - name: rm360_mode
      address: 41195
      scan_interval: 60
      data_type: int16

    - name: rm360_hc2_mode
      unique_id: rm360_hc2_mode
      slave: 1
      address: 41197
      input_type: holding
      scan_interval: 30
      data_type: int16

    - name: rm360_hc2_day_offset
      unique_id: rm360_hc2_day_offset
      slave: 1
      address: 41222
      input_type: holding
      scan_interval: 30
      data_type: float32
      precision: 1

    - name: rm360_hc2_night_offset
      unique_id: rm360_hc2_night_offset
      slave: 1
      address: 41224
      input_type: holding
      scan_interval: 30
      data_type: float32
      precision: 1

    - name: rm360_day_offset
      unique_id: rm360_day_offset
      slave: 1
      address: 41214
      input_type: holding
      data_type: float32
      scan_interval: 30
      precision: 1

    - name: rm360_night_offset
      unique_id: rm360_night_offset
      slave: 1
      address: 41216
      input_type: holding
      data_type: float32
      scan_interval: 30
      precision: 1

    - name: rm360_hc2_day_cutoff
      unique_id: rm360_hc2_day_cutoff
      slave: 1
      address: 40146
      input_type: holding
      data_type: int16
      unit_of_measurement: "°C"
      device_class: temperature
      scan_interval: 1800
      precision: 0

    - name: rm360_hc2_night_cutoff
      unique_id: rm360_hc2_night_cutoff
      slave: 1
      address: 40147
      input_type: holding
      data_type: int16
      unit_of_measurement: "°C"
      device_class: temperature
      scan_interval: 1800
      precision: 0

Notes

  • input_type: holding maps to Modbus FC3: Read Holding Registers.
  • Keep read-only sensors read-only. Do not create write automations until the read side is stable.
  • Slow-moving parameters such as cutoff temperatures do not need a 30-second polling interval. Thirty minutes is usually enough.

In the next part we will look at the energy counter and why I added a raw sensor plus a filtered Home Assistant template sensor.


Series navigation

Next step: Aqotec RM360 over Modbus, Part 2: The Energy Counter Workaround