Overview

Voltary simulates household load, PV generation, battery dispatch, and tariff settlement at fixed time intervals. The results are intended for robust comparisons across scenarios and configurations, not as a guarantee that realized savings will match the model exactly.

On this page, we document the currently implemented model logic through formulas, assumptions, data sources, and model boundaries.

Notation and units

The notation below is used consistently across the page. Intermediate state markers such as (sd), (reserve), (d), and (pv) denote temporary SoC states inside a single dispatch interval.

SymbolUnitMeaning
EEkWhEnergy quantity
PPkWPower
ppEUR/kWhPrice or tariff component
CCEURCost or annual savings
IIEURInvestment
Π\PiEURTotal profit over the analysis horizon
η\eta1Efficiency factor
SSkWhBattery state of charge
ttindexSimulation interval
YYyearsAnalysis horizon

Indices, suffixes, and arrow notation

NotationMeaningExample
gross\mathrm{gross}energy before efficiency lossesEgridbat,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 effectEcharge,netE^{\mathrm{charge},\mathrm{net}} is energy stored net inside the battery.
res\mathrm{res}remaining quantity after an earlier stepLresL^{\mathrm{res}} is residual load after direct PV coverage.
exp,pre\mathrm{exp,pre}potential export before regulatory limitationEexp,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 referencepdynp^{\mathrm{dyn}} is the interval price; ϕfi\phi_{\mathrm{fi}} scales permitted feed-in.
aba \rightarrow bdirected energy flow from source a to sink bpvload\mathrm{pv}\rightarrow\mathrm{load} means direct PV-to-load coverage; gridbat\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 intervalSt(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.

Simulation pipeline

The outputs are produced in a fixed sequence from data intake and normalization to physical simulation and economic evaluation.

1. Inputs

Consumption data, PV configuration, battery parameters, price assumptions, and tariff extras are assembled as model inputs.

2. Normalization

Time stamps, units, and missing values are aligned to a common interval structure so that load, PV, and price series can be compared directly. For uploads without an existing battery, we carry forward into later years the hourly pattern observed in the upload: how much PV directly covers load and in which hours residual load and grid import still remain despite PV. This matters because otherwise hours with strong PV but remaining residual load and grid import would be smoothed away. Those are exactly the spikes a battery can often cover later.

3. PV modelling

Depending on the workflow, we use uploaded PV data or compute weather-based PV production curves from PVGIS hourly data. We send the location, orientation, tilt, and allocated kWp per PV surface to PVGIS and use its documented default value of 14% system losses. For forecasts, we combine three real historical PVGIS years by taking the middle-yield month for each calendar month. In new-system scenarios where the selected PV size is smaller than the configured roof capacity, the highest-yield surfaces are allocated first; only those allocated partial surfaces feed into the PVGIS profile.

4. Battery dispatch

For each interval, SoC bounds, power constraints, efficiencies, and economic thresholds determine whether the battery charges, discharges, or remains idle. The battery therefore follows a transparent rule-based logic rather than a forecast-optimized controller.

5. Tariff settlement

Import cost, export revenue, and annual fixed components are aggregated under the active pricing model.

6. Evaluation

The model derives metrics such as self-sufficiency, self-consumption, ROI, payback, and profit and then ranks configurations by the chosen objective.

Battery model

The battery is modelled as a discrete-time storage problem with SoC bounds, charge/discharge power limits, and efficiency losses. Within each interval, the implementation follows this sequence: SoC clipping, direct PV-to-load allocation, self-discharge, reserve restoration, auxiliary demand, economically admissible discharge, PV charging, optional grid charging, and only then export or feed-in limitation.

(1)

Calendar aging

Usable capacity declines over time even without active cycling. The model captures this effect in a chemistry-aware way and makes it depend on the average SoC of the simulation day.

Ltcal=τtmcalachemmsoc ⁣(sˉτ)(yτyτ1)L_t^{\mathrm{cal}} = \sum_{\tau \le t} m_{\mathrm{cal}}\, a_{\mathrm{chem}}\, m_{\mathrm{soc}}\!\left(\bar s_\tau\right)\left(\sqrt{y_\tau} - \sqrt{y_{\tau-1}}\right)
Variables
LtcalL_t^{\mathrm{cal}}cumulative calendar-driven capacity loss up to t
achem,msoc(sˉt)a_{\mathrm{chem}}, m_{\mathrm{soc}}(\bar s_t)calendar-aging sensitivity multiplier together with chemistry-specific base coefficient and SoC multiplier
sˉt,yt\bar s_t, y_taverage SoC of the simulation day and years elapsed up to t
Interpretation

In the model, calendar aging follows a square-root-of-time structure. Higher average SoC levels accelerate aging through the multiplier msoc()m_{\mathrm{soc}}(\cdot), while the base coefficients differ by cell chemistry. The user-facing multiplier mcalm_{\mathrm{cal}} scales this baseline term for sensitivity analysis without changing the underlying model structure.

The calendar-aging sensitivity is an optional high-level scenario control, not a manufacturer-specific cell coefficient.

(2)

Cycle aging

In addition to calendar aging, cycling reduces the available capacity. The daily SoC path is therefore translated into equivalent full cycles and a daily cycle depth.

ntefc=12itsisi1n_t^{\mathrm{efc}} = \frac{1}{2}\sum_{i \in t}\left|s_i - s_{i-1}\right|
Dt=maxit ⁣(si)minit ⁣(si)D_t = \max_{i \in t}\!\left(s_i\right) - \min_{i \in t}\!\left(s_i\right)
Nlife,t=Ncycmdepth(Dt)N_{\mathrm{life},t} = N_{\mathrm{cyc}}\, m_{\mathrm{depth}}(D_t)
Ltcyc=0.20τtmcycnτefcNlife,τL_t^{\mathrm{cyc}} = 0.20 \sum_{\tau \le t} m_{\mathrm{cyc}}\, \frac{n_\tau^{\mathrm{efc}}}{N_{\mathrm{life},\tau}}
Variables
ntefc,Dtn_t^{\mathrm{efc}}, D_tequivalent full cycles and daily cycle depth of simulation day t
Nlife,t,mdepth(Dt)N_{\mathrm{life},t}, m_{\mathrm{depth}}(D_t)chemistry- and depth-dependent effective cycle life
Ltcyc,NcycL_t^{\mathrm{cyc}}, N_{\mathrm{cyc}}cumulative cycle-driven capacity loss up to t, guaranteed cycles, and the cycle-aging sensitivity multiplier
Interpretation

Shallow daily SoC swings consume less life in the model than deep cycles. The factor 0.20 maps cumulative cycle damage into capacity loss, so calendar and cycle components jointly determine the available capacity. The user-facing multiplier mcycm_{\mathrm{cyc}} scales the baseline cycle-damage term for sensitivity analysis.

Like the calendar-aging sensitivity, the cycle-aging sensitivity is an optional scenario setting rather than a raw internal coefficient table.

(3)

Available capacity and SoC bounds

The allowable operating band scales with the battery capacity still available at the relevant point in the simulation; minimum and maximum SoC are therefore not fixed kWh values.

Ecap,t=Ecap,0(1LtcalLtcyc)E_{\mathrm{cap},t} = E_{\mathrm{cap},0}\left(1 - L_t^{\mathrm{cal}} - L_t^{\mathrm{cyc}}\right)
Smin,t=σminEcap,tS_{\min,t} = \sigma_{\min} E_{\mathrm{cap},t}
Smax,t=σmaxEcap,tS_{\max,t} = \sigma_{\max} E_{\mathrm{cap},t}
Variables
Ecap,tE_{\mathrm{cap},t}available battery capacity in interval or simulation day t
Ltcal,LtcycL_t^{\mathrm{cal}}, L_t^{\mathrm{cyc}}cumulative calendar- and cycle-driven capacity losses up to t
σmin,σmax\sigma_{\min}, \sigma_{\max}minimum and maximum allowed SoC shares, e.g. 10% and 95%
Interpretation

In the main implementation path, usable capacity is propagated over time with a chemistry-aware calendar and cycle aging model. The lower and upper SoC bounds are recomputed from that currently available capacity in each interval.

(4)

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^dmaximum chargeable and dischargeable energy in interval t
Pc,PdP_c, P_dbattery charge and discharge power
Δt\Delta tsimulation interval length in hours
Interpretation

This makes short-term flexibility power-limited by construction. A large battery without sufficient power cannot react arbitrarily fast to price or load spikes.

(5)

Battery wear cost

The implementation spreads battery investment across nominal lifetime cycle throughput given by capacity times guaranteed cycles.

wbat=IbatEcapNcycw_{\mathrm{bat}} = \frac{I_{\mathrm{bat}}}{E_{\mathrm{cap}} N_{\mathrm{cyc}}}
Variables
wbatw_{\mathrm{bat}}wear cost per internally cycled kWh
IbatI_{\mathrm{bat}}battery investment
Ecap,NcycE_{\mathrm{cap}}, N_{\mathrm{cyc}}battery capacity and guaranteed cycles
Interpretation

This definition matches the current dispatch logic. Efficiency losses are not baked into wear cost; they are applied afterwards in the charge and discharge thresholds.

The reference quantity here is internally cycled kWh, not lifetime net energy delivered to the load. The current implementation deliberately uses a linear wear-cost model based on guaranteed cycles; additional aging drivers such as temperature, charge and discharge power, depth of discharge, and calendar aging are not modeled separately. A possible future extension could derive state-dependent marginal aging cost from the long-horizon chemistry-aware aging model, but the current dispatch path keeps wear cost as a simpler operational proxy.

(6)

Maximum charge price

Grid charging is only economical when the purchase price is low enough to cover both wear cost and round-trip losses.

pchargemax=wbatηcηdp_{\mathrm{charge}}^{\max} = \frac{w_{\mathrm{bat}}}{\eta_c \eta_d}
Variables
pchargemaxp_{\mathrm{charge}}^{\max}highest economical grid-charging price
wbatw_{\mathrm{bat}}battery wear cost
ηcηd\eta_c \eta_dround-trip efficiency
Interpretation

Under fixed pricing, this threshold is typically below the flat import price, so pure grid arbitrage remains disabled.

In the current implementation this threshold is derived from the operational wear-cost proxy above, not from a state-dependent chemistry-aware marginal aging model.

(7)

Minimum discharge price

Discharging only makes sense when the avoided import price exceeds wear cost after accounting for discharge losses.

pdischargemin=wbatηdp_{\mathrm{discharge}}^{\min} = \frac{w_{\mathrm{bat}}}{\eta_d}
Variables
pdischargeminp_{\mathrm{discharge}}^{\min}lowest economical discharge price
wbatw_{\mathrm{bat}}battery wear cost
ηd\eta_ddischarge efficiency
Interpretation

The battery therefore does not discharge mechanically at every opportunity. It only discharges in intervals where the modeled value of saved grid energy exceeds modeled wear.

As with the charge threshold, the current implementation uses the simpler operational wear-cost proxy here. A future extension could make this threshold depend on state-dependent marginal aging cost.

(8)

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.

Etpvload=min ⁣(Etpv,Etload)E_t^{\mathrm{pv}\rightarrow\mathrm{load}} = \min\!\left(E_t^{\mathrm{pv}}, E_t^{\mathrm{load}}\right)
Ltres=max ⁣(EtloadEtpvload,0)L_t^{\mathrm{res}} = \max\!\left(E_t^{\mathrm{load}} - E_t^{\mathrm{pv}\rightarrow\mathrm{load}}, 0\right)
Xt=max ⁣(EtpvEtpvload,0)X_t = \max\!\left(E_t^{\mathrm{pv}} - E_t^{\mathrm{pv}\rightarrow\mathrm{load}}, 0\right)
Variables
Etpv,EtloadE_t^{\mathrm{pv}}, E_t^{\mathrm{load}}PV generation and household load in interval t
EtpvloadE_t^{\mathrm{pv}\rightarrow\mathrm{load}}load covered directly by PV
Ltres,XtL_t^{\mathrm{res}}, X_tremaining residual load and remaining PV surplus
Interpretation

These definitions are the starting point of the dispatch sequence. All later battery decisions are based on residual load and surplus, not on gross load and PV values.

(9)

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~t1E_t^{\mathrm{self}} = \lambda_{\mathrm{sd}} \tilde S_{t-1}
St(sd)=S~t1EtselfS_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})}SoC immediately after applying self-discharge
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.

