Self-hosted solar + battery ROI tracker, motorbike trip writeups with GPS routes, and notes on building it all with Claude Code.
Solar & Battery ROI: Agile vs the Price Cap
solarbatteryoctopus-agileenergy
In July 2025 I installed solar panels and a battery in a one-bed flat in south London. Small panels, a 6.7 kWh LiFePO4 battery, and a Victron charge controller. Total spend: £2,203.
Every kilowatt-hour the system produces or shifts is one I don't have to buy at the Ofgem price cap. This page tracks — live, from Home Assistant — exactly how much I've saved so far, and which part of the kit is doing the most work.
Last updated: 16 May 2026 22:22 BST
Next update at: 23:22 BST
Two destinations for grid imports. A chunk
goes through the charger to power the microgrid (TVs, computers,
networking, e-bike, lighting), with the surplus banked in the battery
for later.
Bigger appliances (fridge, freezer, oven,
washer) stay on the main grid direct. Solar offsets both whenever it's
producing.
Internally the charger and inverter share a DC
busbar with the battery — the battery box here stands in for that
whole DC node.
Invested
£2,203
Saved so far
£191
vs price cap
Payback
8.68%
of investment
Projected
9.6
years to break even
Solar lifetime
229
kWh
Battery out
689
kWh
Grid → batt
790
kWh AC
Battery now
32%
SOC
Running
305
days
What It Cost — Purchase records
The core system went in on 15 July 2025 (panels, battery, charge controller). Two more panels were bolted on in November once the summer yield curve tailed off. Only the panels are outside — mounted in the garden on bespoke frames I built from salvaged wooden pallets. The battery, MPPT and inverter live inside on a board.
▾13 items · total invested £2,203click for full breakdown
Victron 250A 6P busbars with cover (2×, replacing original busbar after thermal events)
08 May 2026
£120.00
Total investment
£2,203
What It Produced — Home Assistant
Live, lifetime totals. The system has been running for 305 days since commissioning in July 2025.
Meter
Value
Solar generated (lifetime)
229 kWh
Battery charged (lifetime in)
711 kWh
Battery discharged (lifetime out)
689 kWh
Battery currently stored
2.1 kWh (32% SoC)
▾Battery is 97% round-trip efficient — what does that mean?click to expand
97% of the energy I put in comes back out: 689 kWh out + 2.11 kWh currently stored, ÷ 711 kWh in. Most batteries lose ~5–10% as heat in each charge / discharge cycle; LiFePO4 is at the efficient end.
The 2.11 kWh sitting in the pack right now is a pending saving of ~£0.27 once it discharges.
Grid charging is on, but only fires during plunge slots (Octopus paying me to consume, ≤ 0 p/kWh) or very cheap slots (< 5 p/kWh) — an Agile-aware planner script reconsiders every 30 minutes and skips charging when forecast solar plus current SOC are enough to bridge to the next cheap window. Across the whole install every kWh into the pack has averaged 13.2 p/kWh (grid cost ÷ total DC in). At today's cap rate of 25.77 p/kWh that's a saving of 12.6 p/kWh on every kWh the battery delivers, and the figure keeps falling as solar yield grows and plunge captures stack up.
▾Solar lifetime — daily generation chartclick for chart
Daily kWh produced by the panels, sourced from HA long-term statistics so labels and values match HA Energy Dashboard. Peak day so far: 3.4 kWh; midwinter days often well under 1 kWh.
▾Battery discharge — daily kWh outclick for chart
Daily kWh discharged from the battery to the microgrid, sourced from HA long-term statistics for the BMS output counter — same source as the Energy Dashboard.
May 2026 So Far — Octopus half-hourly
The lifetime rollup further down spans 285 days; this is the snapshot for the current month. Real Octopus half-hourly imports over 1–16 May 2026 (16 days) priced two ways: what I actually paid (Agile + battery time-shifting + solar) versus what the same kWh would have cost on the Ofgem default tariff cap (25.77p/kWh, consumption-weighted across the install period). All cap comparisons later in the post use this same weighted rate.
Item
On cap
I paid
Saved
Unit cost (55 kWh)
£13.04
£10.56
£2.48
Standing charge (16 days)
£7.53
£9.48
£-1.96
Total
£20.56
£20.04
£0.52
This month I've paid £10.56 in unit costs against £13.04 on cap — about 81% of what the same demand would have cost a cap-tariff household. After standing charges, the bottom-line bill is £20.04 vs £20.56, a saving of £0.52 (3%). My current tariff (Octopus Agile, daily standing 59.27p) charges more standing than the cap (44.29p), so a small chunk of the unit-cost win is given back on the standing line — but the plunge wins on the unit side more than make up for it.
▾Previous months — final figuresclick to expand
Month
kWh
On cap
I paid
Saved
Apr 2026
223
£76.88
£26.02
£50.86
Mar 2026
176
£65.41
£41.69
£23.72
Feb 2026
127
£47.25
£32.74
£14.51
Jan 2026
158
£56.75
£47.42
£9.32
Dec 2025
191
£62.13
£45.78
£16.35
Nov 2025
185
£60.30
£45.57
£14.72
Oct 2025
179
£58.56
£37.65
£20.91
Sep 2025
142
£53.51
£31.42
£22.09
Aug 2025
158
£56.75
£39.13
£17.62
Jul 2025*
84
£28.35
£26.88
£1.47
Total (10 months)
£191.58
* partial month (install or current cutover).
Actual Bill vs Price Cap — Octopus half-hourly
This is the ground-truth answer, attributed three ways: what I actually paid Octopus, what I'd have paid on Agile without the battery (time-shift removed, charging removed, loads priced at the Agile rate in force when they happened), and what the Ofgem default tariff cap would have charged for the same household demand. Plunge credits when rates went negative are baked into the actual column.
▾Two ways to value the battery — what does each one tell me?click to expand
The battery saves money in two different ways depending on what you compare it against:
vs Agile without the battery: £61.25. Each hour of discharge priced at the Agile rate in force, minus what I actually paid to charge. This is what the battery adds on top of already being on Agile — the £ that flows into the headline saving above.
vs the Ofgem cap: £83.81. 689 kWh discharged × 25.77p (weighted-average cap), minus the £93.75 I paid on Agile to charge. This is what the battery would have saved if I were on the flat cap with no time-of-use pricing.
The gap between the two is the bit Agile already gives me without a battery: many evening loads would have been on cheap Agile half-hours anyway.
Household demand (1,738 kWh) is reconstructed from grid consumption minus the grid kWh I diverted to charging the battery, plus what the battery discharged to loads, plus solar self-consumed.
Plunge credit so far: £6.04 of negative-rate electricity where Octopus paid me to consume — 287 half-hours since install. Not life-changing money, but a satisfying number; I catch them when the battery has headroom.
What It's Saved — And When It Pays Back — HA + Ofgem cap
Priced against the weighted cap (defined up top). The daily chart below uses the actual cap rate in force on each day; the lifetime rollup here uses the weighted average.
▾How each row is calculatedclick to expand
Solar = (kWh produced − kWh that went into the battery) × cap, so a self-charged kWh isn't counted twice when it discharges.
Battery = (kWh discharged × cap) − the Agile spend on grid-charging.
The smaller "what the battery adds on top of already being on Agile" figure (£61.25) lives in the bill section above. Standing charge is excluded both sides — the kit can't reduce it.
Cap rates come from Octopus's cap-tracking SVR product, stored quarter-by-quarter.
Solar (panels + MPPT + cables)
Invested
£749
Saved so far
£41.05
Running rate
£49/year
Pays back
Oct 2040 (15.2 yr)
Lifetime earnings
£1,229
Net profit
£480
25 yr life · 9.8 yr free after payback
Battery
Invested
£1,454
Saved so far
£83.97
Running rate
£101/year
Pays back
Dec 2039 (14.5 yr)
Lifetime earnings
£2,011
Net profit
£557
20 yr life · 5.5 yr free after payback
Whole system
Invested
£2,203
Saved so far
£191.11
Running rate
£229/year
Pays back
Feb 2035 (9.6 yr)
Lifetime earnings
£5,722
Net profit
£3,519
25 yr life · 15.4 yr free after payback
Of the £191.11 saved vs cap so far: £41.05 from solar, £83.97 from the battery time-shift, and £103.26 from Agile pricing the imports that bypassed the battery below cap. That sums to £228.28 on units alone; the gap to the headline £191.11 above is about £37.17 handed back on the standing-charge line, where Agile (55.79p/day) costs more than the cap (44.29p/day). Agile is brilliant — the plunges alone more than cover the slightly steeper standing charge, and the half-hourly pricing lets the planner cherry-pick the cheapest slots every cycle.
▾Cumulative £ saved vs cap — payback curveclick for chart
Daily £ saved vs cap, summed since install. Left axis is £, right axis shows the same value as a % of the £2,203 investment. The y-axis auto-scales to what I've actually banked so far — the dashed 100%-paid-back line will appear once the curve climbs into view (a few years off at the current rate).
▾Monthly £ saved — bars getting taller as solar and plunges ramp upclick for chart
Each bar is one month of saved £ vs cap, split by source. Yellow = solar (kWh × cap). Amber = battery time-shift (batt_out × cap − grid-charge spend). Blue = Agile pricing on the grid kWh that bypassed the battery (cap − Agile rate). Bars get taller toward summer as days lengthen, plunges deepen, and the kit captures more of both.
▾How the arbitrage maths worksclick to expand
Real hourly data: 785 kWh of AC delivered for charging at an effective 11.9p/kWh, versus BMS discharge priced at the Agile rate in that same hour.
DC-side round-trip: 97% (711 kWh in / 687 kWh out).
Life: 102.8 cycles so far (~123/year) means ~49 years to hit Fogstar's 6,000-cycle rating, so calendar aging (~20 yr) binds first — the pack keeps working past that, just at reduced capacity.
If the current rate holds, combined lifetime net profit is £3,519 — about 2.6× the original £2,203 back. The cap has usually drifted up, which pushes that higher; if Agile rates tighten or the pack ages faster than rated, it shrinks.
▾Where the load-shifting savings actually go — arb-profit DC £61.25 · AC-honest £50.40 · £10.85 lost to conversion · AC→AC 81%click to expand
I bill the system as load-shifting from Agile — charge cheap, discharge expensive — but the figure I see on the headline (vs cap) and the figure I actually pocket from arbitrage are different numbers. Here's why.
Avg charge rate (paid)
11.9 p/kWh
Effective rate I paid Octopus on the main grid for AC into the battery charger
Avg discharge value
22.5 p/kWh
Agile rate at the hours the battery actually delivered energy to my microgrid loads (TV, computers, lighting). If those loads had been on the main grid instead, this is what I would have paid
Gross spread
10.6 p/kWh
What I would earn per kWh charged if conversion losses were zero
Battery RTE (DC→DC)
97.0 %
BMS-measured: out of the battery vs in. Anything below 95% means cells warming or cycling at low SOC
End-to-end AC→AC
81.2 %
Charger 90% × battery 97% × inverter 93%. Only this fraction of grid AC charged actually reaches a microgrid load
Arb profit (DC-priced)
£61.25
BMS_out × Agile − charge cost. Historically what I show; ignores the DC→AC inverter loss between battery and load
Arb profit (AC-honest)
£50.40
After applying inverter efficiency. The microgrid only sees a saving for each AC kWh actually delivered
Lost to round-trip
£10.85
Money I paid the main grid for kWh that conversion losses consumed before they reached a microgrid load
Plunge credit captured
£6.04
Earned from negative-rate Agile slots — Octopus paid me to take the energy
Cumulative £ saved vs price cap since install. Battery line is measured from the BMS; solar is modelled on a UK seasonal profile (lifetime sensor has backfill gaps) and calibrated to the current lifetime total. The dashed line is the ground-truth bill-vs-cap saving from Octopus half-hourly data. The shaded band marks the low-solar window (Nov – mid-Feb).
Why Agile, Not a Fixed Tariff — Octopus live
The price cap is what most households pay on a standard variable tariff. Agile lets me buy electricity at the half-hourly wholesale price, which on a typical week is much cheaper than cap — and occasionally goes negative when wind and solar flood the grid. A battery turns those cheap hours into stored energy for the expensive ones.
Metric
Value
Ofgem cap unit rate
25.77p/kWh
Agile average, last 9 days
17.89p/kWh
Agile average after solar offset
12.86p/kWh
Standing charge
55.79p/day
At an effective rate of 12.9p/kWh, electricity here costs about half of the price cap (25.77p). That difference is where the ROI lives — Agile does most of the heavy lifting; the battery amplifies it; solar adds free kWh on sunny days.
Plunge Response — Octopus + HA
Two networks here: the main grid (what Octopus bills for, measured at the smart meter) and my microgrid, a 800 W Victron inverter fed from the battery. Microgrid runs the low-draw always-on stuff — TVs, computers, networking kit, desk electronics, uplighters, e-bike charging. Fridge, freezer, oven and washing machine stay on the main grid on purpose: I sized the inverter small to keep compressor and heating-element spikes off the battery, and Agile on a sunny, windy day often beats what overnight rates cost in a winter Dunkelflaute — the dark, still spells when neither solar nor wind shows up and wholesale prices climb. When nothing heavy is running, Home Assistant's daily_power_min (lowest main-grid pull seen each day) routinely bottoms out near 42 W — fridge on idle plus whatever else is quietly ticking over. Then Agile goes negative, and the main-grid pull goes up, on purpose.
Metric
Value
Negative-price half-hours since install
287
Lowest rate seen
-12.1p/kWh
Grid pull during plunge slots (avg)
1311 W
Grid pull outside plunges (avg)
208 W
Total kWh pulled during plunges
188 kWh
Credit earned from plunge consumption
£6.04
That's roughly 6.3× the normal main-grid draw, concentrated in the exact half-hours when Octopus is paying me to consume. Most of those kWh get banked in the battery for later; the rest runs anything else I can sensibly time-shift. On a fixed tariff this mechanic simply doesn't exist.
The response scales with how negative the price goes. Deeper plunges pull me (and the dryer, and the washing machine) into action more aggressively:
Rate bucket
Avg draw
vs baseline
Slots
Normal (≥ 0p/kWh)
0.21 kW
1.0×
14,305
Mild plunge (0 to −5p)
1.25 kW
6.0×
246
Medium plunge (−5 to −10p)
1.72 kW
8.2×
34
Deep plunge (< −10p)
1.61 kW
7.8×
7
The biggest single-day response was 5 April 2026: 30 plunge half-hours, 28.7 kWh drawn while the rate sat as low as -12.1p/kWh, with a peak half-hour pulling 4.7 kW sustained. Tumble dryer, washing machine, and the rest of the kitchen, all running at once — and Octopus paid me to do it.
The Takeaway
Agile is the foundation. Without a half-hourly tariff, the battery has nothing cheap to soak up.
The battery makes Agile workable. It charges in the cheapest slots and discharges in the dearest — sometimes that's overnight, sometimes a sunny midday. The gap is small per kWh but runs every day.
Small solar, real impact. 700 W on salvaged-pallet frames in the garden displaces grid imports any time the sun is up, and tops the battery up for free on the good days.
The price cap isn't my benchmark — it's the comparison point. For me, Agile + battery is the lived rate. Cap-vs-mine is what shows the gap most households are leaving on the table.
How this gets built — data stack + warts
Every number on this page is derived live, on the server, every two hours. A cron job pulls Home Assistant long-term statistics for the BMS and solar sensors, fetches half-hourly consumption and agreement history from the Octopus API, looks up the unit rate in force at every slot, and upserts the lot into SQLite. The post is rebuilt and pushed via Ghost's Admin API, then Cloudflare's cache is purged.
Local store: 14,592 half-hourly consumption slots, 14,764 tariff rates back to install, plus daily battery-charge attributions, solar-yield history, and the full tariff-agreement timeline.
Octopus' public API and HA's long-term statistics are both quietly fantastic. The hardware at the other end is less so — Zigbee drops, energy counters freeze while power sensors keep reporting, some sensors reset silently on firmware updates. A few figures above include corrections for exactly those glitches (a BMS counter reset in September, a charging plug that also carries desk passthrough, an output plug that's been stuck since February). The top-line numbers hold, but anyone trying this should expect to spend real time reconciling sensors.
Thinking of switching energy supplier? We both get £50.