Zigbee TRVs in Home Assistant: Setup & Calibration

Disclosure: This article contains affiliate links. As an Amazon Associate, I earn from qualifying purchases. If you buy through the links on this page, I may earn a small commission at no extra cost to you.

A Zigbee radiator valve (TRV) looks like the easiest smart heating upgrade there is: unscrew the old thermostatic head, screw on the new one, pair it, done. In practice, most of the problems people hit have nothing to do with Zigbee. They come from the valve underneath, from how the head regulates flow, and from the fact that a TRV cannot tell your heat pump or boiler to start.

This guide covers what actually happens between the motor and the water: how a smart TRV moves the valve pin, why some heads never quite reach the setpoint, how to fix the built-in sensor’s accuracy, and how to turn a set of valves into a reliable heat-demand signal for your heat source. It assumes Home Assistant with ZHA or Zigbee2MQTT, and EU-style hydronic heating with radiators.

Short version: check that the valve pin moves freely before you buy, try one head on your worst valve first, give every room an external temperature sensor, and drive the heat source with an OR rule to start and an AND rule to stop. The product recommendations are at the end, because the right TRV depends on everything before them.


Table of Contents

  1. How a Smart TRV Actually Works
  2. Before You Buy: Will It Fit Your Valve?
  3. On/Off vs Proportional Control (and the Setpoint Problem)
  4. Pairing and First Setup in Home Assistant
  5. Fixing Temperature Accuracy
  6. Open Window Detection
  7. Controlling the Heat Pump or Boiler
  8. Common Problems and Fixes
  9. Which Zigbee TRV for Which Setup
  10. Sonoff TRVZB
  11. Aqara Radiator Thermostat E1
  12. Danfoss Ally Radiator Thermostat
  13. FAQ

How a Smart TRV Actually Works

A radiator valve has two parts: the valve body in the pipe, and a thermostatic insert with a spring-loaded pin sticking out of it. Push the pin in and the valve closes; release it and the spring opens the valve again. Everything that sits on top of the valve, manual or smart, is just a way of pushing that pin.

A classic thermostatic head does it with a wax or liquid capsule that expands as the room warms. A smart TRV replaces the capsule with a small DC motor, a gearbox and a plunger. The motor drives the plunger down onto the valve pin by a measured amount, and the insert’s spring pushes it back when the plunger retracts.

  • Motor and gearbox: convert battery power into a slow, strong linear movement.
  • Plunger: the part that actually touches the valve pin. Its position is what the TRV reports as valve opening.
  • Valve pin and spring: belong to the valve, not the TRV. Their condition decides whether the TRV can do its job.
  • Built-in sensor: measures temperature inside the head, a few centimetres from a hot radiator.

When you first mount a smart TRV it runs a calibration (Danfoss calls it an adaptation run). The head drives the plunger until it detects the end of travel, usually from rising motor current or step count, and maps that distance to 0–100% opening. Everything the TRV does afterwards is relative to what it learned in that run.

If anything stops the plunger before the real end of the valve’s travel, the TRV learns the wrong end stops. From then on its 30% is not your valve’s 30%, and no amount of software tuning fixes it.

Before You Buy: Will It Fit Your Valve?

Most EU radiator valves use the M30×1.5 thread, and most smart TRVs mount on it directly. Many valve bodies don’t: Danfoss RA, RAV and RAVL, and several Italian and German brands use their own connections and need an adapter. Most TRVs ship with a few adapters, but check the included list against your valve before ordering.

Fit is not only about the thread. On real installations, these are the problems that cause failed calibrations and heads that never close properly:

  • A seized valve pin. After a summer without movement, pins stick. Remove the old head and press the pin with your finger: it should go down smoothly and spring back fully. If it doesn’t, free it (gently, several times) before mounting anything.
  • A ridge or burr on the valve body or adapter. A small lip of metal or old paint can stop the head from seating flat. The head sits slightly high or tilted, the plunger meets the pin at the wrong point, and calibration learns the wrong travel.
  • Wrong adapter depth. An adapter that holds the head too far from the pin means it can never fully close the valve; too close and it starts half-closed.
  • Worn or non-standard inserts. Old inserts can have a stroke the TRV doesn’t expect. Replacing a cheap insert is often easier than fighting it in software.

Buy one head first. Mount it on the valve you trust least, run calibration, and watch it for a few days of real heating. If it seats, closes and holds temperature there, it will work on the rest of the house. If it doesn’t, you’ve spent the price of one head, not six. Check the seller’s return policy before you buy.

On/Off vs Proportional Control (and the Setpoint Problem)