(10)

Reserve restoration after self-discharge

If self-discharge pushes SoC below the configured minimum reserve, the model restores that reserve from PV surplus first and from grid second, subject to the remaining charge-power budget.

Etreservepv,gross=min ⁣(Xt,max ⁣(Smin,tSt(sd),0)ηc,Eˉtc)E_t^{\mathrm{reserve}\leftarrow\mathrm{pv,gross}} = \min\!\left(X_t, \frac{\max\!\left(S_{\min,t} - S_t^{(\mathrm{sd})}, 0\right)}{\eta_c}, \bar E_t^c\right)
Etreservegrid,gross=min ⁣(max ⁣(Smin,tSt(sd,pv),0)ηc,max ⁣(EˉtcEtreservepv,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
Etreservepv,gross,Etreservegrid,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})}SoC after self-discharge and after PV-backed reserve restoration
Xt,EˉtcX_t, \bar E_t^cremaining PV surplus and charge-power headroom
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.

(11)

Standby and auxiliary demand

Standby and auxiliary demand represents the ongoing electrical load of the battery, inverter, and control electronics within the interval. That power draw is first converted into an energy amount. The battery covers only the share that remains available above the minimum-SoC reserve after reserve restoration and within the discharge limit; any remainder is drawn directly from the grid.

