TapHome

Vaillant aroTHERM plus + sensoCOMFORT VRC 720 (eBUS, micro-ebusd)

Packet Parser → HTTP
Submitted by
Last updated: 11. 2026

Requires external gateway

eBUS Adapter (ebusd.eu) eBUS Adapter Shield or Stick C6 with micro-ebusd (HTTP JSON API, port 80) — product page

Vaillant aroTHERM plus + sensoCOMFORT VRC 720 (eBUS, micro-ebusd)

The Vaillant aroTHERM plus template connects TapHome to a Vaillant aroTHERM plus air-to-water heat pump and its system controller sensoCOMFORT VRC 720 through an eBUS Adapter Shield or Stick C6 from ebusd.eu. The adapter sits on the eBUS of the controller and runs micro-ebusd, which decodes the Vaillant messages and offers them over a local HTTP JSON API. TapHome talks only to the adapter, in the local network; no cloud is used.

The template reads the outdoor, room, flow and hot water temperatures, the water pressure, the power and energy of the heat pump and the errors of the controller. It sets the room setpoint of zone 1, the hot water setpoint, the operating modes of zone 1 and the hot water and starts a one-time hot water charge.

Community template — not yet tested with TapHome on a real adapter. The template was generated in the TapHome portal from the micro-ebusd documentation and the ebusd message definitions for the VRC 720 and the aroTHERM plus. It was tested only against a simulated adapter on a local TapHome Core 2025.2, not on a real adapter, controller or heat pump, and feedback from the field is welcome. Download the XML on this page, or get it from the TapHome portal: Vaillant aroTHERM plus + VRC 720 — community template, and import it as a new module.

The template complements the official TapHome template eBUS Adapter Shield C6 Stick, which shows the health of the adapter itself (bus signal, daemon, temperature) over MQTT; the two can run side by side. It is not related to the community template for the Vaillant aroVAIR fan coil, which uses Modbus RTU.

What you need

  • Vaillant aroTHERM plus with the controller sensoCOMFORT VRC 720 on the eBUS.
  • eBUS Adapter Shield C6 or Stick C6 (adapter.ebusd.eu) with the latest firmware and micro-ebusd activated. micro-ebusd is a paid function of the adapter, unlocked with a token; each adapter gets one 30-day trial.
  • The adapter and the TapHome Core in the same local network.

Hardware connection

The adapter connects to the two eBUS terminals of the VRC 720 controller; eBUS is polarity-independent. The aroTHERM plus talks to the controller over the same bus, so no wire to the outdoor unit is needed. Disconnect the mains power before working on the controller terminals.

Connect the adapter to the local network as described in the adapter documentation and reserve its IP address in the router, so that TapHome can always reach it.

Configuration

Activating micro-ebusd

  1. Update the adapter to the latest firmware (adapter.ebusd.eu).
  2. Get a micro-ebusd token at token.ebusd.eu (one 30-day trial per adapter, then paid) and enter it in the web interface of the adapter.
  3. After the activation the HTTP JSON API answers at http://<adapter-ip>/api/v1/ebus.

Finding the circuit names

micro-ebusd addresses each value by circuit and message name. Open http://<adapter-ip>/api/v1/ebus/list in a browser: it lists the circuits and messages the adapter found on the bus. The controller sensoCOMFORT VRC 720 appears as ctlv2, ctlv3 or 720 depending on its version, the outdoor unit of the aroTHERM plus as hmu. The import dialog also names 700 for the VRC 700; the template was written against the message definitions of the VRC 720.

Import parameters

ParameterDefaultDescription
ADAPTER_IP(empty)IP address of the eBUS adapter
CONTROLLER_CIRCUITctlv2Circuit name of the controller from /api/v1/ebus/list
HEAT_SOURCE_CIRCUIThmuCircuit name of the aroTHERM plus outdoor unit

