Back to Strategies
export
intermediate

Octopus Flux in summer: why BatteryWiz barely touches the cheap night rate

A real BatteryWiz solver run on an Octopus Flux summer day. See why the optimiser skips most of the cheap 2-5 am window, fills the battery from solar instead, and empties it into the grid at the 4-7 pm peak, slot by slot.

Published: 9 June 2026
Last reviewed: 9 June 2026
Share:
Type
export
Difficulty
intermediate
Required Equipment
Home battery (>=5 kWh usable), Solar PV array, Octopus Flux tariff, Hybrid inverter supported by BatteryWiz

On a clear day, a home battery on Octopus Flux - a fixed time-of-use tariff with set cheap and peak windows - looks easy to optimise: charge cheap at night, discharge at the evening peak. But add solar, and a forecast that is not quite average, and the "obvious" plan turns out to be the wrong one.

This post walks through a real BatteryWiz solver run for a summer day on Octopus Flux, half-hour by half-hour. The numbers below are exactly what the on-device optimiser computed (an 8.6 kWh battery, solved just after midnight). The interesting part is not that it saves money. It is why it does several things that look counter-intuitive.

How to read the times. The day is split into 48 half-hour slots. A slot labelled 02:00 covers 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 Flux, three price windows a day:
    • Off-peak 02:00 to 05:00: import 15.49p, export 5.05p
    • Peak 16:00 to 19:00: import 36.13p, export 29.79p
    • Standard (the rest): import 25.80p, export 10.24p
  • Battery: 8.6 kWh usable, allowed to swing between 20% and 100%, 4.5 kW max charge / 3.4 kW max discharge constraints, 90% round-trip efficiency.
  • Solar forecast: 11.3 kWh for the day, a below-average summer day (thin, variable cloud), which turns out to matter.
Battery constraintValue
Usable capacity8.6 kWh
SoC range20% to 100%
Max charge rate4.5 kW
Max discharge rate3.4 kW
Round-trip efficiency90%
Solar forecast (next 24 h)11.3 kWh

The price profile and what the battery did

Import price per 30-min slot, bars coloured by battery action; x-axis = slot start time

