“I want to get in at half seven” – and my Balboa spa, running ESPHome, works out when to start heating.
A spa takes hours to heat up, often around 20 minutes for every half a degree. To have mine ready when I want it, I either left it heating all day or guessed when to switch it on. So I added a Ready At planner to my spa’s ESPHome setup. You tell it the time you want to get in, and it works out when to start heating. It also learns how quickly your spa heats up, so it gets more accurate over time.
It runs on the ESP32 connected to the spa, so it carries on even if Home Assistant is down. Everything shows up in Home Assistant automatically. I’ve published the full config and a step-by-step guide on GitHub.

Built on Brian Feucht’s esphome-balboa-spa
None of this would be possible without esphome-balboa-spa by Brian Feucht (see his project on GitHub). It’s the ESPHome component that talks to Balboa spa controllers and provides the thermostat, jets, lights, filter cycles, fault log, reminders and more. My project is just a configuration that sits on top of his work. If you have a Balboa spa, his project is the place to start: please give it a star and read his README. His component in turn builds on the original UART reader by Dakoriki.
Why the timing is tricky
Balboa spas have two heat modes, and esphome-balboa-spa maps them onto the Home Assistant thermostat:
| Spa setting | In Home Assistant | What it does |
|---|---|---|
| Ready | Mode: Heat | Heats whenever the water drops below the set temperature |
| Rest | Mode: Off | Only heats during filter cycles. “Off” doesn’t mean the spa is off. |
| High range | Preset: Home | The higher temperature range (up to 40°C) |
| Low range | Preset: Eco | The lower range, with its own set temperature |
Rest mode saves energy, but in Rest the spa only measures the water while its pump is running, so the temperature you see can be hours old. That makes it hard to know how long a heat-up will take.
What the Balboa spa ESPHome planner does
- Works out the start time from the water temperature, the target and the learned heat-up rate, and switches from Rest to Ready at the right moment.
- Takes a fresh reading first. When you switch the schedule on, it puts the spa in Ready for a minute or two so the pump runs, reads the real water temperature, then goes back to Rest.
- Learns your spa. After every heat-up of an hour or more it updates its “minutes per 0.5°C”, blending each new run in so it follows the seasons.
- Shows its working. A “Last Heat-up” sensor reports each run, for example: 31.0 to 38.5°C in 4h 53m, 19.5 min per 0.5°C, 24 Oct 05:29 (learned).
- Recalculates straight away when you change the target temperature or the Ready At time.
- Repeats every day until you switch it off, and can put the spa back into Rest a few hours after you’re done.
How it works it out
Between readings, the planner takes the last water temperature it trusts and subtracts an allowance for cooling. Then:
half-degrees short = (target − estimated temperature) ÷ 0.5, rounded up
time needed = half-degrees short × minutes per 0.5°C + margin
heating starts at = Ready At − time needed
For example, 34.5°C water heating to 38°C is 7 half-degrees. At 20 minutes each plus a 15-minute margin, that’s 2 hours 35 minutes, so for 23:00 it starts heating at 20:25. If you set a time too soon for a full heat-up, it starts straight away and gets as close as it can.
Every option explained
Controls
| Setting | What it does |
|---|---|
| Ready At | The time you want to get in, 24-hour, e.g. 19:30. Changing it re-plans immediately. |
| Ready At Schedule | Turns the planner on or off. Switching it on runs the fresh temperature check first. |
Settings
| Setting | Default | What it does |
|---|---|---|
| Heat-up Minutes per 0.5°C | 20 min | How long your spa takes to raise the water half a degree. Your starting guess; it updates itself after every heat-up of an hour or more. |
| Cool-down °C per Hour | 0.3 | How fast the water is assumed to cool while resting. Raise it in cold weather, lower it if the spa is ready too early. |
| Ready At Margin | 15 min | Extra time added to every heat-up, so it’s ready a little early rather than late. |
| Back to Rest After | 0 h | Hours after your Ready At time to switch back to Rest. 0 means stay in Ready. |
What it tells you
| Sensor | What it shows |
|---|---|
| Ready At Status | What it’s doing now, e.g. “Will heat from 20:25”, “Checking water temperature…”, “Heating, ready by 23:00”, “Up to temperature”. |
| Heating Starts At | The planned start time. |
| Heat-up Time Needed | How long the next heat-up should take, including the margin. |
| Last Heat-up | The last heating run: temperatures, time taken, rate measured, and whether it was long enough to learn from. |
Everything else
The rest of the config is esphome-balboa-spa’s own features, set up and named consistently: the thermostat (Rest/Ready and High/Low range), jets with Off/Low/High speed, lights, blower, status sensors (heater, circulation pump, rest mode, high range, connected), filter 1 and 2 start times and durations, Disable Filter 2, the spa clock with Sync, the fault log and reminders with Clear. The GitHub guide lists every option, including Brian’s extra jets, second light, filter 2 switch and water heater alternative, and which ones you can leave out. His README is the definitive reference for those.
Getting started with ESPHome on your Balboa spa
- You’ll need a Balboa spa, an ESP32 wired to the spa’s control board via RS-485 (I use a Lolin S2 Mini), and ESPHome, ideally the ESPHome Builder add-on in Home Assistant. For wiring, follow Brian’s project.
- Copy spa.yaml from my GitHub repository into a new ESPHome device and add your Wi-Fi details and keys to ESPHome’s Secrets.
- Check the board, pins, temperature scale (C or F) and time zone, and remove anything your spa doesn’t have.
- Install it, accept the device in Home Assistant, set Ready At and switch on Ready At Schedule.
The guide also covers the status messages, the full logic, Home Assistant automation examples and a couple of gotchas I hit along the way.
Get the Balboa spa ESPHome config
Everything is free on GitHub under the same BSD licence as esphome-balboa-spa: the full config, a secrets template and the complete guide.
More home automation on Dean’s Workbench: play your own audio stream on Amazon Echo, or fix your music tags with PowerShell.
Not affiliated with or endorsed by Balboa Water Group. “Balboa” is only used to describe compatible equipment.