Etaux=PauxΔtE_t^{\mathrm{aux}} = P_{\mathrm{aux}} \Delta t
Etauxbat=min ⁣(Etaux,ηdmin ⁣(max ⁣(St(reserve)Smin,t,0),Eˉtd))E_t^{\mathrm{aux}\leftarrow\mathrm{bat}} = \min\!\left(E_t^{\mathrm{aux}}, \eta_d \min\!\left(\max\!\left(S_t^{(\mathrm{reserve})} - S_{\min,t}, 0\right), \bar E_t^d\right)\right)
Etauxgrid=EtauxEtauxbatE_t^{\mathrm{aux}\leftarrow\mathrm{grid}} = E_t^{\mathrm{aux}} - E_t^{\mathrm{aux}\leftarrow\mathrm{bat}}
Variables
EtauxE_t^{\mathrm{aux}}total auxiliary demand in interval t
Etauxbat,EtauxgridE_t^{\mathrm{aux}\leftarrow\mathrm{bat}}, E_t^{\mathrm{aux}\leftarrow\mathrm{grid}}auxiliary demand covered by the battery and by the grid
Paux,EˉtdP_{\mathrm{aux}}, \bar E_t^dauxiliary power and discharge-power limit
Interpretation

Auxiliary demand is therefore ordinary site consumption, not a separate battery-chemistry loss term. It reduces SoC only to the extent that withdrawable energy actually exists above the reserve floor; otherwise it increases grid import directly without triggering artificial grid-to-battery charging.

(12)

Economically admissible discharge

After direct PV self-consumption is allocated, the model reads the term from the inside out to determine how much energy the battery can physically deliver to load in this interval: first the energy available above the minimum reserve, then that amount capped by the interval discharge-power limit, and then converted with ηd\eta_d into the energy that actually reaches the load after discharge losses. Residual load is served only up to that amount and only if the current electricity price exceeds the discharge threshold.

