Octopus Agile in summer: why BatteryWiz banks the midday sun, not the morning sun
A real BatteryWiz solver run on an Octopus Agile summer day. On a half-hourly dynamic tariff the cheapest power is at lunchtime, not midnight - so the optimiser leaves the battery empty all morning, banks the cheap midday sun, and sells it into the 6pm price spike.
- Type
- export
- Difficulty
- advanced
- Required Equipment
- Home battery (>=5 kWh usable), Solar PV array, Octopus Agile tariff (plus Agile Outgoing for export), Hybrid inverter supported by BatteryWiz
If you have heard one rule about home batteries, it is probably "charge overnight when power is cheap." On Octopus Agile in summer, that rule is wrong - and this real solver run shows exactly why.
Octopus Agile is a dynamic tariff: instead of fixed cheap and peak windows, the price changes every 30 minutes and is published a day ahead, tracking the wholesale market. On a sunny summer day the wholesale price collapses around the middle of the day (so much solar floods the grid that power is cheapest at lunchtime) and spikes in the early evening when the sun fades and demand rises. That single fact reshapes the whole battery plan.
This post walks through one real BatteryWiz solver run on Octopus Agile, half-hour by half-hour. The numbers are exactly what the on-device optimiser computed for an 8.6 kWh battery on a bright June day. The interesting part is the chain of decisions that look odd until you see the prices.
How to read the times. The day is split into 48 half-hour slots. A slot labelled
02:00covers 02:00 to 02:30. Prices, solar, load, charge, discharge and grid flows are totals for that whole slot. State of charge (SoC) is the battery level at the end of the slot. Both chart x-axes show slot start times.
The setup
- Tariff: Octopus Agile (region J, Southern England) - a half-hourly dynamic tariff. There are no fixed windows: today's prices ran from a low of 13.5p (around 14:30) to a high of 36.6p (at 18:30), with export paid on Agile Outgoing from 8p to 19.7p. Agile prices are regional and change every day.
- Battery: 8.6 kWh usable, allowed to swing between 20% and 100%, about 4.5 kW max charge / 3.4 kW max discharge, 90% round-trip efficiency.
- Solar forecast: 19.3 kWh - a big, bright summer day, far more solar than the 8.6 kWh battery can hold.
| Battery constraint | Value |
|---|---|
| Usable capacity | 8.6 kWh |
| SoC range | 20% to 100% |
| Max charge rate | 4.5 kW |
| Max discharge rate | 3.4 kW |
| Grid export limit | 3.4 kW (1.7 kWh per half-hour) |
| Round-trip efficiency | 90% |
| Battery-wear cost (degradation) | about 7p per kWh discharged |
| Solar forecast (next 24 h) | 19.3 kWh |
The price profile and what the battery did
Notice the shape: prices dip into the low teens around midday and spike above 35p in the early evening. That is the opposite of the old "cheap at night" picture. Green bars are charging, amber and orange are discharging, grey is idle. Here is the day in five phases (SoC shown at each phase's end):
| Phase (slot start) | Agile prices | What the battery did | SoC by phase end |
|---|---|---|---|
| 00:00 to 05:00 | ~20-22p | Sits at the 20% floor; no grid charging (nothing is cheap yet) | 21% to 20% |
| 05:00 to 10:00 | ~20-24p | Battery stays empty; morning solar is exported straight to the grid | 20% to 20% |
| 10:00 to 16:00 | 13.5-18p (cheapest) | Banks the cheap midday solar into the battery | 20% to ~92% |
| 16:00 to 19:00 | 29-37p (peak) | Discharges into the price spike and exports, capped by the grid limit | 92% to 27% |
| 19:00 to 00:00 | ~22-27p | Covers the home's own load from the battery down to the floor | 27% to 20% |
Overnight (00:00 to 05:00): nothing worth doing
On a fixed tariff this is the cheap window. On Agile today it is not - overnight prices sit around 20-22p, no cheaper than the daytime average. So the battery does nothing: it holds the 20% floor and the small overnight load is met from the grid. There is no point charging at 20p tonight when the same battery can be filled from free solar in a few hours.
Morning (05:00 to 10:00): export the sun, keep the battery empty
Here is the first surprise. From 05:00 the panels are generating (7.6 kWh over the morning), but the battery stays at 20% and every bit of that solar is exported straight to the grid at the morning export rate of about 11-12p. The optimiser deliberately does not charge.
Why leave the battery empty while the sun is up? Because the day will produce 19.3 kWh of solar and the battery only holds about 6.9 kWh of usable room. Most of the solar has to be exported no matter what, so the only question is which solar to keep. The answer comes down to export prices, and that is the next phase.
Midday (10:00 to 16:00): bank the cheap sun, and time it to fill before the peak
Now the battery charges, taking about 6.5 kWh of solar and climbing from 20% to about 92% by 16:00 (the end of the 15:30 slot), right as the evening spike begins. This is exactly when Agile is at its cheapest - import prices bottom out at 13.5p and export prices are only 8-10p. Storing solar now means giving up only an 8-10p export, to sell it later at nearly 20p.
The peak (16:00 to 19:00): wait for the very top, then sell into the spike
As prices climb past 28p at 16:00 the battery does not immediately dump. At 16:00 and 16:30 it sits idle and exports the afternoon solar straight to the grid, waiting for the highest half-hours. The battery-wear cost plays a part here: every discharge carries a roughly 7p per kWh degradation charge (see the constraints table), so for the modest 16-18p export on offer in these two slots the solver prefers to send the free solar to the grid and keep the battery's cycles for the higher-value half-hours just ahead. From 17:00 to 18:30, with import at 34-37p and export at 18-20p, it discharges hard and exports - and runs straight into the grid export limit of 1.7 kWh per half-hour (a 3.4 kW cap), which it hits in the last three slots. State of charge falls from 92% to 27% by 19:00 (the end of the 18:30 slot).
Evening (19:00 to 00:00): spend the rest on the house
The battery still holds 27% after the peak, and that is deliberate: with the evening import price (22-27p) higher than the peak export rate (18-20p), that energy is worth more covering the home than it would have fetched exported (and far more than the ~13p post-peak export rate). So from 20:30 the battery discharges to meet the evening load (self-use), sliding gently down to the 20% floor by midnight.
The constraint moments
1. The cheap window is lunchtime, not midnight. On a fixed time-of-use tariff you charge overnight. On Agile in summer the cheapest power is the midday solar trough, so the battery does no overnight charging at all and instead banks solar in the middle of the day. The whole plan is built around when the dynamic price is low, which is the opposite of the usual intuition.
2. Export the morning sun, bank the midday sun. This is the subtle one. The battery sits empty all morning while solar is exported, then fills at midday. Why not charge in the morning? Because the battery can only keep a fraction of the day's 19.3 kWh of solar, so it keeps the solar that is cheapest to keep. Morning export pays about 11-12p; midday export pays only 8-10p. So the solver sells the morning sun at the better rate and stores the midday sun (the cheaper export to give up), then resells it at the 18-20p evening peak. Keep the low-value energy, sell the high-value energy now.
3. Why the battery does not empty at the peak. This is the decision people find most surprising, and it is planned from the start: the optimiser solves the whole day at once, so it could have exported more, and earlier, if that paid better, and deliberately did not. The reason it holds 27% at 7pm rather than draining to the floor is opportunity cost. Unlike a fixed tariff, here the peak export price (18-20p) is actually lower than the evening import price (22-27p). A kWh kept back to cover the evening's own load avoids buying at 22-27p later, which is worth more than exporting it at the peak for 18-20p. So the optimiser reserves roughly enough to ride out the evening and exports only the surplus above that. This is the mirror image of the Flux day, where peak export beat the evening import rate and the battery emptied completely into the grid.
The export limit plays a separate role. It does not decide how much to hold back - that is the opportunity cost above - but it shapes how the surplus is sold. No single half-hour can absorb it all: export is capped at 1.7 kWh per half-hour (you can see it pin to exactly 1.70 at 17:30, 18:00 and 18:30), and the battery cannot discharge faster than its 3.4 kW rate anyway. So rather than targeting the single dearest slot, the solver spreads the sale across the dearest few half-hours, filling each up to the cap.
4. Price overrides the battery-smoothing preference. On the Flux day, the peak half-hours were all priced the same, so a small built-in preference for an even discharge rate (gentler on the cells) made the discharge perfectly flat. Here, with a different price every half-hour, that tie-breaker barely registers: the solver fills the dearest slots first and accepts an uneven discharge (0.74 kWh at 17:00 rising to 1.56 kWh at 18:30) because the price gaps dwarf the smoothing preference. When the price signal is strong, economics wins and smoothing steps aside.
Put together, the day is a deliberate mix: export surplus solar, bank the cheapest solar, arbitrage it into the evening spike, then self-consume the remainder. No single rule produces it.
Day summary
| Metric | Value |
|---|---|
| Grid import | 0.5 kWh (about £0.11) |
| Grid export | 14.5 kWh (about £2.17) |
| Net grid position with battery | earns about £2.06 on the day |
| Projected saving vs self-consumption | about £0.81 |
| Battery charged / discharged | 6.5 kWh / 5.9 kWh |
| Throughput | 12.4 kWh (about 0.72 full cycles) |
Most of the day's value is export: a big solar day on Agile is really an export game, and the optimiser's edge is timing - selling morning solar at the morning rate and saving midday solar for the evening spike, rather than dribbling it all out at the midday lows.
One more thing: this is a plan, not a commitment
The 48-slot schedule above is a look-ahead, not a fixed timetable. BatteryWiz solves the whole next 24 hours to make a good decision now, applies only the next one to five half-hour slots (your setting), and then re-solves every 30 minutes in the background. That matters even more on Agile than on a fixed tariff: tomorrow's half-hourly prices are published each afternoon, and the live solar and load forecasts keep shifting, so each re-run folds in the latest numbers. The clean "empty all morning, full by 4pm, sold into the spike" arc you see here is the intended path; the live plan nudges toward it as the day unfolds.
The full decision log (all 48 slots)
Energy columns (Solar, Load, Charge, Dischg, Grid imp, Grid exp) are in kWh. Import p / Export p are in p/kWh. SoC is the battery percent at the end of each 30-minute slot.
Action key: charge (solar) = battery filled from solar surplus; charge (grid) = grid energy bought to charge; discharge (home) = battery powers the house (self-use); discharge (export) = battery exported to the grid.
| # | Slot | Import p | Export p | Solar | Load | Action | Charge | Dischg | Grid imp | Grid exp | SoC |
|---|---|---|---|---|---|---|---|---|---|---|---|
| 0 | 00:00 | 21.0 | 11.1 | 0.00 | 0.09 | idle | 0.00 | 0.00 | 0.09 | 0.00 | 21% |
| 1 | 00:30 | 22.2 | 11.5 | 0.00 | 0.09 | discharge (home) | 0.00 | 0.08 | 0.00 | 0.00 | 20% |
| 2 | 01:00 | 22.0 | 11.5 | 0.00 | 0.08 | idle | 0.00 | 0.00 | 0.08 | 0.00 | 20% |
| 3 | 01:30 | 20.8 | 11.0 | 0.00 | 0.06 | idle | 0.00 | 0.00 | 0.06 | 0.00 | 20% |
| 4 | 02:00 | 20.4 | 10.8 | 0.00 | 0.07 | idle | 0.00 | 0.00 | 0.07 | 0.00 | 20% |
| 5 | 02:30 | 20.3 | 10.8 | 0.00 | 0.04 | idle | 0.00 | 0.00 | 0.04 | 0.00 | 20% |
| 6 | 03:00 | 19.8 | 10.6 | 0.00 | 0.05 | idle | 0.00 | 0.00 | 0.05 | 0.00 | 20% |
| 7 | 03:30 | 19.5 | 10.4 | 0.00 | 0.04 | idle | 0.00 | 0.00 | 0.04 | 0.00 | 20% |
| 8 | 04:00 | 20.1 | 10.7 | 0.00 | 0.07 | idle | 0.00 | 0.00 | 0.07 | 0.00 | 20% |
| 9 | 04:30 | 19.9 | 10.6 | 0.00 | 0.04 | idle | 0.00 | 0.00 | 0.04 | 0.00 | 20% |
| 10 | 05:00 | 20.7 | 11.0 | 0.18 | 0.04 | idle | 0.00 | 0.00 | 0.00 | 0.14 | 20% |
| 11 | 05:30 | 21.0 | 11.1 | 0.45 | 0.05 | idle | 0.00 | 0.00 | 0.00 | 0.41 | 20% |
| 12 | 06:00 | 21.2 | 11.1 | 0.67 | 0.05 | idle | 0.00 | 0.00 | 0.00 | 0.62 | 20% |
| 13 | 06:30 | 23.4 | 12.1 | 0.82 | 0.04 | idle | 0.00 | 0.00 | 0.00 | 0.78 | 20% |
| 14 | 07:00 | 23.1 | 11.9 | 0.92 | 0.04 | idle | 0.00 | 0.00 | 0.00 | 0.88 | 20% |
| 15 | 07:30 | 23.8 | 12.2 | 0.96 | 0.04 | idle | 0.00 | 0.00 | 0.00 | 0.91 | 20% |
| 16 | 08:00 | 23.8 | 12.2 | 0.94 | 0.07 | idle | 0.00 | 0.00 | 0.00 | 0.88 | 20% |
| 17 | 08:30 | 22.4 | 11.6 | 0.92 | 0.09 | idle | 0.00 | 0.00 | 0.00 | 0.83 | 20% |
| 18 | 09:00 | 20.6 | 10.9 | 0.87 | 0.12 | idle | 0.00 | 0.00 | 0.00 | 0.76 | 20% |
| 19 | 09:30 | 19.6 | 10.5 | 0.84 | 0.14 | idle | 0.00 | 0.00 | 0.00 | 0.70 | 20% |
| 20 | 10:00 | 18.4 | 10.0 | 0.83 | 0.15 | charge (solar) | 0.68 | 0.00 | 0.00 | 0.00 | 28% |
| 21 | 10:30 | 17.3 | 9.5 | 0.83 | 0.14 | charge (solar) | 0.69 | 0.00 | 0.00 | 0.00 | 35% |
| 22 | 11:00 | 16.3 | 9.2 | 0.82 | 0.12 | charge (solar) | 0.70 | 0.00 | 0.00 | 0.00 | 43% |
| 23 | 11:30 | 15.9 | 9.0 | 0.81 | 0.12 | charge (solar) | 0.70 | 0.00 | 0.00 | 0.00 | 51% |
| 24 | 12:00 | 16.6 | 9.3 | 0.80 | 0.15 | charge (solar) | 0.65 | 0.00 | 0.00 | 0.00 | 58% |
| 25 | 12:30 | 15.3 | 8.8 | 0.79 | 0.24 | charge (solar) | 0.55 | 0.00 | 0.00 | 0.00 | 64% |
| 26 | 13:00 | 15.0 | 8.6 | 0.77 | 0.21 | charge (solar) | 0.56 | 0.00 | 0.00 | 0.00 | 70% |
| 27 | 13:30 | 14.5 | 8.4 | 0.73 | 0.18 | charge (solar) | 0.56 | 0.00 | 0.00 | 0.00 | 76% |
| 28 | 14:00 | 13.6 | 8.1 | 0.70 | 0.16 | idle | 0.00 | 0.00 | 0.00 | 0.54 | 76% |
| 29 | 14:30 | 13.5 | 8.0 | 0.65 | 0.16 | charge (solar) | 0.50 | 0.00 | 0.00 | 0.00 | 82% |
| 30 | 15:00 | 14.0 | 8.2 | 0.60 | 0.13 | charge (solar) | 0.47 | 0.00 | 0.00 | 0.00 | 87% |
| 31 | 15:30 | 14.9 | 8.6 | 0.55 | 0.12 | charge (solar) | 0.43 | 0.00 | 0.00 | 0.00 | 92% |
| 32 | 16:00 | 28.7 | 16.5 | 0.51 | 0.11 | idle | 0.00 | 0.00 | 0.00 | 0.40 | 92% |
| 33 | 16:30 | 32.1 | 17.9 | 0.46 | 0.11 | idle | 0.00 | 0.00 | 0.00 | 0.34 | 92% |
| 34 | 17:00 | 33.6 | 18.5 | 0.40 | 0.15 | discharge (export) | 0.00 | 0.74 | 0.00 | 0.99 | 82% |
| 35 | 17:30 | 34.8 | 19.0 | 0.35 | 0.12 | discharge (export) | 0.00 | 1.47 | 0.00 | 1.70 | 65% |
| 36 | 18:00 | 35.4 | 19.2 | 0.31 | 0.11 | discharge (export) | 0.00 | 1.50 | 0.00 | 1.70 | 46% |
| 37 | 18:30 | 36.6 | 19.7 | 0.27 | 0.13 | discharge (export) | 0.00 | 1.56 | 0.00 | 1.70 | 27% |
| 38 | 19:00 | 25.5 | 12.9 | 0.23 | 0.10 | idle | 0.00 | 0.00 | 0.00 | 0.13 | 27% |
| 39 | 19:30 | 25.8 | 13.0 | 0.18 | 0.10 | idle | 0.00 | 0.00 | 0.00 | 0.09 | 27% |
| 40 | 20:00 | 26.5 | 13.3 | 0.13 | 0.10 | idle | 0.00 | 0.00 | 0.00 | 0.03 | 27% |
| 41 | 20:30 | 26.5 | 13.3 | 0.04 | 0.10 | discharge (home) | 0.00 | 0.05 | 0.00 | 0.00 | 26% |
| 42 | 21:00 | 26.4 | 13.3 | 0.00 | 0.10 | discharge (home) | 0.00 | 0.10 | 0.00 | 0.00 | 25% |
| 43 | 21:30 | 26.6 | 13.3 | 0.00 | 0.09 | discharge (home) | 0.00 | 0.09 | 0.00 | 0.00 | 24% |
| 44 | 22:00 | 24.1 | 12.3 | 0.00 | 0.09 | discharge (home) | 0.00 | 0.09 | 0.00 | 0.00 | 23% |
| 45 | 22:30 | 21.7 | 11.3 | 0.00 | 0.08 | discharge (home) | 0.00 | 0.08 | 0.00 | 0.00 | 22% |
| 46 | 23:00 | 21.9 | 11.4 | 0.00 | 0.08 | discharge (home) | 0.00 | 0.08 | 0.00 | 0.00 | 21% |
| 47 | 23:30 | 21.7 | 11.3 | 0.00 | 0.08 | discharge (home) | 0.00 | 0.08 | 0.00 | 0.00 | 20% |
How Agile differs from a fixed tariff like Octopus Flux
If you have read our Octopus Flux summer walkthrough, the contrast is the whole point. Flux has three fixed windows that repeat every day, so the plan is predictable: a small cheap-rate top-up overnight, solar through the day, a force-export at the set 4-7pm peak. Agile has no fixed windows - the optimiser reads 48 individual prices and finds the cheapest and dearest half-hours wherever they land. On this summer day that meant no overnight charging at all (nothing was cheap), charging in the midday price trough, and concentrating the discharge into the single dearest half-hours rather than a flat block. Same battery, same solar; a completely different shape, because the price signal is completely different.
What changes in winter
In winter the picture flips: little solar to bank, and the cheapest Agile half-hours often return to the small hours overnight. The battery then charges from the grid in the cheapest overnight slots and discharges through the evening peak to avoid expensive imports rather than to export. We will cover an Agile winter day in a later post.
Frequently Asked Questions
- Why didn't BatteryWiz charge the battery overnight when power is "cheap"?
- On Octopus Agile the price changes every half-hour, and on this summer day the overnight slots were not cheap (around 20-22p) - the cheapest power was the midday solar trough. So there was nothing worth charging from overnight. The battery instead filled from free solar in the middle of the day. "Cheap overnight" is a fixed-tariff habit; Agile rewards charging whenever the price is actually lowest, which in summer is often lunchtime.
- The panels were generating from 5am, so why did the battery stay empty until 10am?
- The day produced about 19.3 kWh of solar but the battery only holds around 6.9 kWh of usable room, so most of the solar has to be exported regardless. The optimiser keeps the solar that is cheapest to keep: morning export paid about 11-12p while midday export paid only 8-10p, so it sold the morning sun at the better rate and stored the midday sun (the cheaper export to give up) to resell into the 18-20p evening spike.
- Why didn't the battery empty completely during the evening peak?
- Two reasons. First, it was worth keeping some back: today the peak export price (18-20p) was actually lower than the evening import price (22-27p), so a kWh saved to cover the evening's own load avoids a 22-27p purchase, which beats exporting it at 18-20p. The optimiser reserved roughly enough for the evening and exported the rest. Second, your grid connection caps export at 1.7 kWh per half-hour, so the surplus it *did* sell had to be spread across the dearest few slots rather than dumped into the single highest-priced one (it hit that cap in three consecutive peak slots). (On the Flux day the opposite trade applied: peak export beat the evening import price, so the battery emptied fully into the grid.)
- Does Agile ever go negative, and would BatteryWiz use that?
- Yes - on very windy or sunny low-demand days Agile prices can briefly go negative, meaning you are paid to consume. This particular day did not have negative prices (the lowest was 13.5p), but when they occur the optimiser will happily import and charge during those slots. Because BatteryWiz reads all 48 prices, it spots and exploits those moments automatically.
- Is this whole-day schedule fixed once it is made?
- No. BatteryWiz plans 24 hours ahead but applies only the next one to five half-hour slots, then re-solves every 30 minutes. On Agile that is especially useful: next-day prices are published each afternoon and the solar and load forecasts keep updating, so the plan continuously adapts.
- How is this different from a fixed time-of-use tariff like Octopus Flux?
- Flux has set cheap and peak windows that repeat daily, so its plan is predictable. Agile is dynamic - 48 prices a day that move with the market - so the optimiser finds the cheapest and dearest half-hours wherever they fall, which in summer means charging at midday rather than overnight. See our Octopus Flux walkthrough for the fixed-tariff version of the same day.
- Does this need an export (outgoing) tariff?
- To capture the value shown here, yes - most of the day's benefit came from exporting at the right times, which needs an export tariff such as Agile Outgoing. Without an export tariff the same logic still applies to *avoiding* expensive imports (charging cheap, discharging into the peak to cover your own load), just with less upside.
Related Content
Octopus Agile: Half-Hourly Dynamic Electricity Tariff
Octopus Agile prices change every 30 minutes - and can go negative, paying you to use electricity. No exit fee, no fixed term. Pair with Agile Outgoing for dynamic export rates, and let BatteryWiz schedule your battery around the cheapest slots every day.
Energy Arbitrage vs Peak Shaving: What's the Difference for Home Batteries?
Energy arbitrage and peak shaving are often treated as separate strategies for home batteries, but they're not. This article explains what each term actually means for UK battery owners, where they overlap, which tariffs support each approach, and how to calculate whether arbitrage is genuinely worth it after accounting for round-trip efficiency losses and battery wear.