Overview

Voltary simulates how a household generates, consumes, stores and pays for electricity. Each interval accounts for demand, PV generation, battery charging and discharge, grid imports and exports. Voltary uses these flows to calculate electricity costs, feed-in revenue and investment returns for the proposed system.

Battery retrofit for regular PV supports German rooftop systems with self-consumption and EEG surplus feed-in, original PV commissioning from 1 August 2014, capacity below 100 kWp and one common PV commissioning date. Full feed-in, direct marketing and later PV additions with separate commissioning dates are excluded. The PV commissioning date applies, rather than registration or battery installation. Balcony PV has a separate model.

This page documents the calculation rules, assumptions and data sources. Results depend on your inputs and the model assumptions. Actual savings and returns can differ.

Calculation basis at a glance

Voltary lets you compare how PV, battery size and electricity tariffs affect grid imports and costs. The investment calculation also includes purchase and maintenance costs over the selected period.

Which questions does Voltary answer?

Voltary compares the evaluated configurations using the same consumption and price assumptions. You can select either the highest net present value or the highest self-sufficiency within your budget.

  • How much of the household’s electricity demand can PV and a battery cover?
  • How does a battery change grid import, feed-in, and self-consumption?
  • Which of the evaluated PV or battery sizes has the highest net present value?
  • How do electricity prices, feed-in revenue, investment, and operating costs interact?
  • How do the results differ when selecting for investment value or self-sufficiency?
Why does time resolution matter?

PV and storage results depend on when you use electricity. Two households with the same annual consumption can use different amounts of their own PV generation and have different electricity costs.

Voltary evaluates consumption, PV generation and prices in 15- or 60-minute intervals. Each interval determines how much PV electricity is used directly or stored and how much electricity is needed from the grid.

Which data is used?

You can upload measurements or create a household profile, then enter PV, battery, tariff and cost settings. Voltary uses the defaults listed on this page for settings you leave unspecified.

For existing systems, enter any active 70% limit and its removal date if applicable. A dynamic limit applies to grid export after self-consumption and battery charging; a fixed inverter limit applies to available PV generation. The same setting is used with and without the new battery. Curtailed generation is not reconstructed from measured data; hourly values only approximate short power peaks.

  • Consumption, generation, and grid data from uploads or generated household profiles
  • PV capacity, location, orientation, tilt, and location-based yield profiles
  • Battery capacity, power limits, efficiencies, reserve, and aging assumptions
  • Electricity tariffs, feed-in remuneration, market prices and the Solarspitzengesetz rules described below
  • Investment, maintenance, analysis horizon, price development, and discount rate
How should results be interpreted?

Compare configurations using the same consumption, price and cost assumptions. Self-sufficiency measures the share of demand supplied by your own PV. Net present value assesses the investment using payment dates and the selected discount rate.

  • Check which inputs differ between the configurations you compare.
  • Results over many years depend on assumed prices, costs and usage.
  • Changing price or cost assumptions shows how they affect the assessment.
  • Technical planning, concrete quotes, financing, and contract review remain separate steps.
How can I assess a specific storage offer?

Voltary offers automatic sizing and manual configuration. Automatic sizing compares storage capacities and power limits within your settings. Manual configuration lets you enter the technical specifications and complete price of a specific offer. Selection or recommendation of named storage products is unavailable.

Capacity, charging and discharging power, state-of-charge limits, efficiencies, auxiliary consumption and aging determine the modeled behavior. Defaults are adjustable modeling assumptions. Use documented values from your offer and check that they describe the same technical measurement boundary. Unknown properties remain assumptions; the calculation does not reproduce manufacturer-specific control strategies.

Include the complete price of required metering, accessories, installation and applicable taxes. Do not count costs already included twice. For balcony PV, AC/DC connection and inverter limits remain part of the configuration. Device and sensor compatibility and electrical connection requirements need separate verification before purchase.

Technical methodology in detail

The chapters below explain the calculation, its assumptions and sources. Fractions and interest rates enter the equations as decimal values: 1 means 100%, and 0.05 means 5%. For display as a percentage, the value is multiplied by 100.

Simulation pipeline

Voltary prepares the time series, simulates PV and storage, then calculates costs and investment metrics.

1. Inputs

The calculation uses consumption data, PV and battery settings, and the selected prices and tariff components.

2. Normalization

Voltary aligns timestamps and units, handles missing values and places demand, PV generation and prices on a common interval grid. For uploads without an existing battery, later years retain the measured hourly overlap between PV and consumption. This includes hours with grid imports despite PV generation. Recalculating direct PV supply solely from hourly generation and demand could hide those imports and understate the potential benefit of an added battery.

3. PV modelling

Voltary uses uploaded PV measurements or calculates a generation profile from PVGIS 5.3 hourly data with the crystSi2025 crystalline-silicon model. The request includes location, IANA time zone, surface orientation and tilt, mounting type and system losses. Each distinct surface geometry receives a checked 1 kWp profile, scaled to its allocated capacity. Defaults are 14% system losses and free-standing, ventilated mounting. Month selection follows the PVGIS typical meteorological year (TMY) method under ISO 15927-4 for 2005–2023. The calculation uses the hourly PVGIS values from the selected source years. If only part of the configured capacity is requested, Voltary allocates it first to surfaces with the highest site-specific annual yield per kWp. Unavailable, incomplete or invalid PVGIS data stops the calculation. No synthetic replacement profile is used.

4. Battery operation

PV supplies household demand first and surplus charges storage. The battery covers later demand above its reserve at a positive consumer import price, subject to power and efficiency limits. There are no PV/load forecasts or price-based grid charging. Investment cost affects the investment evaluation, not this operating rule.

5. Tariff settlement

Voltary calculates grid import costs and feed-in revenue using the applicable prices, then includes annual fixed charges and credits.

6. Evaluation

The model derives self-sufficiency, useful household PV utilisation, payback, NPV, IRR and net profit from simulation results and dated project cash flows. Configurations are selected by NPV or self-sufficiency.

Project start and timing conventions

The simulation and financial calculation start on the confirmed project date. Energy charts show calendar years; finance groups payments into operating years from the project start.

Project start t₀

t₀ is a local calendar date in the site's confirmed IANA time zone. New PV and a new battery are active from the first interval on t₀; the configured initial SoC applies to that first active interval.

Before t₀, new assets produce no energy and incur no self-discharge, auxiliary demand, battery aging, or PV degradation.

Horizons and operating years

The physical commissioning view shows the calendar year from January 1. The financial calculation begins exactly at t₀; operating years end on project-start anniversaries.

An operating year can span parts of two calendar years.

Cash-flow dates

The investment is booked at t₀. Operating cash flows and prorated maintenance are grouped by calendar month and dated at month-end; the first and last month may be partial months.

NPV and IRR use these payment dates. Payments are not moved to an assumed year-end date.

Time convention

Physical intervals follow local time, including daylight-saving transitions. Financial discounting uses ACT/365F: actual calendar days divided by 365.

Discounting uses the days between project start and payment, including irregular payment intervals.

Battery model

PV electricity supplies household demand and battery auxiliaries first. Surplus charges the battery, with the remainder exported or curtailed. The battery supplies unmet demand when the current import price is positive and stored energy exceeds the minimum reserve, subject to the configured power limits and efficiencies. Self-discharge reduces stored energy; any reserve deficit is restored. Grid charging is used only for reserve restoration. Uploaded flows from an existing battery remain part of the measured comparison baseline.

The change in available capacity over time is explained in Battery ageing.

(1)Available capacity and SoC bounds

Minimum and maximum stored energy are the configured SoC fractions multiplied by available capacity. As ageing reduces capacity, these kWh limits also fall.

