Skip to Content

OpenTherm Doesn't Stop Short Cycling: The Boiler Minimum-Output Problem

People put a boiler on OpenTherm, connect it to Home Assistant, and in October the burner still starts every few minutes. The gateway is not broken and neither is the boiler. The house needs less heat than the boiler can produce at its lowest setting, and no protocol changes that number. Here is where the floor is, how to find yours, and what to do above and below it.

By Dmitry Drezyulya · Updated September 5, 2026 · ~11 min read


The short version. A modulating boiler can turn its burner down only so far. Below that minimum output it has one option left: stop, wait, start again. In mild weather most houses need less heat than most boilers can deliver continuously, so the boiler cycles. OpenTherm gives you a flow-temperature setpoint and live telemetry — modulation, flow and return temperature, flame state — which is enough to see the cycling, to push the boiler down to its floor and keep it there longer, and to know when you are below the floor and nothing you set will help. It does not lower the floor.

1. What short cycling is, and why it costs you

A boiler cycle is ignition, a run at some modulation level, and a stop. Short cycling is the same thing at a pace the boiler was not designed for: a start every few minutes, runs of one to three minutes, and a burner that spends much of its time in ignition and post-purge instead of steadily heating water.

Three things go wrong at the same time. Every start burns gas at a fixed rate for a short time and pushes the heat exchanger through a temperature swing, so efficiency drops. The boiler spends its life in the least efficient part of its operating envelope, hot and pulsing rather than warm and steady. And the components that wear per start rather than per hour — the ignition electrode, the gas valve, the fan bearings — collect starts at a rate that shortens their life. A thread on the German bau.de forum has a 19 kW Buderus condensing boiler in a 130 m² new build logging 29,400 starts in 22 months — about 44 a day — and the consensus there is that the boiler is oversized for the house, not broken.

The number to keep in your head is starts per hour, not hours of runtime. A boiler with a modest burner-hours counter and a huge burner-starts counter is a short-cycling boiler.

2. A modulating boiler has a floor

Every gas boiler is sold by its maximum: 19 kW, 26 kW, 30 kW. What decides whether it cycles in your house is the number the brochure prints small, the minimum output — the lowest heat the burner can produce and stay lit.

The two numbers are not tied together by any fixed ratio. Manufacturers quote a modulation range — 1:4, 1:6, 1:10 — and the range varies enormously between models, sometimes between two versions of the same model. Our own test boiler is a good example. The Viessmann Vitodens 100-W comes in 19 kW and 26 kW versions and both have the same floor: 6.5 kW at 50/30 °C, a 1:4 range on the larger one per the data sheet. Intergas lists the HRE 28/24 A with a heating load range starting at 7.9 kW and the smaller HRE Solo 18 starting at 6.2 kW (nominal load, upper heating value). Those are model-level figures from the manufacturer's spec sheets; a percentage guessed from the maximum is not a substitute for looking yours up.

Set that against what the house needs. A reasonably insulated house on a mild autumn day loses two or three kilowatts; the radiators are sized for the coldest week of the year and on that day they need a fraction of their output. A forum thread that puts it neatly: radiators calling for around 2 kW, a boiler whose minimum is around 6 kW, and nothing in between. The boiler heats the water past the setpoint faster than the radiators can shed the heat, hits its limit, stops, and starts again when the flow temperature has dropped enough. That is short cycling, and it is arithmetic, not a fault.

Heat demand of a house across the season versus the boiler's minimum and maximum output. Above the minimum the boiler modulates; below it, it cycles — and most of the mild-weather hours sit below.
Heat demand of a house across the season versus the boiler's minimum and maximum output. Above the minimum the boiler modulates; below it, it cycles — and most of the mild-weather hours sit below.

3. What OpenTherm actually reports about it

Once the boiler is on OpenTherm, you can see the floor instead of guessing it. Three data IDs matter here.

Data ID Name What it tells you
15 Max capacity / min modulation level The boiler's maximum output in kW and the lowest modulation it can hold, as a percentage of that maximum
17 Relative modulation level Where the burner sits between its minimum and maximum modulation: 0 % = at minimum, 100 % = at maximum
25 / 28 Flow and return temperature Where the water is, and how much heat the system is taking out of it

Data ID 15 is the one to read first. Our Vitodens 100-W answers it with 25 kW maximum and 10 % minimum modulation, so the boiler itself is telling you its floor is around 2.5 kW — which does not match the 6.5 kW in the data sheet, and that is worth knowing too. What the boiler reports and what its burner physically does are not always the same number; the data sheet describes the burner, ID 15 describes what the firmware was told. Treat ID 15 as a starting point and the manual as the authority, and watch the actual behaviour on the graph rather than trusting either blindly.

Data ID 17, the relative modulation level, is defined in the OpenTherm specification as the percentage between the boiler's minimum and maximum modulation levels: 0 % is the minimum, 100 % is the maximum. It is not a percentage of nominal power. On a boiler with a 6 kW minimum and a 30 kW maximum, 20 % is not 6 kW — it is a fifth of the way from 6 towards 30, about 10.8 kW; 0 % with the flame on is 6 kW.

