Thermal storage in Denmark
Loading thermal storage records…
Estimated capacity by technology
Capacity by commissioning decade
Thermal storage records
Loading electric vehicle data…
Assumptions
Each slider moves a group of related assumptions between their Low and High values from the EV workbook; the middle is Central. Your changes stay in this browser and do not change the workbook.
Sources to find
Assumptions without a source. Save a lead (a link or note to check later) or mark it as a deliberate DaCES assumption. Leads are kept in the reader, included in the exported EV workbook (sheet Source leads) and merged back on import.
Advanced: every assumption
Moving a single assumption detaches it from its group slider. Values are shown for the selected year.
How the estimates are calculated
- V2G-ready vehicles = battery-electric cars and vans sold within the vehicle lifetime × V2G-ready share of new sales (never more than the fleet). Older cars without bidirectional support stay out until they are replaced.
- Enrolled at a location = V2G-ready vehicles × share charging mainly there × bidirectional share of the chargers there × enrolment.
- Power per vehicle = the lowest of the charger's discharge power, the vehicle's discharge power and, at home, the household export limit.
- V2G power at an hour = Σ locations: enrolled × plugged-in share at that hour × power per vehicle × local grid capacity × aggregator dispatch share.
- V2G energy at an hour = Σ locations: enrolled × plugged-in share × battery × battery share offered. It is energy that can be lent to the grid for a few hours and must be recharged before the next trip — daily flexibility, not seasonal storage.
- Evening peak = average of 17:00, 18:00 and 19:00, when Danish demand peaks. Fast DC chargers are demand only.
- Shiftable charging per day = charging demand (KF26) × share of vehicles charging mainly on AC × smart-charging share.
V2G power at the evening peak
GW, average 17:00–20:00. Band: every slider at Low to every slider at High.
V2G energy at the evening peak
GWh lendable to the grid at that moment. Same band.
Charging demand and flexibility
GWh per day: charging demand, the part smart charging can shift, and V2G energy if used once a day.
V2G power through the day
GW available each hour, by charging location. Shaded: evening peak.
What matters most
Each bar moves one assumption from Low to High while every other assumption stays where the sliders put it.
Ancillary services the vehicle fleet could support
Each bidding zone's vehicles form one shared pool, filled market by market in the order listed (fastest products first), hour by hour — capacity sold to one market is not available to the next. Up- and down-regulation are separate pools; symmetric products need both. Smart charging is used first where the product allows it: pausing charging gives up-regulation (at most the charging load that hour), charging faster gives down-regulation (at most the free charger capacity). V2G then sells the lower of its remaining power (less any extra power the product requires a battery to hold back) and its remaining offered energy divided by the hours of full delivery required. Reserve sizes are Energinet's median forecast for the selected year (Outlook for Ancillary Services 2024–2040, appendix), held flat after 2040.
Battery-electric cars on the road
Estimates with the current sliders
By bidding zone
Zone shares of today's fleet (Statistics Denmark) applied to the projectionPublic chargers
Sources count differently; each count is shown with its dateGas and oil reserves in Denmark
Fuel reserves for security of supply. Figures are fuel energy (heating value of the fuel), not electricity, and are never added to storage totals.
Loading gas and oil reserves…
Gas storage fill level
Emergency oil stocks
LNG in the region
Denmark has no LNG terminal. LNG reaches the Danish market through Germany, so German terminals and the EU total are shown. Source: GIE ALSI.
German LNG send-out
| Area | Inventory (GWh) | Of max | Send-out (GWh/d) | Of capacity |
|---|
Gas storage sites
| Site | Type | Total volume (million Nm³) | Working gas (million Nm³) | Cushion gas | Working gas (TWh) |
|---|
How the bookable capacity is used
Emergency oil stocks
| Category | Holder | Quantity | Tonnes | Energy (TWh) | As of |
|---|
Outages and capacity reductions
Running, upcoming and recently ended notices (last 90 days) published under REMIT. Source: GIE AGSI+ and ALSI unavailability.
Checks against live data
Refresh with uv run python scripts/fuel_reserves.py verify. Gas: GIE AGSI+ (both Danish sites reported as one facility). Oil: Eurostat nrg_stk_oem.
Data notes and corrections
Loading Analyseforudsætninger…
By edition
Forecast against actual
What each edition expects
Revisions from edition to edition
Every category in the target year
Editions and changes in definitions
Read before comparing editionsHow the editions are harmonised
- Each edition's Elforbrug sheet is read as headings, tables and rows. Blocks that repeat the previous edition (til sammenligning) and figure data are skipped; AF18 and AF19 are read from their summary block.
- DK1 and DK2 come from the sheet; Denmark is DK1 + DK2. PtX at the energy islands and PtX off grid are kept apart, so grid-connected means the DK1 and DK2 grids in every edition (AF22 and AF23 count the energy islands as grid-connected themselves).
- Net excludes grid losses. Where an edition publishes only net, gross is derived: classic demand, individual heat pumps and transport get the edition's grid-loss factor; the transmission-connected categories get gross = net, as AF24 and AF25 publish.
- Every edition is checked against itself: DK1 + DK2 must equal the sheet's national rows, and the category totals must equal the edition's own figure data, net and gross. All checks pass. Rebuild with
uv run python scripts/af_data.py. - Actual demand is Energinet's settled gross consumption (production plus net import) per zone, from Energi Data Service; it matches the editions' own gross demand in their base year. Actual net takes off transmission and distribution loss and starts in 2021, because distribution loss is settled only from mid-2020. Error = (forecast − actual) / actual: positive means the edition expected too much. Update with
uv run python scripts/eds_actuals.py, which asks only for years not yet settled.
How the editions are harmonised
- Each edition's Vindmøller, Solceller, Kraftværkskapaciteter and Ellagring sheets are read as headings, tables and rows. Blocks that repeat the previous edition, alternative pathways (AF22) and figure data are skipped.
- Capacity is at the start of the year (primo), as the sheets give it; production is expected production in the year. The sheets give production for wind and solar only, so the production total is wind and solar.
- DK1 and DK2 come from each sheet's zone totals; Denmark is DK1 + DK2. AF18 gives power plants only for Denmark as a whole (marked *). Nearshore wind (AF18, AF19) is counted as offshore.
- Offshore wind is what lands in DK1 and DK2. Energy islands and overplanting at them, and parks connected abroad or off grid, are kept apart. AF20–AF23 count the energy islands inside DK1 and DK2; their island section is moved out here, so these editions' offshore totals are lower than in their own summaries.
- Every edition is checked against itself: DK1 + DK2 must equal the sheet's national rows, and the totals must equal the edition's own summary and figure data. All checks pass. The share of gross demand compares each edition's wind and solar with its own gross grid-connected demand.
- Actual production is Energinet's settled production per zone from Energi Data Service: offshore wind, onshore wind and solar (including solar used on site). It is compared with production forecasts only; capacity actuals are not in the dataset. Error = (forecast − actual) / actual. AF's production is what the capacity would give in a normal wind and sun year; settled production has the real weather and curtailment in it. Every edition is 9–17% above the settled total even in its own base year, so read how the error grows with the years ahead rather than its level.
Loading district heating statistics…
Fuel and electricity into district heat producers
Who makes the heat and power
District heat by plant type
Heat capacity against heat delivered
Power capacity by plant type
GW at the end of each year. CHP plants make heat and power from the same capacity.
Where the heat goes
District heat used by households and by business and the public sector, and heat lost in the networks, TWh per year.
District heating in the power system
Power-to-heat through the year
Electricity for heat: three sources
Buildings and heat pumps
Buildings by main heating
Heat drawn by heat pumps
Ambient heat that heat pumps take from air, ground and water, TWh per year. The electricity they use comes on top.
Every fuel
TWh per year · fuel for electricity included at CHP and waste plantsSources and method
How the figures are put together
- Statistics Denmark's energy account splits district heat between three industries that together make all of it: power and CHP plants (350010), heat-only plants (350030) and waste incineration (383900). The fuel table is their energy use; the check that the producers add up to the national total passes for every year.
- Wind, hydro and solar power (inputs to electricity only), the industries' own vehicle fuel and district heat bought back are kept out of the fuel chart. What remains plus what is kept out equals Statistics Denmark's own total in every year; the build stops if it does not.
- CHP and waste plants make electricity from the same fuel, so their bars are fuel for heat and power. Heat-only plants show the fuel for heat alone.
- Electricity into the plants (Statistics Denmark) covers electric boilers, heat pumps and the plants' own use. Energinet's PowerToHeatMWh is metered electricity into electric boilers and large heat pumps only, so it is lower. The outlook is the newest Analyseforudsætninger edition's net demand of large heat pumps and electric boilers.
- Power-to-heat months are summed from hourly settlement data and shown only when every hour of the month is in. E-boilers run when electricity is cheap, so the monthly curve follows prices as much as the weather.
- Heat and power by plant type and by fuel and technology come from Energistyrelsen's annual energy statistics (base data and the power and heat sector workbook). Heat is net production, power gross production. The fuel and technology split starts in 1994. Heat from heat pumps is the electricity they use plus the ambient heat they lift; until 2012 electricity into heat is not split by use and is shown with electric boilers. Energistyrelsen's district heat by plant type agrees with Statistics Denmark within 2% in every year; the build checks it.
- Capacity and share of heat delivered by plant type are published for the latest four years. Full-load hours are heat delivered divided by heat capacity: low values mean peak and reserve boilers.
- District heating in the power system: power from central, decentral and industrial plants (Energinet's settlement of central, local and commercial production) against metered power-to-heat. Central plants include the few power-only units.
- Buildings are counted by the main heating registered in BBR, which lags real installations.
- Not covered by any open statistic: capacities (MW) of individual plants, electric boilers and heat pumps, and biomass stocks at the plants. Thermal storage comes from the TESS registry in this reader. Refresh the data with
uv run python scripts/dh_data.py.
Elsystemet: how the Danish power system actually runs
Loading the power system…
Sources and method
How the figures are made
- Everything is Energinet data from Energi Data Service, downloaded once and cached as monthly figures in
data/source-workbooks/energidataservice/. Update withuv run python scripts/power_system_data.py; it asks only for periods that are not yet settled, because the API limits how often each dataset may be asked. - Prices are day-ahead prices in EUR/MWh. Since 1 October 2025 the market sets a price per quarter hour; these are averaged to hours so every year is measured the same way. The daily spread is the most expensive hour minus the cheapest; the two-hour spread is the average of the two most expensive hours minus the two cheapest, an upper bound on what a two-hour battery cycling once a day earns per MWh before losses.
- Reserve prices are what Energinet pays per MW for being available for an hour, whether or not the reserve is used. "Earned per MW" sums the hourly prices: what one MW accepted in every hour would have earned. Real assets are not accepted every hour and also pay for energy, so read it as a ceiling and a trend.
- Production, consumption, power-to-heat and exchange are Energinet's settlement per zone. Gross consumption is production plus net import; it includes grid losses. Positive exchange is import into the zone.
- Consumption by consumer category and households by heating type come from DataHub (per region, mapped to zones: Hovedstaden and Sjælland are DK2). Rolling 12-month sums show a full year ending each month, so the latest months count without waiting for the year to end.