The import creates two modules on the same adapter: sensoCOMFORT VRC 720 (ctlv2) with eight devices and aroTHERM plus (hmu) with the electricity meter of the heat pump.

Device capabilities

Temperatures and pressure

  • Outdoor Temperature — outdoor temperature as shown by the VRC 720.
  • Flow Temperature — system flow temperature (heating supply).
  • Water Pressure — water pressure of the heating system in bar (read only).

Zone 1

  • Zone 1 Thermostat — room temperature and the setpoint the controller really uses. A setpoint set in TapHome (5–30 °C) is sent as quick veto: a temporary change, the time programme of the controller stays as it is. After the write the template reads the value again from the bus.
  • Zone 1 Operating Mode — Off, Auto (time programme), Manual / Day and Night. The template sends the names of the ebusd definition (off, auto, day, night). On the VRC 720 the mode day is its manual mode, and the VRC 720 has no night mode.

Hot water

  • Hot Water Thermostat — temperature of the hot water storage tank and the hot water setpoint, adjustable from 35 to 75 °C.
  • Hot Water Operating Mode — Off, Auto, Day or Night.
  • Hot Water Boost — one-time hot water charge. Switching it on starts the charge; the controller returns to auto by itself when the tank is charged, and the switch then shows off again.

Heat pump electricity

The module aroTHERM plus (hmu) carries one device, Heat Pump Electricity, an electricity meter of the outdoor unit:

  • Demand — current electrical power of the heat pump in kW.
  • Total consumption — total electricity consumption of the heat pump in kWh. The counter is a 16-bit number (at most 65535 kWh), so on a unit that has run for many years it can have started from zero again.

It also shows three service attributes:

Service attributeDescription
COP (heating)Coefficient of performance of the heat pump in heating
Total thermal yield [kWh]Total heat yield of the heat pump — thermal energy, not electricity
Operational stateState reported by the outdoor unit: ready, heating, cooling, heating_water or error

Controller errors

The module sensoCOMFORT VRC 720 (ctlv2) reads the current errors of the controller every cycle. For each of its five error fields that is not zero, the module shows an error with the error number, for example Controller error code: 1025.

How the template talks to the adapter

Each value is one message of the ebusd definition. The template reads it with GET /api/v1/ebus/{circuit}/{message}/get?from=1, which answers from the cache of the adapter or asks the bus, and takes data.fields.value from the answer. A write is PUT /api/v1/ebus/{circuit}/{message}/set with the body {"fields":{"value":…}}, followed by a read with from=2, which always asks the bus. The modules and all devices read every 60 s.

None of the devices writes anything when the TapHome Core starts: they take their state from the adapter, not from the last value in TapHome.

Some VRC 720 firmware versions confirm a write and do not apply it. Because the template reads the value back from the bus after each write, TapHome then shows the value the controller really uses, not the one you set.

What the template does not do

  • Installer parameters (heat curve, maximum flow temperature) are left out on purpose — the template does not change the installer settings of the controller.
  • Cooling of zone 1, zones 2 and 3, and the weekly time programme are not part of the template.
  • Further values of the outdoor unit (air intake temperature, compressor utilisation, current heat output) are available on the bus but not read.

Troubleshooting

No values at all

Check that micro-ebusd is activated and the token has not expired: without micro-ebusd the adapter does not answer on /api/v1/ebus. Check that http://<adapter-ip>/api/v1/ebus/list opens in a browser.

The controller devices show no value

The circuit name does not match. Open http://<adapter-ip>/api/v1/ebus/list, find the name of the controller (ctlv2, ctlv3 or 720) and of the outdoor unit (hmu) and import the template again with these names.

A setpoint or mode returns to the old value

The controller did not apply the write; TapHome shows the value read back from the bus. Check the operating mode of the zone and the firmware of the controller.

Module error Controller error code: …

The controller reports an error with this number. Look it up in the documentation of the controller or the heat pump; the module error goes away when the controller clears it.