Smart TRVs regulate in one of two ways, and many let you choose. The difference explains most complaints of the type “my room never reaches 21 °C”.

AspectOn/Off (with hysteresis)Proportional / PID
How it worksOpens fully below setpoint, closes at setpoint, reopens after the room drops by a set marginOpens partially, closing gradually as the room approaches setpoint
ComfortSmall temperature swings around the setpointSmoother temperature when it works well
Typical problemOvershoot on fast, oversized radiatorsStalls just below setpoint and never reaches it
Battery useFewer movementsMore frequent small movements
ExampleSonoff TRVZB with temperature accuracy (hysteresis) setSonoff TRVZB with smart temperature control (PID) enabled

The stalling problem with proportional heads is real and has three causes that add up:

  • Proportional control always settles short. As the room approaches the target, the valve closes, so less heat enters the room. At some point heat in equals heat lost, and that point sits slightly below the setpoint. Control engineers call it steady-state offset.
  • The valve is not linear. Thermostatic inserts are designed to regulate with a very small pin movement, and most of the change in flow happens close to the closed position. A TRV reporting 30% open can, on some valves, be passing very little water.
  • The stroke mapping can be off. If calibration learned the wrong end stops, or the TRV’s assumed stroke doesn’t match the insert, the whole percentage scale shifts toward closed.

Low flow temperatures make all three worse. With a heat pump supplying water at 40–45 °C instead of a boiler’s 70 °C, a nearly-closed valve delivers almost nothing, and the room drifts down while the TRV believes it is regulating. Presetting rings on the valve body (used for hydraulic balancing) reduce maximum flow further. If you want numbers for your specific insert, look up its flow-versus-stroke curve in the manufacturer’s datasheet.

What helps, roughly in order of effectiveness:

  • An external room sensor. The head stops reading the hot air next to the radiator and keeps the valve open longer. This alone fixes most stalling.
  • Switching to on/off mode where the device allows it, with a small hysteresis.
  • Valve opening limits. The TRVZB exposes opening and closing degree settings; check exactly what each one does on the Zigbee2MQTT device page before changing them.
  • A control layer above the TRV such as Better Thermostat, which can take over calibration or valve control.
  • Hydraulics: check presetting, balancing and flow temperature. A TRV cannot add heat the system isn’t delivering.

Pairing and First Setup in Home Assistant

Pairing works like any other Zigbee device, through ZHA or Zigbee2MQTT. If your network is new, start with our Home Assistant Zigbee setup guide. The order of the physical steps matters more than the software:

  1. Free and check the valve pin (previous section).
  2. Put the TRV in mounting mode if it has one, then fit the adapter and screw the head on firmly and straight.
  3. Let it run calibration with the head mounted. A calibration done in your hand learns nothing useful.
  4. Pair it with the coordinator, ideally with the TRV in its final position, so it joins through the right router.
  5. Update the firmware before tuning. Several TRV features only exist on newer firmware.
  6. Set the system mode (heat, auto, off) and decide whether schedules live in the TRV or in Home Assistant. Don’t run both.

TRVs are battery-powered end devices, so they depend on mains-powered routers nearby. A TRV that reports late or misses commands is usually a mesh problem; see why Zigbee devices lose connection and Zigbee range problems before blaming the valve.

Fixing Temperature Accuracy

The built-in sensor sits inside the head, next to a radiator that may be at 50–70 °C. It will read warm while the radiator is on and the TRV will close early. There are three ways to fix that, from simplest to most robust.

1. Temperature offset

Every TRV lets you add or subtract a fixed offset from its reading. It is quick, but it is only right at one operating point: the error changes with radiator temperature, outdoor temperature and airflow. Use it as a first step, not a solution.

2. External room sensor

The better approach is to feed the TRV a reading from a sensor placed where people actually sit, away from the radiator, windows and direct sun. Any reliable Zigbee sensor works; see our Zigbee temperature and humidity sensor guide. How it works differs by model:

TRVHow external temperature is used (Zigbee2MQTT)Update requirement
Sonoff TRVZBexternal_temperature_input plus temperature_sensor_select; falls back to the built-in sensor if the external source goes offlineSynchronisation must be done outside Zigbee2MQTT (automation or blueprint)
Aqara E1Set sensor to external, then write external_temperature_input (0–55 °C)Push regularly from Home Assistant
Danfoss Allyexternal_measured_room_sensor with radiator_covered choosing Auto Offset or Room Sensor modeAuto Offset: at least every 3 h. Room Sensor: at least every 30 min, or the function is disabled after 35 min