Etdisload={min ⁣(Ltres,ηdmin ⁣(S~t1Smin,t,Eˉtd)),pt>pdischargeminpt>pchargemax0,otherwiseE_t^{\mathrm{dis}\rightarrow\mathrm{load}} = \begin{cases}\min\!\left(L_t^{\mathrm{res}}, \eta_d \min\!\left(\tilde S_{t-1} - S_{\min,t}, \bar E_t^d\right)\right), & p_t > p_{\mathrm{discharge}}^{\min} \land p_t > p_{\mathrm{charge}}^{\max} \\ 0, & \text{otherwise}\end{cases}
Variables
EtdisloadE_t^{\mathrm{dis}\rightarrow\mathrm{load}}battery energy delivered to load in interval t
LtresL_t^{\mathrm{res}}residual load after direct PV consumption
S~t1,pt\tilde S_{t-1}, p_tclipped start-of-interval SoC and current grid price
Interpretation

The nested min structure therefore reads in three stages: withdrawable energy above the reserve floor, the amount actually usable within the discharge limit, and finally no more than the current residual load. ηd\eta_d ensures that only the energy still available at the load after discharge losses is counted. The battery discharges only when doing so is both physically feasible and economically justified.

The additional condition pt>pchargemaxp_t > p_{\mathrm{charge}}^{\max} prevents discharge in price windows where charging would be economically preferred.

(13)

PV charging priority

PV surplus charges the battery before any possible grid charging. The limiting factors are surplus energy, free storage headroom, and charge power.

Etpvbat,gross=min ⁣(Xt,Smax,tSt(d)ηc,Eˉtc)E_t^{\mathrm{pv}\rightarrow\mathrm{bat,gross}} = \min\!\left(X_t, \frac{S_{\max,t} - S_t^{(d)}}{\eta_c}, \bar E_t^c\right)
Variables
XtX_tPV surplus after direct load coverage
St(d)S_t^{(d)}SoC after the discharge decision and before PV charging
Eˉtc\bar E_t^cmaximum charge energy in the interval
Interpretation

In the implemented dispatch sequence, PV charging has priority over grid charging. Any surplus not absorbed by the battery is only handled afterwards via export or feed-in limitation.

(14)

Conditional grid charging

Grid charging is evaluated only after PV charging and can use only the remaining charge power in that interval. In addition, the current price must be below the charge threshold.

Etgridbat,gross={min ⁣(Smax,tSt(pv)ηc,max ⁣(EˉtcEtpvbat,gross,0)),ptpchargemax0,otherwiseE_t^{\mathrm{grid}\rightarrow\mathrm{bat,gross}} = \begin{cases}\min\!\left(\frac{S_{\max,t} - S_t^{(\mathrm{pv})}}{\eta_c}, \max\!\left(\bar E_t^c - E_t^{\mathrm{pv}\rightarrow\mathrm{bat,gross}}, 0\right)\right), & p_t \le p_{\mathrm{charge}}^{\max} \\ 0, & \text{otherwise}\end{cases}
Variables
Etgridbat,grossE_t^{\mathrm{grid}\rightarrow\mathrm{bat,gross}}gross energy charged from the grid
St(pv)S_t^{(\mathrm{pv})}SoC after PV charging and before grid charging
pchargemaxp_{\mathrm{charge}}^{\max}economic price threshold for grid charging
Interpretation

This prevents PV charging and grid charging from consuming the same charge-power budget twice. Grid charging remains restricted to intervals with sufficiently low prices.

(15)

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 ⁣(XtEtpvbat,gross,0)E_t^{\mathrm{exp,pre}} = \max\!\left(X_t - E_t^{\mathrm{pv}\rightarrow\mathrm{bat,gross}}, 0\right)
Etexp=min ⁣(Etexp,pre,ϕfiPnompvΔt)E_t^{\mathrm{exp}} = \min\!\left(E_t^{\mathrm{exp,pre}}, \phi_{\mathrm{fi}} P_{\mathrm{nom}}^{\mathrm{pv}} \Delta t\right)
Etcurt=Etexp,preEtexpE_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}}feed-in factor and nominal PV power
Interpretation

If no feed-in ceiling is active, ϕfi\phi_{\mathrm{fi}} is effectively 1 and curtailment disappears. Under an active cap, the difference is the modeled curtailed energy.

(16)

Grid import with battery

In the model, grid import consists not only of residual household demand but also of reserve-restoration charging from the grid, ordinary grid charging, and any uncovered auxiliary demand.

