Overview

Voltary represents the energy system of a German household as a time-resolved sequence of electricity demand, PV generation, battery storage, grid import, and feed-in. Tariffs, operating costs, and investment metrics are calculated from this shared energy balance. This allows PV, battery, and tariff scenarios to be compared on a consistent basis.

The chapters below make the calculation path transparent: from data preparation and the project timeline through battery operation and the Solarspitzengesetz path to economic evaluation. They also document default assumptions, data sources, and model limitations. Every result depends on the selected inputs and assumptions; it is a modeled scenario value, not a guarantee of future savings or returns.

Calculation basis at a glance

This introduction explains without formulas which decisions Voltary supports, why time resolution matters, and how the results should be read.

Which questions does Voltary answer?

Voltary considers technical and economic questions together. The aim is not to maximize a single metric, but to identify which configuration best fits the selected objective under the same assumptions.

  • 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 PV or battery size is economically attractive under the selected assumptions?
  • How do electricity prices, feed-in revenue, investment, and operating costs interact?
  • Which configuration better fits an objective such as self-sufficiency, total profit, or return?
Why does time resolution matter?

Annual electricity demand alone is not enough to evaluate PV and battery storage. Two households with the same consumption can obtain different results when demand, PV generation, and prices occur at different times.

Voltary therefore evaluates these quantities together in 15- or 60-minute intervals. This shows whether PV electricity can be used directly or stored, when grid import occurs, and whether time-dependent tariff differences can actually be used.

Which data is used?

The exact data basis depends on the selected analysis and the information available. Voltary combines user inputs and measured data with documented product defaults and external data sources.

  • 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 revenue, dynamic market prices, and the implemented Solarspitzengesetz logic
  • Investment, maintenance, analysis horizon, price development, and discount rate
How should results be interpreted?

The most informative view is a comparison of scenarios calculated with the same rules and assumptions. Individual metrics answer different questions and should therefore not be read in isolation.

  • Differences between scenarios are often more robust than a single absolute result.
  • Long-term euro values depend especially on price, cost, and usage assumptions.
  • Sensitivity analysis shows whether a decision remains plausible under more cautious assumptions.
  • Technical planning, concrete quotes, financing, and contract review remain separate steps.
How do we compare specific storage products?

Voltary compares a limited selection of exact device configurations, not the entire market. Capacity, power limits and connection type have manufacturer sources and review dates. Shared loss and aging assumptions are separate; technical edits are identified as a modified model. This is a simulation, not a product test or a reproduction of proprietary manufacturer energy management.

Modeled balcony PV module profiles allow AC and DC storage in the same comparison. Measured AC generation cannot reveal DC energy already clipped by the inverter and therefore only supports AC retrofit. Regular PV currently uses separate AC storage without replacing the PV inverter. Module compatibility and electrical connection requirements need separate verification.

The prefilled, editable all-in price is a Voltary planning estimate, not a purchase offer. It combines a documented device estimate with an allowance for required accessories, measurement, shipping, installation and applicable taxes. The basis and date are disclosed; replace it with your complete quote. Selecting higher planned AC output updates only an unedited planning price. Commissions do not affect calculations or ranking.

The default comparison idealizes storage: 100% charge/discharge efficiency and usable nominal capacity, no self-discharge, auxiliary consumption or capacity aging. These are not promised product properties; actual savings and rankings can differ. Editable storage efficiencies cover the entire storage path including conversion once. PV generation, direct PV conversion and power limits remain unchanged. Results and reports disclose the actual parameters.

Notional wear remains active: storage investment divided by nominal capacity and assumed reference cycles. It affects dispatch even without capacity aging, but is not an additional cashflow payment. Model-specific cycles carry a manufacturer source and conditions or an explicit Voltary assumption; they are not warranty or lifetime predictions. Compatible load-following household measurement is assumed and must be checked for the actual installation before purchase.

Technical methodology in detail

The chapters below document the implemented calculation through timing and cost conventions, simulation order, formulas, default values, and sources. They provide the precise detail behind the introduction above.

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 measured PV data or calculate new weather-based production curves exclusively from PVGIS 5.3 hourly data with the crystalline-silicon 2025 model (crystSi2025). We send the location and its IANA time zone, every configured surface geometry, the selected mounting type, and the selected system losses to the PVGIS-based backend method. For every unique geometry, it requests a normalized 1 kWp profile and scales the verified values locally to the allocated kWp. The transparent defaults are 14% system losses and free-standing, ventilated mounting. Month selection follows the official PVGIS TMY method under ISO 15927-4 across the 2005–2023 history, and we use the real PVGIS hourly values from the selected source years. When a requested PV size is smaller than the total configured capacity, the backend ranks the surfaces by their site-specific normalized PVGIS annual yield and allocates the requested capacity deterministically in that order. Unavailable, incomplete, or invalid PVGIS data stops the calculation and is never replaced by a synthetic PV curve.

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, NPV, IRR, and profit from the simulation results and dated project cash flows, then ranks configurations by the chosen objective.

