Dynamic heat pump simulator {{ mode == 'day' ? 'single day' : 'full year' }} · run {{ simulation_index }} · vs baseline

{{ group_info[ui.group].title }}

most-changed

{{ group_info[ui.group].desc }}

W
Time Set point Price
°C
p
Degree hours above set point (heat pump running) {{ stats.degree_hours_above_setpoint.toFixed(1) }} Kh
Degree hours below set point {{ stats.degree_hours_below_setpoint.toFixed(1) }} Kh
Max room temperature {{ max_room_temp | toFixed(2) }} °C
Time Set point Duration Mod. limit
°C
s
%

Set duration to 0 to disable a window. Modulation limits below the heat pump minimum modulation ({{ heatpump.minimum_modulation }}%) are raised to it.

Draw profile: showers 07:00 ({{ (dhw.daily_volume*0.4).toFixed(0) }} L), bath 19:00 ({{ (dhw.daily_volume*0.3).toFixed(0) }} L), 3× washing up ({{ (dhw.daily_volume*0.1).toFixed(0) }} L each), mixed volumes.

Hot water heat / electric / COP {{ results.dhw_heat_kwh | toFixed(2) }} / {{ results.dhw_elec_kwh | toFixed(2) }} kWh · {{ results.dhw_elec_kwh > 0 ? (results.dhw_heat_kwh / results.dhw_elec_kwh).toFixed(2) : '-' }}
Hot water delivered {{ results.dhw_delivered_kwh | toFixed(2) }} kWh
Cylinder standing loss {{ results.cylinder_loss_kwh | toFixed(2) }} kWh
Minimum cylinder top temperature {{ results.min_cylinder_top_temp | toFixed(1) }} °C
W
W/step

The max electrical power limit caps the whole unit's electrical input (compressor + pump {{ heatpump.pumps }} W + standby {{ heatpump.standby }} W), the electrical-side equivalent of a maximum modulation limit. The heat output the cap allows is solved from the COP at the operating point, so the heat it permits rises and falls with the COP: mild weather and low flow temperatures buy more heat per watt than cold weather does. Like the flow temperature limiter it modulates the unit down rather than switching it off, so it can hold the compressor below the minimum modulation output ({{ heatpump.minimum_modulation * heatpump.capacity / 100 | toFixed(0) }} W) that the cycling control would otherwise enforce.

Heat emitters
°K
W

The emitter spec is sized from the design flow temperature with the radiator equation: emitters big enough to emit the design heat loss ({{ building.heat_loss }} W) into a room at the design room temperature, when supplied at the design flow temperature. The design system DT is the drop across the emitters when the flow rate carries the whole design heat loss.

Control

Curve automatically selected based on building heat loss, internal gains and heat emitter spec.

