ED.PROGRAM
ESIOS scheduling programs (PBF/PVP/PHFC/P48) by tech — mix matrix or single series.
Signature
ED.PROGRAM([tech], [program], [start], [end], [agg], [zone], [headers], [noDate], [tz])Description
Returns ESIOS scheduling programs for one technology. **Two modes** depending on whether program is supplied:
- **Mix mode** (default — omit program): returns a 4-column matrix [PBF | PVP | PHFC | P48] aligned by Madrid civil hour. One drag reproduces the APPA "redespachos por tecnología" lámina for any tech. Each column is independent — sparse-history programs (PHFC pre-2018-07, hybrid pre-2024-06) come back as 0 in those buckets.
- **Single mode** (program="pbf"|"pvp"|"phfc"|"p48"): returns a single program series, equivalent to =ED.RANGE("program_<program>_<tech>", ...). Use this when you want one program over a long window without the 3 extra columns.
**Tech codes ≠ ED.GEN tech codes.** The 4 program families (PBF/PVP/PHFC/P48) ingest different metric suffixes from gen_*: code 5 maps to ccgt (not combined_cycle), 6 to cogen (not cogeneration), 4 to hidro_total (not hydro), and code 2 = total_wind (onshore + offshore — matches REE/APPA trader semantics) versus code 12 = wind (onshore-only, distinct alias). If you copy codes between ED.GEN and ED.PROGRAM verify the tech is what you expect — see the value table below.
Aggregation is controlled by agg: 0=native, 5min/10min/15min, 1=hourly, 2=daily (default), 3=monthly, 4=quarterly, 5=semiannual, 6=annual, 7=total. Programs are MWh-stored at 15-min cadence, so each bucket is a SUM (not AVG) — the right semantic for scheduled energy.
Pass tz to switch the timezone interpretation: 0/madrid (default, DST-aware), 1/cet (UTC+1 fixed — 8760 hourly buckets/year), or 2/utc. See /docs/concepts for why this matters around the spring/autumn DST transitions.
Parameters
| Name | Type | Default | Description |
|---|---|---|---|
| tech | 1-20 | string | 1 (solar_pv) | Tech code or alias (see table below). Note codes 4/5/6/12 differ from ED.GEN — read the description above. |
| program | "" | "pbf" | "pvp" | "phfc" | "p48" | "" (mix) | Which program. Empty / "mix" returns a 4-column matrix; one of the 4 names returns a single series. Case-insensitive. |
| start | date | — | Start. Defaults: omit end for today (Madrid, with a small overnight cutoff), omit start for 30 days before end. |
| end | date | — | End. Omit for today. |
| agg | 0-7 | string | 2 (daily) | Aggregation is controlled by agg: 0=native, 5min/10min/15min, 1=hourly, 2=daily (default), 3=monthly, 4=quarterly, 5=semiannual, 6=annual, 7=total. |
| zone | "ES" | "ES" | ES only — ESIOS programs are ES-peninsular. PT not supported. |
| headers | 0 | 1 | 0 | Set 1 for header row (Period, PBF, PVP, PHFC, P48 in mix mode). |
| noDate | 0 | 1 | 0 | Set 1 to omit the period column from the spill array. |
| tz | 0 | 1 | 2 | "madrid" | Timezone interpretation for the hourly bucket. |
Valid values for tech
| Code | English alias | Description |
|---|---|---|
| 1 | solar_pv, solar, pv, fotovoltaica | Solar photovoltaic. Maps to program_*_solar_pv. |
| 2 | total_wind, eolica_total, eolica | Total wind = onshore + offshore. Trader-default. Use code 12 if you need onshore only. Maps to program_*_total_wind. |
| 3 | nuclear | Nuclear. Maps to program_*_nuclear. |
| 4 | hidro_total, hydro, hidro, hidraulica | Hydro total (UGH + non-UGH + turbinación bombeo). NB: the metric suffix is hidro_total (NOT hydro like ED.GEN). Maps to program_*_hidro_total. |
| 5 | ccgt, combined_cycle, gas | Combined-cycle gas. NB: the metric suffix is ccgt (NOT combined_cycle like ED.GEN). Maps to program_*_ccgt. |
| 6 | cogen, cogeneration, cogeneracion | Cogeneration. NB: the metric suffix is cogen (NOT cogeneration). Maps to program_*_cogen. |
| 7 | solar_thermal, termosolar, csp | Concentrated solar thermal. Maps to program_*_solar_thermal. |
| 8 | total, all, todo | Sum across techs (program-side ESIOS aggregate). Maps to program_*_total. |
| 9 | hidro_ugh | Hidro UGH (Unidad de Gestión Hidráulica) — large reservoirs. |
| 10 | hidro_no_ugh | Hidro non-UGH — run-of-river and small hydro outside UGH. |
| 11 | turb_bombeo | Turbinación bombeo — pumped-storage in generation mode (positive flow). |
| 12 | wind, wind_onshore, eolica_terrestre | Wind ONSHORE only (excludes offshore). Use code 2 (total_wind) if you want onshore + offshore combined. Maps to program_*_wind. |
| 13 | biomass, biomasa | Biomass. |
| 14 | biogas | Biogas. |
| 15 | other_renewable, otras_renovables | Other renewables (small hydro, geothermal, …). |
| 16 | oil_coal_deriv, derivados_petroleo_carbon | Oil + coal derivatives — refinery and coal-derived liquid fuels. |
| 17 | residual_energy, energia_residual | Residual energy from industrial processes. |
| 18 | household_waste, residuos_domesticos | Household waste-to-energy. |
| 19 | misc_waste, residuos_varios | Miscellaneous waste streams. |
| 20 | hybrid, hibridacion | Hybrid plants (renewable + storage). Cobertura desde 2024-06-25 — buckets anteriores aparecen como 0. |
The add-in accepts either the canonical Spanish code or the English alias — both are equivalent.
Valid values for program
| Code | Description |
|---|---|
| "" | "mix" | "all" | Mix mode (default). Returns 4-column matrix [PBF | PVP | PHFC | P48] aligned by hour civil. |
| "pbf" | PBF — Programa Base de Funcionamiento (ex-ante OMIE schedule). Cobertura desde 2014. |
| "pvp" | PVP — Programa Vinculante Provisional (post-MD, antes de RRTT). Cobertura desde 2014. |
| "phfc" | PHFC — Programa Horario Final Continuo (final tras intradiarios). Cobertura desde 2018-07-01. |
| "p48" | P48 — Programa de las 48 horas (final tras RRTT, lo que se ejecuta en tiempo real). Cobertura desde 2014. |
Returns
Spill array. Mix mode: up to 5 columns [Period, PBF, PVP, PHFC, P48] (MWh). Single mode: 2 columns [Period, value]. Reserve enough Excel cells for the matrix in mix mode.
Examples
=ED.PROGRAM(1)— Solar PV — last 30 days mix daily (4-column matrix)=ED.PROGRAM(1, , "2026-01-01", "2026-04-30", 3, , 1)— Solar PV mix Q1 2026 monthly with headers=ED.PROGRAM(2, "p48", "2026-04-01", "2026-04-30")— Total wind P48 series — April 2026 daily=ED.PROGRAM("nuclear", "phfc", "2026-04-01", "2026-04-30", 1)— Nuclear PHFC hourly April 2026 (PHFC available since 2018-07)=ED.PROGRAM(20, , "2024-06-25", "2026-04-30", 3, , 1)— Hybrid mix monthly since cliff (2024-06-25)=ED.PROGRAM("ccgt", "pbf", "2026-01-01", "2026-04-30", 7)— CCGT PBF total Q1+April 2026 — single valueNotes
- **Tech codes ≠ ED.GEN tech codes**. By design: program ingests
ccgt/cogen/hidro_total/total_wind; gen ingestscombined_cycle/cogeneration/hydro/wind. If you copy codes between functions, verify the tech is what you expected (the lookup table above is authoritative). - **Wind disambiguation**: code 2 =
total_wind(onshore + offshore — matches REE/APPA trader semantics). Code 12 =wind(onshore-only, distinct alias). Pre-2024 the two are nearly identical (offshore was zero); from 2026 onwards the spread will widen as offshore comes online. - **Cobertura histórica**: PBF/PVP/P48 desde 2014; PHFC desde **2018-07-01**; hybrid desde **2024-06-25**. En modo mix, las celdas de programas/techs que aún no existían aparecen como 0 en lugar de NULL — diseño deliberado para que el usuario pueda comparar 2014-2026 sin que las filas más viejas se rompan.
- **Mix mode columnas**: hasta 5 columnas (Period + PBF + PVP + PHFC + P48). Reserva celdas suficientes en Excel — un drag corto recortará la matriz.
- **Solo zone=ES**: los programas ESIOS son ES-peninsular. PT no está disponible (los programas portugueses los publica REN, no ESIOS).
- **Modo single reusa
/data/range**: equivalente exacto a=ED.RANGE("program_<program>_<tech>", ...). Usa ED.PROGRAM por la resolución amigable de tech codes; usa ED.RANGE si ya tienes el nombre del metric memorizado.