Methodology: how the calculator works
The calculator does not forecast; it replays the last 12 months (2025-10 – 2026-09) quarter-hour by quarter-hour: for every interval it computes solar output from the weather, the house’s consumption, the battery’s decision, energy bought and sold at that moment’s exchange price, and balancing-market activations. The default scenario’s result – €1,408 saved a year and a 5.4 yrs payback – comes from exactly that calculation. Every step is described here.
Time grid and the 12-month window
Every series is laid on one 15-minute UTC grid. The main window is the last 12 full months (2025-10 – 2026-09); the dataset is refreshed weekly and the window rolls with it. For comparison you can pick the year before (2024-10 – 2025-09), which has no balancing-market data.
Local time, summer and winter time and public holidays follow Estonian time without browser time-zone tables, so the server and the browser give the same numbers.
Solar output
The sun’s position is computed with the NOAA algorithm at the midpoint of every quarter-hour. The Open-Meteo ERA5 archive supplies the hourly mean global (GHI), direct (DNI) and diffuse (DHI) irradiance and the air temperature.
Irradiance on the panel plane follows the Hay–Davies model: direct × cosine of the angle of incidence, the circumsolar part of the diffuse by the anisotropy index, the rest of the diffuse isotropically as (1 + cos tilt)/2, and ground reflection with an albedo of 0.2. At low sun the direct component is capped so that its horizontal projection never exceeds the measured GHI. The panel’s glass reflects part of the light, the more the flatter it arrives (the ASHRAE incidence-angle modifier, b = 0.05): in Estonia that costs about 3% of a south roof’s yearly output and 4–5% of an east–west or vertical one’s.
DC power = kWp × irradiance/1000 × (1 − 0.004 × (cell temperature − 25 °C)), with cell temperature = air temperature + 25/800 × irradiance (NOCT 45 °C). System losses (wiring, soiling, inverter, mismatch) default to 11% and the AC output is clipped at the inverter’s power.
Snow: with more than 1 cm on the ground and frost the panels give 12% of normal, up to 67% in strong sun while the snow is thin (with 15 cm and more the sun clears nothing); on thaw days 50–80%. A steeper roof sheds snow sooner. The model is checked against a 21° roof near Tartu’s 15-minute output and assumes nobody clears the panels; the “I clear snow off the panels” switch assumes the snow is shovelled off within about three days of a snowfall (that roof’s February 2026: five cleanings, 532 kWh; untouched it would have given 121 kWh).
House consumption
Pick a type of home and a yearly kWh. Base consumption (without heating) spreads over the months with a light winter weight (January 1.15 … July 0.85) and within the month by the hourly coefficients of the Elektrilevi standard load profile.
Heating follows the actual weather of the same year: heating degree-hours against a 17 °C base. A heat pump’s electricity grows faster in the cold (exponent 1.3), direct electric heating linearly. Heating share by type: apartment 0%, house with other heating 10%, heat pump 55%, electric heating 65% – editable by hand.
EV charging is spread evenly over the days; the car is home 17:30–06:00 and charges with an 11 kW charger on arrival, the “smart” mode puts the charging into the cheapest quarter-hours of that window.
An uploaded Elektrilevi or Elering hourly or 15-minute file is laid onto the window by calendar date and time, whatever year it comes from; moments the file lacks follow the standard profile, scaled to the file’s own level, and the upload shows how much of the period it covers.
Tariffs
Buy price = (exchange price + seller margin + network fee + state fees 2.181 c/kWh) × 1.24. The network period (day, night, Võrk 5 peaks) is found for every quarter-hour with Elektrilevi’s rules, public holidays included. Monthly fees (main fuse and seller) are added to both bills.
Sell price = exchange price − buyback margin (1.8 c/kWh by default), without VAT for a private person. With a negative exchange price the sale is negative; by default nothing is sold when the exchange price is below 2 c/kWh – the surplus then goes into the battery or is not produced.
Battery control in every quarter-hour
1. Balancing market: if you take part, the aggregator’s signal is served first – UP sends battery energy to the grid, DOWN charges from the grid – within the limits of the battery, the inverter and the grid connection; the power offered (and paid the availability fee) is the inverter’s kW, but no more than the battery’s usable kWh as kW. With a 0 kW export limit only DOWN activations are served, no reserve is held and no capacity fee is paid.
2. Optimal plan: day-ahead prices are published at 14:00. Every day at 14:00 the model makes the battery’s plan to the end of the next day, as a home energy manager (EMHASS, for example) does: consumption, solar output and prices are known to the plan, and charging, discharging and selling are chosen so the bill over that time is as small as it can be – several cycles a day when that pays. It respects the battery’s power and charge window, efficiency, the main fuse, the export limit, wear (per kWh from the battery, its price divided by what it passes in its life: by default 175 €/kWh ÷ (6000 cycles × 90% charge window × 95% efficiency) ≈ 3.4 c/kWh, so the battery skips any cycle that earns less) and the value of energy left at the horizon’s end. The solution is exact (convex dynamic programming, the same optimum as linear programming).
3. Every quarter-hour: the battery takes the step that is best for the quarter-hour’s actual consumption and charge together with the rest of the plan’s cost; when the plan saw the right consumption this is exactly the plan’s step. Solar surplus the battery does not take is sold to the grid (up to the export limit) when the exchange price is above the threshold, otherwise it is not produced and appears on the “not produced” line. A deficit the battery does not cover is bought from the grid.
4. Options: without “Charge the battery from the grid in cheap hours” the battery charges only from solar surplus; without “Sell from the battery” it gives energy only to the house. With both it sells solar and grid-charged energy alike in the day’s dearest hours when that pays after losses and wear.
Battery efficiency (90% round-trip by default) is split equally between charging and discharging; the state-of-charge window defaults to 10–100%. On the balancing market part of the battery (20% by default) is held in reserve from the house for UP activations.
The balancing-market model
From the reference park’s (70 kWh, 20 kW, near Tartu) aggregator reports we know for every quarter-hour the kWh moved per kW of inverter and the net income per kWh (after BRP compensation, before the 80% share), and whether the signal was mFRR or aFRR. Your battery gets the same amount × your battery kW × availability, limited by state of charge and the grid connection. Income = kWh × €/kWh × your share. The energy moved passes through the ordinary bill (sold at the exchange price, bought with fees).
Capacity-market fee = battery kW × €/kW per month (by default from the difference between the reference park’s summer-2026 payouts and its activation income).
Payback
Saving = bill without the system − bill with the system, where bill = energy bought at that moment’s price + monthly fees − export income − balancing income − capacity fee. The saving is split by source: solar used directly, solar used via the battery, sales, arbitrage (the value of grid energy taken from the battery minus what it cost), activations, availability.
Investment = kWp × €/kWp + kWh × €/kWh + fixed cost + installation − grant. Year y cash flow = (solar streams × (1 − panel degradation)^(y−1) + battery streams × (1 − battery degradation)^(battery age)) × (1 + price trend)^(y−1) + balancing streams × (1 − battery degradation)^(battery age) × (1 + balancing trend)^(y−1) − maintenance − new devices. The balancing trend is −10% a year by default: Baltic reserve capacity prices fell three- to fourfold in the first half of 2026 against 2025 (aFRR up 65 → 16, mFRR up 44 → 17 €/MW/h; the Baltic TSOs’ BBCM evaluation 2026) while large grid batteries keep arriving; the TSOs retiring their own reserves by 2028 pulls the other way. The battery lasts its calendar life (15 years by default) or its cycle life (6000 full cycles by default) divided by the simulated cycles a year, whichever ends first; the inverter its own life (15 years by default). Then the cash flow buys a new one at today’s price, and the new battery’s degradation starts over. In the final year the unused share of the last devices’ life comes back at their price. Payback is when the cumulative cash flow turns positive (linear within the year); NPV with the discount rate; IRR by bisection.
Checked against a real house
The model was compared with the reference park’s monthly readings (production, purchases, sales, balancing payouts) for 2025-09 – 2026-09. Yearly solar production agrees within 15% (spring and autumn within 1–5%, winter less certain because of snow, summer depending on curtailment); balancing income agrees within about 11%. The calibration is repeated with every data refresh.
The default scenario
Every value can be changed in the calculator.
| Input | Value |
|---|---|
| Location | Tallinn |
| Home | heat-pump house, 12,000 kWh a year |
| Panels | 10 kWp, south, 30°, losses 11% |
| Battery | 10 kWh, inverter 10 kW, 90%, standby 20 W |
| Grid | Võrk 4, 25 A, seller margin 0.40 c/kWh, buyback margin 1.8 c/kWh |
| Strategy | cheap-hour charging, battery sales, balancing (share 80%, reserve 20%), capacity €0.46/kW per month, export threshold 2 c/kWh |
| Investment | €400/kWp, €175/kWh, fixed cost €2,400, maintenance €50/yr, battery life 6,000 cycles or 15 yrs, new inverter €1,500 every 15 yrs, price trend 2%, balancing trend -10%, discount 4%, 20 yrs |
| Result | saving €1,408, investment €8,150, payback 5.4 yrs, NPV €10,807 |
Simplifications and limits
- One year of weather and prices: next year will differ. The result is an estimate, not an offer.
- Weather is a regional mean (ERA5 ~30 km cell); shading, partial roof shade and local fog are absent.
- The consumption profile is typical, not yours – upload your own data for a sharper result.
- The battery plan assumes consumption, solar output and prices are known exactly to the end of the next day (prices are). With a real forecast the result is a little smaller: a forecast of yesterday’s consumption, for example, typically costs under 5% of the plan’s value in the model.
- Balancing activations are one park’s one-year experience; aggregator portfolios and prices change.
- Tariffs are the June 2026 price list for the whole period; earlier price lists are not applied.
- The battery system’s standby draw (20 W by default; 4–64 W in HTW Berlin’s 2026 test) is taken every quarter-hour from the battery, or from the grid when it is empty. Inverter efficiency by load and battery temperature are not modelled separately (they sit inside the losses).
Sources
- Prices: Elering – Nord Pool EE day-ahead API
- Weather and sun: Open-Meteo ERA5 archive, NOAA solar calculator, PVGIS
- Consumption: Elektrilevi tüüpkoormusgraafik
- Balancing market: Baltic Transparency Dashboard, Elering – balancing services, Qilowatt – paindlikkusturg
- Tariffs: Elektrilevi võrguteenuse hinnakiri (1.6.2026), Elering – tasakaalustamisvõimsuse tasu, Enefit väiketootja