Simple mode pipework is exposed to the live outside air temperature.
Heat loss is quoted on BS 5422 Table 20A's own basis — a horizontal pipe at 60 °C in still air at 15 °C (ΔT 45 K), high-emissivity outer surface — so it can be read against the table's limit of {{ insul_limit }} W/m for {{ primary.pipe }} mm pipe. ✔ meets it, ≈ within 5% (inside the method's uncertainty), ✘ over. The simulation itself uses the assembly's own U′ against live temperatures, not this figure.

Stage Length m Construction Ambient °C / depth mm
tracked

Heat loss is quoted on BS 5422 Table 20A's basis (60 °C pipe, 15 °C still air, ΔT 45 K) against the table's limit for that pipe size: ✔ meets it, ≈ within 5%, ✘ over.
Stage order = heat pump → building; the heat pump itself sits in the first stage's environment. Outside air and Indoor stages track the live simulated temperatures. Buried stages follow the seasonal ground temperature at their depth — at 200–400 mm the soil still swings within ~12% of the surface's annual swing, roughly a week behind it, so a shallow buried run is nearly as cold as the air in January.

Buried as Depth mm Swing kept Lag U′ with soil
{{ g.label }} {{ g.depth }} {{ g.kept }}% {{ g.lag }} days {{ g.u_pipe | toFixed(3) }} → {{ g.u | toFixed(3) }} ({{ g.u_drop }}% lower)

Damping depth {{ ground_damping_depth | toFixed(2) }} m. Soil conductivity 0.4 dry peat, 0.8 dry sand, 1.2 damp loam, 2.0 wet clay — it sets both how far the seasonal swing reaches down and the soil resistance in series with the lagging, which is why it is one input rather than two. The offset is the surface energy balance: paving has no evaporative cooling and absorbs more shortwave than grass, running ~2 K above the air annual mean.

The unit's own heat exchanger and internal pipework, sitting in the first stage's environment — {{ (primary.unit_UA * 30) | toFixed(0) }} W at ΔT 30 K, cooling with a time constant of {{ unit_time_constant | toFixed(1) }} h once the pump stops. A product property, independent of the pipework chosen above.

Primary pipework + unit volume standing loss {{ results.primary_loss_kwh | toFixed(2) }} kWh
W/K

Layer 1: external, Layer 3: internal.

Layer Proportion W/K kWh/K
{{ index + 1 }}
%
W/K
kWh/K
Defrost cycles {{ results.defrost_cycles }}
Heat drawn / electric {{ results.defrost_heat_kwh | toFixed(2) }} / {{ results.defrost_elec_kwh | toFixed(2) }} kWh
Defrost loss {{ results.heat_kwh > 0 ? (100 * results.defrost_heat_kwh / results.heat_kwh).toFixed(2) : '0.00' }} % of heat delivered
Solar gains utilisation (useful / total) {{ results.utilised_solar_gains_kwh.toFixed(0) }} / {{ results.solar_gains_kwh.toFixed(0) }} kWh

Solar gains, PV output and battery storage use the annual dataset, switch to full year mode to explore them.

Annual mode replays the Llanberis 2024 dataset (temperature, humidity, solar and Agile prices). Use the design temperatures below when choosing a design flow temperature for heat emitters.

99.6th percentile outside temperature {{ outsideT_996.toFixed(1) }} °C
99.0th percentile outside temperature {{ outsideT_990.toFixed(1) }} °C
Loading systems from heatpumpmonitor.org…

{{ validator.error }}

day {{ progress.day }} of {{ progress.total }}
{{ k.short }} {{ k.value }} {{ k.delta }}
{{ needs_run ? 'inputs changed — run to update' : 'results from run ' + simulation_index }}
{{ k.label }}
{{ k.value }} {{ k.delta }}
{{ ui.chart == 'daily' ? 'Daily energy' : 'Timeseries' }} Window: {{ stats.window_heat_kwh | toFixed(1) }} kWh heat · {{ stats.window_elec_kwh | toFixed(1) }} kWh elec · COP {{ stats.window_cop > 0 ? stats.window_cop.toFixed(2) : '—' }} {{ daily_stats.days }} days · {{ daily_stats.heat_kwh | toFixed(0) }} kWh heat · {{ daily_stats.elec_kwh | toFixed(0) }} kWh elec · COP {{ daily_stats.cop > 0 ? daily_stats.cop.toFixed(2) : '—' }}
{{ view_range_label }}
Click a bar to open that day · drag to zoom
Performance by metering point
Metering point Heat SPF/COP vs source
At source (condenser, pre unit volume) {{ results.heat_kwh | toFixed(3) }} kWh {{ (results.heat_kwh / results.elec_kwh) | toFixed(2) }} 100 %
Point 1 · heat pump connections {{ results.heat_kwh_m1 | toFixed(3) }} kWh {{ (results.heat_kwh_m1 / results.elec_kwh) | toFixed(2) }} {{ (100 * results.heat_kwh_m1 / results.heat_kwh) | toFixed(1) }} %
Point 2 · building entry, after primaries (main) {{ results.heat_kwh_m2 | toFixed(3) }} kWh {{ (results.heat_kwh_m2 / results.elec_kwh) | toFixed(2) }} {{ (100 * results.heat_kwh_m2 / results.heat_kwh) | toFixed(1) }} %

Primary pipework + heat pump volume standing loss: {{ results.primary_loss_kwh | toFixed(3) }} kWh. The source → point 1 gap is the unit's own standing loss; the point 1 → point 2 gap is heat lost from the primary pipework (while flowing, plus stranded loop charge that cools between cycles).

Coldest day flow temperature measurements
Measurement Flow temperature vs design
Design flow temperature {{ heatpump.design_flowT | degC }}
Maximum during space heating {{ coldest_day.space.max | degC }} {{ (coldest_day.space.max - heatpump.design_flowT) | deltaK }}
Weighted average · space heating only {{ coldest_day.space.weighted | degC }} {{ (coldest_day.space.weighted - heatpump.design_flowT) | deltaK }}
Average · space heating only {{ coldest_day.space.mean | degC }} {{ (coldest_day.space.mean - heatpump.design_flowT) | deltaK }}
Weighted average · space and water heating {{ coldest_day.combined.weighted | degC }} {{ (coldest_day.combined.weighted - heatpump.design_flowT) | deltaK }}
Average · space and water heating {{ coldest_day.combined.mean | degC }} {{ (coldest_day.combined.mean - heatpump.design_flowT) | deltaK }}

Coldest day: {{ coldest_day.label }}, mean outside {{ coldest_day.mean_outsideT | degC }} (minimum {{ coldest_day.min_outsideT | degC }}). Running hours that day: {{ coldest_day.space.hours | toFixed(1) }} h space heating, {{ coldest_day.combined.hours | toFixed(1) }} h space and water. Averages only count steps where the unit is running (≥ 200 W), so standing losses between cycles do not pull them down. The weighted averages weight each step by the heat delivered — the same basis heatpumpmonitor.org publishes flow temperatures on — so they sit above the plain time average whenever the hardest working periods run hottest.

Results{{ baseline_enabled ? ' vs baseline' : '' }}
Name Mean temp Max temp Electric Heat @ M2 COP @ M2 Cost Solar offset Solar saving Agile (2024)
Baseline {{ baseline.mean_room_temp | toFixed(2) }} °C {{ baseline.max_room_temp | toFixed(2) }} °C {{ baseline.elec_kwh | toFixed(3) }} kWh {{ baseline.heat_kwh_m2 | toFixed(3) }} kWh {{ (baseline.heat_kwh_m2 / baseline.elec_kwh) | toFixed(2) }} £{{ baseline.total_cost | toFixed(2) }} {{ baseline.solar_elec_kwh | toFixed(3) }} kWh £{{ baseline.solar_cost | toFixed(2) }} £{{ baseline.agile_cost | toFixed(2) }}
Current {{ results.mean_room_temp | toFixed(2) }} °C {{ results.max_room_temp | toFixed(2) }} °C {{ results.elec_kwh | toFixed(3) }} kWh {{ results.heat_kwh_m2 | toFixed(3) }} kWh {{ (results.heat_kwh_m2 / results.elec_kwh) | toFixed(2) }} £{{ results.total_cost | toFixed(2) }} {{ results.solar_elec_kwh | toFixed(3) }} kWh £{{ results.solar_cost | toFixed(2) }} £{{ results.agile_cost | toFixed(2) }}
Saving {{ (results.mean_room_temp - baseline.mean_room_temp) | toFixed(2) }} °C {{ (results.max_room_temp - baseline.max_room_temp) | toFixed(2) }} °C {{ (results.elec_kwh - baseline.elec_kwh) * -1 | toFixed(3) }} kWh ({{ ((results.elec_kwh - baseline.elec_kwh) / baseline.elec_kwh * -100) | toFixed(1) }}%) {{ (results.heat_kwh_m2 - baseline.heat_kwh_m2) * -1 | toFixed(3) }} kWh ({{ ((results.heat_kwh_m2 - baseline.heat_kwh_m2) / baseline.heat_kwh_m2 * -100) | toFixed(1) }}%) {{ ((results.heat_kwh_m2 / results.elec_kwh) - (baseline.heat_kwh_m2 / baseline.elec_kwh)) | toFixed(2) }} £{{ (results.total_cost - baseline.total_cost) * -1 | toFixed(2) }} {{ (results.solar_elec_kwh - baseline.solar_elec_kwh) | toFixed(3) }} kWh £{{ (results.solar_cost - baseline.solar_cost) | toFixed(2) }} £{{ (results.agile_cost - baseline.agile_cost) * -1 | toFixed(2) }}

Use Save as baseline (above) to keep the current results for comparison as you change parameters.

Weighted averages (heat weighted)
Flow temperature Outside temperature FlowT − outsideT % Carnot
Full simulation {{ stats.flowT_weighted | toFixed(2) }} °C {{ stats.outsideT_weighted | toFixed(2) }} °C {{ stats.flowT_minus_outsideT_weighted | toFixed(2) }} °C {{ stats.wa_prc_carnot * 100 | toFixed(1) }} %
Selected window only {{ stats.window_flowT_weighted | toFixed(2) }} °C {{ stats.window_outsideT_weighted | toFixed(2) }} °C {{ stats.window_flowT_minus_outsideT_weighted | toFixed(2) }} °C