Loading...
ENLAPA stands for Energy Land Lease and is still a young initiative.
Our goal: Make Investments in renewable energy easier and unleash its full potential. We connect the people who drive the energy transition.
Grid intelligence · Technical guide
This guide documents the methods, algorithms and assumptions behind every grid intelligence layer: the reconstruction of the German transmission grid, the hourly DC load-flow screening, the calculation of available feed-in capacity, redispatch attribution and the assignment of generation units to substations, including calibration status and known limits. (As of 2026-07-10)
Contents
Section 1
Every number on the platform belongs to exactly one of three tiers, and the product interface must never let a T3 number look like a T1 number:
| Tier | Meaning | Examples |
|---|---|---|
| T1measured | Taken directly from an official or operator data source | Redispatch energy (MWh) per measure from the transmission system operators (TSOs); measure timestamps, durations and curtailment steps from the distribution system operators (DSOs); master data from the Marktstammdatenregister (MaStR, the German energy market master data register) |
| T2model | Model estimate, calibrated against measured redispatch | Curtailment energy volumes in the distribution grid (upper-bound model, ERA5 weather-corrected) |
| T3model | Model estimate from the DC screening (methodology of the Netzentwicklungsplan, the German grid development plan, NEP). Not a real-time model, and not an operator commitment | Available feed-in capacity per substation; line loadings |
Section 2
| Source | Content / use | Licence / access |
|---|---|---|
| netztransparenz.de | TSO redispatch measures (all four control areas), "Format 5" CSV via the WebAPI (OAuth2), rolling 365-day window; includes the measured energy (MWh), start and end, and the affected unit | netztransparenz terms of data use |
| redispatchdaten.de | Individual DSO measures of the E.ON group (Bayernwerk, Avacon, SH Netz, E.DIS, Syna, LEW): per measure × unit × time slice with start and end, duration, curtailment step and the unit key of the EEG (Erneuerbare-Energien-Gesetz, the German Renewable Energy Sources Act). Monthly windows retrieved through server-side start/end filters | public API |
| MaStR (Bundesnetzagentur, BNetzA) | Unit master data: capacity, energy carrier, voltage level, grid operator, connection location, EEG key, coordinates | Datenlizenz Deutschland (German data licence) |
| OpenStreetMap | Grid topology: substations, lines, voltage and operator tags (imposm import, OpenInfraMap schema) | ODbL |
| 50Hertz static grid model + JAO Core Static Grid Model | Real line parameters (R, X, Imax) for extra-high-voltage (EHV) circuits; the JAO file is split by TSO column onto TenneT, Amprion and TransnetBW. Raw files are never redistributed, only the parsed parameters | TSO publication obligations |
| SMARD (BNetzA) | Hourly actual generation per energy carrier plus grid load (filter 410), used as the national scaling anchors | CC BY 4.0 |
| ARCO-ERA5 (ECMWF/Google) | Reanalysis weather: 100 m wind (u/v), global irradiance (ssrd), 2 m temperature; 0.25° grid, German box 47.0–55.5°N / 5.5–15.5°E = 1,435 cells, hourly | CC BY 4.0 |
| eXtremOS (FfE) | Hourly sectoral load per NUTS-3 region (402 regions; industry, household, commerce and services), weather year 2012 | CC BY 4.0 |
| BKG VG250/VG2500 | Administrative boundaries (municipalities, districts, federal states) for zones, choropleths and the control area dissolve | dl-de/by-2-0 |
| TransnetBW grid connection map / Bayernwerk Simply Connect | Published (not modelled) connection capacities: points (Baden-Württemberg) and segments (Bavaria, steps of 750 kW and 3 MW) | non-binding publications |
| netzausbau.de (BNetzA) / §13k EnWG publications | BBPlG and EnLAG projects (ArcGIS FeatureServer, 159+27 segments); §13k relief regions (42 districts, 50Hertz + TenneT). §13k EnWG refers to the Energiewirtschaftsgesetz, the German Energy Industry Act | open geodata services |
Section 3
The computable grid model is derived deterministically from the OSM data: every recomputation returns identical IDs and identical results for identical inputs.
Resulting size: around 7,950 screened edges after clustering. Quality metrics (island shares, parametrisation level per class, connected components) are logged on every run.
Section 4
Where no real parameters are available, standard types apply (Oeding & Oswald 2011, PyPSA convention), per circuit and kilometre:
| Class | Type | R [Ω/km] | X [Ω/km] | Inom [kA] | Snom = √3·U·I |
|---|---|---|---|---|---|
| 380 kV | Al/St 240/40, quad bundle | 0.03 | 0.246 | 2.58 | ≈1,698 MVA |
| 220 kV | Al/St 240/40, twin bundle | 0.06 | 0.301 | 1.29 | ≈492 MVA |
| 110 kV | Al/St 240/40, single conductor | 0.12 | 0.39 | 0.645 | ≈123 MVA |
Transformers: (380/220) 600 MVA, x_pu=0.10; (380/110) and (220/110) 300 MVA, x_pu=0.12; X/R ≈ 20. Every edge carries the N-1 reserve s_max_pu = 0.7 (pypsa-eur convention): usable capacity = 70% of the thermal rating.
Section 5
CF_wind(v) = 0 for v < 3 m/s or v > 25 m/s
= (v³ − v_ci³)/(v_r³ − v_ci³) for v_ci ≤ v < v_r
= 1 from rated wind speed upwards
Fleet split by coastal AGS prefix {01,02,03,04,13}:
high_wind v_r=13.5 m/s, otherwise low_wind v_r=10.0 m/sSection 6
The core of the twin is a linear DC screening: line flows are linear in the nodal net injections.
f = PTDF · p with p(t) = generation(t) − load(t) per node [MW]
B = Aᵀ·diag(b)·A (nodal susceptance)
PTDF = diag(b)·A·B_red⁻¹ (slack node reduced)
x_pu = x_Ω·S_Base/U², S_Base = 100 MVA, x floor 10⁻⁵ puSection 7
Headroom answers one question: how much additional feed-in ΔP can node n absorb in hour t before any line exceeds its limit? The additional feed-in is taken up by the distributed slack; the slack-adjusted sensitivity of line l to node n is:
S_ln = PTDF_ln − Σ_k w_k·PTDF_lk
headroom_n(t) = min_l ( cap_l − |f_l(t)| ) / |S_ln|
across all l with |S_ln| > 0.05 and known capacityf_l^post(k) = f_l + LODF_lk·f_k
LODF_lk = (PTDF_l,f(k) − PTDF_l,t(k)) / (1 − (PTDF_k,f(k) − PTDF_k,t(k)))Contingency set = EHV; bridges (island formers, |denominator| < 10⁻⁶) are excluded and counted (their N-1 event is loss of load, not redistribution). The N-1-aware headroom adds, for each monitored line, its 5 worst contingencies as pseudo-lines with sensitivity PTDF[l,·] + LODF[l,k]·PTDF[k,·], and is by construction ≤ N-0. A deliberate decision: the customer layer shows N-0 headroom. At today's parametrisation level, the strict N-1 headroom (median p95 ≈ 10 MW; 2,053 of 4,217 substations below 10 MW) is parameter noise rather than signal. It will be released only once the corridor impedance coverage turns the N-1 corridor rank correlation positive (section 8). The N-1 loading and calibration metrics keep running in the background.
Section 8
Every screening cycle is tested against reality: predicted bottlenecks (overload hours per edge) against observed, geocoded redispatch (curtailed MWh per unit, assigned to the nearest EHV edge within 25 km; zones via the control area polygons). All metrics are versioned append-only, and a regression guard blocks publication if the hit rate falls by more than 20% against the previous run.
| Metric | Definition | Current value | A sober reading |
|---|---|---|---|
| hit_rate_top20 | predicted top 20 ∩ observed top 20 / 20 (edges) | 0.00 | disjoint at edge granularity; the attribution base is thin (284 geocoded TSO units → 142 edges) |
| hit_rate_top20_corridor (+N-1) | the same at corridor level | 0.05 | the first hit rate above zero; the dilution effect is real, but small |
| spearman_zone_* | rank correlation of overload hours ↔ attributed MWh per control area | Amprion +0.19 · TenneT −0.18 · zones_mean +0.002 | the ranking does not hold up yet; the remaining error is parameter quality (78.4% std_type) |
| loading_percentile_at_measures | model loading percentile of the edge at the start of real measures (baseline 0.5) | 0.574 (N-1: 0.584) | weakly positive: measures start more often than by chance in hours the model considers tight |
| energy_r2 (generation/load per zone) | r² of modelled vs. SMARD control area energy | load: Amprion 0.95 · TransnetBW 0.86 · TenneT 0.53 · 50Hertz 0.22 | the energy anchor is solid in the west and south; the 50Hertz assignment is the weakest point |
| attribution_coverage | attributed / observed MWh | 0.63 (12.8/20.4 TWh) | unit-level TSO redispatch is only around 20% of the total volume; name matching reaches about 69% |
Interpretation: today the twin is a screening tool with a reliable energy and timing anchor, but still without a reliable edge ranking. Hence the conservative product decision: N-0 display, T3 labelling, no suggestion of an operator guarantee. The calibration loop runs unattended every month.
Section 9
TSO side (measured): redispatch measures from all four TSOs including the measured energy (MWh). The free-text unit names are geocoded against the MaStR: normalisation (remove everything outside [a-zA-Z0-9], lower-case), preferring an exact match, otherwise a substring search over the first non-stopword token of at least 5 letters, with the highest rated capacity as the tiebreak. Coverage is around 68.9% of the name references.
DSO side (E.ON group): measured facts, modelled energy. The feed supplies, per measure × unit × time slice: start and end, duration, curtailment step and the EEG unit key (joined onto the MaStR; 46.4% of the keys match a unit of at least 30 kW), but no energy volume. That volume is modelled in two stages:
v1 (upper bound): E = P_rated · (step%/100, clamped to [0,1]) · (duration_min/60)
CF-refined: E = P_rated · step% · ∫ CF_ERA5(t) dt over the measure windowThe integral sums, per hour, overlap(window, hour) × CF(hour, grid cell); wind uses the two-class power curve, PV the global irradiance (0.25° cell of the unit). Windows longer than 168 h are extrapolated with the window mean after the first exactly integrated week; functional tests are excluded. Both the v1 and the CF value are stored, so the difference stays visible. Why an upper bound: v1 assumes full load throughout the curtailment window; the CF weighting replaces that with the actual weather resource, but it remains a model estimate (not a measurement of lost energy, and structurally impossible to validate, because DSOs do not publish unit-level lost energy).
Consistency rules in the display: measures are counted everywhere as distinct events (not as time slices); measured facts (count, hours, weekly profile) carry "measured", energy volumes carry "model".
Section 10
361,741 MaStR units are assigned to exactly one of around 37,000 OSM substations (exactly one row per unit, strictly checked). Four signals in a fixed order of precedence; every assignment carries its provenance and confidence:
Production distribution after the last recomputation: operator_match 210,371 · lokation_group 131,088 · knn 20,277 · cocurtailment 5; zero split locations. One caveat matters: the MaStR NAP table contains no coordinates, so its geometry is a centroid artefact of the members. Registry data therefore cannot replace the spatial search entirely; it can only refine it.
Section 11
| Layer | Method |
|---|---|
| Redispatch intensity (municipality / grid area) | Curtailed MWh per year and area (TSO: point-in-polygon of the geocoded units; DSO: via the municipality key), normalised per installed MW, in quintile classes. 1,318 municipalities and 104 grid areas carry values. |
| Grid area class (renewables-heavy / balanced / load-heavy) | Ratio of installed renewable capacity (MaStR wind and PV, in operation) to a load proxy from area benchmarks (industry 0.30 MW/ha, settlement 0.08 MW/ha): ≥1.5 → renewables-heavy, ≥0.75 → balanced, otherwise load-heavy. A commercial lead signal, never a scoring input. |
| Substation map (connected capacity) | Sum of rated capacity, unit count and energy carrier mix per substation from the mapping (section 10); curtailment split three ways: TSO measured / DSO CF-modelled / DSO v1 upper bound. |
| Grid operator per municipality | The dominant DSO = highest installed MW per municipality key; the top 12 operators with voltage levels as an attribute. |
| Published connection capacity | TransnetBW grid connection map (around 52 extra-high-voltage (EHV) points, traffic-light status, MW bands, n-0/n-1, 2032–2035) and Bayernwerk Simply Connect (KML segments, steps of 750 kW and 3 MW). Published, non-binding information, not ENLAPA modelling. |
| §13k relief regions | "Use instead of curtail" regions (implementation concept 2.0, effective 2026-10): 42 districts, only 50Hertz (H1, H2) and TenneT (T1–T6), dissolved from district boundaries. |
| Grid expansion projects | BBPlG (159 segments) plus EnLAG (27) from the BNetzA FeatureServer; the timing signal is the procedural stage (rank 1–6). A display signal, never a scoring input. |
| Control areas | District-to-TSO assignment (with the overrides OWL → TenneT, Rhine-Main → Amprion, Bavarian Swabia → Amprion), dissolved; carrier of the measured zonal redispatch totals. |
Section 12
Section 13
| Constant | Value | Meaning |
|---|---|---|
| CLUSTER_M / SNAP_M | 500 m / 2,000 m | Node cluster radius / junction snap radius |
| s_max_pu | 0.7 | N-1 reserve on the thermal rating |
| FUZZY_THRESHOLD | 0.85 | Name matching threshold for the static grid model |
| SENS_MIN | 0.05 | PTDF sensitivity threshold in the headroom |
| HEADROOM_MIN_KV / EXCLUDE_P95 | 220 kV / 2.0 | Constraint set EHV / exclusion of edges with suspect data |
| MAX_HEADROOM_MW | 100,000 | Cap for "no binding element" |
| N1_TOPK / HEADROOM_N1 | 5 / off | Contingencies per line / N-1 headroom disabled on the customer side |
| Wind v_ci/v_r/v_co | 3 / 10 or 13.5 / 25 m/s | Power curve (low_wind / high_wind coastal split) |
| PV PR | 0.9 | Performance ratio, reference 1,000 W/m² |
| Demand gates | 400–600 TWh · 40–90 GW | Fail-closed plausibility window for load |
| Mapping search radius | 20 km (25 km EHV) | Unit → substation (section 10) |
| Capacity floors | 150 / 50 / 1 MW → 220 / 110 / 20 kV | Voltage floor without a registry entry |
| Co-curtailment | ≥3 shared measures · ≤200 units per measure | Cluster signal / area-curtailment exclusion |
| Attribution | ≤25 km, ≥220 kV | Calibration mapping unit → edge |
| TSO window / DSO window | 365 d / 730 d | Rolling data windows |
All thresholds are configurable as documented environment variables; changes run through the monthly calibration loop with its regression guard.
Every value carries its reliability tier in the product (measured / model). Companion document to the grid intelligence page.
In 30 minutes we walk you through the platform using your real project regions, and afterwards you receive a quote that fits your team size.
ENLAPA GmbH · Made in Germany · Hosting in Frankfurt