Etgrid,imp,load=max ⁣(LtresEtdisload,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+Etreservegrid,gross+Etgridbat,gross+EtauxgridE_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
Etreservegrid,gross,EtauxgridE_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
Interpretation

This definition is central for cost and self-sufficiency metrics. Grid import rises whenever the battery is charged from the grid or when auxiliary demand cannot be covered from energy above the reserve floor.

(17)

State-of-charge update

The end-of-interval state of charge is obtained from the clipped starting state after subtracting self-discharge and auxiliary supply from the battery, and after adding reserve restoration as well as ordinary PV and grid charging.

St=S~t1Etself+ηcEtreservepv,gross+ηcEtreservegrid,grossEtauxbatηdEtdisloadηd+ηcEtpvbat,gross+ηcEtgridbat,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~t1,St\tilde S_{t-1}, S_tclipped start-of-interval SoC and end-of-interval SoC
Etself,EtauxbatE_t^{\mathrm{self}}, E_t^{\mathrm{aux}\leftarrow\mathrm{bat}}self-discharge loss and auxiliary demand supplied by the battery
Etreservepv,gross,Etreservegrid,grossE_t^{\mathrm{reserve}\leftarrow\mathrm{pv,gross}}, E_t^{\mathrm{reserve}\leftarrow\mathrm{grid,gross}}reserve-restoration energy from PV and from grid
Interpretation

This equation ties the full dispatch sequence into one consistent terminal state for the interval. For SoC, charging counts only the energy that actually reaches the battery after charging losses. On discharge and on auxiliary demand served by the battery, SoC must fall by more than what later appears at the load, because additional discharge losses occur on the way. That is why charging is added only by the stored share, while discharge is subtracted by the full energy withdrawn from the battery.

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

Under fixed pricing, annual import cost is the energy price times import volume plus annual fixed components.

Cfixed=pfixedEgrid,imp+FannualC_{\mathrm{fixed}} = p_{\mathrm{fixed}} E_{\mathrm{grid,imp}} + F_{\mathrm{annual}}
Variables
pfixedp_{\mathrm{fixed}}flat energy price per kWh
Egrid,impE_{\mathrm{grid,imp}}annual grid import
FannualF_{\mathrm{annual}}annual fixed tariff components
Interpretation

This is the reference path for flat tariffs and provides the baseline against which dynamic pricing logic can be compared.

(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 base and network components
Interpretation

The dynamic-pricing path can be extended with regional network charges, levies, and supplier components; day-ahead prices come from the configured market data source, with DE-LU/AT sourced from Bundesnetzagentur | SMARD.de. For settlement, prices and energy flows are always brought onto the same simulation time axis. In 15-minute simulations, quarter-hourly prices are applied directly to the matching quarter-hourly flows. When energy flows are only available hourly, the model distributes each hourly energy amount evenly across the four quarter-hours in that path. When the simulation runs hourly, quarter-hourly prices are aggregated into hourly means and settled against the matching hourly flow. For rules that depend on negative spot prices, an hour in that path is already treated as affected when at least one quarter-hour within the hour is negative. Separately, the hourly price chart can also show hourly means plus min/max ranges derived from the quarter-hour source.

Reported metrics

We combine physical and economic performance metrics. The definitions below are the main outputs used for PV-only, battery-only, and combined-system comparison.

Comparison paths: uploaded data can already contain battery behavior. A scenario with 0 kWh of additional battery capacity is therefore not always identical to a pure household-without-battery baseline. Reported battery effects always refer to the matching comparison path.

(20)

Self-consumption rate

The self-consumption rate measures how much of total PV generation is used inside the system rather than exported.

SCR=Epv,selfEpv\mathrm{SCR} = \frac{E_{\mathrm{pv,self}}}{E_{\mathrm{pv}}}
Variables
Epv,selfE_{\mathrm{pv,self}}self-consumed PV energy
EpvE_{\mathrm{pv}}total PV generation
Interpretation

Higher values indicate that a larger share of generated solar electricity stays within the household or battery system.

(21)

Self-sufficiency

Self-sufficiency measures the share of household demand that can be covered without importing electricity from the grid.

SS=1Egrid,impEload\mathrm{SS} = 1 - \frac{E_{\mathrm{grid,imp}}}{E_{\mathrm{load}}}
Variables
Egrid,impE_{\mathrm{grid,imp}}grid import over the evaluation period, including reserve-related and ordinary battery grid charging
EloadE_{\mathrm{load}}total household load
Interpretation

The lower residual grid import is relative to total demand, the higher the modeled energy independence. In the implementation path, grid import includes direct load import, reserve-restoration import from the grid, and gross grid charging of the battery.

This is an implementation-level import term, not only direct household import. That choice is deliberate: load later served from a battery that was charged from the grid does not count as genuine energy independence.

(22)

Battery interval net benefit

The battery’s economic contribution in each interval is the avoided import value minus the opportunity cost of all PV-backed charging, including reserve restoration, and minus the direct cost of all grid-backed charging and grid-supplied auxiliary demand.

Btbat=VtdisOCtpvCtgridB_t^{\mathrm{bat}} = V_t^{\mathrm{dis}} - OC_t^{\mathrm{pv}} - C_t^{\mathrm{grid}}
Vtdis=EtdisloadptgridV_t^{\mathrm{dis}} = E_t^{\mathrm{dis}\rightarrow\mathrm{load}} \, p_t^{\mathrm{grid}}
OCtpv=(Etreservepv,gross+Etpvbat,gross)ptfeed-inOC_t^{\mathrm{pv}} = \left(E_t^{\mathrm{reserve}\leftarrow\mathrm{pv,gross}} + E_t^{\mathrm{pv}\rightarrow\mathrm{bat,gross}}\right) p_t^{\mathrm{feed\text{-}in}}
Ctgrid=(Etreservegrid,gross+Etgridbat,gross+Etauxgrid)ptgridC_t^{\mathrm{grid}} = \left(E_t^{\mathrm{reserve}\leftarrow\mathrm{grid,gross}} + E_t^{\mathrm{grid}\rightarrow\mathrm{bat,gross}} + E_t^{\mathrm{aux}\leftarrow\mathrm{grid}}\right) p_t^{\mathrm{grid}}
Variables
BtbatB_t^{\mathrm{bat}}net battery benefit in interval t
Vtdis,OCtpv,CtgridV_t^{\mathrm{dis}}, OC_t^{\mathrm{pv}}, C_t^{\mathrm{grid}}discharge value, PV-charging opportunity cost, and direct grid-backed cost including auxiliary demand supplied from the grid
Etreservepv,gross,Etreservegrid,grossE_t^{\mathrm{reserve}\leftarrow\mathrm{pv,gross}}, E_t^{\mathrm{reserve}\leftarrow\mathrm{grid,gross}}PV-backed and grid-backed reserve restoration flows plus direct auxiliary demand from the grid
Interpretation

In the current implementation path, any PV energy diverted into the battery is valued as foregone feed-in revenue, while any grid-backed battery charging enters as an explicit electricity purchase. Auxiliary demand served directly from the grid is also booked as an explicit negative battery contribution; auxiliary demand served from the battery is reflected indirectly through lower SoC and reduced later discharge potential. These interval values are aggregated over the simulation horizon and then annualized.

In country-specific special cases with netting or saldering logic, the final monetary effect can instead be derived scenario-wise from energy-cost differences.

(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
Interpretation

This aggregation step turns interval battery contributions into the total amount from which annual battery savings are derived.

(24)

Battery cycles and expected life

The reported cycle count is based on total net charged energy relative to battery capacity. From that, an expected operating life in years is derived.

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}
Tlife=NcycNcyc,annT_{\mathrm{life}} = \frac{N_{\mathrm{cyc}}}{N_{\mathrm{cyc,ann}}}
Variables
Ncyc,tot,Ncyc,annN_{\mathrm{cyc,tot}}, N_{\mathrm{cyc,ann}}total and annual full-cycle equivalents
Etcharge,net,EcapE_t^{\mathrm{charge,net}}, E_{\mathrm{cap}}net charged energy in interval t and battery capacity
Tlife,NcycT_{\mathrm{life}}, N_{\mathrm{cyc}}expected operating life and guaranteed cycles
Interpretation

The model uses full-cycle equivalents rather than literal start-stop cycles. This converts partial cycles into a consistent life-expectancy estimate.

(25)

Annual battery savings

Battery savings are the average annual benefit of the battery operation over the full analysis horizon.

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
YYanalysis horizon in years
Interpretation

This metric is the basis for annual battery ROI and simple battery payback.

(26)

Annual PV savings

Annual PV savings combine the value of self-consumed PV energy and export revenue and average them over the analysis horizon.

Cpvann=Vpv,self+Rfeed-inYC_{\mathrm{pv}}^{\mathrm{ann}} = \frac{V_{\mathrm{pv,self}} + R_{\mathrm{feed\text{-}in}}}{Y}
Variables
Vpv,selfV_{\mathrm{pv,self}}value of self-consumed PV electricity
Rfeed-inR_{\mathrm{feed\text{-}in}}feed-in revenue
Interpretation

In total-system summaries this value is added to annual battery savings to derive total ROI, total profit, and total payback.

(27)

Battery ROI and payback

ROI and payback compress annual battery savings into two compact investment metrics.

ROIbat=CbatannIbat×100\mathrm{ROI}_{\mathrm{bat}} = \frac{C_{\mathrm{bat}}^{\mathrm{ann}}}{I_{\mathrm{bat}}}\times 100
Tpb,bat=IbatCbatannT_{\mathrm{pb,bat}} = \frac{I_{\mathrm{bat}}}{C_{\mathrm{bat}}^{\mathrm{ann}}}
Variables
CbatannC_{\mathrm{bat}}^{\mathrm{ann}}annual battery savings
IbatI_{\mathrm{bat}}battery investment
Tpb,batT_{\mathrm{pb,bat}}simple battery payback period
Interpretation

The implementation uses annualized savings. If annual savings are not positive, payback is represented by a large placeholder value rather than mathematical infinity.

These are simple annualized, non-discounted reporting metrics, not NPV\mathrm{NPV} or IRR\mathrm{IRR}.

(28)

Total profit

Total profit is obtained by summing PV and battery savings across the analysis period and subtracting the relevant investments.

Π=Y(Cbatann+Cpvann)IbatIpv\Pi = Y\left(C_{\mathrm{bat}}^{\mathrm{ann}} + C_{\mathrm{pv}}^{\mathrm{ann}}\right) - I_{\mathrm{bat}} - I_{\mathrm{pv}}
Variables
Π\Pitotal system profit over the analysis period
Cbatann,CpvannC_{\mathrm{bat}}^{\mathrm{ann}}, C_{\mathrm{pv}}^{\mathrm{ann}}annual battery and PV savings
Ibat,Ipv,YI_{\mathrm{bat}}, I_{\mathrm{pv}}, Ybattery investment, PV investment, and analysis horizon
Interpretation

This is the profit term used when configurations are ranked by profit rather than ROI or self-sufficiency.

(29)

Optimization objective

When multiple configurations are compared, the preferred configuration is the argmax of the chosen objective.

x(g)=argmaxxg(x)x_{\star}^{(g)} = \arg\max_x g(x)
g{ROI,Π,SS}g \in \{\mathrm{ROI}, \Pi, \mathrm{SS}\}
Variables
xxconfiguration consisting of PV size, battery capacity, and power
ggselected objective: battery ROI, total profit, or self-sufficiency
Interpretation

The best configuration for ROI does not have to be the same as the best configuration for total profit or self-sufficiency.

Economic conventions

The financial outputs follow a few deliberately simple conventions. These should be read together with the formulas so that ROI and payback are interpreted correctly.

Advanced finance metrics

NPV and IRR sit on top of the yearly nominal cash-flow model. Year 0 is upfront CAPEX; years 1 to Y are nominal net cash flows after maintenance.

(30)

Net Present Value (NPV)

NPV\mathrm{NPV} discounts the yearly nominal net cash-flow stream back to year 0 and subtracts the upfront investment.

NPV=I0+t=1YCFtnom(1+r)t\mathrm{NPV} = -I_0 + \sum_{t=1}^{Y}\frac{CF_t^{\mathrm{nom}}}{(1+r)^t}
Variables
NPV\mathrm{NPV}discounted project value over the analysis horizon
I0I_0upfront CAPEX in year 0
CFtnomCF_t^{\mathrm{nom}}nominal net cash flow after maintenance in year t
r,Yr, Ydiscount rate and analysis horizon
Interpretation

A positive NPV\mathrm{NPV} means the project beats the chosen discount rate over the modeled horizon.

The implementation uses nominal yearly cash flows, with maintenance included in each yearly cash-flow term.

(31)

Internal Rate of Return (IRR)

IRR\mathrm{IRR} is the discount rate that makes the same year-0 CAPEX and nominal yearly net cash-flow stream sum to zero.

0=I0+t=1YCFtnom(1+IRR)t0 = -I_0 + \sum_{t=1}^{Y}\frac{CF_t^{\mathrm{nom}}}{(1+\mathrm{IRR})^t}
Variables
IRR\mathrm{IRR}internal rate of return
I0I_0upfront CAPEX in year 0
CFtnomCF_t^{\mathrm{nom}}nominal net cash flow after maintenance in year t
YYanalysis horizon
Interpretation

IRR\mathrm{IRR} can be compared with a hurdle rate or cost of capital. If the cash-flow pattern has no valid unique 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 that underlies the headline payback metric. In representative-year finance plots, annual maintenance is allocated evenly across the displayed intervals so those visualizations stay consistent with the yearly cash-flow model.

AspectCurrent implementationInterpretation
Analysis horizonMulti-year simulation over the configured horizon, 20 years by default.Reported annual figures are summaries across that horizon, not a standalone first-year simulation.
InflationThe operational benefit path uses a configurable inflation assumption.Multi-year totals therefore reflect nominal progression rather than a simple repetition of the initial year.
Average annual net cash flowDisplayed annual net cash flow equals the average yearly nominal cash flow implied by the accumulated multi-year result, after annual maintenance.The number is a smoothed horizon average, not necessarily the cash flow of year one.
ROI and paybackReported ROI uses average annual nominal net cash flow after maintenance divided by upfront investment; reported payback is the nominal break-even of the same maintenance-inclusive cash-flow series.Both remain non-discounted headline metrics. Discounted metrics such as NPV and IRR are reported separately as advanced finance outputs.
NPV and IRRNPV discounts year-0 CAPEX and yearly nominal net cash flows after maintenance at the configured discount rate. IRR is the rate that sets the same nominal cash-flow stream to zero.Positive NPV means the project beats the chosen discount rate. IRR can be compared with a hurdle rate, but may be unavailable when the cash-flow stream has no valid unique solution.
Cumulative cash-flow chartThe plotted nominal line starts with upfront CAPEX and then adds yearly nominal cash flows net of maintenance; the dashed line discounts the same yearly cash flows.The chart's zero crossing is the nominal cash-flow break-even of the plotted series and therefore matches the headline payback logic, apart from small rounding differences. Representative-year finance plots allocate maintenance evenly across intervals for visualization.

Country-specific special logic

The formulas above describe the generic dispatch and cost path. In some markets, additional regulatory logic can modify export treatment or final monetary attribution.

Base model

Without regulatory exceptions, dispatch, export, and monetary valuation follow the generic equations on this page. This base layer is identical across markets unless a country-specific override is triggered.

Override paths

When a market has an explicit special rule, it does not replace the entire model. It only overrides the affected sub-path, for example export limitation or final monetary attribution. The table below names those deviations explicitly.

CountryRuleModel effect
GermanySolarspitzengesetz path with possible feed-in limitation and zero compensation in negative-price intervals when the rule applies.The generic export and revenue logic can therefore be constrained by country-specific regulation.
NetherlandsSaldering/netting logic can derive battery benefit from scenario-wise differences in net energy cost instead of the simple interval decomposition alone.Final monetary impact can therefore follow regulatory cost logic rather than only the baseline interval-benefit formula.

Assumptions and current defaults

The values below are documented product defaults when users do not override them. They are model parameters, not physical constants.

ParameterCurrent defaultNote
Analysis horizon20 yearsEconomic default; user overrides can replace it.
Time basisFixed-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.
SoC bounds10% min / 95% max / 50% initialApplied only when no explicit configuration is present.
Efficiencies95% charge / 95% dischargeAffect both SoC updates and economic thresholds.
Self-discharge3.0 %/monthApplied as a compounded interval loss on stored energy before reserve restoration.
Standby / auxiliary power5 WModeled as direct electrical demand with battery-first coverage above minimum SoC and grid fallback for the remainder.
Guaranteed cycles6000Used in wear cost and life-expectancy estimates.
Battery chemistryLiFePO4 default; catalog chemistry for real models; generic Li-ion treated conservatively as NMCChemistry determines the calendar- and cycle-aging coefficients. If no narrower chemistry information is available, LiFePO4 remains the default for manual configurations.
Battery agingChemistry-aware calendar and cycle aging; LiFePO4 defaultManual and freely configured batteries default to LiFePO4; real battery models use catalog chemistry when available.
Modeled aging stressorsAverage SoC, cycle depth, and guaranteed cyclesTemperature, explicit C-rate, and manufacturer-specific cell or thermal models are not yet modeled separately.
Aging sensitivity controlsCalendar 1.0x and cycle 1.0x by defaultOptional user-facing multipliers scale the baseline calendar- and cycle-aging terms for sensitivity analysis, while the literature-based model structure stays fixed.
PV degradation0.5% per yearDefault used in multi-year PV projections.
Multi-year replay of uploaded profilesWithout an existing battery, the measured hourly PV→load overlap is preservedFor 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 batteryObserved battery behaviour is replayed approximately; the uploaded battery is not synthetically agedWhen uploaded profiles already contain battery charge and discharge flows, we do not infer a separate technical model for that battery in the multi-year path. Instead, we carry its observed behaviour forward approximately. PV degradation still reduces available PV energy, so PV-backed portions remain feasible only to the extent that degraded PV still allows. Long-horizon results with an uploaded existing battery should therefore be read as approximations.
New-system scenario constructionEach candidate PV size gets its own full-year PV profile; battery variants are simulated on the same demand and tariff basisIn the new-system workflow, 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. Manual batteries use the configured assumptions; real battery mode uses catalog specifications where available.
Annual fixed tariff componentsIncluded in annual totals when configuredEUR/kWh charts often show only variable price components.

Data sources and model inputs

The methodology combines user-supplied inputs with external data sources. The table below lists the main sources and their role in the model.

SourceUsed forNotes
User inputs and uploadsHousehold consumption, existing PV data, battery assumptions, price assumptionsUploaded time series take precedence over coarse default profiles where available.
PVGIS 3-year profileSite-specific hourly PV production values from three real historical PVGIS yearsPVGIS calculates production from coordinates, orientation, tilt, and installed capacity; we use 14% system losses and take the middle-yield month for each calendar month. This preserves real weather sequences without modelling a full uncertainty range.
Bundesnetzagentur | SMARD.deDay-ahead spot prices for DE-LU/AT dynamic pricingUsed 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).
Tariff and network-charge inputsRegional network fees, levies, supplier margins, country-specific price componentsIncluded through configuration, operator-specific parameters, and pricing-model logic.
Regulatory inputsSpecial rules such as negative-price handling or feed-in limitationApplied only when country, installation date, and rule path require it.

Methodological references

The structure of the aging model and the key modeling assumptions are anchored in the following references. The concrete coefficients and multipliers are still initial calibration values within those literature envelopes, not untouched copies of any single paper.

TopicMethodological contributionSource
SAM / NREL battery lifeSupports the separation of calendar and cycle aging and DoD-dependent cycle logic.NREL SAM battery life model overview
Lifetime-prediction reviewSupports separating calendar and cycle contributions as a robust model structure.Battery lifetime prediction review
LFP calendar agingSupports SoC-dependent calendar aging and low-to-moderate baseline fade for LFP.LFP storage-aging study
Square-root-of-time calendar agingSupports the square-root-of-time form for calendar aging and the strong impact of high SoC levels.Automotive aging study
LFP cycle-life modelSupports using cycle depth as a central driver of cycle aging.LFP cycle-life model
LFP vs NMC benchmark contextProvides benchmark context for conservative chemistry assumptions and relative life-expectancy ordering.PNNL / Sandia benchmark

Short worked example

The example below is a deliberately simplified single-interval calculation. It illustrates the battery decision sequence and the economic interpretation without carrying all multi-year effects such as degradation or annual fixed charges.

StepCalculationResultInterpretation
1. InputsLoad 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.Complete interval state before dispatch.This example isolates one hourly interval; degradation and annual fixed charges are intentionally excluded.
2. Direct coverage and residual loadPV→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 only decides after this direct PV allocation has been made.
3. Discharge and grid importMaximum 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.Usable discharge is limited by internal reserve above S_min and by discharge efficiency.
4. Updated SoC and interval benefitS_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.Because there is neither PV opportunity cost nor grid charging in this example, the interval benefit equals the avoided import value.
5. Annual metricWith average annual battery savings of 720 EUR and battery investment of 6,000 EUR, ROI = 720 / 6000 × 100 and T_pb = 6000 / 720.Annualized ROI 12%; simple payback 8.3 years.These are annualized, non-discounted metrics and therefore not NPV/IRR measures.

Model limitations

  • Future electricity prices, levies, and regulation are uncertain. The simulation is therefore a structured scenario analysis, not a price guarantee.
  • Current outputs are point estimates under the chosen assumptions, not stochastic ranges, confidence intervals, or uncertainty bands.
  • Usable battery capacity ages over the multi-year path through chemistry-aware calendar and cycle components. Temperature, charge/discharge rate, and manufacturer-specific cell or thermal models are not yet represented separately.
  • If an upload already contains battery flows, we currently treat that existing battery as observed behaviour in the multi-year path and do not synthetically age it. PV-backed portions are only carried forward insofar as degraded PV still makes them feasible. Long-horizon projections with an uploaded existing battery therefore remain approximate unless that battery is modeled separately with its own technical parameters.
  • 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 replacement logic are intentionally excluded from the current DCF layer.
  • The outputs are most reliable for comparing configurations under consistent assumptions. Realized absolute values can still differ later.

Questions about an assumption or equation?

If you want to discuss an edge case, refer directly to the metric or equation number. That makes it easier to trace the relevant calculation path precisely.