Clarify what 'surplus' means in the leaderboard

The number was previously labelled 'total solar surplus' which read like
'total PV produced'. It's actually 'capturable surplus' = the kWh that
would be exported to the grid without a battery, which is less than gross
PV by the directly-self-consumed portion (PV used at the same hour it's
produced never crosses the meter).

For dad's 3 kWp setup: PV produced ≈ 2625 kWh, directly consumed ≈ 750
kWh, exported ≈ 1869 kWh. The battery can only redirect the 1869,
because the 750 doesn't cross the meter.

Renamed heading + extended legend with the explanation.
This commit is contained in:
Michiel Berger 2026-04-30 21:57:11 +02:00
parent faecd9cb80
commit 9d43e1802b

View file

@ -4,7 +4,7 @@
<meta charset="utf-8"> <meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1"> <meta name="viewport" content="width=device-width, initial-scale=1">
<title>Honest battery payback — vs thuisbatterijgids.nl</title> <title>Honest battery payback — vs thuisbatterijgids.nl</title>
<link rel="stylesheet" href="{{ url_for('static', filename='style.css') }}?v=12"> <link rel="stylesheet" href="{{ url_for('static', filename='style.css') }}?v=13">
</head> </head>
<body> <body>
@ -86,7 +86,7 @@
<div class="card"> <div class="card">
<h2> <h2>
Full leaderboard Full leaderboard
<small id="meta">(<span id="count">{{ initial.batteries|length }}</span> batteries · <span id="elapsed">{{ initial.elapsed_seconds }}</span>s · total solar surplus: <span id="total-surplus">{{ '%.0f' % initial.total_surplus_kwh }}</span> kWh/yr)</small> <small id="meta">(<span id="count">{{ initial.batteries|length }}</span> batteries · <span id="elapsed">{{ initial.elapsed_seconds }}</span>s · capturable surplus (= grid exports without a battery): <span id="total-surplus">{{ '%.0f' % initial.total_surplus_kwh }}</span> kWh/yr)</small>
</h2> </h2>
<div class="filters"> <div class="filters">
<label class="filter-toggle"><input type="checkbox" data-cat="small_plugin" checked> ≤ 0.8 kW plug-in (no electrician)</label> <label class="filter-toggle"><input type="checkbox" data-cat="small_plugin" checked> ≤ 0.8 kW plug-in (no electrician)</label>
@ -134,8 +134,8 @@
<dt>LP €/yr</dt> <dd>Honest year-1 savings from our linear-program oracle (perfect 24h foresight).</dd> <dt>LP €/yr</dt> <dd>Honest year-1 savings from our linear-program oracle (perfect 24h foresight).</dd>
<dt>LP yr</dt> <dd>Years until cumulative savings (with the chosen inflation rate) recoup the battery cost.</dd> <dt>LP yr</dt> <dd>Years until cumulative savings (with the chosen inflation rate) recoup the battery cost.</dd>
<dt>10-yr net</dt> <dd>Total profit over 10 years: cumulative savings (compounded by inflation) minus the battery cost. Red = doesn't break even within 10 yr.</dd> <dt>10-yr net</dt> <dd>Total profit over 10 years: cumulative savings (compounded by inflation) minus the battery cost. Red = doesn't break even within 10 yr.</dd>
<dt>kWh capt</dt> <dd>kWh of available solar surplus the battery actually absorbed over the year.</dd> <dt>kWh capt</dt> <dd>kWh of capturable surplus (i.e. of grid exports that would happen without a battery) that this battery absorbs.</dd>
<dt>% capt</dt> <dd>That, as a percentage of the scenario's total surplus (shown in the heading).</dd> <dt>% capt</dt> <dd>That, as a percentage of the scenario's capturable surplus shown in the heading. <em>Note:</em> the denominator is exports, not gross PV — solar that's directly self-consumed during sunny hours never crosses the meter and is invisible to a battery.</dd>
<dt>% full</dt> <dd>Of all surplus hours, the % when the battery was already full and couldn't store more — capacity-bottlenecked.</dd> <dt>% full</dt> <dd>Of all surplus hours, the % when the battery was already full and couldn't store more — capacity-bottlenecked.</dd>
<dt>% sat</dt> <dd>Of all surplus hours, the % when charging was pegged at max kW and couldn't keep up — power-bottlenecked.</dd> <dt>% sat</dt> <dd>Of all surplus hours, the % when charging was pegged at max kW and couldn't keep up — power-bottlenecked.</dd>
</dl> </dl>
@ -152,6 +152,6 @@
</p> </p>
</footer> </footer>
<script src="{{ url_for('static', filename='app.js') }}?v=12"></script> <script src="{{ url_for('static', filename='app.js') }}?v=13"></script>
</body> </body>
</html> </html>