> ## Content Index
> Fetch the complete content index at: https://www.kollr.at/llms.txt
> Use this file to discover other available public pages before exploring further.

# Aqotec RM360 over Modbus, Part 1: Read-Only Home Assistant Sensors
- URL: https://www.kollr.at/aqotec-rm360-modbus-part-1-read-only-sensors/
- Published: 2026-07-07T15:02:20.000Z
- Updated: 2026-07-07T15:09:55.000Z
- Description: A safe read-only Home Assistant Modbus setup for an Aqotec RM360 district-heating controller, with short English sensor names.
- Author: Georg Koller
- Tags: Home Assistant, Modbus, Aqotec RM360, Heating

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:

```yaml
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.

```yaml
- 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](https://www.kollr.at/aqotec-rm360-modbus-part-2-energy-counter-workaround/)