Green bars are charging, amber and orange are discharging, grey is idle. Here is the day in five windows (SoC shown at each window's end):

Window (slot start)Flux periodWhat the battery didSoC by window end
01:00 to 02:00Standard (25.8p)Coasts on the battery for tiny overnight load21% to 20%
02:00 to 05:00Off-peak (15.49p)Small grid top-up, about 0.9 kWh20% to ~30%
05:00 to 16:00Standard (25.8p)Solar runs the house and charges the battery with the surplus; no grid import~30% to 100%
16:00 to 19:00Peak (36.13p in / 29.79p out)Force-discharges to the grid, about 8 kWh exported100% to 20%
19:00 to 00:30Standard (25.8p)Sits near the 20% floor; minor solar and import~20% to 23%

Overnight (02:00 to 05:00): a sip of cheap power, not a full tank

This is the first surprise. The off-peak window is the cheapest grid electricity of the day (15.49p), and a naive rule would "fill the battery while it is cheap." BatteryWiz did not. It took only a modest top-up, about 0.15 kWh per half-hour, lifting the battery from its 20% floor to roughly 30% by 05:00 (when the off-peak window closes), then stopped. That is only about 0.9 kWh of grid charging all night.

Why hold back? Because the solver expects about 11 kWh of free solar that day, and that solar feeds the house first, with only the leftover charging the battery. Even after covering daytime load, the expected surplus is comfortably enough to refill the battery from a low start, so an overnight grid top-up is mostly redundant: you would be paying 15.49p for energy the sun would have supplied for nothing a few hours later. Charging fully overnight would also leave no headroom for that solar, forcing some of it out to the grid at the low 10.24p daytime rate instead of being saved for the 29.79p peak. So the solver charges just enough to bridge to sunrise and leaves most of the battery empty for the sun.

The nuance worth calling out: on an average summer day, with stronger generation, the solver often skips overnight grid charging entirely. Today's forecast was on the low side, so it adjusted, adding that small overnight buffer rather than risking an empty battery if the sun underdelivered. Same tariff, same battery, different forecast, different overnight decision.

Daytime (05:00 to 16:00): bank the sun, and time it to the minute

From dawn, solar does two jobs at once: it powers the house directly, and the leftover charges the battery. So there is no grid import at all through the day. The split is visible in the numbers: at 13:00, for example, 0.55 kWh of solar covers the 0.18 kWh of household load and the remaining 0.37 kWh tops up the battery. State of charge climbs steadily and reaches 100% at 16:00 (the end of the 15:30 slot), exactly as the peak window opens.

Battery state of charge at the end of each 30-min slot; x-axis = slot start time

That timing is not luck. A full battery sitting around mid-morning would be wasted potential; an empty one at 4 pm would miss the peak. The optimiser paces the solar charge so the battery arrives at 100% right as the most valuable selling window begins.

The peak (16:00 to 19:00): sell everything, down to the floor

Now the battery does the opposite of charging: it discharges steadily and exports to the grid at the 29.79p peak rate, roughly 1.1 kWh of battery per half-hour, on top of the solar left after the house load is met, for about 1.2 to 1.5 kWh exported each slot. State of charge falls in a near-straight line from 100% to exactly 20% by 19:00 (the end of the 18:30 slot), as the peak window closes.

Note it is exporting, not just covering the house. Household load in these slots is tiny (about 0.1 kWh); almost everything goes to the grid. Over the peak the run exports about 8 kWh and earns roughly £2.45.

There is a subtle detail in that "near-straight line": the battery discharges the same amount, about 1.1 kWh, in every single peak slot, rather than emptying quickly and coasting. That evenness is deliberate. Because every half-hour of the peak pays the same 29.79p, the plan earns identical revenue no matter how the discharge is spread across the window, so the solver is free to choose the shape. BatteryWiz uses that freedom to keep the discharge rate even, guided by a tiny built-in preference for holding down the highest rate the battery ever has to hit. A gentle, steady draw is easier on the cells than short, hard bursts, so this helps prolong battery life. The preference is deliberately featherweight: it only ever decides between plans that earn essentially the same money. The moment a smoother discharge would cost anything meaningful, the solver drops it and optimises purely for price.

The same gentle smoothing is applied when the battery is force-charged from the grid (solar charging is left free to grab whatever the sun offers, whenever it offers it). You will not see it much on a sunny day like this one, but it matters most in winter: with little solar, the battery is topped up from the grid at higher power during cheap windows, and keeping that charge rate even does the most to protect the cells.

Evening (19:00 onward): living at the floor

After the peak the battery is parked at its 20% floor. A little late solar nudges it up to about 23% just after the peak, then small evening loads are covered by a trickle from the battery and a handful of modest 25.80p grid imports. Total evening import is small, only around 10p.

The constraint moment: an opportunity cost most rules miss

Here is the decision that looks wrong. By 19:00 the battery is empty (at the 20% floor), and the household still needs power all evening. Would it not be smarter to keep some charge back to avoid buying at 25.80p later?

No, and the arithmetic is the whole point. What matters is the energy the battery can actually deliver, and that same delivered energy is worth different amounts depending on where it goes:

  • Sent to the grid at the peak, every kWh the battery delivers earns 29.79p.
  • Kept to power the house in the evening, that same kWh only avoids about 25.80p of import.
  • So exporting at the peak beats hoarding by about 4p per kWh of battery output.

It is the same energy leaving the battery either way, so the battery's internal losses do not tip the balance: they apply equally to export and to self-consumption, and cancel out. The comparison comes down purely to 29.79p versus 25.80p.

The solver runs that comparison across all 48 half-hours at once and concludes: drain the battery into the peak, accept a slightly higher evening grid bill, and come out ahead overall. The "cost" of the empty evening battery is real, that is the opportunity cost, but it is smaller than the peak-export prize. This is why an optimal day is rarely one clean strategy. It is a deliberate mix of solar self-consumption, a dash of off-peak arbitrage, peak export, and just-in-time grid import, each used exactly where it pays.

Day summary

MetricValue
Grid import1.7 kWh (about £0.31)
Grid export8.2 kWh (about £2.45)
Net grid position with batteryearns about £2.14 on the day
Projected saving vs self-consumptionabout £1.43
Battery charged / discharged7.5 kWh / 6.9 kWh
Throughput14.4 kWh (about 0.84 full cycles)

The "projected saving" is BatteryWiz's own figure: the optimised plan compared against a plain self-consumption baseline using the same battery. The optimiser earns far more than self-consumption alone, almost entirely by timing the export into the peak rather than dribbling solar to the grid at the standard 10.24p all day.

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, but it only applies the next one to five half-hour slots (depending on your settings) and then re-solves every 30 minutes when running in the background. Each re-run folds in the latest reality: actual battery level, updated solar and load forecasts, and any price changes. So the plan continuously adapts. The clean "charge to 100% by 16:00, empty by 19:00" arc you see here is the intended path; the live schedule nudges itself toward it as the day actually unfolds.

The full decision log (all 48 slots)

This is the raw output the optimiser produced. 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 (force-charge); discharge (home) = battery powers the house (self-use); discharge (export) = battery exported to the grid (force-discharge).

#SlotImport pExport pSolarLoadActionChargeDischgGrid impGrid expSoC
001:0025.810.20.000.06discharge (home)0.000.040.030.0021%
101:3025.810.20.000.05discharge (home)0.000.050.000.0020%
202:0015.55.00.000.05charge (grid)0.150.000.200.0022%
302:3015.55.00.000.07charge (grid)0.150.000.230.0023%
403:0015.55.00.000.02charge (grid)0.150.000.170.0025%
503:3015.55.00.000.08charge (grid)0.150.000.240.0027%
604:0015.55.00.000.06charge (grid)0.150.000.210.0029%
704:3015.55.00.000.04charge (grid)0.150.000.200.0030%
805:0025.810.20.010.03discharge (home)0.000.020.000.0030%
905:3025.810.20.020.03discharge (home)0.000.010.000.0030%
1006:0025.810.20.050.03charge (solar)0.010.000.000.0030%
1106:3025.810.20.100.03charge (solar)0.070.000.000.0031%
1207:0025.810.20.170.03charge (solar)0.140.000.000.0032%
1307:3025.810.20.250.03charge (solar)0.220.000.000.0035%
1408:0025.810.20.330.06charge (solar)0.270.000.000.0038%
1508:3025.810.20.380.12charge (solar)0.260.000.000.0041%
1609:0025.810.20.420.12charge (solar)0.300.000.000.0044%
1709:3025.810.20.430.14charge (solar)0.300.000.000.0047%
1810:0025.810.20.430.11charge (solar)0.320.000.000.0051%
1910:3025.810.20.420.11charge (solar)0.310.000.000.0054%
2011:0025.810.20.410.11charge (solar)0.300.000.000.0058%
2111:3025.810.20.400.09charge (solar)0.300.000.000.0061%
2212:0025.810.20.410.11charge (solar)0.300.000.000.0064%
2312:3025.810.20.450.20charge (solar)0.250.000.000.0067%
2413:0025.810.20.550.18charge (solar)0.370.000.000.0071%
2513:3025.810.20.680.17charge (solar)0.510.000.000.0077%
2614:0025.810.20.700.14charge (solar)0.560.000.000.0083%
2714:3025.810.20.680.15charge (solar)0.530.000.000.0089%
2815:0025.810.20.630.11charge (solar)0.530.000.000.0095%
2915:3025.810.20.580.09charge (solar)0.490.000.000.00100%
3016:0036.129.80.530.09discharge (export)0.001.090.001.5387%
3116:3036.129.80.470.09discharge (export)0.001.090.001.4673%
3217:0036.129.80.400.09discharge (export)0.001.090.001.4160%
3317:3036.129.80.360.10discharge (export)0.001.090.001.3547%
3418:0036.129.80.320.12discharge (export)0.001.090.001.2833%
3518:3036.129.80.260.15discharge (export)0.001.090.001.2020%
3619:0025.810.20.210.07charge (solar)0.140.000.000.0022%
3719:3025.810.20.150.06charge (solar)0.090.000.000.0023%
3820:0025.810.20.090.08charge (solar)0.010.000.000.0023%
3920:3025.810.20.030.08discharge (home)0.000.050.000.0022%
4021:0025.810.20.000.07discharge (home)0.000.070.000.0021%
4121:3025.810.20.000.07idle0.000.000.070.0021%
4222:0025.810.20.000.08idle0.000.000.080.0021%
4322:3025.810.20.000.08discharge (home)0.000.080.000.0020%
4423:0025.810.20.000.08idle0.000.000.080.0020%
4523:3025.810.20.000.08idle0.000.000.080.0020%
4600:0025.810.20.000.08discharge (home)0.000.020.060.0020%
4700:3025.810.20.000.08idle0.000.000.080.0020%

How this applies to other fixed time-of-use tariffs

Octopus Flux is a fixed time-of-use (ToU) tariff: its cheap and peak windows are set in advance, so the same daily shape repeats. The core moves in this post carry over to any fixed ToU tariff that pairs a cheap overnight window with an expensive evening peak, such as Cosy Octopus, Octopus Go, Intelligent Octopus Go, or an old-style Economy 7 setup:

  • Do not blindly fill the battery in the cheap window if solar is expected to do it for free; charge only enough to bridge to sunrise.
  • Use daytime solar to run the house and bank the surplus, aiming to be full before the expensive window.
  • Treat the minimum state-of-charge floor as a hard limit.

The one move that is not universal is the peak export. Flux is unusual in paying a high rate to export during its peak window, which is why the battery here empties into the grid rather than the house. On tariffs that only have a cheap import window and no premium export rate (Cosy Octopus, Octopus Go, Intelligent Octopus Go, Economy 7), the final step flips: instead of exporting at the peak, the battery discharges to cover the home's own load and avoid buying at the expensive rate. Same solar-banking strategy, different endgame.

Half-hourly dynamic tariffs such as Octopus Agile are a different case again, because prices change every 30 minutes rather than following fixed windows. They get their own walkthrough in a separate post.

What changes on other days

On a brighter summer day the overnight grid sip disappears entirely, and solar alone fills the battery. In winter, with little solar and higher prices, the same Flux structure flips the emphasis to overnight charging. We will cover those in the next posts in this series.

Frequently Asked Questions

Why didn't BatteryWiz fully charge the battery on the cheap overnight rate?
Because it expected about 11 kWh of free solar that day, and the battery only holds 8.6 kWh. Filling it from the grid overnight would leave no room for the sun and mean paying for energy it could get for nothing. It charged just enough (to about 30%) to safely reach sunrise, then let solar do the rest. On a sunnier day it skips overnight grid charging altogether.
The battery was empty by 7 pm. Won't I pay more for electricity in the evening?
Slightly, yes, and that is a deliberate trade. The same energy out of the battery earns 29.79p if it is exported at the peak, but only saves about 25.80p if it is kept to run the house later, so exporting wins by roughly 4p per kWh. The solver takes the bigger win and accepts a small evening grid bill. The day still comes out ahead.
Does exporting to the grid wear the battery out faster?
The plan cycles the battery about 0.84 full cycles on this day, and the optimiser includes a battery-degradation cost in its maths. It only cycles when the financial gain clearly outweighs the wear. It also never discharges below the minimum state of charge you set (20% in this example).
What if the solar forecast is wrong?
The schedule is not fixed. BatteryWiz re-solves every 30 minutes using updated forecasts and the actual battery level. If the sun underdelivers, a re-solve can cover the gap with a little grid import or charging rather than draining the battery early, because holding that charge for the 29.79p peak export is usually worth more than the standard-rate import it would save. If the sun overdelivers, it simply exports more. The 24-hour plan guides the next few slots; it is not locked in.
Is this whole-day schedule applied all at once?
No. The optimiser plans 24 hours ahead to make a good decision now, but applies only the next one to five half-hour slots (your setting), then re-runs. You are always acting on the freshest data.
Does this strategy need solar?
This particular day is solar-led. Without solar, the same Flux structure still works but leans on overnight off-peak charging and discharging through the peak, a different mix we cover in a separate post.
Does this work on other fixed time-of-use tariffs like Cosy Octopus or Octopus Go?
The core strategy does. On any fixed time-of-use tariff with a cheap window and an expensive peak, BatteryWiz holds back on overnight grid charging when solar is expected, banks the daytime solar, and saves the battery for the costly window. The difference is the final step: Flux pays a high rate to export at its peak, so the battery sells into the grid; tariffs with only a cheap import window (Cosy Octopus, Octopus Go, Intelligent Octopus Go, Economy 7) instead discharge the battery to power the house and dodge the peak import price. Half-hourly tariffs such as Octopus Agile are a different case, covered separately.

Related Content