The catch is what the boiler sends when the burner is off. The specification defines the scale only for a running burner; with the flame out there is nothing to modulate and the boiler reports 0 %. So a bare 0 % is ambiguous — minimum fire or no fire — and the flame flag is what resolves it. On our own Vitodens the graph sits at 0 % the whole time the burner is off and jumps up only for hot-water draws. Always plot modulation together with the flame status.

Read the graph with that in mind. Modulation at or near 0 % with the flame on for minutes at a time means the boiler is at its floor and holding. Flame going on and off every few minutes, modulation dropping to 0 % with it, means the house wants less than the floor and the boiler is cycling.

What Relative Modulation Level means on a boiler with a 6 kW minimum and a 30 kW maximum — 0 % is 6 kW with the flame on, 20 % is 10.8 kW, 100 % is 30 kW; burner off also reads 0 %, so read it together with the flame flag.
What Relative Modulation Level means on a boiler with a 6 kW minimum and a 30 kW maximum — 0 % is 6 kW with the flame on, 20 % is 10.8 kW, 100 % is 30 kW; burner off also reads 0 %, so read it together with the flame flag.

Not every boiler sends these IDs. Our Vitodens answers 25 data IDs in total and return temperature is not among them — it reads 0 whatever the pipe says, and so do the burner-hours and burner-starts counters. Before you build a cycling monitor around a value, run the OpenTherm scanner and check that your boiler answers that ID at all.

4. How to see cycling in Home Assistant

With the HomeMaster OpenTherm Gateway on the bus, Home Assistant gets the flame status, the CH setpoint, the flow temperature and the modulation level as ordinary entities. Put four things on one graph over a mild evening: CH setpoint, actual flow temperature, flame on/off, and modulation level. The setup itself is in OpenTherm in ESPHome for Home Assistant.

What you are looking for:

  • Healthy — the flame stays on for long stretches, the flow temperature sits a degree or so under the setpoint, the modulation level is flat and low. The boiler is following the load.
  • Cycling — the flame goes on and off every few minutes, the flow temperature saws between the setpoint and some lower value, the modulation level is at its minimum each time the flame is on and the flame flag is off in between. The boiler is being asked for less than it can produce.

Count the starts yourself. A history-stats sensor on the flame binary sensor, counting state changes per hour, gives you a starts-per-hour number the boiler's own counter may not (ours reads 0 for burner starts). Log it for the whole season. Where the boiler cycles is not "in the mild weather" as a vague idea; it is a specific outdoor temperature above which the starts-per-hour graph climbs, and that temperature is the single most useful number this article will get you.

If the boiler has a built-in anti-cycle timer — Vaillant's ecoTEC installer menu calls it the burner anti-cycling time and lets the installer set it in minutes — you will see it as a fixed minimum gap between starts. That timer belongs to the boiler and OpenTherm does not override it. It limits the damage but it does not solve anything: a boiler that stops every five minutes because of the timer is still stopping every five minutes.

5. What a lower flow setpoint changes

This is where OpenTherm earns its keep, and it is important to be precise about what it does.

A relay thermostat gives the boiler one signal — heat — and the boiler answers by running to whatever flow temperature is set on its panel, usually 65–75 °C. The radiators cannot shed that much heat into a mild room, the flow temperature overshoots, the boiler stops. With OpenTherm you ask for the flow temperature the house actually needs: 40 °C when it is +8 °C outside, not 70 °C. Two things happen.

First, the heat the radiators give off drops with the flow temperature, so the gap between what the boiler is producing at its minimum and what the radiators are taking out narrows. The run lengths stretch and the stops get further apart. On a boiler whose floor is close to the demand, this alone can take it from cycling to steady running for much of the mild season.

Second, the return temperature drops with it, and on a condensing boiler that is where the efficiency is. The dew point of natural-gas flue gas is around 56–57 °C, so the return has to stay below roughly 56 °C for the boiler to condense at all, and the lower it goes the more of the flue gas condenses. A boiler running steady at 40 °C flow with a 32 °C return is condensing all the time; the same boiler cycling to 70 °C is condensing only during the first minute of each run.

Here is what the setpoint does not change. If the house needs 2 kW and the boiler's floor is 6 kW, a 40 °C setpoint moves the boiler from a stop every two minutes to a stop every six. That is better — fewer starts, more condensing — but it is still a cycling boiler. The setpoint decides how far above the floor the boiler runs. It cannot take the boiler below its floor, because that number is set by the burner and the gas valve, not by anything on the bus.

The stepped heating curve in Weather-Compensated Heating with the OpenTherm Gateway is the practical way to do this: outdoor temperature bands, a flow setpoint for each, written to the CH setpoint entity when the outdoor sensor changes. Tune the curve down until the rooms still reach their target and the starts-per-hour graph from section 4 stops climbing. Where it will not go any lower, you have found the floor.

6. When you are below the floor

At some outdoor temperature every boiler ends up below its floor, and there the question is how to cycle well rather than how to stop cycling. There are three levers, and OpenTherm is only one of them.

