Charge the battery on the cheapest half-hours — and not one slot more.
TightWatt is my published Home Assistant blueprint for grid-assisted home batteries on Octopus Agile — built for single-sink (no-export) setups. It reads the Victron VRM solar forecast, works out how much grid charge you still need, and buys only the cheapest half-hours that cover it before your evening cutover. Running on my own hand-built 8 kWh system; shared for everyone else's.
Dumb schedules waste the whole point of Agile
Fixed windows buy at the wrong price
Most charge automations are "turn on at 2 a.m." Agile prices change every 30 minutes and reshuffle daily — last night's cheap window is tonight's expensive one. A fixed schedule leaves money on the table every single day.
Naive price triggers overcharge
"Charge whenever it's cheap" ignores how much charge you actually need. If solar has already done most of the work, buying every cheap slot just cycles the battery for nothing. The right amount of grid energy depends on your bank's capacity and its state — not just the price.
Capacity-aware, deadline-driven
1. Work out the real deficit
From your usable capacity, current state of charge and expected consumption, TightWatt computes the energy still needed — then subtracts the Victron VRM solar forecast (trusted as-is; it self-calibrates against actual yield). What's left is the grid charge that actually has to be bought.
2. Respect the deadline
You set a cutover time — the point in the evening when you want to stop relying on the grid and run from the battery (mine: 18:30, just before the expensive evening peak). Everything TightWatt buys is in service of arriving at cutover with enough stored energy.
3. Buy only the cheapest covering slots
The 3.1 planner ranks every remaining Agile slot before cutover by price and selects the cheapest set whose combined duration covers that deficit — then only lets the charger run inside those slots. Slots above your price cap are never chosen (a missed target beats an expensive one), and negative-price slots always qualify and sort first, so it naturally waits to be paid to charge. Safety and emergency SoC floors override everything and charge at any price.
Up and running in four steps
-
Prerequisites
Agile pricing in Home Assistant
You need the Octopus Energy integration (for half-hourly rates) and a switch entity that controls your battery charger — a smart plug or contactor rated for the charger load.
-
Step 1
Import the blueprint
Import TightWatt from the repository link above into Settings → Automations & Scenes → Blueprints.
-
Step 2
Create an automation from it
Set battery_capacity_kwh to your usable bank size and cutover_time to when you want to be running on stored energy.
-
Step 3
Keep your protection automations
TightWatt optimises cost; it is not a BMS. Keep independent low-voltage and low-SoC protections in place — the install guide shows the tiered pattern I run alongside it.
Running on my own hardware, every day
TightWatt's development system is the 2.32 kW solar + 8 kWh battery installation documented on this site. On 9 July 2026 the whole house drew 6.74 kWh of grid energy for £1.98 — TightWatt buying the bottom of the price curve.
Releases
-
Current release
v3.1.0 — Price-aware charge planner
Ranks every future Agile slot before cutover by price and charges only inside the cheapest set that covers the grid energy still needed after the Victron VRM solar forecast. Slots above the price cap are never bought — a missed SoC target is preferred to expensive charging — while negative-price slots always qualify and sort first. Falls back to the 3.0.x Target-Timeframes behaviour when the Octopus rate-event entities are unavailable.