A simple automation keeps the TRV supplied. This example pushes the room sensor’s value on every change and every 10 minutes as a keep-alive. Entity names depend on your devices:

alias: Living room TRV - push room temperature
triggers:
  - trigger: state
    entity_id: sensor.living_room_temperature
  - trigger: time_pattern
    minutes: "/10"
conditions:
  - condition: template
    value_template: "{{ states('sensor.living_room_temperature') | is_number }}"
actions:
  - action: number.set_value
    target:
      entity_id: number.living_room_trv_external_temperature_input
    data:
      value: "{{ states('sensor.living_room_temperature') | float | round(1) }}"
mode: queued

For the TRVZB, also switch the device’s temperature sensor selection to the external option once. For the Danfoss Ally, respect the update intervals in the table, or the valve will silently fall back to its own estimate.

3. Better Thermostat

Better Thermostat is a Home Assistant custom integration (installed through HACS) that wraps your TRV in a new climate entity. It combines the room sensor, window contacts and weather, and then calibrates the TRV for you using one of several methods: local offset calibration, target-temperature-based calibration or direct valve control. It also offers several control algorithms, including PID and MPC predictive.

It is the most complete option when you have many rooms, but it adds a layer to debug. Start with an external sensor per room. Add Better Thermostat if the rooms still undershoot or oscillate.

Open Window Detection

Most TRVs have built-in open window detection based on a sudden temperature drop. The TRVZB, for example, closes when its reading falls by more than 1.5 °C within 4.5 minutes. It works for a wide-open window right above the radiator. It misses a tilted window across the room, and it reacts to a draught that isn’t a window at all.

A contact sensor on the window is far more reliable. Use a Zigbee door and window sensor and an automation that sets the TRV to off (or a low frost-protection setpoint) after the window has been open for a minute or two, and restores the previous mode when it closes. The Danfoss Ally has a writable external window state for exactly this. Better Thermostat handles window contacts natively.

Controlling the Heat Pump or Boiler

A TRV only controls flow through one radiator. It does not tell the heat source that heat is needed. If every valve in the house closes while the heat pump keeps running, you get no flow, short cycling and wasted energy. If the heat pump is off while a room is calling for heat, the TRV opens fully and nothing happens.

The fix is to treat the TRVs (and any room thermostats) as demand sensors and let Home Assistant switch the heat source. This section assumes the hydraulic circuit goes directly from the heat pump to the radiators or fan coil units. With a buffer tank or a hydraulic separator the heat pump runs on tank temperature, and the logic is different.

What your heat pump expects

Most hydronic heat pumps have one or more volt-free (dry contact) inputs for an external thermostat. Which ones depends on the model, and that decides how many relays you need:

Heat pump inputsWhat you needNotes
One ON/OFF contact1 relayHeat or cool mode is set on the heat pump itself
ON/OFF + heat/cool changeover contact2 relays, or 1 dual-channel relayOne channel for demand, one to select heating or cooling
Separate Heat ON and Cool ON contacts2 relays, or 1 dual-channel relayUse only the heat channel if you only heat

Warning: many smart relays, including most mini modules, switch 230 V to their output. They are not dry contacts. Connecting a 230 V output to a heat pump’s thermostat input can destroy the control board. Use a relay whose datasheet states volt-free / dry-contact output, check in the heat pump’s manual what the input expects, and have a qualified electrician do the wiring.

Two smaller points matter on signal-level inputs. The current through the contact is tiny, so a relay rated for low switching loads is more reliable than a heavy power relay. And for a boiler the same logic applies through its room-thermostat terminals, but on some boilers those terminals carry mains voltage. Check before you connect anything.

Where the logic runs

This is the part people underestimate. Home Assistant runs automations locally, and Zigbee is local by design, so a Zigbee relay driven by Zigbee TRVs keeps working when the internet is down. A Wi-Fi relay is fine too, as long as Home Assistant controls it locally (for example through a local API or ESPHome). A relay that only works through the manufacturer’s cloud will stop your heating every time the internet drops. More on that trade-off in local vs cloud automations.

If you use a vendor gateway instead of Home Assistant, check whether it executes automations locally. If the relay has a switch input, wire a manual switch to it and configure the input to toggle the relay locally. That gives you a way to run the heat pump by hand on a bad day.

The demand rules: OR to start, AND to stop

  • Heat ON: turn the heat pump’s heat contact on if room 1 OR room 2 OR room 3 (and so on) is calling for heat.
  • Heat OFF: turn it off only when room 1 AND room 2 AND room 3 are all satisfied.
  • Cool ON / Cool OFF: the same logic for fan coil units in cooling mode.