Available devices

sensoCOMFORT VRC 720 (ctlv2) Module

sensoCOMFORT VRC 720 (ctlv2)

Read (module)
VAR response := SENDHTTPREQUEST("/api/v1/ebus/" + "$[CONTROLLER_CIRCUIT]" + "/Currenterror/get?from=1");
IF response.IsSuccess
  VAR e0 := PARSEJSON(response.Content, "data.fields.error", true);
  VAR e1 := PARSEJSON(response.Content, "data.fields.error_1", true);
  VAR e2 := PARSEJSON(response.Content, "data.fields.error_2", true);
  VAR e3 := PARSEJSON(response.Content, "data.fields.error_3", true);
  VAR e4 := PARSEJSON(response.Content, "data.fields.error_4", true);
  IF !ISNULL(e0)
    IF e0 != 0
      ADDERROR(0, "Controller error code: " + e0);
    END
  END
  IF !ISNULL(e1)
    IF e1 != 0
      ADDERROR(1, "Controller error_1 code: " + e1);
    END
  END
  IF !ISNULL(e2)
    IF e2 != 0
      ADDERROR(2, "Controller error_2 code: " + e2);
    END
  END
  IF !ISNULL(e3)
    IF e3 != 0
      ADDERROR(3, "Controller error_3 code: " + e3);
    END
  END
  IF !ISNULL(e4)
    IF e4 != 0
      ADDERROR(4, "Controller error_4 code: " + e4);
    END
  END
END
Outdoor Temperature Temperature Sensor Read-only

Outdoor temperature as shown by the VRC 720 controller

numeric Unit: °C

Outdoor Temperature

Read temperature
VAR response := SENDHTTPREQUEST("/api/v1/ebus/" + "$[CONTROLLER_CIRCUIT]" + "/DisplayedOutsideTemp/get?from=1");
IF response.IsSuccess
  RETURN(PARSEJSON(response.Content, "data.fields.value", true));
END
RETURN(NaN);
Zone 1 Thermostat Thermostat

Room temperature and active setpoint of zone 1; a new setpoint is sent as quick veto — a temporary change, the time programme stays as it is

numeric Unit: °C

Zone 1 Thermostat

Read temperature
VAR response := SENDHTTPREQUEST("/api/v1/ebus/" + "$[CONTROLLER_CIRCUIT]" + "/Z1RoomTemp/get?from=1");
IF response.IsSuccess
  RETURN(PARSEJSON(response.Content, "data.fields.value", true));
END
RETURN(NaN);
Read desired temperature
VAR response := SENDHTTPREQUEST("/api/v1/ebus/" + "$[CONTROLLER_CIRCUIT]" + "/Z1ActualRoomTempDesired/get?from=1");
IF response.IsSuccess
  RETURN(PARSEJSON(response.Content, "data.fields.value", true));
END
RETURN(NaN);
Write desired temperature
VAR body := "{\"fields\":{\"value\":" + Se + "}}";
SENDHTTPREQUEST("/api/v1/ebus/" + "$[CONTROLLER_CIRCUIT]" + "/Z1QuickVetoTemp/set", "PUT", body, "Content-Type: application/json");
SENDHTTPREQUEST("/api/v1/ebus/" + "$[CONTROLLER_CIRCUIT]" + "/Z1QuickVetoTemp/get?from=2");
Zone 1 Operating Mode Multi-value Switch

Operating mode of zone 1 — Off, Auto (time programme), Manual / Day or Night; on the VRC 720 the mode day is the manual mode and there is no night mode

enum numeric
Values / States: Off · Auto · Manual / Day · Night

Zone 1 Operating Mode

