Skip to content

Smart hot water

Most heat pumps run hot water on a dumb timer or whenever the tank drops below a threshold. HeatSync’s DHW scheduler picks which hours of the day to heat based on what you care about — cheapest electricity, greenest grid, warmest outdoor air for best COP, or all three at once.

It also learns your cylinder: how big it is, how long a reheat takes, how fast it loses heat overnight. The scheduler uses that to size the heating window correctly rather than assuming a generic 60 minutes.

Choose what counts as the preferred window on /hot-water → Schedule card or /config/energy → Hot water schedule.

ModeHeats duringBest for
£ TariffOff-peak hours from your tariff windowsOctopus Go, Cosy, Economy 7 — anyone with a fixed off-peak slot
🌱 CarbonThe daily greenest 3-hour windowStandard variable tariff — no cheap window to chase, but you can still pick the cleanest grid hours
☀ EfficiencyThe warmest hour from the 12-hour weather forecastBest COP days — warm afternoons in spring/autumn lift heat-pump efficiency by 20–30 % vs. early morning
£☀ ComboThe warmest hour inside off-peakThe smartest default: cheapest electricity × highest COP at the same time

All four modes share the same two-tier safety net (see below) — they only differ in when the “preferred window” opens.

Once per minute the device checks the local clock, the current tank temperature, and the active mode, then decides:

TimeTank tempAction
Inside preferred window(any)Charge to Full target (e.g. 55 °C)
Outside preferred window< Hard limitEmergency top-up to Mid target (e.g. 45 °C)
Outside preferred window≥ Hard limitHold — no write, let the tank drift

So normal operation: tank charges fully during the chosen window, drifts down through the day, gets a small top-up only if it dips below the floor.

The device watches DHW cycles as they happen and infers two things:

  • Tank volume — from the observed ΔT × time × power during a reheat. After 3+ cycles the estimate stabilises.
  • Reheat time — minutes to lift from Mid → Full target on a typical day. This sizes the Efficiency / Combo heating window precisely so the cycle finishes inside the picked hour.

If you’d rather just tell it the cylinder size, there’s a manual Tank volume (litres) field on the Schedule card. Leave it 0 and the learning takes over after a few cycles.

The learned numbers surface on /insights and as Home Assistant sensors (sensor.cylinder_volume, sensor.cylinder_loss, sensor.dhw_last_duration).

If you’re on Octopus Energy, you can skip typing off-peak hours manually. Go to /config/data-sources → Octopus card, paste an API key (generate it on octopus.energy/dashboard → API access) and your account number (A-XXXXXXXX), click Look up.

The device fetches your active tariff, proposes off-peak windows matching what you’re actually on (Go, Cosy, Flux, Intelligent), and populates the live rates. One-click Apply writes them to your tariff windows.

Read-only API access only — the key gives visibility into your tariff but no write permissions are used. It’s masked in API responses (sk_live_***...abcd) and never logged.

On /hot-water → Schedule card → “Targets & limits”:

  • Full target (typical 55 °C) — the aspiration during the preferred window. High enough to mix down to ~40 °C at the tap with usable flow.
  • Mid target (typical 45 °C) — emergency floor: only fired outside the preferred window when the tank drops below…
  • Hard limit (typical 40 °C) — the threshold that triggers the Mid-target top-up. Set it below your acceptable shower temperature with a safety margin.

These exist so the schedule never leaves you with a cold tank if the preferred window misses (sunny forecast didn’t pan out, off-peak window was shorter than the cylinder needed).

Octopus Go + Combo mode — picks the warmest hour between 00:30 and 04:30. On a typical winter night, that’s about 04:00 when the ambient temp is at its low but rising. COP penalty vs. a daytime high is small (~5 %), and you get the off-peak rate (~7 p/kWh vs. ~30 p peak). Best £/kWh × COP product.

Octopus Cosy + Combo mode — three off-peak windows (04–07, 13–16, 22–24). Combo picks the 13:00–16:00 slot on most days because afternoon temps are highest. Heat pump COP is meaningfully better than overnight.

No off-peak tariff + Efficiency mode — pure COP play. Picks the warmest hour 09:00–17:00 on average. Standard-variable users get 20–30 % efficiency uplift vs. early-morning heating without needing to switch tariff.

The minute-tick only writes if the desired state differs from what the unit currently reports:

  • Target differs by ≥ 0.5 °C, or
  • Power flag differs

This keeps the bus quiet and means manual nudges from the dashboard don’t fight the schedule — your manual setpoint holds until the next mode transition (window opens/closes, hard-limit crossed).

Untick Enable schedule in the Schedule card — the minute-tick becomes a no-op and you have full manual control via the dashboard’s toggle, mode picker, and target stepper.

The summary line swaps to “manual (no schedule)” as visual confirmation.

Schedule state publishes to MQTT every minute under <prefix>/_sched/dhw_* — surfaces in HA as:

  • sensor.dhw_schedule_mode — Tariff / Carbon / Efficiency / Combo
  • binary_sensor.dhw_in_window — true during the preferred window
  • sensor.dhw_window_start / sensor.dhw_window_end — epoch timestamps
  • sensor.dhw_schedule_status — the same status string shown on the device UI

Build automations on top — e.g. notify the family that hot water is recharging, or pause your dishwasher until DHW finishes.

  • Bus writes enabled on /config/device. The schedule writes via the same path as manual controls.
  • NTP synced. Wait up to a minute after boot; until then the schedule shows "NTP pending" and takes no action.
  • At least one indoor unit address seen on the bus — the schedule targets the first indoor unit observed.
  • For Efficiency / Combo modes: weather location set on /config/data-sources → Weather card.
  • For Carbon mode: carbon-intensity enabled on /config/data-sources → Carbon intensity card.

The Schedule card title shows the current state at a glance:

BadgeMeaning
tariff · charge to fullInside the off-peak window (Tariff mode)
carbon · charge to fullInside the daily greenest window
efficiency · charge to fullInside the forecast warmest hour
combo · charge to fullInside the warmest off-peak hour
<mode> peak · holdingOutside preferred window, tank fine — no action
<mode> peak · emergency top-upOutside preferred window, tank below hard limit
combo · no off-peak forecast yet, holdingCombo waiting for either weather or off-peak windows
disabledSchedule master toggle is off
writes offBus writes disabled — turn them on
NTP pendingWaiting for clock to sync
no indoor seenBus traffic hasn’t identified an indoor unit yet
no tank tempTank temperature hasn’t broadcast yet (~60 s on a live bus)