Guía de Tableros
Tableros Analíticos

Guía técnica y manual de usuario

Cómo se cargan los datos de XM y SIMEM, cómo se calculan los indicadores y cómo leer cada tablero. Las capturas son del tablero real; toca los números sobre ellas para ver qué es cada elemento.

24embalses del SIN
76,7 %volumen útil nacional al 25-oct-2026
35,4 %mínimo nacional proyectado (mar-2027)
1.050pruebas automatizadas
Módulo técnico · 1

Arquitectura técnica

Backend hexagonal en cuatro capas: la dependencia siempre apunta hacia adentro y solo dos archivos, los composition roots, conectan interfaces con implementaciones.

CapaResponsabilidadEjemplos
domain/Entidades, value objects y servicios de cálculo puros, sin dependencias externasCalculoHidricoService, AutonomiaService, ProyeccionDiariaService
application/Casos de uso, DTOs (Pydantic) y puertosObtenerResumenNacional, GenerarPrediccion, ObtenerSendaVolumen, SeriesAgregadas
infrastructure/Adaptadores: DuckDB, clientes SIMEM/XM, Holt-Winters, importador de OutputsDuckDBMedicionRepository, SimemXmFuenteMediciones
presentation/API REST con FastAPI: routers, errores y CORSembalses_router, senda_volumen_router
flowchart LR
  U["Analista"] --> W["Sitio web
Next.js 16 + React 19"] W -->|"reescribe /api/v1/*"| A["API REST
FastAPI"] A --> D[("DuckDB
hidrologia.duckdb")] S["Sincronizador
CLI Python"] --> D S --> X["SIMEM y API de XM"] I["Importador de Outputs
CLI Python"] --> D O["Excel del modelo
de largo plazo"] --> I

El sitio y la API son dos proyectos de Vercel. El navegador solo conoce el dominio del sitio, que reenvía /api/v1/* a la API, por eso no hay CORS en producción. La API nunca llama a servicios externos al responder: lee solo de la base local.

Módulo técnico · 2

Modelo de datos

Un solo archivo DuckDB de unos 11 MB: cuatro tablas de embalses y las de cada modelo analítico (carbón, DNS y los resultados de gas, optimización y apagón). Una conexión única se serializa con un lock, porque FastAPI atiende peticiones en varios hilos.

TablaClaveContenido
embalsesidCódigo XM, nombre, región hidrológica y si es un agregado
mediciones(embalse_id, fecha)Una fila por embalse y día desde 2022-01-01. 41.882 filas
fuente_datosid = 1Fuente, fecha de corte, momento de actualización y si los datos son reales
proyecciones_senda(embalse_id, mes)P10, P50, P90 y origen. 288 filas: 24 series × 12 meses
carbon_* (10 tablas)—Corrida del modelo de carbón térmico: histórico, proyección P10/P50/P90, trimestres, inventario, comparación con XM, validación y supuestos
dns_* (8 tablas)—Modelo de demanda no atendida: subáreas, 15.799 eventos DNS y EDAC, zonas priorizadas, cambios de reporte, métricas, importancia de variables y pronóstico
modelo_resultadosmodelo_idÚltimo resultado importado de gas, optimización y apagón (JSON validado por el dominio)

Diccionario de datos de mediciones

CampoUnidadOrigenSi falta
Regla:
Un dato no publicado es None, nunca cero. Recorre dominio, DuckDB, API (null) y pantalla (“—”). El %V. útil no se recorta en 100 %: XM publica valores mayores cuando el volumen supera la capacidad nominal.
Ojo:
--reiniciar borra mediciones, embalses y fuente_datos, pero no proyecciones_senda ni las tablas de los modelos (carbon_*, dns_*, modelo_resultados). Una base con el esquema sintético anterior se rechaza con un error explícito.

Los 24 embalses por región

RegiónEmbalses
AntioquiaItuango, Miraflores, Guatapé (Peñol), Playas, Porce II, Porce III, Punchiná, Río Grande 2, San Lorenzo, Troneras
CaldasAmaní (Miel I)
CaribeUrrá I
CentroAgregado Bogotá, Betania, El Quimbo, Muna, Prado, Sogamoso (Topocoro)
OrienteChuza, Esmeralda, Guavio
ValleAlto Anchicayá, Calima, Salvajina
Módulo técnico · 3

Integraciones y fuentes de datos

Cuatro fuentes de datos y tres servicios de plataforma. Ninguna fuente requiere credenciales: SIMEM y la API de XM son públicas.

IntegraciónQué aportaCómo entra
SIMEM 138ED1Capacidad y volumen útil diario por embalse (m³) y regiónCLI de sincronización, HTTPS
SIMEM 1445ACDescargas: turbinada, no turbinada, vertimiento (m³/día)CLI de sincronización
SIMEM 02B289Aportes por serie de río (m³/s) y su media históricaCLI de sincronización
API de XM VoluUtilDiarEnerEnergía útil almacenada por embalse (kWh a GWh)CLI de sincronización
API de XM CapaUtilDiarEnerCapacidad útil en energía (GWh): peso de agregaciónCLI de sincronización
Modelo de largo plazo (Outputs)Proyección a 12 meses P10/P50/P90 por embalse y TOTALExcel importado con CLI
Identidad GOV.COFranja, logo del Ministerio, paleta y tipografíasArchivos en frontend/public/marca/

Mapeo de ríos a embalses

SIMEM publica aportes por serie de río. El diccionario SERIE_A_EMBALSE asigna cada serie a su embalse y suma las que alimentan al mismo. De las 48 series de 02B289, 22 no se asignan (desvíos, Bajo Anchicayá y otras). El 21-sep-2026 esto da 49,49 % frente a 50,58 % con todas las series.

Servicios de plataforma

GitHub: repositorio público, rama main protegida y CI. Vercel: dos proyectos, el sitio por Git y la API por CLI. Google Fonts vía next/font: Nunito Sans, Montserrat y Geist Mono.

Módulo técnico · 4 · Nuevo

Modelo de cargue e integración de datos

Cómo llega un dato desde XM hasta un tablero: descarga, normalización, carga idempotente en DuckDB, servicio por API y lectura en el sitio. Este apartado es la base para construir tableros nuevos.

4.1 Diagrama de flujo de datos

flowchart LR
  subgraph FUENTES["Fuentes públicas"]
    S1["SIMEM 138ED1
volumen y capacidad"] S2["SIMEM 1445AC
descargas"] S3["SIMEM 02B289
aportes por río"] X1["API XM
energía y capacidad GWh"] end subgraph CARGUE["Cargue (CLI Python)"] C["Clientes HTTP
bloques de 30 días"] --> N["Normalización pura
unidades y mapeo río→embalse"] N --> U["Upsert idempotente
desde última fecha − 7 días"] end subgraph MODELO["Modelo de largo plazo"] E["Excel P10/P50/P90"] --> V["Importador con validaciones"] end S1 & S2 & S3 & X1 --> C U --> M[("mediciones
embalses
fuente_datos")] V --> P[("proyecciones_senda")] M --> API["API FastAPI
solo lectura"] P --> API API --> SITIO["Sitio Next.js
reescritura /api/v1/*"] SITIO --> T["Tableros"]

4.2 Mapa de conexión interactivo

Toca cualquier elemento: el mapa resalta lo que lo alimenta o lo consume y muestra su ficha.

4.3 Secuencia de una sincronización

sequenceDiagram
  actor O as Operador
  participant CLI as sincronizar.py
  participant SI as SIMEM
  participant XM as API de XM
  participant DB as DuckDB
  O->>CLI: --fuente simem (API local detenida)
  CLI->>DB: última fecha guardada
  DB-->>CLI: 2026-09-22
  Note over CLI: desde = última fecha − 7 días
  CLI->>SI: 138ED1, 1445AC, 02B289 (desde..hasta)
  SI-->>CLI: filas por embalse y día
  loop bloques de 30 días
    CLI->>XM: VoluUtilDiarEner y CapaUtilDiarEner
    XM-->>CLI: kWh por embalse
  end
  Note over CLI: convierte m³ a Mm³, m³/día a m³/s, kWh a GWh
y asigna cada río a su embalse CLI->>DB: upsert de mediciones y embalses CLI->>DB: fuente_datos (corte, es_real) CLI-->>O: Sincronizado: 24 embalses, fecha de corte O->>O: scripts/desplegar-vercel.sh

4.4 Periodicidad

FlujoPublica la fuenteCargue vigenteVentanaPropuesta
SIMEM y API de XMDiaria, con 1 a 2 días de rezagoManual, bajo demandaÚltima fecha guardada − 7 díasDiaria, por la mañana
Modelo de largo plazoPor corrida (última: 2026-09-23)Manual, con el importadorReemplaza toda la proyección (12 meses)Tras cada corrida del modelo
Insumo ENSO (NOOA)MensualNo se carga: lo usa el modelo—Actualizar antes de cada corrida
Publicación de la API—Manual: desplegar-vercel.shLa base viaja con el despliegueAutomatizar tras cada cargue
Sitio web—Automático por GitCada merge a mainSin cambios
Estado real:
Hoy nada se actualiza solo. Las filas “Propuesta” son recomendaciones, no funcionalidad existente.
Sin huecos:
Como el cargue incremental parte de la última fecha guardada menos 7 días, no se pierden datos aunque pasen semanas sin sincronizar; solo aumenta el tiempo de descarga.

Simulador: ¿qué tan viejo es el dato que ve el usuario?

—
antigüedad máxima del corte
—
antigüedad promedio
—
ventana de descarga en cada sincronización (días de datos)

Antigüedad = rezago de XM + días entre sincronizaciones (+ 1 día si la API se publica al día siguiente). El corte que muestra el pie es siempre la última fecha con datos cargados.

4.5 Linaje de datos por tablero

Elige un tablero para ver el camino completo de sus datos, desde la fuente hasta el componente que los dibuja.

4.6 Controles de calidad en el cargue

Sincronización SIMEM/XM

  • Conversión de unidades con funciones puras, probadas sin red.
  • Upsert idempotente: repetir el cargue no duplica filas.
  • Datos faltantes como None; el peso de agregación se imputa con la capacidad publicada más cercana.
  • Regiones desconocidas y errores de red con mensaje explícito.
  • Cliente de XM en bloques de 30 días.

Importador de Outputs

  • Columnas CodigoEmbalse, Fecha, P10, P50, P90.
  • Rechaza fechas inválidas, meses repetidos y valores fuera de 0–1 (porcentajes ya multiplicados por 100).
  • Rechaza bandas con P10 > P50 o P50 > P90.
  • Rechaza embalses que no existen en la base.
  • Reemplaza la proyección completa en una sola operación.

4.7 Cómo construir un tablero nuevo

El patrón es el mismo para todos los tableros existentes. Marca los pasos a medida que avanzas; el progreso queda en tu navegador.

    # Cargar y publicar datos nuevos
    cd backend && source .venv/bin/activate
    python -m infrastructure.ingesta.sincronizar --fuente simem          # con la API local detenida
    python -m infrastructure.ingesta.importar_proyeccion --xlsx "<ruta>/proyeccion_montecarlo_enso <fecha>.xlsx"
    cd .. && scripts/desplegar-vercel.sh                                  # publica la API con la base actual

    Importadores de los modelos analíticos

    Los modelos no se descargan de una API: sus salidas se importan desde la carpeta de cada proyecto. Todos validan los archivos antes de escribir, reemplazan en una transacción (si algo falla queda la corrida anterior) y no se borran con --reiniciar.

    ModeloComando (desde backend/, con la API detenida)Lee
    Carbón térmicopython -m infrastructure.ingesta.importar_modelo_carbon --carpeta "../../Modelo de carbón térmico"resultados/ y datos/ del proyecto
    Demanda no atendidapython -m infrastructure.ingesta.importar_modelo_dns --carpeta "../../2. Modelo DNS"CSV de Datos/outputs y Datos/outputs_datos
    Apagón (visor interactivo)python -m infrastructure.ingesta.importar_escenarios_apagon --carpeta <proyecto>Ejecuta el script del modelo en las 468 combinaciones de controles (≈2,5 min; requiere las dependencias del modelo)
    Gas · Optimización · Apagónpython -m infrastructure.ingesta.importar_resultado_modelo --modelo <gas|optimizacion|apagon> --carpeta <proyecto>Libro Excel pronostico_v2 (gas), JSON de 05_resultados (optimización), CSV/JSON de resultados_modelo_riesgo_apagon
    Hoy:
    Gas y apagón tienen resultados importados; la carpeta de optimización sigue sin resultados y su tablero muestra la ficha y cómo cargarlos. Nada se inventa.
    Módulo técnico · 5

    Cálculos y modelos

    Los cálculos hidráulicos son funciones puras en domain/services; los agregados y las proyecciones se arman en application.

    %V. útil y nivel de riesgo

    %V_útil = volumen útil del día ÷ capacidad útil del día × 100

    La capacidad es la que XM publica ese mismo día, porque la revisa con el tiempo. La clasificación tiene cinco niveles y es la misma para embalses, regiones y el sistema.

    Nivel%V. útilCódigo de la API
    Normalmás de 80 %NORMAL
    Establede 70 % a 80 % (80 incluido)ESTABLE
    Alerta tempranade 60 % a menos de 70 %ALERTA_TEMPRANA
    Situación delicadade 50 % a menos de 60 %SITUACION_DELICADA
    Críticomenos de 50 %CRITICO

    Probador de niveles

    Estable

    Agregados nacional y regional

    El %V. útil de un conjunto de embalses es el promedio ponderado por la capacidad útil en energía (GWh) de cada embalse ese día, como hace la métrica oficial de XM. Un embalse de caída alta almacena mucha más energía por metro cúbico que uno de caída baja.

    %V_agregado = Σ(%V_i × w_i) ÷ Σ w_i        con w_i = capacidad útil en energía (GWh)

    Reproduce el agregado oficial del SIN con un error medio de 0,046 puntos porcentuales sobre 1.725 días. Incluye el Agregado Bogotá.

    Ponderar por energía o promediar sin más

    —
    ponderado por energía (el que usa la plataforma)
    —
    promedio simple (incorrecto)

    Aportes, autonomía y capacidad guardada

    Aportes %   = Σ aportes (m³/s) ÷ Σ media histórica (m³/s) × 100      (solo embalses con ambos datos)
    Autonomía   = volumen útil ÷ (turbinado + vertimientos − aportes)          (Mm³/día; None si aportes ≥ salidas)
    Capacidad guardada = Σ energía útil almacenada (GWh)                       (si falta, no se suma)

    La autonomía no incluye evaporación porque XM no la publica, y en embalses en cadena (por ejemplo Punchiná) puede resultar engañosamente baja.

    Proyección de largo plazo y pronóstico diario

    ElementoCómo se obtiene
    Valor centralP50 de la corrida Monte Carlo del modelo Prophet + XGBoost con escenarios ENSO
    BandaEscenarios P10 a P90. No es un intervalo de confianza; al inicio puede ser casi nula
    Cobertura12 meses (oct-2026 a sep-2027) por embalse y para TOTAL; 1, 3, 6 y 12 meses toman los primeros meses
    Sin proyección publicadaRespaldo Holt-Winters estacional (12 periodos, tendencia amortiguada, IC 95 % por Monte Carlo) con backtest walk-forward de 6 meses contra persistencia
    Pronóstico diarioLa misma proyección interpolada linealmente: cada valor mensual es el promedio de su mes, situado a mitad de mes. Nace en el último dato y llega hasta el último mes publicado (unos 358 días)
    Agregados regionales y Agregado BogotáUsan el respaldo Holt-Winters
    Horizontes:
    1, 3, 6 y 12 meses en todo el tablero. La API los recibe como meses en la senda (horizonte_meses) y como días de 30 en el pronóstico diario (horizonte: 30, 90, 180, 360). Semáforo de la senda sobre el mínimo proyectado: rojo < 55 %, ámbar < 65 %, verde ≥ 65 %.
    Módulo técnico · 6

    API REST

    Disponible en https://plataforma-embalses-api.vercel.app (local: http://localhost:8000) con OpenAPI en /docs. Todas las rutas cuelgan de /api/v1.

    Códigos de respuesta

    • 200 consulta correcta
    • 404 embalse inexistente o sin mediciones (incluye una región inválida), o modelo de carbón o DNS aún no importado, o un modelo analítico que no existe
    • 422 horizonte, historia, días de inventario, período u origen fuera de la lista permitida (responden con los valores válidos), o una región o subárea de DNS que no existe, parámetro no numérico o historia insuficiente (menos de 30 días para el pronóstico, menos de 9 meses para la senda)

    Formato de errores

    Los errores de dominio responden {"detalle": …} y los de validación de parámetros {"detail": …}. El cliente del sitio lee ambos.

    Módulo técnico · 7

    Plataformas, despliegue y operación

    El sitio se despliega solo por Git y la API se publica a mano, porque la base de datos no está en el repositorio.

    ComponentePlataformaCómo se despliega
    Sitio webVercel, proyecto tableros-analiticos, raíz frontend
    tableros-analiticos.vercel.app (la dirección anterior, plataforma-embalses.vercel.app, redirige a esta)
    Automático: cada merge a main es producción; cada PR genera una vista previa protegida por el login de Vercel
    APIVercel, proyecto plataforma-embalses-api, sin enlace a Git
    …/docs
    Manual: scripts/desplegar-vercel.sh
    Base de datosArchivo DuckDB empaquetado con la APISe copia a backend/data/ (ignorado por git) y viaja con el despliegue
    Código y CIGitHub, repositorio públicoPull request y merge con squash
    flowchart TD
      PR["Pull request"] --> CI{"CI: backend y frontend"}
      CI -->|"falla"| PR
      CI -->|"verde"| M["Merge con squash a main"]
      M --> VS["Vercel publica el sitio"]
      L["Cargue local de datos"] --> SC["desplegar-vercel.sh"] --> VA["Vercel publica la API
    con la base nueva"] VS -. "reescribe /api/v1/*" .-> VA

    Cómo encajan en Vercel

    • El sitio reescribe /api/v1/* hacia la API con la variable API_URL.
    • La API es una función Python (backend/index.py, 60 s máximo, Python 3.12). Al arrancar copia la base a /tmp, porque el disco es de solo lectura.
    • El paquete pesa unos 310 MB y hay arranque en frío.

    Variables de entorno

    NEXT_PUBLIC_API_BASE_URLFrontend: base de la API (local http://localhost:8000; producción /)
    API_URLFrontend: destino de la reescritura
    HIDROLOGIA_DB_PATHBackend: ruta de la base
    CORS_ALLOWED_ORIGINSBackend: orígenes permitidos

    Procedimientos de mantenimiento

    1. Actualizar datos: detener la API local, sincronizar y publicar la API.
    2. Corrida nueva del modelo: importar el Excel y publicar la API.
    3. Cambiar el sitio: PR con chequeos en verde y merge con squash. Si depende de endpoints nuevos, publicar la API antes del merge.
    4. Nunca desplegar el sitio con vercel deploy desde frontend/.
    5. Credenciales: vercel link deja un token temporal en .env.local; el script lo retira y .env* está ignorado por git.
    Módulo técnico · 8

    Calidad y pruebas

    1.050 pruebas automatizadas (583 de backend, 430 unitarias de frontend y 37 de extremo a extremo con navegador real), sin red ni base externa, en cada pull request. Se comprobó que detectan fallos introduciendo regresiones a propósito.

    Backend · 583 (pytest)

    Frontend · 430 (Vitest) + 37 e2e

    Manual de usuario · 9

    Mapa de la pantalla

    Se entra por tableros-analiticos.vercel.app desde cualquier navegador actual, sin usuario ni contraseña. Toca una zona para ir a su capítulo.

    Toca un número para ver qué es cada zona y saltar a su capítulo.
    Tablero completo al corte del 25-oct-2026, en escritorio (1360 px).
    En pantalla ancha el gráfico principal y la distribución regional van lado a lado; en celular todo se apila en una columna.

    El encabezado y el pie

    • Corte al …: fecha del último dato disponible. Todo lo que ves corresponde a ese día. XM publica con uno o dos días de rezago.
    • Botón de tema: alterna claro y oscuro; se recuerda en tu navegador y, la primera vez, sigue el sistema.
    • Pie: muestra Datos reales, la fuente y el corte. Si los datos fueran de demostración diría Datos no reales en ámbar.
    Manual de usuario · 10

    Filtros

    Cuatro campos iguales y un botón. Cada uno tiene un botón ⓘ con su explicación.

    Región y embalse gobiernan todo el tablero a la vez: tarjetas, gráfico principal, distribución regional, senda de largo plazo y tabla. Las fechas solo mueven el histórico diario del gráfico principal.

    ElementoRegión elegidaEmbalse elegido
    TarjetasValores de esa región; el título pasa a «% Volumen útil · Región X»Valores del embalse; el título lleva su nombre y dice «1 embalse monitoreado»
    Gráfico principalAgregado de la regiónSerie del embalse
    Distribución regionalSolo esa regiónSolo la región del embalse
    Senda de largo plazoAgregado de la regiónSenda del embalse
    TablaEmbalses de la regiónSolo ese embalse
    FiltroQué cambiaQué no cambia
    Desde / HastaEl tramo histórico diario del gráfico principal (por defecto 180 días)Las tarjetas, la distribución regional y la tabla (siempre el último corte) y la senda (toda la historia mensual); la proyección parte del último dato
    • Al abrir la página los filtros están en «Todas las regiones» y «Todos los embalses»: el gráfico principal y la senda muestran el total nacional.
    • Al cambiar de región, el embalse vuelve a «Todos los embalses» y todo muestra el agregado de esa región.
    • «Todos los embalses» muestra el total nacional o, con región, el agregado de esa región; elegir un embalse lo reduce todo a ese embalse.
    • Un clic en una fila de la tabla elige ese embalse. La tabla queda con una sola fila: elige «Todos los embalses» o pulsa Restablecer para volver.
    • “Desde” no puede pasar de “Hasta”, y viceversa.
    • Restablecer filtros devuelve región y embalse a “Todos” y las fechas a 180 días.

    Estados que conviene ver

    Filtros con Todas las regiones y Todos los embalses
    Todas las regiones + Todos los embalses: el gráfico pasa al total nacional.
    Región Centro con Todos los embalses
    Región Centro + Todos los embalses: tarjetas, gráficos, senda y tabla recalculan para esa región.
    Manual de usuario · 11

    Tarjetas de indicadores

    Cuatro tarjetas de igual tamaño resumen el estado del sistema en el último corte.

    TarjetaCómo leerlaAl 25-oct-2026
    % Volumen útil nacionalPorcentaje de la capacidad útil que está llena, ponderado por energía. El cambio frente a ayer y a 7 días va en verde si sube y en rojo si baja76,7 % · +0,12 p.p. diario · +0,42 p.p. semanal
    Aportes (% media histórica)100 % es un año típico; menos indica un periodo más seco65,5 %
    Capacidad guardadaEnergía almacenada hoy en el volumen útil13.548 GWh
    Riesgo del sistemaInsignia del nivel de riesgo (Normal, Estable, Alerta temprana, Situación delicada o Crítico; ver la sección 5) y número de embalses monitoreadosEstable · 24 embalses
    Siguen los filtros:
    Con una región, las tarjetas recalculan solo con sus embalses y el título pasa a «% Volumen útil · Región Centro». Con un embalse muestran sus propios valores y el recuadro de riesgo dice «1 embalse monitoreado». Si el embalse no publica un dato (por ejemplo, aportes de Muna), la tarjeta muestra «—».

    Un guion “—” significa que XM no publicó el dato; nunca es un cero.

    Manual de usuario · 12

    Gráfico principal: %V. útil vs. aportes y proyección

    La historia reciente y el futuro esperado del embalse elegido. Con “Todos los embalses” muestra el total nacional o el de la región.

    ElementoAspectoSignificado
    % Volumen útilLínea azul continuaSerie diaria del porcentaje de capacidad llena
    Aportes (% media histórica)Línea amarillaPuede superar 100 % y tiene huecos donde XM no publica
    Proyección %V. útilAzul oscura punteadaCamino esperado desde el último dato
    Escenarios P10–P90 (ENSO)Banda azul claraEscenarios pesimista y optimista; nace sin ancho y puede ser angosta
    • 1m, 3m, 6m, 12m: cuánto se proyecta: 30, 90, 180 o 360 días. Con 12 meses llega a mediados de septiembre de 2027: la curva termina donde publica el modelo, así que cuantos más días pasan desde su corrida, menos días se proyectan.
    • Si el subtítulo dice “escenarios P10–P90”, la banda no es un intervalo de confianza. Si dice “IC 95%”, es el respaldo Holt-Winters (Agregado Bogotá y agregados regionales), que no incorpora el clima.
    • El eje vertical se ajusta a los datos: los picos de aportes lo estiran.
    Total nacional a 12 meses
    Total nacional a 12 meses: baja hasta ~35 % en marzo de 2027 y se recupera después.
    Manual de usuario · 13

    Distribución regional del %V. útil

    Barras horizontales de menor a mayor. Cada barra promedia los embalses de la región ponderados por energía.

    • El color sigue el riesgo: verde normal, cian estable, ámbar alerta temprana, naranja situación delicada y rojo crítico. Al corte del 25-oct-2026, Oriente está en Normal; Antioquia, Caribe, Caldas y Centro en Estable; y Valle en Situación delicada.
    • Al pasar el cursor por una barra aparece su valor. Con una región elegida solo se muestra esa región, y con un embalse elegido, solo la región a la que pertenece.
    Región%V. útilAportes (% media)Energía útil (GWh)Embalses
    Valle58,3 %94,9 %4573
    Centro72,2 %78,4 %4.5906
    Caldas73,3 %38,7 %1861
    Caribe74,9 %58,8 %1051
    Antioquia76,5 %54,0 %4.80910
    Oriente88,5 %62,6 %3.4003

    Oriente (88,5 %) es la única región en Normal y Valle (58,3 %) la única en Situación delicada. Caldas (38,7 %) y Antioquia (54,0 %) tienen los aportes más bajos frente a su media.

    Manual de usuario · 14

    Senda del volumen útil: proyección de largo plazo

    El %V. útil mensual observado desde enero de 2022 y su proyección, por defecto para el total nacional.

    Lector de la senda nacional (proyección real del modelo)

    —
    mínimo proyectado
    —
    ControlQué hace
    Sin selector propioLa senda sigue los filtros del tablero: un embalse, el agregado de una región o el total nacional
    1m, 3m, 6m, 12mMeses proyectados; por defecto 12m
    Último observado%V. útil del último mes con datos (el mes en curso es un promedio parcial): 75,8 % en oct-2026
    Mínimo proyectadoValor esperado más bajo del horizonte, coloreado por el semáforo de la senda: 35,4 % en mar-2027
    • Semáforo de la senda: rojo bajo 55 %, ámbar bajo 65 %, verde desde 65 %. Es distinto de la clasificación de cinco niveles porque juzga un mínimo futuro.
    • Con la proyección del modelo aparece un recuadro azul “Sobre esta proyección” en lugar de la tabla de validación, porque los Outputs no traen validación fuera de muestra.
    • Con el respaldo Holt-Winters (Agregado Bogotá) aparece la tabla walk-forward: modelo, MAE y R² contra la persistencia.
    Senda a 3 meses
    Horizonte 3m: el mínimo proyectado es 63,7 % en diciembre y cae en ámbar.
    Senda del Agregado Bogotá con validación
    Agregado Bogotá: respaldo Holt-Winters con su tabla de validación.
    Manual de usuario · 15

    Tabla de embalses y reportes

    Una fila por embalse con el dato más reciente. Sigue los filtros: con una región muestra sus embalses (con Centro, 6 filas) y con un embalse elegido, solo esa fila.

    ColumnaQué muestra
    EmbalseNombre; el Agregado Bogotá lleva la etiqueta “Agregado”
    RegiónRegión hidrológica
    % Vol. útilPorcentaje de agua útil con su insignia de riesgo
    Aportes (% media)“—” en Muna y en el Agregado Bogotá
    Vertimientos / Turbinado m³/sCaudal descargado sin generar / caudal que pasa por turbinas
    Energía útil GWhEnergía almacenada según XM
    Autonomía (días)Estimación de días hasta agotar el volumen útil; “—” si los aportes superan las salidas; engañosa en embalses en cadena como Punchiná
    ReporteCSV y JSON con la serie diaria de los últimos 180 días
    • Ordenar: clic en un encabezado; otro clic invierte. Arranca por % Vol. útil de menor a mayor.
    • Buscar: por nombre o región mientras escribes.
    • Seleccionar: clic en una fila la resalta y cambia el gráfico principal. Los enlaces CSV/JSON no cambian la selección.
    fecha,pct_volumen_util,energia_util_gwh,aportes_m3s,aportes_pct_media,vertimientos_m3s,turbinado_m3s

    Archivo <CODIGO>_reporte.csv (por ejemplo PENOL_reporte.csv). Una celda vacía es un dato no publicado, nunca un cero. Para otro rango: GET /api/v1/embalses/{id}/reporte?formato=csv&fecha_inicio=…&fecha_fin=….

    Manual de usuario · 16 · Nuevo

    Panel principal: Tableros Analíticos

    La página de inicio (/) es el acceso a todos los tableros. Está organizada en dos grupos para que se vea de un vistazo qué ya muestra resultados y qué todavía no.

    GrupoTablerosQué significa
    Tableros con datosEmbalses, Carbón térmico, Demanda no atendidaMuestran información real y actualizable, con filtros y su fecha de corte
    Modelos en desarrolloGas natural, Optimización hidrotérmica, Riesgo de apagónAún no tienen resultados finales: muestran su ficha, su estado real y cómo cargar los resultados cuando el modelo los entregue (borde punteado y marca «En desarrollo»)
    • Dos accesos por tarjeta: el título abre el tablero (toda la tarjeta es clicable) y «Guía de este tablero» abre el capítulo de esta guía que lo explica.
    • Cada tarjeta dice en una frase qué se puede ver, tres temas concretos y de dónde salen los datos.
    • Dentro de cualquier tablero, el botón Tableros del encabezado vuelve al panel y Información abre esta guía en otra pestaña.
    • Un tablero nuevo se agrega con una entrada en frontend/lib/tableros.ts, su ruta en frontend/lib/rutas.ts y una carpeta en app/; el panel lo muestra solo.
    Manual de usuario · 17 · Nuevo

    Rutas y direcciones: cada vista tiene su URL

    Cada tablero tiene una ruta propia y cada filtro y cada alternancia queda en la dirección de la página. Puedes copiar el enlace para compartir la vista exacta, recargar sin perderla o volver con «atrás». Lo que vale su valor por defecto no aparece en la dirección.

    RutaParámetros
    /Panel principal
    /embalsesregion, embalse, desde y hasta (AAAA-MM-DD), h (30, 90, 180 o 360 días del gráfico principal), hs (1, 3, 6 o 12 meses de la senda), q (búsqueda de la tabla), orden y dir (asc o desc)
    /carbonhistoria (12, 36, 60 o 0), horizonte (1, 3, 6 o 9), unidad (gbtu o kt), dias (15, 30, 45 o 60)
    /dnsperiodo (12, 36, 60 o 0), region, subarea, origen (programada o no_programada), medida (eventos o energia), ampliar (zonas, modelo)
    /gas, /optimizacion, /apagondesde y hasta (AAAA-MM) y, según el modelo, sus filtros (en gas, serie y variable), cuando hay resultados. /apagon usa modo, oni, simulaciones y horizonte
    /informacionEsta guía (#ancla del capítulo)
    • Ejemplo: /dns?periodo=12&region=Caribe&origen=programada abre el tablero de demanda no atendida de los últimos 12 meses, en el Caribe, solo eventos programados.
    • Direcciones alternativas: /tableros, /demanda-no-atendida, /riesgo-apagon, /gas-natural y otras redirigen a la ruta canónica.
    • Seguridad: cada parámetro se valida contra la misma lista cerrada que acepta la API. Un valor inválido (por ejemplo horizonte=2) se ignora y queda el valor por defecto; nunca llega a la API ni rompe la página.
    • Historial: cambiar un filtro reemplaza la entrada del historial (no la apila), así «atrás» vuelve a la pantalla anterior y no al filtro anterior.
    • Una dirección que no existe muestra una página 404 con el camino de vuelta al panel y la lista de tableros.
    Manual de usuario · 18 · Nuevo

    Tablero de carbón térmico: mapa de la pantalla

    Mismo esquema que el de embalses: encabezado, filtros, tarjetas, gráficos y detalle. Toca un número para ver qué es cada zona.

    El modelo encadena ENOS (RONI) → aportes hídricos → uso del techo térmico → consumo de carbón y simula 20.000 trayectorias para dar escenarios P10, P50 y P90 de oct-2026 a jun-2027. Las bandas son escenarios, no intervalos de confianza.
    Manual de usuario · 19 · Nuevo

    Filtros del tablero de carbón

    Cuatro campos y «Restablecer filtros». Solo ofrecen valores que la API acepta; cada uno tiene su botón ⓘ.

    FiltroOpciones (por defecto)Qué cambia
    Historia12, 36 (defecto), 60 meses o todaSolo los meses de consumo observado del gráfico principal
    Horizonte1, 3, 6 o 9 meses (9)Tarjetas, gráfico principal, trimestres, inventario y comparación con XM
    UnidadGBTU/día (defecto) o kt/díaTarjetas y gráficos de consumo, sin volver a consultar; el inventario siempre está en kt
    Días de inventario15, 30, 45 (defecto) o 60La tarjeta y el gráfico de inventario
    • kt/día = GBTU/día ÷ 26,27 (poder calorífico, MBTU/t).
    • Restablecer filtros devuelve los cuatro a su valor por defecto.
    Manual de usuario · 20 · Nuevo

    Tarjetas de indicadores del carbón

    TarjetaQué significa
    Pico esperadoMes de mayor consumo (P50) dentro del horizonte, con su rango P10–P90
    Uso del techo térmico% del techo físico (403,3 GBTU/día) que se usaría en el pico. Semáforo: holgado < 85 %, ajustado 85–100 %, supera el techo > 100 %; se muestra además el récord histórico (340,5, mar-2024)
    Prob. de superar el récord% de las simulaciones que superan el récord histórico mensual en el mes del pico
    Inventario de N díaskt de carbón para cubrir N días de consumo en el mes del pico (P50 y P90)
    Manual de usuario · 21 · Nuevo

    Gráficos del tablero de carbón

    • Consumo de carbón térmico: línea azul = observado (solo meses completos), línea punteada oscura = proyección P50, banda = escenarios P10–P90; las líneas horizontales son el techo (rojo) y el récord (ámbar). Si el mes en curso tiene datos parciales, una nota los informa aparte.
    • Consumo por trimestre (Mt): barras P50 y tabla con P10–P90. Un trimestre que no cabe completo en el horizonte se atenúa y se rotula «parcial».
    • Inventario requerido (kt): barras por mes, P50 (central) y P90 (adverso).
    • Modelo frente a XM: proyección P50 y banda frente al caso estocástico de XM; avisa en cuántos meses XM supera el techo físico: consulta a XM ese supuesto antes de usarlo como referencia.
    Manual de usuario · 22 · Nuevo

    Validación, supuestos y limitaciones

    • Criterios: el modelo cumple 35 de 38 criterios de validez. Primero se muestran los que no cumplen (son limitaciones reales); los que cumplen están en un desplegable.
    • Error medio (MAE) por horizonte: compara el modelo con métodos ingenuos (persistencia, estacional, climatología).
    • Episodios críticos: cómo se habría comportado en El Niño 2014-16, 2018-19 y 2023-24 (real, P50, error y cobertura P10–P90).
    • Supuestos: ecuaciones, muestra de estimación, techo, simulaciones, poder calorífico y la proyección de XM comparada. La proyección no reemplaza el despacho ni el análisis de XM.
    Manual de usuario · 23 · Nuevo

    Tablero de demanda no atendida (DNS): mapa de la pantalla

    Analiza los eventos de demanda no atendida (la energía que el sistema deja de suministrar) y de desconexión automática de carga (EDAC) que se reportan a SIMEM por subárea operativa, desde 2013. Toca un número para ver qué es cada zona.

    Es el único de los modelos 2 a 5 que hoy trae resultados reales: 15.799 eventos hasta el 11-ago-2026. Los EDAC se cuentan aparte porque su valor es carga desconectada, no kWh de DNS.
    Manual de usuario · 24 · Nuevo

    Filtros y tarjetas del tablero DNS

    FiltroOpcionesA qué llega
    Período12, 36 (defecto), 60 meses o todo el históricoTarjetas, serie, patrones y causas. No cambia zonas, cambios de reporte ni modelo: son resultados sobre todo el histórico
    RegiónLas del catálogo, más «Sin asignar»Todos los bloques; al cambiarla, la subárea vuelve a «Todas»
    SubáreaSolo las de la región elegida (o todas)Todos los bloques. También se elige con un clic en una zona del ranking
    OrigenProgramada o no programada (o ambas)Tarjetas, serie, patrones y causas; con origen activo no se muestra el pronóstico porque el modelo no lo separa
    • Eventos y energía no atendida: la variación es frente al período anterior de igual duración; subir es desfavorable (rojo) y bajar favorable (verde). Con «todo el histórico» no hay con qué comparar.
    • Eventos críticos: los que dejan sin atender 100 MWh (100.000 kWh) o más.
    • Eventos no programados: los que no estaban planeados; debajo se informa cuántos EDAC hubo.
    • Restablecer filtros devuelve los cuatro a su valor por defecto.
    Manual de usuario · 25 · Nuevo

    Gráficos, causas y modelo predictivo

    • Serie mensual: eventos o energía (botones Eventos / Energía). El último mes está atenuado si aún no termina. El punto de pronóstico es lo que el modelo estima para ese mes sumando las subáreas del filtro.
    • Paneles ampliables: «Priorización de zonas» y «Modelo predictivo» son largos, así que por defecto miden lo mismo que el panel de al lado (para conservar la simetría) y se desplazan por dentro. El botón Ver todo los extiende para ver todos los datos y Ver menos los devuelve; el estado queda en la dirección (?ampliar=zonas,modelo).
    • Priorización de zonas: índice 0-100 con magnitud (40 %), frecuencia (20 %), criticidad (20 %) y tendencia (20 %); los pesos son una decisión editorial. En rojo, las zonas cuya energía de los últimos 24 meses empeoró frente a los 24 previos.
    • Patrones: por hora, día y franja. Se excluyen los eventos con «hora desconocida» (00:00:00 exacto, valor por defecto de SIMEM).
    • Causas: la reportada por el operador o, si falta, inferida del texto (reglas y TF-IDF). Se avisa qué porcentaje es inferido.
    • Cambios en la forma de reportar: subáreas con más descripciones genéricas y menos causa conocida desde un mes; explican parte del aumento de eventos en 2024-2025.
    • Modelo predictivo: error (MAE, RMSE) de cada algoritmo frente a la persistencia; un modelo que no la supera no se reporta como exitoso.
    Manual de usuario · 26 · Nuevo

    Tableros de gas, optimización hidrotérmica y riesgo de apagón

    Los tres tienen la misma estructura. Gas y apagón ya tienen resultados importados; optimización solo tiene una prueba técnica sin resultados, así que muestra la ficha y cómo cargarlos. Nunca se inventan cifras. La captura muestra el estado de un modelo sin resultados.

    Riesgo de apagón:
    Es un visor interactivo. En el menú izquierdo eliges el modo de ONI (pronóstico ENOS o manual), el ONI objetivo (−2,5 a 2,5 °C, de 0,1 en 0,1, con la fase ENOS), las simulaciones (1000, 2000 o 5000) y el horizonte (12, 18 o 24 meses). A la derecha cambian los indicadores, el índice de riesgo por mes, las probabilidades de déficit y de apagón severo, el mapa de calor por franja horaria, la oferta frente a la demanda y la tabla mensual completa. Cada combinación es una corrida del modelo ya calculada; la plataforma no la recalcula. Los controles quedan en la dirección de la página.
    TableroEstado según sus documentosCuando haya resultados
    Gas naturalCon resultados: pronóstico coherente por campo y nacional (v2), curvas de Arps, backtesting y comparación con la oferta declaradaFiltros Campo y Variable (fiscalizado, comercializado, entregado a gasoducto): cambian el gráfico y las tablas
    Optimización hidrotérmicaEvaluación técnica favorable para el alcance actual, pero la corrida es una prueba INSUFFICIENT_RISK_SAMPLE marcada publishable = falseResumen de la corrida con advertencia si no es publicable
    Riesgo de apagón (visor interactivo)Con resultados: 18 meses de horizonte con semáforo mensual, probabilidad de déficit, margen de reserva, demanda frente a oferta y generación por fuenteGráficos con bandas P10-P90 y semáforo como insignia con texto (Verde, Amarillo, Rojo)
    • Estado: «Sin resultados publicados» (ámbar), «Prueba técnica: no publicable» (rojo) o «Con resultados importados» (verde).
    • Cifras documentadas: datos que ya están en los documentos; cada tarjeta dice de cuál.
    • Ficha: pregunta, método, datos, alcance, limitaciones y siguientes pasos, en secciones plegables.
    • Con resultados aparecen los filtros del modelo y Desde / Hasta, que recortan a la vez todos los gráficos y tablas, además de indicadores con nivel, advertencias y la procedencia de la corrida. Las líneas punteadas son referencias (por ejemplo, la curva de Arps).
    Manual de usuario · 26b · Nuevo

    Actualizar los tableros con archivos

    La página /actualizar (enlace «Acceso para actualizar datos» al pie del panel) permite cargar los archivos nuevos de un modelo sin usar la línea de comandos. Requiere una cuenta; cada acceso y cada carga queda registrado.

    PasoQué hacesQué pasa
    1. Iniciar sesiónUsuario y contraseñaCinco intentos fallidos bloquean la cuenta 15 minutos. La sesión vence a los 30 minutos sin actividad.
    2. Elegir el tableroSolo ves los que tu cuenta puede actualizarLa elección queda en la dirección (?tablero=gas).
    3. Cargar los archivosUn campo por archivo, con su formato y si es obligatorioExcel (.xlsx), CSV, JSON o Parquet según el modelo. Los CSV grandes se comprimen solos al enviarse.
    4. Revisar archivosPulsa «Revisar archivos»No se guarda nada. Verás un resumen (filas, fechas, series) y las advertencias del modelo, o la lista de errores con su motivo.
    5. AplicarMarca la confirmación y pulsa «Aplicar actualización»Reemplaza los datos del tablero en una sola operación. Si algo falla, los datos anteriores se conservan.
    Qué se rechaza:
    Archivos con formato distinto al esperado, vacíos o demasiado grandes (4 MB por archivo), libros de Excel con macros, vínculos externos o protegidos con contraseña, CSV que no estén en UTF-8, y cualquier archivo cuya estructura no cumpla lo que pide el modelo. Si cambias o quitas un archivo después de revisar, hay que revisar de nuevo: lo que se aplica es exactamente lo que se revisó.
    • Roles: el administrador actualiza todos los tableros y ve la bitácora; el cargador solo los que se le asignaron.
    • Riesgo de apagón (visor): el módulo no ejecuta el modelo. Se genera la tanda de 468 escenarios con importar_escenarios_apagon --exportar-csv y se carga el CSV.
    • Sin base externa: si el entorno no guarda datos de forma permanente, puedes revisar archivos pero no aplicarlos (la página lo avisa).
    Manual de usuario · 27

    Ayuda contextual, tema y preguntas frecuentes

    Botones de ayuda ⓘ

    Cada encabezado técnico, filtro, selector y columna tiene un botón circular azul claro.

    Cursor encimaAparece la explicación; se oculta al salir
    Tecla TabSe muestra al enfocar
    Toque en celularAbre; tocar fuera cierra
    Escape, scroll o redimensionarCierra
    Ayuda contextual al pasar el cursor
    Ayuda de la tarjeta de volumen útil.

    Tema oscuro y celular

    Tablero en tema oscuro
    Tema oscuro: los colores de riesgo se ajustan para mantener el contraste.
    Tablero en celular
    Celular: una sola columna; la tabla se desplaza horizontalmente.

    Preguntas frecuentes

    ¿Por qué el corte no es el día de hoy?
    XM publica con uno o dos días de rezago y la base se actualiza al sincronizar. La fecha del último dato está bajo el título y en el pie.
    ¿Los filtros afectan todo el tablero?
    Región y embalse sí: tarjetas, gráfico principal, distribución regional, senda y tabla. Las fechas solo cambian el histórico diario del gráfico principal.
    ¿Qué significa un guion “—”?
    Que XM no publicó ese dato (por ejemplo, aportes de Muna). Nunca es un cero.
    ¿Por qué el total proyecta bajar a 35 % si hoy está en 77 %?
    El modelo incorpora escenarios de El Niño: el insumo climático prevé El Niño con probabilidad del 100 % de octubre de 2026 a febrero de 2027, lo que reduce los aportes esperados. Es una proyección, no un dato observado.
    ¿Por qué la banda casi no se ve al inicio?
    Los escenarios P10–P90 solo varían el clima; en los primeros meses casi coinciden. No es un intervalo de confianza.
    ¿Por qué el Agregado Bogotá o una región muestran “IC 95%”?
    Para ellos el modelo de largo plazo no publica proyección y se usa Holt-Winters, que solo mira la serie del volumen.
    ¿Por qué la primera carga tarda unos segundos?
    La API se duerme tras un rato sin uso y la primera consulta la reactiva.
    ¿Cada cuánto se actualizan los datos?
    No es automático: se actualizan cuando el equipo técnico sincroniza y publica la API. El pie muestra el corte vigente.
    ¿Son proyecciones oficiales?
    No. Los datos observados son públicos de XM/SIMEM; las proyecciones son de un modelo del proyecto y los archivos entregados no traen validación fuera de muestra.
    Anexos · 28

    Límites conocidos y glosario

    TemaDetalle
    ActualizaciónManual: sincronizar en local y volver a publicar la API
    Cobertura de la proyección12 meses (oct-2026 a sep-2027); sin proyección por región ni para el Agregado Bogotá
    ValidaciónLos Outputs no traen validación fuera de muestra; el ajuste dentro de muestra del total nacional es de 2,0 pp de error medio
    BandaEscenarios P10–P90 que solo varían el clima; en 69 de 288 casos tiene ancho cero
    ProphetEn los 24 embalses el componente Prophet es una constante igual al último valor observado; el aporte del modelo es el ajuste de XGBoost
    Aportes26 de 48 series de río; Muna y el Agregado Bogotá no tienen
    Valores sobre 100 %El histórico por embalse puede superar 100 % (1.988 filas, sobre todo Playas); hoy ninguno lo supera
    Datos de origenEl dataset oficial 1d3ef8 trae valores atípicos (0 % el 20-ago-2023 en varios embalses); la plataforma calcula el % desde volumen y capacidad
    RendimientoPaquete de API de unos 310 MB y arranque en frío
    IdentidadLos logos son del Ministerio de Minas y Energía y se usan solo con su autorización; la plataforma no es un producto oficial
    TérminoSignificado
    Anexos · 29

    Fuentes y referencias

    Cifras y comportamientos salen del código y la base de la plataforma al corte del 25-oct-2026, de las pruebas automatizadas y de las comparaciones contra los insumos y resultados del modelo de largo plazo. SIMEM y la API de XM se consumen mediante los clientes del backend; no se consultaron sus portales para redactar esta guía.