ED.UPS
List ENTSO-E production units (~300) with code, name, tech, owner.
Signature
ED.UPS([tech])Description
List the ~300 Spanish production units that report individual MW under ENTSO-E A73. Each row is one unit, with its code, name, technology, average MW, and the company that owns or represents it.
This is the small set with 15-min per-unit MW data — use the codes returned here as input to ED.UNIT and ED.UNIT.RANGE. For the full Spanish market participant directory (8000+ entries: small renewables, retailers, consumers) use ED.UP.SEARCH.
**"Avg MW" is a long-run duration-weighted mean over the unit’s whole history.** ENTSO-E A73 is run-length encoded (curveType A03): a missing 15-min position repeats the previous value rather than meaning zero, so each published point is weighted by how long it was in force instead of counted as one equal sample. Reading it the naive way inflates the figure by up to +777 % on a CCGT — if this column looks different from a number you saved earlier, that is why.
Because the average spans everything held for the unit, it mixes periods of uneven data quality (see ED.UNIT.RANGE for the detail). Use it to rank and locate units, not as a capacity-factor input; for that, query a specific window with ED.UNIT.RANGE and check the coverage_pct the REST endpoint returns. /api/data/units also returns a coverage_pct per unit — the share of the unit’s publishing span (first observation to last) that is actually backed by data — which the Excel spill does not include.
Parameters
| Name | Type | Default | Description |
|---|---|---|---|
| tech | string | — | Filter by ENTSO-E technology label: "nuclear", "solar", "fossil_gas", "wind_onshore", "hydro_reservoir", etc. Omit for all. |
Returns
Spill array with header row: Code, Name, Tech, Avg MW, Company, Zone. Rows are ordered by Avg MW descending.
Examples
=ED.UPS()— All 300+ units=ED.UPS("nuclear")— Nuclear units only=ED.UPS("wind_onshore")— Onshore wind unitsNotes
- An unknown
techreturns an error listing the accepted values rather than an empty list — the vocabulary here is ENTSO-E's (solar,fossil_gas,wind_onshore…), not the oneED.GENuses. - "Avg MW" is duration-weighted (ENTSO-E A73 is run-length encoded), so the ranking differs from a plain average of the published points — see the description.
- **One plant, several identifiers.** A unit can report under more than one ENTSO-E identifier at once, and only some of those are separate meters. Turbines of a combined cycle (
…TG1,…TG2,…TV) are separate meters and are added together, so you get the plant's output rather than one turbine's. Two cases are not: a plant-level identifier published alongside its own turbines (it repeats one turbine's readings), and the same identifier spelled two ways (they agree on every shared reading). Until 2026-09-11 those were added up as well, which double-counted them: on 2026-05-17 Almaraz I — a ~1 000 MW reactor — read 1 817.64 MW. They are now counted once, in every aggregation — daily and coarser, hourly, and the raw 15-minute grid all give the same answer. Measured over the whole history, this affects 489 of 162 180 unit-days and moves 55 of the 409 rows behindED.UPS, almost all by well under 1 %. Identifiers that replace one another over time are stitched into a single timeline instead. - "Avg MW" spans the unit’s whole history, so a correction to a handful of days barely moves it; the per-day figures from
ED.UNITandED.UNIT.RANGEmove much more on the days involved. - **Pre-computed catalogue** (rolling out): the whole list is moving to a nightly rebuild in the database (table
unit_catalog, one row per unit and technology) instead of being aggregated over the 3.2 M raw A73 rows on every call — so the function answers in milliseconds instead of seconds./api/data/unitsreports which rebuild a response comes from in the root fieldrefreshed_at(ISO-8601 UTC);refreshed_at: nullmeans that response was computed live from the raw rows, which is the case wherever the nightly rebuild is not switched on yet. Same list either way: the rebuild runs the very computation the live path runs, and each run re-checks a set of reference figures and flags any drift. Once it is on, the figures can trail the raw feed by up to a day, which is inside the publication lag of A73 itself. - **The
techargument no longer changes the numbers, only which rows come back.** It used to be applied to the raw samples before the average was taken, so for a plant whose identifier has published under more than one technology label the filtered "Avg MW" disagreed with the same unit’s row in the unfiltered list. Measured on the current data, 11 of the ~405 rows move — the largest is the La Muela pumped-hydro unit, 53.7 → 49.2 MW; the other 394 rows are unchanged, and a filtered figure now always matches the one the full list shows. - A **blank** "Avg MW" cell means the unit has no covered time at all in the data held for it — it is a gap, not an output of zero.