Let the boiler run longer per start. The boiler stops when the flow temperature reaches the setpoint plus its internal hysteresis. The more water and metal there is between the boiler and the radiators, the longer it takes to get there. A buffer tank or a low-loss header is the installer's answer for exactly this reason; a system with thermostatic valves on every radiator and one open bypass is the opposite, a tiny volume that heats up in seconds. If you have TRVs everywhere, keep one large radiator fully open on the boiler's circuit so there is always somewhere for the heat to go.

Do not fight the boiler from Home Assistant. The tempting automation is to switch CH enable off and on from Home Assistant to force longer gaps. It does not help. The boiler's anti-cycle timer already enforces a minimum gap; turning the demand off and on adds a second controller with its own timing on top of the first, and the result is usually more starts, not fewer. Set the flow temperature, let the boiler run its own burner, and use the CH enable switch for scheduling, not for cycle control.

Accept the season. A properly sized boiler cycles on the mildest days and modulates on the rest. A boiler that cycles at −5 °C is oversized for the house, and the honest fix is hydraulic or a different boiler when this one is replaced. Sizing a replacement on measured load — the number from section 4, extrapolated to the design temperature — rather than on the old boiler's nameplate is the single biggest thing the telemetry buys you, and it pays off years later.

7. A quick checklist

Symptom on the graph What it means What to do
Flame on for long stretches, modulation flat and low, flow a degree under setpoint Boiler is following the load Nothing — leave the curve where it is
Flame on/off every few minutes, modulation dropping to 0 % with the flame each time Demand is below the boiler's floor Lower the curve; check radiator valves and system volume
Starts spaced at an exact interval whatever the setpoint Boiler's anti-cycle timer is the limit Not fixable over OpenTherm; see section 6
Cycling continues at your lowest livable setpoint, even in cold weather Boiler oversized for the house Hydraulic buffer, or size the next boiler on measured load
Modulation reads 0 all the time, including with the flame on at full demand Boiler does not send ID 17 Run the scanner; use flame status and flow temperature instead

What this does not do

  • Lower the boiler's minimum output. That number is in the burner, not on the bus.
  • Override the boiler's anti-cycle timer.
  • Stop cycling on a boiler that is far too big for the house.
  • Report data IDs the boiler's firmware does not implement — starts and hours counters included, on some models.
  • Promise a gas-saving percentage. The savings from steady running and lower return temperatures are real; how large they are in your house is something you measure, not something we publish.

The takeaway

Short cycling is what happens when the house needs less heat than the boiler can make at its lowest setting, and in mild weather that is the normal case, not a defect. OpenTherm does two things about it. It shows you the cycling — starts per hour, modulation level, flow and return temperature — so you know which outdoor temperature puts your boiler below its floor. And it gives you the flow setpoint, which is how you keep the boiler above its floor for as much of the season as the house allows. The gateway is the measurement and the lever; the floor itself is the boiler's, and no controller moves it.

Sources

  • OpenTherm Protocol Specification v2.2 — Data IDs 15 (max capacity kW / min modulation level as % of max capacity), 17 (relative modulation level: "0 % = minimum modulation level, 100 % = maximum modulation level"), 25 (flow temperature), 28 (return temperature): https://ihormelnyk.com/Content/Pages/opentherm_library/Opentherm%20Protocol%20v2-2.pdf
  • Viessmann Vitodens 100-W data sheet — 19/26 kW versions, minimum output 6.5 kW at 50/30 °C, modulation range 1:4 (our test boiler).
  • Our Vitodens 100-W over OpenTherm — answers 25 data IDs; ID 15 reports 25 kW / 10 %; return temperature, burner hours and burner starts read 0; modulation graph at 0 % with the burner off (our own gateway logs).
  • Intergas HRE 28/24 A — nominal load 7.9–26.3 kW: https://www.intergas-verwarming.nl/en/consumer/products/hre/hre-28-24-a/
  • Intergas HRE Solo 18 — nominal load 6.2–20.8 kW: https://www.intergas-verwarming.nl/en/consumer/products/hre/hre-solo-18/
  • Flue-gas dew point ~56–57 °C, return below ~56 °C for condensation: https://www.heizsparer.de/heizung/heizungssysteme/gasheizung/gasheizung-brennwerttechnik
  • 19 kW Buderus, 29,400 starts in 22 months, oversized for a 130 m² house: https://bau.de/forum/heizung/13928.php
  • Vaillant ecoTEC plus installation manual, section 7.2.4 — burner anti-cycling time setting: https://www.manualslib.de/manual/804966/Vaillant-Ecotec-Plus.html?page=36
  • Home Assistant history_stats integration (count of state changes): https://www.home-assistant.io/integrations/history_stats/
  • Radiators ~2 kW vs boiler minimum ~6 kW — forum example, Home Assistant Community; illustrative, not measured.

No source (general engineering statements): run lengths of one to three minutes as a description of short cycling; per-start wear of ignition electrode, gas valve and fan; system volume, buffer tank and low-loss header extending run time; keeping one radiator open on a TRV system; the effect of a second on/off controller on top of the boiler's timer; sizing a replacement boiler on measured load.