Ecap,t={Ecap,0,d(t)=0Ecap,0 max⁡ ⁣(0.01,1−Ld(t)−1cal−Ld(t)−1cyc),d(t)>0E_{\mathrm{cap},t} = \begin{cases}E_{\mathrm{cap},0}, & d(t)=0 \\ E_{\mathrm{cap},0}\,\max\!\left(0.01,1-L_{d(t)-1}^{\mathrm{cal}}-L_{d(t)-1}^{\mathrm{cyc}}\right), & d(t)>0\end{cases}
Smin⁡,t=σmin⁡ Ecap,tS_{\min,t} = \sigma_{\min}\,E_{\mathrm{cap},t}
Smax⁡,t=σmax⁡ Ecap,tS_{\max,t} = \sigma_{\max}\,E_{\mathrm{cap},t}
Variables
Ecap,t,Ecap,0E_{\mathrm{cap},t}, E_{\mathrm{cap},0}
available battery capacity in interval t and nominal initial capacity, both in kWh
tt
index of the simulation interval being considered
d(t)d(t)
active simulation day containing interval t, starting at 0; d(t) − 1 denotes the preceding day
Ld(t)−1cal,Ld(t)−1cycL_{d(t)-1}^{\mathrm{cal}}, L_{d(t)-1}^{\mathrm{cyc}}
cumulative calendar and cycle capacity losses up to the end of the preceding day, as fractions of initial capacity; 0.05 means 5% loss
Smin⁡,t,Smax⁡,tS_{\min,t}, S_{\max,t}
lower and upper stored-energy limits in interval t, in kWh; the lower limit is the minimum reserve
σmin⁡,σmax⁡\sigma_{\min}, \sigma_{\max}
configured minimum and maximum state of charge (SoC) as fractions of available capacity; e.g. 0.1 and 0.9 for 10% and 90%
Interpretation

The additional simulated battery starts its first active day at nominal capacity. From the following day, the calendar and cycle losses accumulated through the previous evening reduce its available capacity. Available capacity has a numerical floor of 1% of nominal capacity. The loss components themselves are not capped by this floor. It allows the calculation to continue and does not establish whether a real battery could still operate. SoC bounds scale with available capacity; disabling ageing keeps capacity constant. Uploaded flows from an existing battery are treated separately.

Worked example: With 10 kWh initial capacity, 3% calendar loss and 2% cycle loss, 9.5 kWh remain available. SoC limits of 10% and 90% then give a minimum reserve of 0.95 kWh and an upper energy limit of 8.55 kWh.

(2)Per-interval power constraints

Charge and discharge power are first converted into the maximum amount of energy that can be moved during one interval. This limit applies in addition to the SoC bounds.

Eˉtc=PcΔt\bar E_t^c = P_c \Delta t
Eˉtd=PdΔt\bar E_t^d = P_d \Delta t
Variables
Eˉtc,Eˉtd\bar E_t^c, \bar E_t^d
maximum gross charging energy and maximum battery-side withdrawal per interval, both in kWh
Pc,PdP_c, P_d
battery charging and discharging power in kW
Δt\Delta t
simulation interval length in hours
tt
index of the simulation interval being considered
Interpretation

Capacity determines how much energy can be stored. Charging and discharging power limit how much can enter or leave the battery within one interval.

(3)Direct PV coverage, residual load, and surplus

Before the battery reacts, household demand is first covered directly from concurrent PV generation. This yields the residual load for possible discharge and the PV surplus for later charging or export.

Etpv→load={min⁡ ⁣(Etpv,Etload),generatedmin⁡ ⁣(max⁡ ⁣(Etpv−Xtmeas,0),Etload),measuredE_t^{\mathrm{pv}\rightarrow\mathrm{load}} = \begin{cases}\min\!\left(E_t^{\mathrm{pv}},E_t^{\mathrm{load}}\right), & \text{generated} \\ \min\!\left(\max\!\left(E_t^{\mathrm{pv}}-X_t^{\mathrm{meas}},0\right),E_t^{\mathrm{load}}\right), & \text{measured}\end{cases}
Ltres=max⁡ ⁣(Etload−Etpv→load,0)L_t^{\mathrm{res}} = \max\!\left(E_t^{\mathrm{load}} - E_t^{\mathrm{pv}\rightarrow\mathrm{load}}, 0\right)
Xt={max⁡ ⁣(Etpv−Etpv→load,0),generatedmax⁡ ⁣(Xtmeas,0),measuredX_t = \begin{cases}\max\!\left(E_t^{\mathrm{pv}} - E_t^{\mathrm{pv}\rightarrow\mathrm{load}}, 0\right), & \text{generated} \\ \max\!\left(X_t^{\mathrm{meas}},0\right), & \text{measured}\end{cases}
Variables
Etpv,EtloadE_t^{\mathrm{pv}}, E_t^{\mathrm{load}}
prepared PV generation and household load for the added battery in interval t
Etpv→loadE_t^{\mathrm{pv}\rightarrow\mathrm{load}}
direct PV coverage from generated coincidence or measured flows
Ltres,Xt,XtmeasL_t^{\mathrm{res}}, X_t, X_t^{\mathrm{meas}}
residual load, available surplus and measured PV export before the added battery
tt
index of the simulation interval being considered
Interpretation

Generated profiles use concurrent PV and load. Measured profiles preserve recorded PV export: both import and export can occur within an aggregated interval. The equation uses prepared inputs for the added battery; measured existing-battery flows are removed first and accounted for separately. Example without existing storage: 2.32 kWh PV, 0.94 kWh load and 1.54 kWh export yield 0.78 kWh direct PV coverage, not 0.94 kWh.

(4)Self-discharge

Chemical idle losses are modeled separately from charge and discharge efficiency. They reduce stored energy in proportion to the current SoC even when the battery is otherwise inactive.

Etself=λsdS~t−1E_t^{\mathrm{self}} = \lambda_{\mathrm{sd}} \tilde S_{t-1}
St(sd)=S~t−1−EtselfS_t^{(\mathrm{sd})} = \tilde S_{t-1} - E_t^{\mathrm{self}}
Variables
EtselfE_t^{\mathrm{self}}
self-discharge loss in interval t
λsd\lambda_{\mathrm{sd}}
compounded self-discharge factor derived from the monthly rate
St(sd)S_t^{(\mathrm{sd})}
stored energy immediately after self-discharge, in kWh
S~t−1\tilde S_{t-1}
stored energy carried over from the previous interval, limited to the current upper energy bound, in kWh; starting value before self-discharge
tt
index of the simulation interval being considered
Interpretation

This term captures chemically driven loss of stored energy rather than electrical conversion losses. It is applied before reserve restoration, auxiliary demand, or ordinary dispatch decisions.

(5)Reserve restoration after self-discharge

Available PV restores a reserve deficit first, followed by the grid within remaining charge-power and hardware limits. PV auxiliary supply is accounted for before this step; battery auxiliary and household discharge follow it.

Etreserve←pv,gross=min⁡ ⁣(Xt(aux),max⁡ ⁣(Smin⁡,t−St(sd),0)ηc,Eˉtc)E_t^{\mathrm{reserve}\leftarrow\mathrm{pv,gross}} = \min\!\left(X_t^{(\mathrm{aux})}, \frac{\max\!\left(S_{\min,t} - S_t^{(\mathrm{sd})}, 0\right)}{\eta_c}, \bar E_t^c\right)
Etreserve←grid,gross=min⁡ ⁣(max⁡ ⁣(Smin⁡,t−St(sd,pv),0)ηc,max⁡ ⁣(Eˉtc−Etreserve←pv,gross,0))E_t^{\mathrm{reserve}\leftarrow\mathrm{grid,gross}} = \min\!\left(\frac{\max\!\left(S_{\min,t} - S_t^{(\mathrm{sd,pv})}, 0\right)}{\eta_c}, \max\!\left(\bar E_t^c - E_t^{\mathrm{reserve}\leftarrow\mathrm{pv,gross}}, 0\right)\right)
Variables
Etreserve←pv,gross,Etreserve←grid,grossE_t^{\mathrm{reserve}\leftarrow\mathrm{pv,gross}}, E_t^{\mathrm{reserve}\leftarrow\mathrm{grid,gross}}
gross reserve-restoration energy from PV and from grid
St(sd),St(sd,pv)S_t^{(\mathrm{sd})}, S_t^{(\mathrm{sd,pv})}
stored energy after self-discharge and after subsequent PV reserve restoration, respectively, in kWh
Xt(aux),EˉtcX_t^{(\mathrm{aux})}, \bar E_t^c
PV surplus after supplying auxiliaries from PV, and the total charging-energy budget for the interval. Grid reserve charging uses only the budget remaining after PV reserve charging
Smin⁡,tS_{\min,t}
minimum battery reserve in interval t, in kWh
ηc\eta_c
charging efficiency as a fraction between 0 and 1; 0.95 means 95%. It converts gross input energy into stored energy
tt
index of the simulation interval being considered
Interpretation

The model treats minimum SoC as a binding reserve floor. If self-discharge pushes the state of charge below it, that reserve is restored regardless of the electricity price.

(6)Standby and auxiliary demand

Auxiliary power is an effective system load. Available PV supplies it before battery charging. The battery covers the remainder only when discharge is permitted by price, reserve and power limits; otherwise the available grid path supplies it.

Etaux=PauxΔtE_t^{\mathrm{aux}} = P_{\mathrm{aux}} \Delta t
Etaux←pv=min⁡ ⁣(Etaux,Xt)E_t^{\mathrm{aux}\leftarrow\mathrm{pv}} = \min\!\left(E_t^{\mathrm{aux}}, X_t\right)
Xt(aux)=Xt−Etaux←pvX_t^{(\mathrm{aux})} = X_t - E_t^{\mathrm{aux}\leftarrow\mathrm{pv}}
Etaux←bat={min⁡ ⁣(Etaux−Etaux←pv,ηdmin⁡ ⁣(max⁡ ⁣(St(reserve)−Smin⁡,t,0),Eˉtd)),pt>00,otherwiseE_t^{\mathrm{aux}\leftarrow\mathrm{bat}} = \begin{cases}\min\!\left(E_t^{\mathrm{aux}} - E_t^{\mathrm{aux}\leftarrow\mathrm{pv}}, \eta_d \min\!\left(\max\!\left(S_t^{(\mathrm{reserve})} - S_{\min,t}, 0\right), \bar E_t^d\right)\right), & p_t > 0 \\ 0, & \text{otherwise}\end{cases}
Etaux←grid=Etaux−Etaux←pv−Etaux←batE_t^{\mathrm{aux}\leftarrow\mathrm{grid}} = E_t^{\mathrm{aux}} - E_t^{\mathrm{aux}\leftarrow\mathrm{pv}} - E_t^{\mathrm{aux}\leftarrow\mathrm{bat}}
Variables
EtauxE_t^{\mathrm{aux}}
total auxiliary demand in interval t
Etaux←pv,Etaux←bat,Etaux←gridE_t^{\mathrm{aux}\leftarrow\mathrm{pv}}, E_t^{\mathrm{aux}\leftarrow\mathrm{bat}}, E_t^{\mathrm{aux}\leftarrow\mathrm{grid}}
auxiliary demand supplied by PV, battery and grid
Paux,EˉtdP_{\mathrm{aux}}, \bar E_t^d
auxiliary power in kW and maximum battery-side energy withdrawal per interval in kWh
XtX_t
available PV surplus after directly supplying the household, before auxiliary demand and battery charging, in kWh
Xt(aux)X_t^{(\mathrm{aux})}
PV surplus after directly supplying the household and PV-supplied auxiliaries, before reserve restoration, in kWh
St(reserve)S_t^{(\mathrm{reserve})}
stored energy after self-discharge and reserve restoration, before withdrawals for auxiliaries and the household, in kWh
Smin⁡,tS_{\min,t}
minimum battery reserve in interval t, in kWh
ηd\eta_d
discharging efficiency as a fraction between 0 and 1; 0.95 means 95%. Delivering energy requires a correspondingly larger withdrawal from the battery
ptp_t
current grid import price including the assumed price components, in €/kWh
Δt\Delta t
simulation interval length in hours
tt
index of the simulation interval being considered
Interpretation

Regular PV and separate AC storage use an AC-side approximation. Shared DC storage accounts for internal demand on its DC bus. The wattage includes auxiliary supply losses; direct PV supply receives no additional storage losses. Auxiliary demand is shown separately from household discharge.

(7)Discharge to household loads

The battery supplies household demand left after direct PV use when the current import price is above zero.

Etdis→load={min⁡ ⁣(Ltres,ηdmin⁡ ⁣(max⁡ ⁣(St(reserve)−Etaux←bat/ηd−Smin⁡,t,0),max⁡ ⁣(Eˉtd−Etaux←bat/ηd,0))),pt>00,otherwiseE_t^{\mathrm{dis}\rightarrow\mathrm{load}} = \begin{cases}\min\!\left(L_t^{\mathrm{res}}, \eta_d \min\!\left(\max\!\left(S_t^{(\mathrm{reserve})} - E_t^{\mathrm{aux}\leftarrow\mathrm{bat}}/\eta_d - S_{\min,t}, 0\right), \max\!\left(\bar E_t^d - E_t^{\mathrm{aux}\leftarrow\mathrm{bat}}/\eta_d, 0\right)\right)\right), & p_t > 0 \\ 0, & \text{otherwise}\end{cases}
Variables
Etdis→loadE_t^{\mathrm{dis}\rightarrow\mathrm{load}}
battery energy delivered to load in interval t
LtresL_t^{\mathrm{res}}
residual load after direct PV consumption
St(reserve),ptS_t^{(\mathrm{reserve})}, p_t
stored energy after reserve restoration, before the withdrawal for auxiliary demand, and the current grid price. The equation explicitly subtracts the auxiliary withdrawal
Etaux←batE_t^{\mathrm{aux}\leftarrow\mathrm{bat}}
auxiliary demand supplied by the battery after discharge losses, in kWh; divide by discharge efficiency to obtain the battery-side withdrawal
Smin⁡,tS_{\min,t}
minimum battery reserve in interval t, in kWh
ηd\eta_d
discharging efficiency as a fraction between 0 and 1; 0.95 means 95%. Delivering energy requires a correspondingly larger withdrawal from the battery
Eˉtd\bar E_t^d
maximum battery-side energy withdrawal within the interval, in kWh
tt
index of the simulation interval being considered
Interpretation

Output is limited by energy above the reserve, remaining discharge power and efficiency. Discharge pauses at zero or negative import prices. This decision does not forecast or optimise over future prices.

(8)PV charging priority

PV surplus charges storage within available headroom and charging power, after auxiliary demand and reserve restoration.

Etpv→bat,gross=min⁡ ⁣(Xt(aux)−Etreserve←pv,gross,Smax⁡,t−St(d)ηc,Eˉtc−Etreserve←pv,gross−Etreserve←grid,gross)E_t^{\mathrm{pv}\rightarrow\mathrm{bat,gross}} = \min\!\left(X_t^{(\mathrm{aux})} - E_t^{\mathrm{reserve}\leftarrow\mathrm{pv,gross}}, \frac{S_{\max,t} - S_t^{(d)}}{\eta_c}, \bar E_t^c - E_t^{\mathrm{reserve}\leftarrow\mathrm{pv,gross}} - E_t^{\mathrm{reserve}\leftarrow\mathrm{grid,gross}}\right)
Variables
Xt(aux)X_t^{(\mathrm{aux})}
PV surplus after direct household supply and PV-supplied auxiliaries, before reserve restoration
St(d)S_t^{(d)}
stored energy after withdrawals for auxiliaries and the household, before regular PV charging, in kWh
Eˉtc\bar E_t^c
maximum charge energy in the interval
Etpv→bat,grossE_t^{\mathrm{pv}\rightarrow\mathrm{bat,gross}}
gross PV energy for regular battery charging after reserve restoration, before charging losses, in kWh
Etreserve←pv,grossE_t^{\mathrm{reserve}\leftarrow\mathrm{pv,gross}}
gross PV energy used to restore the minimum reserve, before charging losses, in kWh
Etreserve←grid,grossE_t^{\mathrm{reserve}\leftarrow\mathrm{grid,gross}}
gross grid energy used to restore the minimum reserve, before charging losses, in kWh
Smax⁡,tS_{\max,t}
upper stored-energy limit in interval t, in kWh
ηc\eta_c
charging efficiency as a fraction between 0 and 1; 0.95 means 95%. It converts gross input energy into stored energy
tt
index of the simulation interval being considered
Interpretation

Remaining surplus is exported or curtailed under the configured limits. Forgone export revenue is included in financial results; the controller does not forecast its future value.

(9)No discretionary grid charging

The battery does not charge from the grid to exploit price differences, including under a dynamic tariff.

Etgrid→bat,gross=0E_t^{\mathrm{grid}\rightarrow\mathrm{bat,gross}} = 0
Variables
Etgrid→bat,grossE_t^{\mathrm{grid}\rightarrow\mathrm{bat,gross}}
discretionary gross grid charging in addition to reserve restoration, in kWh; always zero in this model
tt
index of the simulation interval being considered
Interpretation

This term is zero. Grid-backed reserve restoration and auxiliaries remain separate metered flows, subject to available hardware. Dynamic tariffs still price every actual import interval.

(10)Export and curtailment after charging

Any PV surplus left after battery charging is first treated as potential export and then, if required, capped by the active feed-in limit.

Etexp,pre=max⁡ ⁣(Xt(aux)−Etreserve←pv,gross−Etpv→bat,gross,0)E_t^{\mathrm{exp,pre}} = \max\!\left(X_t^{(\mathrm{aux})} - E_t^{\mathrm{reserve}\leftarrow\mathrm{pv,gross}} - E_t^{\mathrm{pv}\rightarrow\mathrm{bat,gross}}, 0\right)
Etexp={min⁡ ⁣(Etexp,pre,ϕfiPnompvΔt),ϕfi<1 ∧ Pnompv>0Etexp,pre,otherwiseE_t^{\mathrm{exp}} = \begin{cases}\min\!\left(E_t^{\mathrm{exp,pre}}, \phi_{\mathrm{fi}} P_{\mathrm{nom}}^{\mathrm{pv}} \Delta t\right), & \phi_{\mathrm{fi}}<1\ \land\ P_{\mathrm{nom}}^{\mathrm{pv}}>0 \\ E_t^{\mathrm{exp,pre}}, & \text{otherwise}\end{cases}
Etcurt=Etexp,pre−EtexpE_t^{\mathrm{curt}} = E_t^{\mathrm{exp,pre}} - E_t^{\mathrm{exp}}
Variables
Etexp,preE_t^{\mathrm{exp,pre}}
potential export before limitation
Etexp,EtcurtE_t^{\mathrm{exp}}, E_t^{\mathrm{curt}}
actual export and curtailed energy
ϕfi,Pnompv\phi_{\mathrm{fi}}, P_{\mathrm{nom}}^{\mathrm{pv}}
export factor as a fraction between 0 and 1 and nominal PV capacity in kWp; 0.6 means a limit of 60% of nominal power
Xt(aux)X_t^{(\mathrm{aux})}
PV surplus after directly supplying the household and PV-supplied auxiliaries, before reserve restoration, in kWh
Etreserve←pv,grossE_t^{\mathrm{reserve}\leftarrow\mathrm{pv,gross}}
gross PV energy used to restore the minimum reserve, before charging losses, in kWh
Etpv→bat,grossE_t^{\mathrm{pv}\rightarrow\mathrm{bat,gross}}
gross PV energy for regular battery charging after reserve restoration, before charging losses, in kWh
Δt\Delta t
simulation interval length in hours
tt
index of the simulation interval being considered
Interpretation

The cap applies only when the feed-in factor is below 1 and nominal PV power is positive. At factor 1 it is inactive: there is no additional clipping at nominal PV power. Physical inverter limits remain part of generation or hardware modeling.

(11)Grid import with battery

Grid import comprises residual household demand, required grid-backed reserve restoration and uncovered auxiliary demand. Discretionary tariff charging is zero.

Etgrid,imp,load=max⁡ ⁣(Ltres−Etdis→load,0)E_t^{\mathrm{grid,imp,load}} = \max\!\left(L_t^{\mathrm{res}} - E_t^{\mathrm{dis}\rightarrow\mathrm{load}}, 0\right)
Etgrid,imp=Etgrid,imp,load+Etreserve←grid,gross+Etgrid→bat,gross+Etaux←gridE_t^{\mathrm{grid,imp}} = E_t^{\mathrm{grid,imp,load}} + E_t^{\mathrm{reserve}\leftarrow\mathrm{grid,gross}} + E_t^{\mathrm{grid}\rightarrow\mathrm{bat,gross}} + E_t^{\mathrm{aux}\leftarrow\mathrm{grid}}
Variables
Etgrid,imp,loadE_t^{\mathrm{grid,imp,load}}
grid import used to serve household load
Etgrid,impE_t^{\mathrm{grid,imp}}
total grid import in interval t
Etreserve←grid,gross,Etaux←gridE_t^{\mathrm{reserve}\leftarrow\mathrm{grid,gross}}, E_t^{\mathrm{aux}\leftarrow\mathrm{grid}}
grid reserve top-up and auxiliary demand covered directly from the grid
LtresL_t^{\mathrm{res}}
remaining household demand after direct PV supply, in kWh
Etdis→loadE_t^{\mathrm{dis}\rightarrow\mathrm{load}}
energy delivered from the battery to the household after discharge losses, in kWh
Etgrid→bat,grossE_t^{\mathrm{grid}\rightarrow\mathrm{bat,gross}}
discretionary gross grid charging in addition to reserve restoration, in kWh; always zero in this model
tt
index of the simulation interval being considered
Interpretation

Grid electricity used to restore the reserve or supply auxiliaries also incurs import costs. The total therefore includes these uses alongside unmet household demand.

(12)State-of-charge update

End-of-interval state of charge subtracts self-discharge and battery withdrawals and adds PV charging and reserve restoration after charging losses. Discretionary grid charging is zero.

St=S~t−1−Etself+ηcEtreserve←pv,gross+ηcEtreserve←grid,gross−Etaux←batηd−Etdis→loadηd+ηcEtpv→bat,gross+ηcEtgrid→bat,grossS_t = \tilde S_{t-1} - E_t^{\mathrm{self}} + \eta_c E_t^{\mathrm{reserve}\leftarrow\mathrm{pv,gross}} + \eta_c E_t^{\mathrm{reserve}\leftarrow\mathrm{grid,gross}} - \frac{E_t^{\mathrm{aux}\leftarrow\mathrm{bat}}}{\eta_d} - \frac{E_t^{\mathrm{dis}\rightarrow\mathrm{load}}}{\eta_d} + \eta_c E_t^{\mathrm{pv}\rightarrow\mathrm{bat,gross}} + \eta_c E_t^{\mathrm{grid}\rightarrow\mathrm{bat,gross}}
Variables
S~t−1,St\tilde S_{t-1}, S_t
opening stored energy after clipping to the current maximum SoC, before self-discharge, and stored energy at the end of the interval
Etself,Etaux←batE_t^{\mathrm{self}}, E_t^{\mathrm{aux}\leftarrow\mathrm{bat}}
self-discharge loss and auxiliary demand supplied by the battery
Etreserve←pv,gross,Etreserve←grid,grossE_t^{\mathrm{reserve}\leftarrow\mathrm{pv,gross}}, E_t^{\mathrm{reserve}\leftarrow\mathrm{grid,gross}}
reserve-restoration energy from PV and from grid
ηc\eta_c
charging efficiency as a fraction between 0 and 1; 0.95 means 95%. It converts gross input energy into stored energy
ηd\eta_d
discharging efficiency as a fraction between 0 and 1; 0.95 means 95%. Delivering energy requires a correspondingly larger withdrawal from the battery
Etdis→loadE_t^{\mathrm{dis}\rightarrow\mathrm{load}}
energy delivered from the battery to the household after discharge losses, in kWh
Etpv→bat,grossE_t^{\mathrm{pv}\rightarrow\mathrm{bat,gross}}
gross PV energy for regular battery charging after reserve restoration, before charging losses, in kWh
Etgrid→bat,grossE_t^{\mathrm{grid}\rightarrow\mathrm{bat,gross}}
discretionary gross grid charging in addition to reserve restoration, in kWh; always zero in this model
tt
index of the simulation interval being considered
Interpretation

Charging increases stored energy only by the amount retained after charging losses. Discharging subtracts energy supplied to household loads and auxiliaries, together with discharge losses. The equation combines these flows with opening energy and self-discharge.

Balcony PV and battery connection

The general battery operating equations describe regular PV. Voltary uses a separate calculation for balcony PV, with separate AC and DC power limits. As with regular PV, the minimum reserve is replenished first from PV and then from the grid where grid charging is supported. The simulation does not intentionally export battery energy.

DC storage can use surplus before inverter clipping. AC storage only receives limited AC generation. For modelled PV, the selected losses apply before the inverter; inverter efficiency is then applied exactly once.

The model assumes a compatible consumption sensor and demand-following operation. Response delays and small control deviations within an interval are not simulated separately. The sensor is not a regulatory smart metering system.

AC measurements cannot support a DC battery calculation. First create a PV profile using the existing module surfaces.

Timing and financial calculations follow the same rules as for regular PV. Existing systems compare the retrofit with unchanged operation. New systems use whole-module layouts; the comparison also includes PV without storage and no purchase. Sensor and other retrofit costs enter the budget and investment only for storage candidates.

Enter the complete cost including any required metering, accessories and installation. Do not count costs already included twice. Check device and sensor compatibility before purchase.

Power limits, remuneration and connection requirements are explained under Balcony PV in Germany.

Battery ageing

Batteries lose capacity over time, even when they are not in use. Charging and discharging cause additional ageing. Voltary calculates both contributions with one of the models below and accounts for the declining capacity in the simulation. Naumann is selected by default. If you turn ageing off, Voltary uses a constant capacity.

Naumann · Sony/Murata LFP

This model combines the calendar-ageing equations from Naumann et al. (2018) with the cycling-ageing equations from Naumann et al. (2020). Both studies examine the same Sony/Murata LFP/graphite cell type. Voltary uses the published coefficients, converting capacity losses from percentages to fractions. Naumann et al. (2018); Naumann et al. (2020)

Calendar ageing depends on elapsed time, cell temperature and state of charge. Cycling ageing depends on how much energy passes through the cell, how deeply it is discharged and how fast it charges or discharges. Charging and discharging speed is expressed as a C-rate.

Voltary evaluates continuous charging and discharging phases as half-cycles. Naumann et al. describe this method in Section 3.3.2. In our calculation, a rest period, a new day or a new year does not end a half-cycle. The initial state of charge and the final unfinished phase are also included. Naumann et al. (2020), § 3.3.2

(13)Naumann: Calendar ageing

At constant temperature and state of charge, this model’s calendar capacity loss grows with the square root of time. Factors A and B describe the effects of temperature and state of charge. When the state of charge changes, Voltary calculates the additional loss under the new conditions while accounting for the ageing already accumulated.

Lcal(τ)=kcalτL^{\mathrm{cal}}(\tau) = k_{\mathrm{cal}}\sqrt{\tau}
T=TC+273.15,sˉi=si−1+si2T = T_{\mathrm{C}}+273.15,\qquad \bar s_i = \frac{s_{i-1}+s_i}{2}
kcal(T,sˉi)=1.2571⋅10−5 A(T) B(sˉi)k_{\mathrm{cal}}(T,\bar s_i) = 1.2571\cdot10^{-5}\,A(T)\,B(\bar s_i)
A(T)=exp⁡ ⁣[−17126Rgas(1T−1298.15)]A(T) = \exp\!\left[-\frac{17126}{R_{\mathrm{gas}}}\left(\frac1T-\frac1{298.15}\right)\right]
B(sˉi)=2.8575(sˉi−0.5)3+0.60225B(\bar s_i) = 2.8575(\bar s_i-0.5)^3+0.60225
(Lical)2=(Li−1cal)2+kcal(T,sˉi)2 Δτi\left(L_i^{\mathrm{cal}}\right)^2 = \left(L_{i-1}^{\mathrm{cal}}\right)^2+k_{\mathrm{cal}}(T,\bar s_i)^2\,\Delta\tau_i
L0cal=0L_0^{\mathrm{cal}} = 0
Variables
Lcal,Lical,iL^{\mathrm{cal}}, L_i^{\mathrm{cal}}, i
capacity lost through calendar ageing by the end of interval i, as a fraction of initial capacity. A value of 0.05 means a 5% loss. Initially L₀ = 0
τ,Δτi\tau, \Delta\tau_i
elapsed time and the duration of one calculation interval, both in seconds
kcal,A,Bk_{\mathrm{cal}}, A, B
calendar coefficient in s⁻¹ᐟ². A describes the temperature effect and B the state-of-charge effect. Both factors are dimensionless
T,TC,RgasT, T_{\mathrm{C}}, R_{\mathrm{gas}}
cell temperature in kelvin and degrees Celsius, respectively. RgasR_{\mathrm{gas}} = 8.3144598 J/(mol·K) is the gas constant
si−1,si,sˉis_{i-1}, s_i, \bar s_i
state of charge at the start and end of interval i and their mean, each as a fraction between 0 and 1; 0.5 means 50%
Interpretation

As a calculation example for the studied cell, the model gives about 4.25% calendar capacity loss after 365 days at a constant 25 °C and 50% state of charge. The final equation carries accumulated ageing forward when the state of charge changes. It is equivalent to the virtual-time method described in the paper.

The coefficients are listed in Table 7 of Naumann (2018). Converting percentages to capacity fractions gives the coefficient 1.2571·10⁻⁵. Voltary approximates the state of charge within each interval by averaging its start and end values. Calendar and cycling losses are calculated separately, then added.

Naumann et al. (2018): Eqs. (3), (5), (12), (17); Table 7

(14)Naumann: Cycle ageing

For each charging or discharging phase, Voltary calculates a stress coefficient from cycle depth and mean C-rate. This determines the additional capacity loss. The equations account for accumulated cycling ageing when the stress changes. This approach excludes the additional, partly reversible losses observed during shallow cycling. Those losses did not occur in the two dynamic test profiles.

Lcyc(Nefc)=khNefcL^{\mathrm{cyc}}(N^{\mathrm{efc}}) = k_h\sqrt{N^{\mathrm{efc}}}
Dh=smax⁡,h−smin⁡,hD_h = s_{\max,h}-s_{\min,h}
Crate,h=∑i∈Ih∣ΔEiactive∣Enom∑i∈IhΔtiC_{\mathrm{rate},h} = \frac{\sum_{i\in I_h}|\Delta E_i^{\mathrm{active}}|}{E_{\mathrm{nom}}\sum_{i\in I_h}\Delta t_i}
kh=FC(Crate,h) FD(Dh)100k_h = \frac{F_C(C_{\mathrm{rate},h})\,F_D(D_h)}{100}
FC(Crate,h)=0.0630 Crate,h+0.0971F_C(C_{\mathrm{rate},h}) = 0.0630\,C_{\mathrm{rate},h}+0.0971
FD(Dh)=4.0253(Dh−0.6)3+1.0923F_D(D_h) = 4.0253(D_h-0.6)^3+1.0923
ΔNiefc=∣ΔEiactive∣2Enom\Delta N_i^{\mathrm{efc}} = \frac{|\Delta E_i^{\mathrm{active}}|}{2E_{\mathrm{nom}}}
(Licyc)2=(Li−1cyc)2+kh(i)2 ΔNiefc\left(L_i^{\mathrm{cyc}}\right)^2 = \left(L_{i-1}^{\mathrm{cyc}}\right)^2+k_{h(i)}^2\,\Delta N_i^{\mathrm{efc}}
L0cyc=0L_0^{\mathrm{cyc}} = 0
Variables
h,i,h(i),Ihh, i, h(i), I_h
half-cycle h and calculation interval i. h(i) identifies the half-cycle to which an active interval belongs. Iₕ contains its intervals with active energy flow
Dh,smin⁡,h,smax⁡,hD_h, s_{\min,h}, s_{\max,h}
difference between the lowest and highest state of charge during the active parts of the half-cycle. Values are fractions between 0 and 1
Crate,h,ΔtiC_{\mathrm{rate},h}, \Delta t_i
mean C-rate during charging or discharging in h⁻¹ and active interval duration in hours. Rest periods are excluded from this mean. The C-rate factor was fitted to measurements at 0.2 C, 0.5 C and 1 C, each at 40 °C and 80% cycle depth
kh,FC,FDk_h, F_C, F_D
cycling coefficient in EFC⁻¹ᐟ², combining C-rate and depth factors. Division by 100 converts the paper’s percentages to capacity fractions
Nefc,ΔNiefcN^{\mathrm{efc}}, \Delta N_i^{\mathrm{efc}}
accumulated equivalent full cycles (EFC) and the increase during the interval. Charging and discharging each contribute half their energy throughput divided by initial capacity
ΔEiactive,Enom\Delta E_i^{\mathrm{active}}, E_{\mathrm{nom}}
active energy change on the battery side in kWh, excluding passive self-discharge, and nominal initial capacity in kWh
Lcyc,LicycL^{\mathrm{cyc}}, L_i^{\mathrm{cyc}}
capacity lost through cycling ageing as a fraction of initial capacity. A value of 0.05 means a 5% loss. Initially L₀ = 0
Interpretation

Charging from 10% to 90% gives a cycle depth of 0.8 and counts as 0.4 EFC. Discharging back to 10% adds another 0.4 EFC. A battery-side power of 5 kW with 10 kWh initial capacity corresponds to 0.5 C in our calculation. We use energy and capacity in kWh to approximate the charge-based quantities in the cell experiments. Voltage, cell current and charge in Ah are not calculated individually. After evaluating the whole profile, Voltary allocates each half-cycle’s coefficient across its actual energy throughput. Rainflow counting is not used.

The paper is ambiguous about the update: Section 3.2.6 refers to previous cycling loss, while Equation (7) uses total loss. Voltary uses cycling loss alone, as does the linked SimSES version. Our comparison with reconstructed test profiles supports this choice, although we could not reproduce every model component in Figure 8. The cycling term has no separate temperature or mean-SOC factor. Temperature independence was investigated between 25 and 40 °C. The 25 °C default is within this range; lower temperatures are outside it.

Naumann et al. (2020): Eqs. (4)–(8), (10); Table 6; § 3.2.6; SimSES: continuation rule used

Gasper / BLAST-Lite · Sony/Murata LFP

This model uses the same laboratory tests by Naumann et al. on the 3 Ah Sony/Murata LFP/graphite cell. Naumann et al. (2018): calendar experiments; Naumann et al. (2020): cycling experiments

Gasper et al. (2022) derived a different set of ageing equations from these data. Their approach separates calendar ageing, long-term cycling loss and an additional loss early in intensive use. Voltary calculates these three contributions using the linked BLAST-Lite code version and its fixed coefficients. Gasper et al. (2022): model equations; BLAST-Lite: adopted code revision

(15)Gasper / BLAST: Calendar ageing

Gasper describes calendar capacity loss with an S-shaped curve. Temperature and state of charge determine its shape and saturation level. The tanh equation is mathematically equivalent to the form in the paper. Under constant conditions, loss can be calculated directly from elapsed time. For changing conditions, BLAST uses the update described below.

fsig(x;a,b,c)=atanh⁡ ⁣((bx)c2)f_{\mathrm{sig}}(x;a,b,c) = a\tanh\!\left(\frac{(bx)^c}{2}\right)
Lcal(tage)=fsig(tage;a,bt,c)L^{\mathrm{cal}}(t_{\mathrm{age}})=f_{\mathrm{sig}}(t_{\mathrm{age}};a,b_t,c)
a=∣a0exp⁡(AU(s))∣a=\left|a_0\exp(A\sqrt{U(s)})\right|
A=a1T2+a2TA=\frac{a_1}{T^2}+\frac{a_2}{T}
c=∣c0exp⁡(B1U(s)1/3+B2U(s)1/4)∣c=\left|c_0\exp(B_1U(s)^{1/3}+B_2U(s)^{1/4})\right|
B1=c1T4+c3T3,B2=c2T3+c4T2B_1=\frac{c_1}{T^4}+\frac{c_3}{T^3},\qquad B_2=c_2T^3+c_4T^2
Variables
fsig,Lcal,tagef_{\mathrm{sig}}, L^{\mathrm{cal}}, t_{\mathrm{age}}
fsigf_{\mathrm{sig}} is the S-shaped curve and L the loss as a fraction of initial capacity. A value of 0.05 means 5%. Elapsed ageing time taget_{\mathrm{age}} is given in days
T,s,U(s)T, s, U(s)
T is cell temperature in kelvin and s the state of charge between 0 and 1. U(s) approximates the graphite anode potential in volts from state of charge, following Gasper, Appendix A.1. It is not the cell’s terminal voltage
a,c,bta, c, b_t
a determines the saturation level and c the curve shape. bₜ = 0.000130510034211874 d⁻¹. BLAST calculates daily means of a and c using the trapezoidal rule over SOC values at interval boundaries
a0,a1,a2,c0,…,c4a_0,a_1,a_2,c_0,\ldots,c_4
fixed coefficients from the linked code version. Table IV in the paper contains rounded values. The temperature and SOC functions follow Equations (7) and (8)
x,bx, b
generic sigmoid input and its scaling coefficient; calendar ageing uses time in days and bₜ, while early cycle ageing uses EFC and bₑ
A,B1,B2A, B_1, B_2
temperature-dependent intermediate terms in the exponents for a and c, calculated from the stated fixed coefficients
Interpretation

Under constant conditions, the calculated loss approaches a. How quickly the curve flattens depends on temperature and state of charge. This saturation follows from the chosen equation. It does not predict how long a battery can keep operating.

The full coefficients and the function U(s) are provided in the linked BLAST code. Voltary uses these fixed values. It does not calculate the parameter confidence intervals from Gasper’s bootstrap analysis.

Gasper et al. (2022): Eqs. (6)–(8), Table IV, Appendix A.1; BLAST-Lite: complete coefficients and implementation

(16)Gasper / BLAST: Cycling ageing

Cycling loss has two contributions. The long-term loss grows with equivalent full cycles. An additional early loss appears in the model under intensive use and approaches a saturation level. The curves shown here apply at constant stress.

Lmain(N)=(k(D,Crate)N)βL^{\mathrm{main}}(N)=(k(D,C_{\mathrm{rate}})N)^{\beta}
k(D,Crate)=∣k0+kDD+kEexp⁡(D2Crate3)∣k(D,C_{\mathrm{rate}})=\left|k_0+k_DD+k_E\exp(D^2C_{\mathrm{rate}}^3)\right|
ri=∣si−si−1∣Δthr_i=\frac{|s_i-s_{i-1}|}{\Delta t_{\mathrm{h}}}
r^i={ri,ri≥0.01 h−10,otherwise\widehat r_i=\begin{cases}r_i,& r_i\geq0.01\,\mathrm{h}^{-1}\\0,&\text{otherwise}\end{cases}
Crate={Hd−1m(r^12+∑i=2m−1r^i+r^m2),m≥20,m=1C_{\mathrm{rate}}=\begin{cases}\dfrac{H_{d-1}}{m}\left(\dfrac{\widehat r_1}{2}+\displaystyle\sum_{i=2}^{m-1}\widehat r_i+\dfrac{\widehat r_m}{2}\right),&m\geq2\\0,&m=1\end{cases}
Learly(N)=fsig(N;b,be,ce)L^{\mathrm{early}}(N)=f_{\mathrm{sig}}(N;b,b_e,c_e)
b=∣b0Ψs(s)‾ ΨD(D)tanh⁡(gD/2)∣b=\left|b_0\overline{\Psi_s(s)}\,\Psi_D(D)\tanh(gD/2)\right|
Ψ(z;ξ,ω)=2ϕ(u)Φ(ξu),u=z−0.5ω\Psi(z;\xi,\omega)=2\phi(u)\Phi(\xi u),\quad u=\frac{z-0.5}{\omega}
Lcyc=Lmain+LearlyL^{\mathrm{cyc}}=L^{\mathrm{main}}+L^{\mathrm{early}}
Variables
N,D,CrateN,D,C_{\mathrm{rate}}
N is the number of equivalent full cycles (EFC), D is the daily range between minimum and maximum SoC from 0 to 1, and CrateC_{\mathrm{rate}} is the daily C-rate in h⁻¹ calculated with the weighting shown
k0,kD,kE,βk_0,k_D,k_E,\beta
long-term loss coefficients: k₀ ≈ −6.813·10⁻⁶, kᴅ ≈ 2.596·10⁻⁵, kᴇ ≈ 2.116·10⁻⁶ and β ≈ 1.12848. Voltary calculates with the unrounded values from the reference code
b,b0,be,ce,gb,b_0,b_e,c_e,g
b is the saturation level of early loss. The coefficients are b₀ ≈ 0.58226, bₑ ≈ 0.00303554 EFC⁻¹, cₑ ≈ 1.43752 and g ≈ 25.41308. fsigf_{\mathrm{sig}} is the S-shaped curve from the calendar equation
Ψs,ΨD,ϕ,Φ,ξ,ω\Psi_s,\Psi_D,\phi,\Phi,\xi,\omega
functions describing the effects of SOC and cycle depth. φ and Φ are the standard normal density and cumulative distribution functions; ξ and ω are fixed shape parameters. The bar denotes the daily mean of the SOC function, calculated with the trapezoidal rule
Lmain,LearlyL^{\mathrm{main}},L^{\mathrm{early}}
long-term and early cycling loss, each as a fraction of initial capacity. Their sum is added to calendar loss
ri,r^i,Δth,mr_i,\widehat r_i,\Delta t_{\mathrm{h}},m
rᵢ is the absolute SoC change in an interval divided by its duration Δtₕ in hours. r̂ᵢ sets values below 0.01 h⁻¹ to zero. m counts all equally spaced intervals in the daily window, including idle intervals
Hd−1H_{d-1}
remaining capacity fraction at the end of the previous day. It scales both the daily C-rate and EFC
k(D,Crate)k(D,C_{\mathrm{rate}})
depth- and C-rate-dependent coefficient for long-term cycle loss, in EFC⁻¹
s,si−1,si,is, s_{i-1}, s_i, i
relative state of charge between 0 and 1; indexed values are at the start and end of calculation interval i
dd
index of the daily window; d − 1 denotes the preceding day
Ψ,z,u\Psi, z, u
skew-normal function Ψ with input z: state of charge s for Ψₛ or cycle depth D for Ψᴅ. u is the input shifted by 0.5 and scaled by ω
fsigf_{\mathrm{sig}}
sigmoid evaluated at N EFC with saturation value b, scaling coefficient bₑ and shape parameter cₑ
LcycL^{\mathrm{cyc}}
total cycle loss as a fraction of initial capacity, consisting of long-term and early loss
Interpretation

At constant stress, Naumann’s cycling loss grows with the square root of EFC. Gasper uses an exponent of about 1.13 for the long-term loss. The early loss is added to this and particularly affects the beginning of the curve.

For the daily C-rate, BLAST gives the first and last interval values half weight and the intervening values full weight, then divides their sum by the total interval count m. Idle intervals remain included. With only one interval, CrateC_{\mathrm{rate}} = 0. The 0.01 h⁻¹ threshold applies only to the C-rate, not to EFC counting. These rules come from the reference code. The factor k and exponent β are named q₇ and q₈ in the paper and q5 and q6 in BLAST. The listed coefficients are rounded; Voltary uses the full precision of the linked code version.

Gasper et al. (2022): Eqs. (11)–(15), Table IV; BLAST-Lite: complete coefficients and implementation

(17)BLAST: Calculation under changing stress

When state of charge or stress changes, the corresponding loss curve changes too. For each of the three loss contributions, BLAST finds the point on the new curve that matches the loss already calculated. The slope at that point determines the additional loss in the next calculation step.

x∗=f−1(Ld−1)x^*=f^{-1}(L_{d-1})
ΔLd=f′(x∗)Δxd\Delta L_d=f'(x^*)\Delta x_d
Ld=Ld−1+ΔLdL_d=L_{d-1}+\Delta L_d
Ld−1=0:Ld=f(Δxd)L_{d-1}=0:\quad L_d=f(\Delta x_d)
ΔNd=Hd−12∑i∣si−si−1∣\Delta N_d=\frac{H_{d-1}}2\sum_i|s_i-s_{i-1}|
ΔLdearly=0if ΔNdΔtage,d≤3 day−1\Delta L_d^{\mathrm{early}}=0\quad\text{if }\frac{\Delta N_d}{\Delta t_{\mathrm{age},d}}\leq3\,\mathrm{day}^{-1}
Hd=1−Ldcal−LdcycH_d=1-L_d^{\mathrm{cal}}-L_d^{\mathrm{cyc}}
Variables
d,f,f−1,f′,x∗d, f, f^{-1}, f', x^*
daily index d; loss curve f with that day’s stress factors, its inverse f⁻¹ and derivative f′. x* is the virtual time or EFC count corresponding to the previous loss
Ld−1,ΔLd,LdL_{d-1},\Delta L_d,L_d
previous loss, additional loss and updated total for the contribution being calculated. Each of the three contributions is updated separately
Δxd,Δtage,d,ΔNd\Delta x_d,\Delta t_{\mathrm{age},d},\Delta N_d
additional time in days for calendar ageing or additional EFC for cycling ageing. Δtage,d\Delta t_{\mathrm{age},d} is the actual duration of the daily window in days
Hd−1,Hd,si−1,si,iH_{d-1}, H_d, s_{i-1}, s_i, i
remaining capacity fraction at the end of the previous and current day d; s denotes relative states of charge at interval i boundaries. The factor H in the EFC equation comes from the BLAST code
Ldcal,Ldcyc,ΔLdearlyL_d^{\mathrm{cal}}, L_d^{\mathrm{cyc}}, \Delta L_d^{\mathrm{early}}
cumulative calendar and total cycle losses at day end and the daily increment of early cycle loss, each as a fraction of initial capacity
Interpretation

BLAST calculates the increment with an Euler step from Gasper, Equation (19). The paper instead describes the exact difference between two curve values in Equation (20) for its SimSES simulation. When a loss contribution starts at zero, BLAST directly uses the loss curve’s value for the first step.

The BLAST code used here updates early cycling loss only above 3 EFC per day. The paper sets the threshold at at least 2 EFC per day. This loss has an internal starting value of 10⁻¹⁰, while the reported initial loss is zero. Each day starts with the previous day’s last SOC value. Movement up to the first SOC value in the entire series is not counted. These calculation rules can lead to results that differ from the curves shown in the paper.

Gasper et al. (2022): Eqs. (16)–(20), dynamic validation section; BLAST-Lite: complete coefficients and implementation

Assumptions and limitations

Both models were developed for a particular cell type. We have not independently checked their predictions for other LFP cells or complete home batteries. Naumann’s dynamic tests lasted 885 days. A 20-year simulation therefore extends far beyond the period covered by measurements. The gap between the two model curves is not a statistically determined uncertainty range. Naumann et al. (2020), §§ 3.2.1–3.2.5 and 3.3.2

The selected cell temperature applies throughout the calculation. The default is 25 °C; you can enter values from 10 to 45 °C. Heating during operation, room temperature and cooling are not calculated separately. Not every combination of temperature, state of charge and cycling conditions has been tested experimentally. Neither cycling model has a separate temperature factor. The calculation also omits resistance growth, additional damage from charging in cold conditions and differences between individual cells.

Voltary first calculates operation at the initial capacity and uses that result to determine ageing. A second pass calculates operation with the reduced capacity. The changed energy flows from this second pass are not used to calculate ageing again.

Each day’s loss reduces the available capacity from the following day. Daylight-saving changes and partial days use their actual duration. Reaching 80% remaining capacity does not trigger battery replacement. To let the calculation continue even at very high losses, we set a lower limit of 1% on available capacity. This does not establish whether a real battery would still work.

Time resolution limits both models. Quarter-hourly or hourly values cannot reveal shorter charging and discharging reversals. Comparisons with published reference code check whether we have implemented its calculation correctly.

Regulatory framework in Germany

System type, capacity and the commissioning and installation dates entered determine which rules Voltary applies to exports and remuneration.

Balcony PV: power limits and connection

The simplified connection rule in Section 8(5a) EEG applies to plug-in solar devices with a combined module capacity of at most 2 kW and inverter capacity of at most 800 VA, operated behind a final consumer’s withdrawal point and assigned to export without remuneration. Registration in the Marktstammdatenregister is required. Section 8(5a) EEG

Voltary assumes no feed-in remuneration in its balcony PV model. The calculation covers households without additional PV or an existing battery.

A separate AC battery may have a higher connection rating. This does not automatically qualify the combined system for simplified connection procedures. Check compatibility, connection and registration with the manufacturer and a qualified installer before purchasing.

Solarspitzengesetz

Voltary accounts for the temporary export-power limit and the loss of remuneration during negative wholesale prices. Both affect the value of storage. The calculation uses the system details entered and the selected price time series.

Scope and commissioning date

25 February 2025 is the relevant cutoff for applying the new rules. For older systems, transitional provisions determine which version of the EEG applies. Section 100(3), (3b) and (46) EEG

Voltary models these rules for fixed PV systems in Germany with capacity below 100 kW and EEG feed-in remuneration. Direct marketing, project-specific aggregation of installations and systems of 100 kW or more are outside this regulatory model. Balcony PV is calculated separately.

For a new system, each simulated variant’s capacity is used. Roof potential is only the upper limit. Voltary does not activate the new rules described here for systems commissioned before 25 February 2025. Earlier technical requirements and a voluntary switch to the new remuneration rules are not fully modelled.

The 60% export-power limit

For the new systems covered here, export power at the grid connection is limited to 60% of installed PV capacity until an intelligent metering system (iMSys) and control equipment are installed and the grid operator has completed the first successful control test. This also applies to fixed PV systems below 2 kWp. The plug-in solar exemption additionally requires the appropriate device type and connection arrangement. Section 9(1) and (2) EEG; Clearingstelle: technical requirements

Voltary supplies household demand first and charges the battery where capacity and charging power are available. It then limits the remaining exports. The energy lost to curtailment depends on the time profiles of generation, demand and battery operation.

Example: An affected 10 kWp system has a 6 kW export limit. If it generates an average of 8 kW during an interval, while the household consumes 1 kW and 1 kW reaches the battery’s charging input, 6 kW remains for export. No additional curtailment is needed in that interval.

Dates and assumptions when information is missing

The PV commissioning date determines which rules and remuneration periods apply in the calculation. The iMSys installation date affects the start of zero remuneration during negative prices. The first successful control-test date ends the 60% limit. Installing an iMSys alone does not end that limit. Section 9(2) EEG; Section 51(2) EEG

For existing PV, the iMSys installation date and the control-test date may be unknown. Without a successful control-test date, Voltary applies the 60% limit throughout the analysis period in the affected scenario. Without an iMSys installation date, the model assumes no start of zero remuneration; exports during the EEG funding period are then remunerated even when wholesale prices are negative.

An unknown date does not establish whether installation or control testing has already occurred. These assumptions affect battery sizing and financial results. Recalculate the results after adding or changing dates.

For a newly planned system, both dates are required. The fields initially use the planned PV commissioning date and can be adjusted. These are planning assumptions. The successful control test cannot precede PV commissioning or iMSys installation.

Remuneration during negative wholesale prices

For the systems covered here from exactly 2 kWp to below 100 kW, Voltary sets EEG feed-in remuneration to zero in intervals with a negative day-ahead wholesale price, starting no earlier than 1 January after the year of iMSys installation. The wholesale price determines this treatment. The household import price includes additional tariff components and may still be positive. Section 51(1) and (2) EEG

Below 2 kWp, the calendar year of a corresponding BNetzA determination must also have ended. Voltary assumes no future determination and therefore calculates no negative-price remuneration loss for these small systems. The 60% limit is assessed independently. Exactly 2 kWp is outside this additional exemption. Section 51(2), point 2 EEG; Clearingstelle: negative prices

With 15-minute energy data, Voltary assigns remuneration to each interval. Where energy data is hourly but prices are quarter-hourly, the model distributes the energy evenly across the four quarters. If one quarter is negative, this approximation removes 25% of the otherwise applicable hourly remuneration. After EEG remuneration ends, the configured post-EEG export price applies; the model does not set that price to zero under Section 51.

How storage affects the simulation

A battery can absorb solar energy that would otherwise be curtailed or exported without remuneration. This requires free capacity and sufficient charging power in that interval. Using the stored energy later can avoid grid imports. The financial benefit depends on factors including electricity prices, losses, ageing and purchase costs.

Voltary charges the battery from the current PV surplus within the configured limits. Its controller uses no generation, demand or price forecast and does not deliberately reserve capacity for the midday peak. A full battery cannot absorb further surplus. The calculated results describe this operation; they do not establish the performance of forecast-based control.

Extended remuneration under Section 51a EEG

For the systems modelled here, ordinary EEG remuneration ends on 31 December of the twentieth year following commissioning. Section 51a can extend that period when remuneration is suspended under Section 51. Section 25(1) EEG; Section 51a EEG

Voltary counts the affected quarter-hours in the commissioning year and the following 19 calendar years. For PV, this count is multiplied by 0.5 and rounded up to the next whole quarter-hour. The resulting full-load quarter-hour allowance is used up after the ordinary remuneration period according to the statutory monthly quotas. The extension runs through the end of the month containing the final such quarter-hour. Section 51a(1) and (2) EEG

The extension adds periods eligible for remuneration. Their revenue depends on later exports and the remuneration conditions that apply then. It does not guarantee repayment of the same euro amount previously lost. Voltary repeats the selected historical price profile for future years; the resulting extension is a scenario assumption.

Within the analysis period, Voltary uses simulated exports. If the extended remuneration falls later, the model estimates its value from the final operating year’s exports and negative-price pattern, with continued PV degradation. It retains that year’s battery operation without projecting additional battery ageing beyond the analysis period. The estimated revenue enters the financial calculation as a dated terminal value.

Tariff and cost model

We separate fixed energy prices, dynamic interval prices, and annual fixed components. Price charts usually focus on variable EUR/kWh components; annual base charges are included in annual totals when configured.

(18)Fixed tariff

A fixed energy price can still be combined with time-varying network charges. Voltary therefore prices imports in each interval at the applicable total unit price, then adds the annual fixed components.

Cfixed=∑tptfixedEgrid,imp,t+FannualC_{\mathrm{fixed}} = \sum_t p_t^{\mathrm{fixed}} E_{\mathrm{grid,imp},t} + F_{\mathrm{annual}}
ptfixed=pfixed ∀t⇒Cfixed=pfixedEgrid,imp+Fannualp_t^{\mathrm{fixed}}=p_{\mathrm{fixed}}\ \forall t\quad\Rightarrow\quad C_{\mathrm{fixed}}=p_{\mathrm{fixed}} E_{\mathrm{grid,imp}}+F_{\mathrm{annual}}
Variables
ptfixed,pfixedp_t^{\mathrm{fixed}}, p_{\mathrm{fixed}}
total import price per kWh in interval t, and its constant value in the special case without price changes over time
Egrid,imp,t,Egrid,impE_{\mathrm{grid,imp},t}, E_{\mathrm{grid,imp}}
grid imports in interval t and their annual sum
FannualF_{\mathrm{annual}}
annual fixed tariff components after applicable flat credits
CfixedC_{\mathrm{fixed}}
annual electricity import costs under the fixed tariff, including fixed tariff components, in €
tt
index of the simulation interval being considered
Interpretation

If the total unit price stays constant, the sum reduces to price times annual imports. With time-varying network charges, such as the selected Module 3 under Section 14a, the calculation uses interval prices. A fixed energy price alone therefore does not imply a constant total import price.

(19)Dynamic tariff

Under dynamic pricing, grid import is always priced on the chosen simulation time axis: hourly in hourly simulations and quarter-hourly in 15-minute simulations. Annual fixed charges are then added on top.

Cdyn=∑tptdynEgrid,imp,t+FannualC_{\mathrm{dyn}} = \sum_t p_t^{\mathrm{dyn}} E_{\mathrm{grid,imp},t} + F_{\mathrm{annual}}
Variables
ptdynp_t^{\mathrm{dyn}}
time-varying price in interval t
Egrid,imp,tE_{\mathrm{grid,imp},t}
grid import in interval t
FannualF_{\mathrm{annual}}
annual fixed tariff components after applicable flat credits
CdynC_{\mathrm{dyn}}
annual electricity import costs under the dynamic tariff, including fixed tariff components, in €
tt
index of the simulation interval being considered
Interpretation

The dynamic-pricing path can include German network charges, levies, and supplier components; day-ahead prices come from Bundesnetzagentur | SMARD.de. Prices and energy flows are aligned to one simulation timeline. Fifteen-minute simulations settle each quarter-hour directly. With hourly energy data, the economic evaluation preserves the share of negative quarter-hours within each hour, so one negative quarter reduces that hour's remuneration proportionally instead of eliminating it completely. The hourly chart can additionally show means and min/max ranges.

Reported metrics

These metrics describe electricity supplied by PV and storage, the resulting costs and the investment outcome over the selected period.

Uploaded data can already include an existing battery’s operation. A case with 0 kWh of added storage retains that operation in the baseline. The reported storage benefit then measures the effect of the additional battery.

(20)PV utilisation in the household

PV utilisation measures the share of PV generation that supplies household loads directly or through storage.

UPV=∑t(Epv,direct,t+Ebat→load,pv,t)∑tEpv,input,tU_{\mathrm{PV}} = \frac{\sum_t (E_{\mathrm{pv,direct},t} + E_{\mathrm{bat\to load,pv},t})}{\sum_t E_{\mathrm{pv,input},t}}
Variables
UPVU_{\mathrm{PV}}
fraction of PV input energy supplying the household directly or through storage; 0.4 means 40% self-consumption
Epv,direct,t,Ebat→load,pv,tE_{\mathrm{pv,direct},t}, E_{\mathrm{bat\to load,pv},t}
PV energy delivered directly to the household and the PV share of battery energy delivered to the household in interval t, both in kWh; storage losses and grid-charged energy are excluded
Epv,input,tE_{\mathrm{pv,input},t}
PV input energy in interval t, in kWh, at the input boundary specified for the system
tt
index of the simulation interval being considered
Interpretation

PV electricity delivered to household loads, directly and through storage, divided by PV generation in the same period. Grid-charged electricity, losses, auxiliaries, curtailment and energy still stored receive no household-use credit. Results cover the whole analysis period from commissioning; the data preview covers the input profile. Regular PV and AC uploads: PV output, without reconstructing upstream losses. Modelled balcony PV: energy before the inverter; modelled conversion losses and clipping remain in the denominator. The formula returns a fraction: 0.75 is displayed as 75% in the results.

The ratio is undefined without PV generation. A subperiod can exceed 100% when it consumes PV stored earlier. Existing-battery origin is estimated from measured charging and discharge; unknown opening charge receives no PV credit.

(21)Self-sufficiency

Share of household consumption supplied by own PV

SS=∑t(Epv,direct,t+Ebat→load,pv,t)∑tEload,t\mathrm{SS} = \frac{\sum_t (E_{\mathrm{pv,direct},t} + E_{\mathrm{bat\to load,pv},t})}{\sum_t E_{\mathrm{load},t}}
Variables
SS\mathrm{SS}
self-sufficiency: fraction of household demand supplied by PV directly or through storage; 0.4 means 40%
Epv,direct,t,Ebat→load,pv,tE_{\mathrm{pv,direct},t}, E_{\mathrm{bat\to load,pv},t}
PV energy delivered directly to the household and the PV share of battery energy delivered to the household in interval t, both in kWh; storage losses and grid-charged energy are excluded
Eload,tE_{\mathrm{load},t}
household consumption in interval t, in kWh
tt
index of the simulation interval being considered
Interpretation

PV supplied directly to the household plus PV supplied through storage, divided by household consumption. Grid-charged electricity and storage losses do not count as self-sufficiency. Results and optimization cover the analysis period from commissioning; charts cover the selected period. Consumption weighting and modelled ageing are included. The formula returns a fraction: 0.75 is displayed as 75% in the results.

Self-sufficiency = total PV electricity supplied to the household / total household consumption in the displayed period; not an average of percentages.

(22)Operating benefit from explicit comparisons

Compare three versions of the same household: keep the current setup (0), add the proposed PV without a new battery (P), and add the selected PV and battery (S).

Ctv=Eimp,tvptgrid−Eexp,tvptfeed-in,v∈{0,P,S}C_t^v = E_{\mathrm{imp},t}^v p_t^{\mathrm{grid}} - E_{\mathrm{exp},t}^v p_t^{\mathrm{feed\text{-}in}},\qquad v\in\{0,P,S\}
Btbat=CtP−CtSB_t^{\mathrm{bat}} = C_t^P-C_t^S
Btpv=Ct0−CtPB_t^{\mathrm{pv}} = C_t^0-C_t^P
Bttotal=Ct0−CtS=Btpv+BtbatB_t^{\mathrm{total}} = C_t^0-C_t^S = B_t^{\mathrm{pv}}+B_t^{\mathrm{bat}}
Variables
v,Ctv,Ct0,CtP,CtSv, C_t^v, C_t^0, C_t^P, C_t^S
comparison case v and its net electricity costs in interval t, in €: continued operation (0), planned PV without a new battery (P), and selected configuration (S)
Eimp,tv,Eexp,tv,ptgrid,ptfeed-inE_{\mathrm{imp},t}^v, E_{\mathrm{exp},t}^v, p_t^{\mathrm{grid}}, p_t^{\mathrm{feed\text{-}in}}
Metered imports and exports in each version, import price and feed-in remuneration
Btbat,Btpv,BttotalB_t^{\mathrm{bat}}, B_t^{\mathrm{pv}}, B_t^{\mathrm{total}}
Additional operating benefit of the new battery, added PV, and complete added project
tt
index of the simulation interval being considered
Interpretation

Existing equipment remains in all three versions; uploaded existing-battery operation stays fixed. P and S use the same proposed PV configuration. Import/export differences include losses, auxiliaries, curtailment and foregone export revenue. Battery benefit is P minus S; added-PV benefit is 0 minus P. Their sum is the complete project benefit, so PV value is not counted again as battery value.

These are operating amounts before added investment and maintenance, which enter the dated financial cash flows separately. Unchanged tariff fixed charges cancel. Applicable remuneration and curtailment rules enter each modeled version. Historical purchase costs are not charged again.

(23)Cumulative battery benefit

The interval-level battery benefit is first summed across all simulated intervals and only then annualized.

Bbat,tot=∑tBtbatB_{\mathrm{bat,tot}} = \sum_t B_t^{\mathrm{bat}}
Variables
Bbat,totB_{\mathrm{bat,tot}}
cumulative battery benefit over the analysis period
BtbatB_t^{\mathrm{bat}}
battery benefit in interval t
tt
index of the simulation interval being considered
Interpretation

Dividing this total by the number of analysis years gives average annual battery savings.

(24)Charge cycles and time to 80% remaining capacity

The reported cycle count divides net charged energy by nominal capacity. It measures charging throughput. Time to 80% remaining capacity is calculated separately from the simulated capacity trajectory.

Ncyc,tot=∑tEtcharge,netEcapN_{\mathrm{cyc,tot}} = \frac{\sum_t E_t^{\mathrm{charge,net}}}{E_{\mathrm{cap}}}
Ncyc,ann=Ncyc,totYN_{\mathrm{cyc,ann}} = \frac{N_{\mathrm{cyc,tot}}}{Y}
j=min⁡{i∈{1,…,M}:Ri≤0.80},R0=1j = \min\{i\in\{1,\ldots,M\}: R_i\le 0.80\},\qquad R_0=1
T80=YM(j−1+Rj−1−0.80Rj−1−Rj)T_{80} = \frac{Y}{M}\left(j-1+\frac{R_{j-1}-0.80}{R_{j-1}-R_j}\right)
Variables
Ncyc,tot,Ncyc,annN_{\mathrm{cyc,tot}}, N_{\mathrm{cyc,ann}}
total and average annual charge-cycle equivalents based on charging throughput
Etcharge,net,EcapE_t^{\mathrm{charge,net}}, E_{\mathrm{cap}}
net stored charging energy, including reserve restoration, and initial nominal capacity
T80,Ri,M,jT_{80}, R_i, M, j
time to 80%, retained capacity fraction Rᵢ, number M of valid active simulation intervals and first threshold index j
YY
length of the analysis period in years
tt
index of the simulation interval being considered
ii
index of a valid active simulation interval; R₀ = 1 is the initial value, Rⱼ₋₁ and Rⱼ bracket the first crossing of 80%
Interpretation

The estimator distributes Y years across M active intervals and linearly interpolates between the last value above 80% and the first at or below it. An empty index set means “not reached”. There is no extrapolation or division of reference cycles by annual cycles. The value is neither equipment failure nor warranty expiry; automatic replacement is not modeled.

This metric comes from the second dispatch pass with reduced capacity. The ageing models evaluate the first pass at nominal capacity and use different counters: Naumann counts half the absolute active energy changes from charging and discharging, excluding self-discharge. BLAST uses half the absolute SoC changes, multiplied by the remaining capacity fraction. The reported charge cycles therefore need not equal the EFC used in the ageing calculation.

(25)Annual battery savings

The operating benefit of storage over the analysis period is expressed as an annual average.

Cbatann=Bbat,totYC_{\mathrm{bat}}^{\mathrm{ann}} = \frac{B_{\mathrm{bat,tot}}}{Y}
Variables
Bbat,totB_{\mathrm{bat,tot}}
total battery benefit over Y years
YY
analysis horizon in years
CbatannC_{\mathrm{bat}}^{\mathrm{ann}}
average annual operating benefit of the added battery in €/year, before investment and maintenance costs
Interpretation

This operating metric is reported before maintenance. Net profit and payback include investment and maintenance in the nominal payment series. NPV\mathrm{NPV} also accounts for payment dates and the selected discount rate.

(26)Annual PV savings

Compare keeping the current setup with adding the proposed PV, without a new battery, over the same period.

Cpvann=∑t(Ct0−CtP)YC_{\mathrm{pv}}^{\mathrm{ann}} = \frac{\sum_t (C_t^0-C_t^P)}{Y}
Variables
Ct0,CtPC_t^0, C_t^P
net electricity costs in interval t under continued operation and planned PV without a new battery, in €; their difference is the added PV operating benefit
YY
Analysis period in years
CpvannC_{\mathrm{pv}}^{\mathrm{ann}}
average annual operating benefit of the added PV in €/year, before investment and maintenance costs
tt
index of the simulation interval being considered
Interpretation

Existing equipment remains. This includes the effect of added PV on an existing battery’s grid charging. It excludes the new battery’s contribution and precedes added-PV investment and maintenance.

(27)Battery payback

Payback is the first payment date when cumulative nominal battery cash flow is no longer negative.

Tpb,bat=min⁡ ⁣{dj−d0365 | ∑k:dk≤djCFbat,knom≥0},CFbat,0nom=−IbatT_{\mathrm{pb,bat}} = \min\!\left\{\frac{d_j-d_0}{365}\ \middle|\ \sum_{k:d_k\le d_j} CF_{\mathrm{bat},k}^{\mathrm{nom}}\ge0\right\},\qquad CF_{\mathrm{bat},0}^{\mathrm{nom}}=-I_{\mathrm{bat}}
Variables
IbatI_{\mathrm{bat}}
battery investment at project start d₀, in €
CFbat,knom,dk,Tpb,batCF_{\mathrm{bat},k}^{\mathrm{nom}}, d_k, T_{\mathrm{pb,bat}}
dated nominal payments including investment, payment dates and first recovery in ACT/365F years
d0,dj,j,kd_0, d_j, j, k
project start and payment date being tested; j indexes tested dates and k the cash flows summed up to that date. Date differences are measured in days and divided by 365 to obtain ACT/365F years
Interpretation

Payback includes all payments from the chosen operating period, including its final month-end settlement. Without a nonnegative cumulative total, it is “not reached”; with zero investment, it is not applicable. Any later return below zero is flagged separately. NPV\mathrm{NPV} is the economic selection objective.

Payback is the first payment date when cumulative savings and revenue after maintenance cover the investment. It is undiscounted. Investment is booked at project start and operating payments at month end; the final partial month can settle after the last operating day. Payments on the same date are combined. We do not interpolate between payment dates.

(28)Total profit

Total profit is obtained by summing all nominal PV and battery net cash flows after maintenance and subtracting the relevant investments.

Π=−Ibat−Ipv+∑j=1NCF(CFbat,jnom+CFpv,jnom)\Pi = -I_{\mathrm{bat}} - I_{\mathrm{pv}} + \sum_{j=1}^{N_{\mathrm{CF}}}\left(CF_{\mathrm{bat},j}^{\mathrm{nom}} + CF_{\mathrm{pv},j}^{\mathrm{nom}}\right)
Variables
Π\Pi
total system profit over the analysis period
CFbat,jnom,CFpv,jnomCF_{\mathrm{bat},j}^{\mathrm{nom}}, CF_{\mathrm{pv},j}^{\mathrm{nom}}
nominal battery and PV net cash flows after maintenance
Ibat,Ipv,NCFI_{\mathrm{bat}}, I_{\mathrm{pv}}, N_{\mathrm{CF}}
battery investment, PV investment, and number of cash flows
jj
payment-date index; 0 denotes the initial investment
Interpretation

Nominal net profit is a reported metric. We optimise NPV\mathrm{NPV}; at 0% comparison interest, both coincide for identical cash flows.

(29)Optimization objective

Voltary selects the evaluated configuration with the highest value for the chosen objective: net present value or self-sufficiency.

x⋆(g)=arg⁡max⁡xg(x)x_{\star}^{(g)} = \arg\max_x g(x)
g∈{NPV,SS}g \in \{\mathrm{NPV}, \mathrm{SS}\}
Variables
xx
configuration consisting of PV size, battery capacity, and power
gg
NPV\mathrm{NPV} for a focus on economics or self-sufficiency for a focus on self-sufficiency
x⋆(g)x_{\star}^{(g)}
selected configuration within the evaluated search space that maximizes objective g
NPV\mathrm{NPV}
discounted project value over the analysis horizon
SS\mathrm{SS}
self-sufficiency: fraction of household demand supplied by PV directly or through storage; 0.4 means 40%
Interpretation

We compare tested options within budget: added-battery NPV\mathrm{NPV} for existing PV, total added-project NPV\mathrm{NPV} for new systems. Existing assets remain in the reference; no purchase and PV-only options are included. Self-sufficiency is the PV-origin share of total household supply across the active project period.

Investment calculation

The investment calculation assigns each payment a date. Purchase costs occur at project start t₀; operating savings, revenue and maintenance are dated at month-end. Amounts are nominal and include the assumed price changes.

Analysis horizon

The financial calculation runs from t₀ over the configured horizon, 20 years by default; operating years follow anniversaries of t₀.

Reported yearly figures summarize project operating years, which do not necessarily match calendar years.

Inflation

Assumed operating savings and revenue are projected using the configured inflation rate.

The resulting amounts are nominal. A nonzero inflation rate changes them relative to the initial year.

Average annual net cash flow

Displayed annual net cash flow is the average nominal cash flow after prorated maintenance across completed project operating years.

Cash flow in an individual year can differ from this average.

Payback

Payback is the first payment date when cumulative nominal payments after investment and maintenance are no longer negative.

Payback is undiscounted. Economic selection uses NPV; net profit and payback complement the assessment.

NPV and IRR

NPV discounts the initial investment at t₀ and all monthly net payments after maintenance to project start. Time intervals use ACT/365F. IRR is the annual rate at which NPV for these payments is zero.

A positive NPV means discounted net payments exceed the investment. IRR can be compared with your required minimum return. It is unavailable when the cash flows have no valid unique solution.

Cumulative cash-flow chart

The nominal line starts with purchase costs at t₀, then adds monthly net payments after prorated maintenance. Yearly values group those payments. The dashed line discounts each payment to project start.

The first point where the nominal line reaches or exceeds zero gives the reported payback. The discounted line ends at NPV, apart from display rounding.

Advanced finance metrics

Net present value (NPV) and internal rate of return (IRR) use the same payments: purchase costs at t₀ and operating savings and revenue after prorated maintenance at each month-end.

(30)Net Present Value (NPV)

NPV\mathrm{NPV} discounts every nominal net cash flow back to t₀ using its actual payment date.

NPV=∑j=0NCFCFjnom(1+r)(dj−d0)/365 ,CF0nom=−I0\mathrm{NPV} = \sum_{j=0}^{N_{\mathrm{CF}}}\frac{CF_j^{\mathrm{nom}}}{(1+r)^{(d_j-d_0)/365}}\,,\qquad CF_0^{\mathrm{nom}}=-I_0
Variables
NPV\mathrm{NPV}
discounted project value over the analysis horizon
CFjnomCF_j^{\mathrm{nom}}
dated nominal cash flow j, including CF₀ = −I₀
rr
annual discount rate as a decimal value; r = 0.05 means 5% per year
dj,d0d_j, d_0
payment date dⱼ and project start d₀; ACT/365F year fraction
NCFN_{\mathrm{CF}}
number of cash flows after the initial investment at index 0
I0I_0
initial investment in the project in €; its cash flow at project start is negative
jj
payment-date index; 0 denotes the initial investment
Interpretation

A positive NPV\mathrm{NPV} means the net payments, discounted to project start at the selected rate, exceed the investment.

Monthly cash flows after maintenance use ACT/365F. PV NPV\mathrm{NPV} compares P with 0; battery NPV\mathrm{NPV} compares S with P; total NPV\mathrm{NPV} compares S with 0. Total NPV\mathrm{NPV} equals PV NPV\mathrm{NPV} plus battery NPV\mathrm{NPV} before rounding. A positive total can coexist with a negative battery contribution.

(31)Internal Rate of Return (IRR)

IRR\mathrm{IRR} is the annual discount rate that makes NPV\mathrm{NPV} equal zero for the same dated cash-flow stream.

0=∑j=0NCFCFjnom(1+IRR)(dj−d0)/3650 = \sum_{j=0}^{N_{\mathrm{CF}}}\frac{CF_j^{\mathrm{nom}}}{(1+\mathrm{IRR})^{(d_j-d_0)/365}}
Variables
IRR\mathrm{IRR}
internal rate of return as a decimal value; a result of 0.05 is displayed as 5% per year
CFjnomCF_j^{\mathrm{nom}}
dated nominal cash flow j, including the upfront investment
dj,d0d_j, d_0
payment date dⱼ and project start d₀
NCFN_{\mathrm{CF}}
number of cash flows after the initial investment at index 0
jj
payment-date index; 0 denotes the initial investment
Interpretation

IRR\mathrm{IRR} can be compared with the required minimum return or cost of capital. Like NPV\mathrm{NPV}, it accounts for payment dates. If the cash flows have no valid solution, the application reports N/A.

In the cumulative cash-flow chart, the dashed discounted line ends at NPV, while the solid nominal line shows the nominal payback path. Displayed yearly rows aggregate the underlying monthly dated cash flows; maintenance is allocated pro rata to the actual project periods.

Assumptions and defaults

Voltary uses these defaults when you do not enter your own values. You can adjust the settings to match your system and offer.

Project, time and costs
Analysis horizon
20 yearsYou can change the period used for the investment calculation.
Project start
Confirmed local date t₀New assets are active exactly from t₀; the financial horizon and operating years are measured from that date.
Time basis
Fixed-interval simulation at 15 or 60 minutesInput series are normalized to a common 15-minute or 60-minute interval grid before dispatch, depending on the selected or detected dataset granularity.
Annual fixed tariff components
Included in annual totals when configuredEUR/kWh charts often show only variable price components.
Battery
SoC bounds
10% min / 95% max / 50% initialApplied only when no explicit configuration is present.
Efficiencies
95% charge / 95% dischargeAffect stored energy, delivered electricity and actual import/export costs.
Self-discharge
3.0 %/monthApplied as a compounded interval loss on stored energy before reserve restoration.
Standby / auxiliary power
5 WAuxiliary demand uses available PV first. The battery covers the remainder at a positive import price above reserve and within power limits, followed by the available grid path.
Cycle evaluation
Naumann: half-cycles; BLAST: daily windowsFixed published coefficients. A user-defined reference cycle count does not change these models.
Aging and the multi-year model
Cell chemistry
LiFePO4 (LFP) / graphiteBoth models refer to Sony/Murata cells. Shared chemistry alone does not establish transferability to other products.
Battery ageing
Naumann · Sony/Murata LFP (default) or BLAST-Lite · Sony/Murata LFPVoltary calculates ageing with the selected cell model. Results are not a product warranty.
Ageing stressors
Calendar: time, SOC, temperature; cycling: throughput, depth, C-rateThe cycle terms have no explicit temperature factor. BLAST adds SOC-dependent early-cycle loss.
Adjustable inputs
Cell temperature: 25 °C; allowed range 10–45 °CThe app accepts this input range. Not every combination of temperature, state of charge and load was tested experimentally. Model coefficients are fixed; you can switch ageing off.
PV degradation
0.5% per yearDefault used in multi-year PV projections.

Profile and scenario continuation

Multi-year replay of uploaded profiles

Without an existing battery, the measured hourly PV→load overlap is preserved

For uploads without an existing battery, we reconstruct hourly direct PV usage from PV generation, grid import, and grid export and carry that overlap structure into later years. This keeps hours visible in which strong PV output still leaves residual load peaks. If later years were rebuilt only from min(PV, load), those peaks would disappear and the additional battery benefit would tend to be understated. PV degradation still reduces the available PV energy over time.

Uploads with an existing battery

Observed battery behaviour is replayed approximately; the uploaded battery is not synthetically aged

When uploaded profiles already contain battery charge and discharge flows, we do not infer a separate technical model for that battery. Its measured total charge and discharge remain fixed in every modeled interval and are neither re-optimized nor synthetically aged. PV degradation can reduce the PV-backed share of that fixed charge; any resulting shortfall is assigned to grid import. Long-horizon results with an uploaded existing battery should therefore be read as conditional fixed-dispatch projections.

Scenario construction for new PV systems

Each candidate PV size gets its own full-year PV profile; battery variants are simulated on the same demand and tariff basis

When planning a new PV system, the demand baseline comes from uploaded or generated consumption data. For each candidate PV size, we first assign available PV capacity to the roof surfaces with the highest expected yield and send only those allocated partial surfaces to the PV profile calculation. This creates a full-year PV profile; we then simulate each PV/battery combination against the same horizon and optimization objective. All battery variants use the configured technical and economic assumptions.

Notation and units

Fractions and interest rates enter the equations as decimal values: 0.95 means 95% efficiency, and 0.05 means a 5% capacity loss or 5% annual interest. Equations from the sources are expressed in this notation; any unit conversions are explained beside the relevant formula. Intermediate markers such as (sd), (reserve), (d) and (pv) identify stored-energy states within a simulation interval.

EEEnergy quantity
UnitkWh
PPPower
UnitkW
ppPrice or tariff component
UnitEUR/kWh
CCCost or annual savings
UnitEUR
IIInvestment
UnitEUR
Π\PiTotal profit over the analysis horizon
UnitEUR
η\etaCharging or discharging efficiency; 0.95 means 95%
Unit1
SSEnergy stored in the battery; s denotes the relative state of charge
UnitkWh
ttSimulation interval
Unitindex
YYAnalysis horizon
Unityears
s,σmin⁡,σmax⁡s, \sigma_{\min}, \sigma_{\max}State of charge and operating limits as fractions between 0 and 1
Unitdimensionless
DDCycle depth as a SOC difference: 0.8 means 80 percentage points
Unitdimensionless
Lcal,LcycL^{\mathrm{cal}}, L^{\mathrm{cyc}}Calendar and cycling losses as fractions of initial capacity
Unitdimensionless
Hd,RiH_d, R_iCapacity relative to initial capacity: H at day end for BLAST, R at a simulation interval for the 80% metric
Unitdimensionless
UPV,SSU_{\mathrm{PV}}, \mathrm{SS}PV utilisation and self-sufficiency as ratios; 0.75 is displayed as 75%
Unitdimensionless
r,IRRr, \mathrm{IRR}Annual discount rate and internal rate of return; 0.05 means 5% per year
Unitdimensionless
CrateC_{\mathrm{rate}}Charging or discharging rate relative to capacity; 0.5 h⁻¹ means 0.5 C
Unith⁻¹
RgasR_{\mathrm{gas}}Universal gas constant in the temperature function
UnitJ/(mol·K)
fsigf_{\mathrm{sig}}Sigmoid function for capacity loss in the BLAST model
Unitdimensionless
β\betaExponent of long-term BLAST cycling loss, approximately 1.12848
Unitdimensionless
τ,tage\tau, t_{\mathrm{age}}Elapsed ageing time: τ in seconds for Naumann, taget_{\mathrm{age}} in days for BLAST
Unitseconds / days
v∈{0,P,S}v\in\{0,P,S\}Comparison case: current setup (0), added PV (P), added PV and storage (S)
Unitdimensionless
NCFN_{\mathrm{CF}}Number of cash flows after the initial investment, which has index 0
Unitdimensionless

Indices, suffixes, and arrow notation

gross\mathrm{gross}energy before efficiency losses
ExampleEgrid→bat,grossE^{\mathrm{grid}\rightarrow\mathrm{bat},\mathrm{gross}} is gross energy charged from the grid.
net\mathrm{net}energy after efficiency losses or expressed as a net effect
ExampleEcharge,netE^{\mathrm{charge},\mathrm{net}} is energy stored net inside the battery.
res\mathrm{res}remaining quantity after an earlier step
ExampleLresL^{\mathrm{res}} is residual load after direct PV coverage.
exp,pre\mathrm{exp,pre}potential export before regulatory limitation
ExampleEexp,preE^{\mathrm{exp,pre}} is only later capped to EexpE^{\mathrm{exp}} if required.
dyn  /  ϕfi\mathrm{dyn}\;/\;\phi_{\mathrm{fi}}dynamic tariff notation or feed-in scaling reference
Examplepdynp^{\mathrm{dyn}} is the interval price; ϕfi\phi_{\mathrm{fi}} scales permitted feed-in.
a→ba \rightarrow bdirected energy flow from source a to sink b
Examplepv→load\mathrm{pv}\rightarrow\mathrm{load} means direct PV-to-load coverage; grid→bat\mathrm{grid}\rightarrow\mathrm{bat} means battery charging from the grid.
(sd)/(reserve)/(d)/(pv)(\mathrm{sd}) / (\mathrm{reserve}) / (\mathrm{d}) / (\mathrm{pv})temporary battery state of charge within the same interval
ExampleSt(sd)S_t^{(\mathrm{sd})} is after self-discharge, St(reserve)S_t^{(\mathrm{reserve})} after reserve restoration, St(d)S_t^{(\mathrm{d})} after discharge, and St(pv)S_t^{(\mathrm{pv})} after PV charging.
Data sources

The calculation uses your inputs, uploaded measurements and the following external data.

User inputs and uploads

Household consumption, existing PV data, battery assumptions, price assumptions

Uploaded time series take precedence over coarse default profiles where available.

PVGIS TMY profile

Site-specific hourly PV production values from the historical TMY months officially selected by PVGIS

PVGIS 5.3 selects a Typical Meteorological Year under ISO 15927-4 across 2005–2023. For each surface geometry, we use the real hourly PVGIS power values from the selected source months, calculated with crystSi2025, the selected mounting type, and the selected system losses (defaults: free-standing/ventilated and 14%). The backend ranks configured surfaces by their site-specific normalized PVGIS annual yield and scales the verified profiles locally to the resulting allocation. A leap-year target receives a real, separately recorded PVGIS leap day. No synthetic fallback is used; an unavailable or invalid PVGIS profile stops the calculation.

Open source
Bundesnetzagentur | SMARD.de

Day-ahead spot prices for dynamic tariffs in Germany

Used in quarter-hour resolution. Source attribution: Bundesnetzagentur | SMARD.de, licensed under CC BY 4.0. Voltary processes the source data (including unit conversion, interval alignment, and chart aggregation).

Open source
Tariff and network-charge inputs

German network fees, levies, supplier margins, and configured tariff components

Included through configuration, network-operator parameters, and the implemented regulatory logic.

Regulatory inputs

Selected implemented Solarspitzengesetz rules for negative prices and feed-in limitation

Applied only when the installation date and configuration trigger the implemented German regulatory path.

Open source
Ageing model references

Sources support cell experiments, model equations and numerical implementation. They do not independently validate transferability to a specific home battery.

Short worked example

This simplified example calculates battery discharge over one hour. Self-discharge and auxiliary demand are zero; ageing and annual fixed charges are excluded. The final step gives a separate simplified payback calculation.

  1. 1. Inputs

    Load 4.0 kWh; PV 1.0 kWh; starting SoC 6.0 kWh; capacity 10.0 kWh; SoC bounds 10% and 95%; P_d = 3.0 kW; η_d = 0.95; price 0.30 EUR/kWh.
    Inputs for one hour.

    This example isolates one hour: self-discharge and auxiliary consumption are zero; degradation and annual fixed costs are excluded.

  2. 2. Direct coverage and residual load

    PV→load = min(1.0, 4.0) = 1.0. Therefore L^res = 4.0 - 1.0 = 3.0.
    Direct PV coverage 1.0 kWh; residual load 3.0 kWh.

    The battery supplies demand left after direct PV use.

  3. 3. Discharge and grid import

    Maximum deliverable to load: 0.95 × min(6.0 - 1.0, 3.0) = 2.85. Remaining grid import: 3.0 - 2.85 = 0.15.
    Battery discharge 2.85 kWh; grid import 0.15 kWh.

    Energy above the minimum reserve, discharge power and efficiency limit delivery to the household.

  4. 4. Updated SoC and interval benefit

    S_t = 6.0 - 2.85 / 0.95 = 3.0. Interval benefit: 2.85 × 0.30 = 0.855 EUR.
    End-of-interval SoC 3.0 kWh; interval monetary value 0.855 EUR.

    In this hour, the battery displaces grid imports. There is no forgone feed-in revenue or grid-charging cost, so the benefit equals the cost of the avoided grid electricity.

  5. 5. Cash flow and payback

    With 720 EUR of operating battery benefit, 120 EUR maintenance per full operating year and 6,000 EUR investment, nominal net cash flow is 600 EUR per year. Under constant nominal cash flows, the investment is recovered after 10 years.
    600 EUR annual net cash flow; nominal payback 10 years.

    This simplified example shows nominal cash flows and payback. NPV and IRR use the actual payment dates. NPV uses the selected discount rate; IRR finds the rate at which NPV is zero.

Model limitations
  • Future electricity prices, levies and regulation are uncertain. The calculation uses the selected assumptions and does not guarantee future prices.
  • The Solarspitzengesetz path covers fixed PV below 100 kW with EEG feed-in remuneration. Balcony PV is modeled separately without remuneration; direct marketing and project-specific system aggregation are not modeled. Below 2 kWp, no future BNetzA determination is assumed. Section 51a recovery outside the analysis period is estimated from the final operating year with continued PV degradation. The model is not a legal compliance assessment.
  • Voltary calculates individual result values for each configuration under the selected assumptions. It does not calculate statistical uncertainty ranges or confidence intervals.
  • Ageing uses a constant cell temperature and specific Sony/Murata LFP cell models. Independent home-battery validation, a thermal model and ageing-dependent efficiencies or power limits are absent. Long horizons extrapolate the measurement duration.
  • If an upload already contains battery flows, we keep that existing battery's measured total charge and discharge fixed in every modeled interval and neither re-optimize nor synthetically age it. When PV degradation reduces the PV energy available for that fixed charging, the shortfall is assigned to grid import. Long-horizon projections with an uploaded existing battery are therefore conditional fixed-dispatch projections rather than a technical battery-aging forecast.
  • Household behaviour changes, manual intervention, and manufacturer-specific control strategies are only captured to the extent that they are represented in the inputs and assumptions.
  • Installer quotes, financing costs, tax edge cases, and project-specific ancillary costs are outside the baseline equations documented here.
  • Advanced finance outputs are pre-tax and unlevered. Taxes, grants, depreciation, salvage value, and automatic replacements are excluded from the base calculation. For a selected configuration, the app can separately deduct one additional future payment from NPV and nominal net profit. This optional cost scenario changes neither the recommendation nor energy flows or ageing, and does not predict failure.
  • Even a comparison using the same assumptions can differ from later outcomes. Before investing, check that consumption, prices, costs and technical specifications match your project.