Read switch state
VAR response := SENDHTTPREQUEST("/api/v1/ebus/" + "$[CONTROLLER_CIRCUIT]" + "/Z1OpMode/get?from=1");
IF response.IsSuccess
  # micro-ebusd returns the name of the value from the ebusd definition (off, auto, day, night); a number is accepted too
  VAR v := TOSTRING(PARSEJSON(response.Content, "data.fields.value", true));
  IF v = "off" OR v = "0"
    RETURN(0);
  END
  IF v = "auto" OR v = "1"
    RETURN(1);
  END
  IF v = "day" OR v = "manual" OR v = "2"
    RETURN(2);
  END
  IF v = "night" OR v = "3"
    RETURN(3);
  END
END
RETURN(NaN);
Write switch state
# Names from the ebusd definition; on the VRC 720 "day" is the manual mode
VAR name := SWITCH(Mu, 0, "off", 1, "auto", 2, "day", 3, "night", "");
IF name != ""
  SENDHTTPREQUEST("/api/v1/ebus/" + "$[CONTROLLER_CIRCUIT]" + "/Z1OpMode/set", "PUT", "{\"fields\":{\"value\":\"" + name + "\"}}", "Content-Type: application/json");
  # Read back from the bus: a write the controller ignored shows the real mode at the next read
  SENDHTTPREQUEST("/api/v1/ebus/" + "$[CONTROLLER_CIRCUIT]" + "/Z1OpMode/get?from=2");
END
Hot Water Thermostat Thermostat

Hot water storage temperature and hot water setpoint, adjustable from 35 to 75 °C

numeric Unit: °C

Hot Water Thermostat

Read temperature
VAR response := SENDHTTPREQUEST("/api/v1/ebus/" + "$[CONTROLLER_CIRCUIT]" + "/HwcStorageTemp/get?from=1");
IF response.IsSuccess
  RETURN(PARSEJSON(response.Content, "data.fields.value", true));
END
RETURN(NaN);
Read desired temperature
VAR response := SENDHTTPREQUEST("/api/v1/ebus/" + "$[CONTROLLER_CIRCUIT]" + "/HwcTempDesired/get?from=1");
IF response.IsSuccess
  RETURN(PARSEJSON(response.Content, "data.fields.value", true));
END
RETURN(NaN);
Write desired temperature
VAR body := "{\"fields\":{\"value\":" + Se + "}}";
SENDHTTPREQUEST("/api/v1/ebus/" + "$[CONTROLLER_CIRCUIT]" + "/HwcTempDesired/set", "PUT", body, "Content-Type: application/json");
SENDHTTPREQUEST("/api/v1/ebus/" + "$[CONTROLLER_CIRCUIT]" + "/HwcTempDesired/get?from=2");
Hot Water Operating Mode Multi-value Switch

Operating mode of the hot water circuit — Off, Auto, Day or Night

enum numeric
Values / States: Off · Auto · Day · Night

Hot Water Operating Mode

Read switch state
VAR response := SENDHTTPREQUEST("/api/v1/ebus/" + "$[CONTROLLER_CIRCUIT]" + "/HwcOpMode/get?from=1");
IF response.IsSuccess
  # micro-ebusd returns the name of the value from the ebusd definition (off, auto, day, night); a number is accepted too
  VAR v := TOSTRING(PARSEJSON(response.Content, "data.fields.value", true));
  IF v = "off" OR v = "0"
    RETURN(0);
  END
  IF v = "auto" OR v = "1"
    RETURN(1);
  END
  IF v = "day" OR v = "manual" OR v = "2"
    RETURN(2);
  END
  IF v = "night" OR v = "3"
    RETURN(3);
  END
END
RETURN(NaN);
Write switch state
# Names from the ebusd definition; on the VRC 720 "day" is the manual mode
VAR name := SWITCH(Mu, 0, "off", 1, "auto", 2, "day", 3, "night", "");
IF name != ""
  SENDHTTPREQUEST("/api/v1/ebus/" + "$[CONTROLLER_CIRCUIT]" + "/HwcOpMode/set", "PUT", "{\"fields\":{\"value\":\"" + name + "\"}}", "Content-Type: application/json");
  # Read back from the bus: a write the controller ignored shows the real mode at the next read
  SENDHTTPREQUEST("/api/v1/ebus/" + "$[CONTROLLER_CIRCUIT]" + "/HwcOpMode/get?from=2");