In Home Assistant a single helper does both. A binary sensor group is on when any member is on and off only when all members are off. Create one binary sensor per room that means “this room needs heat”, put them in a group, and drive the relay from the group.

Defining “needs heat” per room depends on what your TRV reports. With Zigbee2MQTT, heads that expose a running state show up as the climate entity’s hvac_action. Where that isn’t available, compare the room sensor with the setpoint:

template:
  - binary_sensor:
      - name: "Living room heat demand"
        state: >
          {{ state_attr('climate.living_room_trv', 'hvac_action') == 'heating'
             or states('sensor.living_room_temperature') | float(99)
                < state_attr('climate.living_room_trv', 'temperature') | float(0) - 0.3 }}

Then switch the relay from the group, with delays so that one valve twitching doesn’t start the compressor, and an interlock so heating and cooling can never be on together:

alias: Heat pump - heating demand
mode: restart
triggers:
  - trigger: state
    entity_id: binary_sensor.heating_demand_all_rooms
    to: "on"
    for:
      minutes: 3
    id: demand_on
  - trigger: state
    entity_id: binary_sensor.heating_demand_all_rooms
    to: "off"
    for:
      minutes: 5
    id: demand_off
actions:
  - choose:
      - conditions:
          - condition: trigger
            id: demand_on
          - condition: state
            entity_id: switch.heat_pump_cool_contact
            state: "off"
        sequence:
          - action: switch.turn_on
            target:
              entity_id: switch.heat_pump_heat_contact
      - conditions:
          - condition: trigger
            id: demand_off
        sequence:
          - action: switch.turn_off
            target:
              entity_id: switch.heat_pump_heat_contact

Heat pumps have their own anti-short-cycle protection. These delays sit on top of it, they don’t replace it. Check the minimum run and stop times in your heat pump’s settings and keep your delays compatible with them.

Heating, cooling and radiators

Fan coil units can heat and cool. Radiators should only heat. If the same circuit serves both, isolate the radiator circuit with a zone valve in cooling mode. Chilled water in a radiator cools the surface below the room’s dew point, and the result is condensation on and under the radiator.

Some systems pair a wall thermostat with the TRVs in a room, so the thermostat sits in the right place and commands the valves. That works well with Zigbee binding or a vendor’s grouping feature, and it fits the same demand logic: the thermostat becomes the room’s demand signal. For the bigger picture of where heat is generated and distributed, see how a central heating system works, and for wall units see our Zigbee thermostats for EU homes.

Common Problems and Fixes

  • Calibration fails or repeats: check the pin moves freely, remove burrs or paint from the seat, confirm the adapter, then remount and recalibrate.
  • Room never reaches setpoint: see the control section above. Add an external sensor first, then check presetting and flow temperature.
  • Radiator stays warm when the TRV says closed: usually the head isn’t seated fully or the adapter is too deep. Less often, the insert is worn.
  • Valve noise (whistling or knocking): often high differential pressure across a nearly-closed valve. Check the pump setting and balancing before blaming the TRV.
  • Batteries drain fast: PID modes move the motor more often, and so do frequent setpoint changes from automations. Weak Zigbee links also cost energy.
  • Tuya-based heads behave oddly: many share one model ID across different firmware. Check the exact model in the Zigbee2MQTT device list before you buy; our Aqara vs Tuya comparison explains why.
  • Schedules fight each other: pick one place for schedules, either the TRV or Home Assistant, never both.

Which Zigbee TRV for Which Setup

The three heads below are well supported in Zigbee2MQTT and cover the main use cases. Notes come from the manufacturers’ documentation and the Zigbee2MQTT device definitions, combined with installation experience. They are not lab test results. Prices change, and availability varies by EU country.

AspectSonoff TRVZBAqara E1Danfoss Ally
Control modesHysteresis or PID (selectable)Thermostat with valve calibrationPID-based control with adaptation run
External sensorYes, with automatic fallbackYes (sensor: external)Yes, two modes, strict update interval
Open windowBuilt-in (temperature drop)Built-inBuilt-in plus writable external state
Heat demand reportingRunning state (idle/heat)Check the device pageRunning state and valve demand
Best forBudget, Home Assistant-first homesAqara ecosystems and mixed setupsDanfoss valves and multi-head rooms
Device docsZigbee2MQTT pageZigbee2MQTT pageZigbee2MQTT page

Budget Tuya and Moes heads can work, and Better Thermostat supports several of them, but firmware varies between batches. Buy them only when you can match the exact model ID, and buy one first.

Sonoff TRVZB

