Consumption data, PV configuration, battery parameters, price assumptions, and tariff extras are assembled as model inputs.
Methodology
Transparent methodology for PV, battery, and tariff analysis. This page documents the current implementation, assumptions, data sources, and model limits.Last updated: April 4, 2026
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.
| Symbol | Unit | Meaning |
|---|---|---|
| kWh | Energy quantity | |
| kW | Power | |
| EUR/kWh | Price or tariff component | |
| EUR | Cost or annual savings | |
| EUR | Investment | |
| EUR | Total profit over the analysis horizon | |
| 1 | Efficiency factor | |
| kWh | Battery state of charge | |
| index | Simulation interval | |
| years | Analysis horizon |
Indices, suffixes, and arrow notation
| Notation | Meaning | Example |
|---|---|---|
| energy before efficiency losses | is gross energy charged from the grid. | |
| energy after efficiency losses or expressed as a net effect | is energy stored net inside the battery. | |
| remaining quantity after an earlier step | is residual load after direct PV coverage. | |
| potential export before regulatory limitation | is only later capped to if required. | |
| dynamic tariff notation or feed-in scaling reference | is the interval price; scales permitted feed-in. | |
| directed energy flow from source a to sink b | means direct PV-to-load coverage; means battery charging from the grid. | |
| temporary battery state of charge within the same interval | is after self-discharge, after reserve restoration, after discharge, and after PV charging. |
Simulation pipeline
The outputs are produced in a fixed sequence from data intake and normalization to physical simulation and economic evaluation.
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.
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.
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.
Import cost, export revenue, and annual fixed components are aggregated under the active pricing model.
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.
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.
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.
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.
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.
Battery wear cost
The implementation spreads battery investment across nominal lifetime cycle throughput given by capacity times guaranteed cycles.
Maximum charge price
Grid charging is only economical when the purchase price is low enough to cover both wear cost and round-trip losses.
Minimum discharge price
Discharging only makes sense when the avoided import price exceeds wear cost after accounting for discharge losses.
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.
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.
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.
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.
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 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.
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.
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.
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.
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.
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.
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.
Fixed tariff
Under fixed pricing, annual import cost is the energy price times import volume plus annual fixed components.
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.
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.
Self-consumption rate
The self-consumption rate measures how much of total PV generation is used inside the system rather than exported.
Self-sufficiency
Self-sufficiency measures the share of household demand that can be covered without importing electricity from the grid.
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.
Cumulative battery benefit
The interval-level battery benefit is first summed across all simulated intervals and only then annualized.
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.
Annual battery savings
Battery savings are the average annual benefit of the battery operation over the full analysis horizon.
Annual PV savings
Annual PV savings combine the value of self-consumed PV energy and export revenue and average them over the analysis horizon.
Battery ROI and payback
ROI and payback compress annual battery savings into two compact investment metrics.
Total profit
Total profit is obtained by summing PV and battery savings across the analysis period and subtracting the relevant investments.
Optimization objective
When multiple configurations are compared, the preferred configuration is the argmax of the chosen objective.
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.
Net Present Value (NPV)
discounts the yearly nominal net cash-flow stream back to year 0 and subtracts the upfront investment.
Internal Rate of Return (IRR)
is the discount rate that makes the same year-0 CAPEX and nominal yearly net cash-flow stream sum to zero.
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.
| Aspect | Current implementation | Interpretation |
|---|---|---|
| Analysis horizon | Multi-year simulation over the configured horizon, 20 years by default. | Reported annual figures are summaries across that horizon, not a standalone first-year simulation. |
| 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 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 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 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 chart | The 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.
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.
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.
| Country | Rule | Model effect |
|---|---|---|
| Germany | Solarspitzengesetz 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. |
| Netherlands | Saldering/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.
| Parameter | Current default | Note |
|---|---|---|
| Analysis horizon | 20 years | Economic default; user overrides can replace it. |
| Time basis | Fixed-interval simulation at 15 or 60 minutes | Input series are normalized to a common 15-minute or 60-minute interval grid before dispatch, depending on the selected or detected dataset granularity. |
| SoC bounds | 10% min / 95% max / 50% initial | Applied only when no explicit configuration is present. |
| Efficiencies | 95% charge / 95% discharge | Affect both SoC updates and economic thresholds. |
| Self-discharge | 3.0 %/month | Applied as a compounded interval loss on stored energy before reserve restoration. |
| Standby / auxiliary power | 5 W | Modeled as direct electrical demand with battery-first coverage above minimum SoC and grid fallback for the remainder. |
| Guaranteed cycles | 6000 | Used in wear cost and life-expectancy estimates. |
| Battery chemistry | LiFePO4 default; catalog chemistry for real models; generic Li-ion treated conservatively as NMC | Chemistry determines the calendar- and cycle-aging coefficients. If no narrower chemistry information is available, LiFePO4 remains the default for manual configurations. |
| Battery aging | Chemistry-aware calendar and cycle aging; LiFePO4 default | Manual and freely configured batteries default to LiFePO4; real battery models use catalog chemistry when available. |
| Modeled aging stressors | Average SoC, cycle depth, and guaranteed cycles | Temperature, 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 default | Optional 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 year | Default used in multi-year PV projections. |
| 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 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 construction | Each candidate PV size gets its own full-year PV profile; battery variants are simulated on the same demand and tariff basis | In 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 components | Included in annual totals when configured | EUR/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.
| Source | Used for | Notes |
|---|---|---|
| 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 3-year profile | Site-specific hourly PV production values from three real historical PVGIS years | PVGIS 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.de | Day-ahead spot prices for DE-LU/AT dynamic pricing | 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). |
| Tariff and network-charge inputs | Regional network fees, levies, supplier margins, country-specific price components | Included through configuration, operator-specific parameters, and pricing-model logic. |
| Regulatory inputs | Special rules such as negative-price handling or feed-in limitation | Applied 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.
| Topic | Methodological contribution | Source |
|---|---|---|
| SAM / NREL battery life | Supports the separation of calendar and cycle aging and DoD-dependent cycle logic. | NREL SAM battery life model overview |
| Lifetime-prediction review | Supports separating calendar and cycle contributions as a robust model structure. | Battery lifetime prediction review |
| LFP calendar aging | Supports SoC-dependent calendar aging and low-to-moderate baseline fade for LFP. | LFP storage-aging study |
| Square-root-of-time calendar aging | Supports the square-root-of-time form for calendar aging and the strong impact of high SoC levels. | Automotive aging study |
| LFP cycle-life model | Supports using cycle depth as a central driver of cycle aging. | LFP cycle-life model |
| LFP vs NMC benchmark context | Provides 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.
| Step | Calculation | Result | Interpretation |
|---|---|---|---|
| 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. 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. 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. 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. Annual metric | With 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.