END
Hot Water Boost Switch

One-time hot water charge — on starts the charge, the controller returns to auto by itself when the tank is charged

boolean
Values / States: Active · OFF

Hot Water Boost

Read switch state
VAR response := SENDHTTPREQUEST("/api/v1/ebus/" + "$[CONTROLLER_CIRCUIT]" + "/HwcSFMode/get?from=1");
IF response.IsSuccess
  VAR v := TOSTRING(PARSEJSON(response.Content, "data.fields.value", true));
  IF v = "load" OR v = "6"
    RETURN(1);
  END
  RETURN(0);
END
RETURN(NaN);
Write switch state
# load = one-time hot water charge; the controller returns to auto by itself when the tank is charged
VAR name := IF(St, "load", "auto");
SENDHTTPREQUEST("/api/v1/ebus/" + "$[CONTROLLER_CIRCUIT]" + "/HwcSFMode/set", "PUT", "{\"fields\":{\"value\":\"" + name + "\"}}", "Content-Type: application/json");
SENDHTTPREQUEST("/api/v1/ebus/" + "$[CONTROLLER_CIRCUIT]" + "/HwcSFMode/get?from=2");
Flow Temperature Temperature Sensor Read-only

System flow temperature (heating supply) as reported by the VRC 720 controller

numeric Unit: °C

Flow Temperature

Read temperature
VAR response := SENDHTTPREQUEST("/api/v1/ebus/" + "$[CONTROLLER_CIRCUIT]" + "/SystemFlowTemp/get?from=1");
IF response.IsSuccess
  RETURN(PARSEJSON(response.Content, "data.fields.value", true));
END
RETURN(NaN);
Water Pressure Variable Read-only

Water pressure of the heating system in bar

numeric Unit: bar

Water Pressure

Read
VAR response := SENDHTTPREQUEST("/api/v1/ebus/" + "$[CONTROLLER_CIRCUIT]" + "/WaterPressure/get?from=1");
IF response.IsSuccess
  RETURN(PARSEJSON(response.Content, "data.fields.value", true));
END
RETURN(NaN);
Connection: Packet Parser → HTTP
Possible improvements (5)
  • Cooling of zone 1 — The controller definition has cooling setpoints for the zone and the heating circuit; the template covers heating only.
  • Installer parameters (heat curve, maximum flow temperature) — Left out on purpose — installer settings of the controller are not changed from TapHome.
  • Weekly time programme — Reading and editing the weekly schedule of the zone and the hot water is not part of the template.
  • Further heat pump values — Air intake temperature, compressor utilisation and current heat output of the outdoor unit.
  • Further zones — The template covers zone 1 only.

Sources

  • micro-ebusd HTTP JSON API (get, set, list, from=0/1/2, token)
    token.ebusd.eu 2026-11-04
  • ebusd message definitions — Vaillant sensoCOMFORT VRC 720 (15.ctlv2.csv)
    ebus.github.io 2026-11-04
  • ebusd message definitions — Vaillant aroTHERM plus outdoor unit (08.hmu.csv)
    ebus.github.io 2026-11-04
  • ebusd configuration — Vaillant index
    ebus.github.io 2026-11-04
  • micro-ebusd MQTT documentation
    token.ebusd.eu 2026-11-04

Found a problem with this device template?

Tell us what's wrong, what's missing, or how the template should behave. We rely on your feedback to keep the catalog accurate.

Community — unreviewed

Want to use this in your TapHome Core?

Open this template in the Customer Portal to apply it to one of your homes, or to draft a refinement and submit it back to the catalog.

Open in portal