Project start and timing conventions

The physical simulation and financial calculation use the same confirmed project start, with separate, explicitly defined time axes.

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.

Calendar years in energy charts and operating years in finance therefore do not always coincide.

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 therefore use actual payment dates rather than assumed year-end values.

Time convention

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

The energy balance remains time-zone accurate, while discounting is unambiguous for irregular payment intervals.

Balcony PV and battery connection

Balcony PV is an explicit system choice: up to 2,000 Wp of modules and an 800 VA PV inverter, without feed-in remuneration. Timing and financial evaluation stay shared. The general battery formulas below describe regular PV; balcony PV instead uses separate AC/DC boundaries with the same reserve-first operating policy where grid charging is supported, and no intentional battery export. Existing systems compare the retrofit with unchanged operation; new systems compare whole-module layouts, including PV without storage and no purchase. Sensor and other retrofit costs enter the budget and investment only for storage candidates.

No additional PV, no existing battery and no feed-in remuneration.

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.

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.

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

Real storage models use editable planning assumptions, not current offers. The total price includes measurement, connection and installation. Check device and sensor compatibility before purchase.

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.

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 through the documented aging assumptions 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 the documented 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 coefficient comes from the documented cell and aging assumptions. 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)effective cycle life derived from the aging assumptions and daily cycle depth
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 the documented calendar and cycle aging assumptions. 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 distinction is important: available capacity and SoC bounds are propagated with the documented calendar and cycle aging assumptions. The dispatch decision, however, uses a separate constant marginal-cost proxy: battery investment divided by nominal lifetime cycle throughput. Temperature, current charge/discharge power, and state-dependent aging do not currently change this price threshold directly; depth of discharge and calendar effects enter the capacity-aging model, not variable interval-level wear cost. A possible future extension could derive state-dependent marginal wear cost from the long-horizon aging model.

