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.
Four modes — pick one
Section titled “Four modes — pick one”Choose what counts as the preferred window on /hot-water →
Schedule card or /config/energy → Hot water schedule.
| Mode | Heats during | Best for |
|---|---|---|
| £ Tariff | Off-peak hours from your tariff windows | Octopus Go, Cosy, Economy 7 — anyone with a fixed off-peak slot |
| 🌱 Carbon | The daily greenest 3-hour window | Standard variable tariff — no cheap window to chase, but you can still pick the cleanest grid hours |
| ☀ Efficiency | The warmest hour from the 12-hour weather forecast | Best COP days — warm afternoons in spring/autumn lift heat-pump efficiency by 20–30 % vs. early morning |
| £☀ Combo | The warmest hour inside off-peak | The 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.
How the windowing actually works
Section titled “How the windowing actually works”Once per minute the device checks the local clock, the current tank temperature, and the active mode, then decides:
| Time | Tank temp | Action |
|---|---|---|
| Inside preferred window | (any) | Charge to Full target (e.g. 55 °C) |
| Outside preferred window | < Hard limit | Emergency top-up to Mid target (e.g. 45 °C) |
| Outside preferred window | ≥ Hard limit | Hold — 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.
Cylinder learning
Section titled “Cylinder learning”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).
Octopus tariff auto-detect
Section titled “Octopus tariff auto-detect”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.
Three temperatures, the safety net
Section titled “Three temperatures, the safety net”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).
Three combinations to think about
Section titled “Three combinations to think about”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.
Hysteresis
Section titled “Hysteresis”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).
Disabling the schedule
Section titled “Disabling the schedule”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.
Home Assistant
Section titled “Home Assistant”Schedule state publishes to MQTT every minute under
<prefix>/_sched/dhw_* — surfaces in HA as:
sensor.dhw_schedule_mode— Tariff / Carbon / Efficiency / Combobinary_sensor.dhw_in_window— true during the preferred windowsensor.dhw_window_start/sensor.dhw_window_end— epoch timestampssensor.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.
Requirements
Section titled “Requirements”- 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.
Status badge
Section titled “Status badge”The Schedule card title shows the current state at a glance:
| Badge | Meaning |
|---|---|
tariff · charge to full | Inside the off-peak window (Tariff mode) |
carbon · charge to full | Inside the daily greenest window |
efficiency · charge to full | Inside the forecast warmest hour |
combo · charge to full | Inside the warmest off-peak hour |
<mode> peak · holding | Outside preferred window, tank fine — no action |
<mode> peak · emergency top-up | Outside preferred window, tank below hard limit |
combo · no off-peak forecast yet, holding | Combo waiting for either weather or off-peak windows |
disabled | Schedule master toggle is off |
writes off | Bus writes disabled — turn them on |
NTP pending | Waiting for clock to sync |
no indoor seen | Bus traffic hasn’t identified an indoor unit yet |
no tank temp | Tank temperature hasn’t broadcast yet (~60 s on a live bus) |