The TRVZB is the most practical starting point for a Home Assistant user. It exposes nearly everything this guide talks about: a selectable external sensor with automatic fallback, a temperature offset, hysteresis or PID control, valve opening and closing limits, and frost protection. If you already use Sonoff devices, see our Sonoff Zigbee ecosystem overview. 👉 Check Price on Aliexpress

  • Best for: Home Assistant users who want full control at a low price per room.
  • Watch out for: several features need recent firmware, so update before tuning.
  • Tip: if a room stalls below setpoint in PID mode, try hysteresis mode with an external sensor.

Aqara Radiator Thermostat E1

The E1 suits homes already built around Aqara. It supports an external sensor input, a manual calibration command, window detection with a valve alarm that flags problems such as incorrect calibration, plus away mode and child lock. It works through an Aqara hub or directly with Zigbee2MQTT.

  • Best for: Aqara households, or mixed setups that want one consistent app.
  • Watch out for: the valve alarm usually points to a mounting or calibration problem, not a faulty unit.
  • Tip: if you are choosing between Aqara and Tuya devices, read the ecosystem comparison first.

Danfoss Ally Radiator Thermostat

The Ally comes from a radiator valve manufacturer, and it shows. It has a proper adaptation run, two external sensor modes (for exposed and covered radiators), load balancing between several heads in one room, and clear heat-demand reporting that maps well to the OR/AND logic above. It is the most demanding to integrate, because the external reading must be refreshed on schedule. 👉 Check Price on Amazon

  • Best for: Danfoss valve bodies, large rooms with two or more radiators, and heat pump systems where accurate demand matters.
  • Watch out for: if the external temperature isn’t refreshed in time, the Room Sensor function switches off.
  • Tip: enable load balancing only if Home Assistant will keep the room mean value updated.

A smart TRV is a small motor pushing a pin. When it fails, the cause is usually the pin, the seat, the insert’s characteristic or the missing link to the heat source, not Zigbee. Check the valve, buy one head first, and give every room a real temperature reading. Those three steps fix most of the problems people blame on the device.

The second half of the job is system-level: a dry-contact relay on the heat pump, local automations, and an OR rule to start and an AND rule to stop. Do that well and the TRVs stop being gadgets and become zone control. It is also where the energy is: heating dominates most EU homes’ energy use, as we explain in why HVAC drives EU energy bills, and the EPBD smart-building requirements push in the same direction. To see what your heat pump actually consumes, add an energy meter on the heat pump circuit.


FAQ

  • Do Zigbee TRVs work with a combi boiler or heat pump?
    Yes, but a TRV only controls its own radiator. To make the boiler or heat pump run when rooms need heat, you also need a demand signal: a relay on the heat source’s thermostat input, switched by Home Assistant from the combined demand of all rooms.
  • Why does my smart TRV never reach the setpoint?
    Usually a combination of proportional control settling slightly short, a valve insert that passes very little water near its closed position, and a built-in sensor that reads the warm air next to the radiator. An external room sensor fixes most cases. On/off mode, valve limits or Better Thermostat handle the rest.
  • Should I buy one TRV first or a full set?
    Buy one first. Mount it on the valve you trust least, let it calibrate and watch it through a few days of heating. Seized pins, burrs on the seat and adapter problems show up on the first head and save you from buying a full set that won’t seat properly.
  • Can I use any smart relay to switch my heat pump?
    No. Heat pump thermostat inputs expect a volt-free (dry) contact. Many smart relays switch 230 V to their output and can damage the heat pump’s control board. Use a relay specified as dry contact and have the wiring done by a qualified electrician.
  • Will my heating keep working without internet?
    With Zigbee devices and Home Assistant, yes: the automations and the radio network are local. A Wi-Fi relay that only works through a vendor cloud will not. A manual switch on the relay’s input is a useful fallback.
  • Can I use Zigbee TRVs on underfloor heating?
    No. Underfloor heating loops are controlled by actuators on the manifold, driven by room thermostats, not by radiator heads. The same OR/AND demand logic still applies to the heat source.
  • Do smart TRVs save energy?
    They can, by heating only the rooms you use and only when you use them, but the savings depend on the building, the heat source and how you set schedules. Without a link to the heat source, part of the benefit is lost.
Panos K. - Smart Home Engineer

About the author: Panos K.

Panos K. is a Smart Home Engineer and Digital Systems Specialist with over 15 years of experience in wireless automation, Zigbee ecosystems, Matter/Thread technologies, and EU-based smart home deployments. He focuses on practical, reliable, low-power smart home design.

View full profile →