(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 marginal aging model based on the aging assumptions.

(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

After household and auxiliary demand, remaining PV restores a reserve deficit first, followed by grid charging within the available charge-power budget. Protective reserve charging is independent of tariff charging.

Etreservepv,gross=min ⁣(Xt(aux),max ⁣(Smin,tSt(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)
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

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
Etauxpv=min ⁣(Etaux,Xt)E_t^{\mathrm{aux}\leftarrow\mathrm{pv}} = \min\!\left(E_t^{\mathrm{aux}}, X_t\right)
Xt(aux)=XtEtauxpvX_t^{(\mathrm{aux})} = X_t - E_t^{\mathrm{aux}\leftarrow\mathrm{pv}}
Etauxbat={min ⁣(EtauxEtauxpv,ηdmin ⁣(max ⁣(St(reserve)Smin,t,0),Eˉtd)),pt>pdischargeminpt>pchargemax0,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 > p_{\mathrm{discharge}}^{\min} \land p_t > p_{\mathrm{charge}}^{\max} \\ 0, \text{otherwise}\end{cases}
Etauxgrid=EtauxEtauxpvEtauxbatE_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
Etauxpv,Etauxbat,EtauxgridE_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^dauxiliary power and discharge-power limit
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.

(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 ⁣(max ⁣(St(reserve)Etauxbat/ηdSmin,t,0),max ⁣(EˉtdEtauxbat/ηd,0))),pt>pdischargeminpt>pchargemax0,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 > 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_tSoC after reserve restoration and auxiliary supply, and the 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(aux)Etreservepv,gross,Smax,tSt(d)ηc,EˉtcEtreservepv,grossEtreservegrid,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
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ˉtcEtreservepv,grossEtreservegrid,grossEtpvbat,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{reserve}\leftarrow\mathrm{pv,gross}} - E_t^{\mathrm{reserve}\leftarrow\mathrm{grid,gross}} - 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 ⁣(Xt(aux)Etreservepv,grossEtpvbat,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)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 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

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

Battery benefit compares metered import and export with the same system without the new battery. It includes grid-backed charging and auxiliary demand, plus actual lost feed-in revenue from PV charging and PV-backed auxiliaries. PV that would otherwise be curtailed causes no lost feed-in revenue.

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=(Etexp,nonewbatEtexp)ptfeed-inOC_t^{\mathrm{pv}} = \left(E_t^{\mathrm{exp,no\,new\,bat}} - E_t^{\mathrm{exp}}\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

Battery benefit compares metered import and export with the same system without the new battery. It includes grid-backed charging and auxiliary demand, plus actual lost feed-in revenue from PV charging and PV-backed auxiliaries. PV that would otherwise be curtailed causes no lost feed-in revenue.

For the German methodology documented here, this interval decomposition remains the operating basis; the Solarspitzengesetz path can additionally constrain export and compensation.

(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 is an operating metric reported before maintenance. ROI and payback are calculated separately from the maintenance-adjusted nominal battery cash-flow series.

(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

This operating metric describes the PV contribution before maintenance. Financial metrics use the complete maintenance-adjusted cash flows and the relevant investments.

(27)Battery ROI and payback

ROI relates average nominal battery net cash flow to the investment. Payback is the first zero crossing of cumulative nominal battery cash flow.

ROIbat=CFbatnomIbat×100\mathrm{ROI}_{\mathrm{bat}} = \frac{\overline{CF}_{\mathrm{bat}}^{\mathrm{nom}}}{I_{\mathrm{bat}}}\times 100
Tpb,bat=inf ⁣{y0CFbatcum,nom(y)0}T_{\mathrm{pb,bat}} = \inf\!\left\{y \ge 0 \mid CF_{\mathrm{bat}}^{\mathrm{cum,nom}}(y) \ge 0\right\}
Variables
CFbatnom\overline{CF}_{\mathrm{bat}}^{\mathrm{nom}}average nominal battery net cash flow after maintenance
IbatI_{\mathrm{bat}}battery investment at t₀
CFbatcum,nom(y),Tpb,batCF_{\mathrm{bat}}^{\mathrm{cum,nom}}(y), T_{\mathrm{pb,bat}}cumulative nominal battery cash flow and first break-even date
Interpretation

ROI uses the average nominal net cash flow after maintenance across operating years. Payback follows the actual cumulative path; if no break-even occurs within the horizon, the application reports no regular payback date.

Both headline metrics are non-discounted. NPV\mathrm{NPV} and IRR\mathrm{IRR} are calculated separately from dated cash flows.

(28)Total profit

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

Π=IbatIpv+j=1N(CFbat,jnom+CFpv,jnom)\Pi = -I_{\mathrm{bat}} - I_{\mathrm{pv}} + \sum_{j=1}^{N}\left(CF_{\mathrm{bat},j}^{\mathrm{nom}} + CF_{\mathrm{pv},j}^{\mathrm{nom}}\right)
Variables
Π\Pitotal 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,NI_{\mathrm{bat}}, I_{\mathrm{pv}}, Nbattery investment, PV investment, and number of cash flows
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 evaluation uses a dated nominal cash-flow path: investments are booked at project start t₀, while operating values and maintenance are booked monthly at the corresponding month-end.

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

The 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 flow

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

The number is a smoothed horizon average, not necessarily the cash flow of year one.

ROI and payback

Reported 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 IRR

NPV discounts CAPEX at t₀ and all monthly dated nominal net cash flows after maintenance using ACT/365F. IRR is the annual rate that sets the same dated 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 chart

The nominal line starts with CAPEX at t₀ and then adds monthly dated cash flows net of prorated maintenance. Yearly chart rows are aggregations; the dashed line discounts the original dated cash flows.

The zero crossing is the nominal break-even used for headline payback. The discounted line's ending value equals NPV, apart from display rounding.

Advanced finance metrics

NPV and IRR use dated nominal cash flows. Upfront CAPEX is booked at t₀; operating cash flows and prorated maintenance are booked 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=0NCFjnom(1+r)(djd0)/365,CF0nom=I0\mathrm{NPV} = \sum_{j=0}^{N}\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₀
rrannual discount rate
dj,d0d_j, d_0payment date dⱼ and project start d₀; ACT/365F year fraction
Interpretation

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

The implementation uses monthly dated nominal cash flows after maintenance and ACT/365F rather than assumed yearly spacing.

(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=0NCFjnom(1+IRR)(djd0)/3650 = \sum_{j=0}^{N}\frac{CF_j^{\mathrm{nom}}}{(1+\mathrm{IRR})^{(d_j-d_0)/365}}
Variables
IRR\mathrm{IRR}internal rate of return
CFjnomCF_j^{\mathrm{nom}}dated nominal cash flow j, including the upfront investment
dj,d0d_j, d_0payment date dⱼ and project start d₀
NNnumber of cash flows in the analysis horizon
Interpretation

This XIRR\mathrm{IRR}-like metric can be compared with a hurdle rate or cost of capital. If the cash-flow pattern has 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.

Solarspitzengesetz

For German residential scenarios, Voltary includes the Solarspitzengesetz path as explicitly documented technical scenario logic.

Applicability check

The model covers fixed PV systems below 100 kW receiving the EEG feed-in tariff, not plug-in devices. Systems commissioned before 25 February 2025 retain the previous rules in this path. For new systems, each simulated variant's capacity matters, not maximum roof potential.

Feed-in limitation

From commissioning, the 60% limit also applies below 2 kWp. It ends on the date of the grid operator's first successful control test. Battery charging from PV precedes the limit. The separate plug-in-device exemption is not inferred from module capacity.

Negative prices

From exactly 2 kWp and below 100 kW, zero remuneration starts on 1 January after iMSys installation. Below 2 kWp, Section 51 EEG additionally requires a BNetzA determination; without a recorded determination date, the model assumes no future start. Quarter-hour data is settled exactly; hourly data proportionally to negative quarters.

Extended remuneration under Section 51a

The model counts affected quarter-hours in the statutory period, applies the 0.5 solar factor, and derives the extension from the statutory monthly quotas. If recovery falls after the analysis period, it is estimated as a dated terminal value from the final operating year with continued PV degradation.

Assumptions and current defaults

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

Project, time and costs
Analysis horizon
20 yearsEconomic default; user overrides can replace it.
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 both SoC updates and economic thresholds.
Self-discharge
3.0 %/monthApplied as a compounded interval loss on stored energy before reserve restoration.
Standby / auxiliary power
5 WModeled as direct electrical demand with battery-first coverage above minimum SoC and grid fallback for the remainder.
Guaranteed cycles
6000Used in wear cost and life-expectancy estimates.
Aging and the multi-year model
Documented aging assumption
LiFePO4 (LFP) for all supported storage scenariosThe simulation uses LFP coefficients for calendar and cycle aging. Guaranteed cycles and advanced aging assumptions remain adjustable according to the configuration.
Battery aging
Calendar and cycle aging model with a LiFePO4-like default assumptionManual and freely configured batteries use the default assumption; real battery models use more specific catalog data where available.
Modeled aging stressors
Average SoC, cycle depth, and guaranteed cyclesTemperature, explicit C-rate, and manufacturer-specific cell or thermal models are not yet modeled separately.
Aging sensitivity controls
Calendar 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 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. Manual batteries use the configured assumptions; real battery mode uses catalog specifications where available.

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.

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
η\etaEfficiency factor
Unit1
SSBattery state of charge
UnitkWh
ttSimulation interval
Unitindex
YYAnalysis horizon
Unityears

Indices, suffixes, and arrow notation

gross\mathrm{gross}energy before efficiency losses
ExampleEgridbat,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.
aba \rightarrow bdirected energy flow from source a to sink b
Examplepvload\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 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 and model inputs

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

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
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.

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.

  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.
    Complete interval state before dispatch.

    This example isolates one hourly interval; degradation and annual fixed charges are intentionally 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 only decides after this direct PV allocation has been made.

  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.

    Usable discharge is limited by internal reserve above S_min and by discharge efficiency.

  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.

    Because there is neither PV opportunity cost nor grid charging in this example, the interval benefit equals the avoided import value.

  5. 5. Annual metric

    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. ROI = 600 / 6000 × 100; under deliberately constant nominal cash flows, the cumulative series first reaches zero after 10 years.
    ROI 10%; nominal payback 10 years.

    This simplified example shows ROI and cumulative payback. NPV and IRR would additionally use the actual monthly payment dates and the selected discount rate.

Model limitations
  • Future electricity prices, levies, and regulation are uncertain. The simulation is therefore a structured scenario analysis, not a price guarantee.
  • 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.
  • 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 based on the documented calendar and cycle aging assumptions. Temperature, charge/discharge rate, and manufacturer-specific cell or thermal models are not yet represented separately.
  • 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 replacement logic are intentionally excluded from the current DCF layer.
  • The outputs are most informative when comparing configurations under consistent assumptions. Realized absolute values can still differ later.