Files
ems/db/migration/V007__rolling_replanning.sql
Dusan Vojacek 8b4af663d8 Initial commit
Made-with: Cursor
2026-03-20 13:27:44 +01:00

92 lines
4.4 KiB
SQL
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
-- =============================================================
-- V007__rolling_replanning.sql
-- EMS Platform rozšíření planning_run o rolling horizon typ
-- a forecast korekční faktory
-- =============================================================
-- ============================================================
-- Rozšíření planning_run o typ a kontext replanningu
-- ============================================================
ALTER TABLE ems.planning_run
ADD COLUMN IF NOT EXISTS run_type TEXT NOT NULL DEFAULT 'daily',
ADD COLUMN IF NOT EXISTS triggered_by TEXT,
ADD COLUMN IF NOT EXISTS replan_from TIMESTAMPTZ,
ADD COLUMN IF NOT EXISTS soc_at_replan_wh NUMERIC(10,2),
ADD COLUMN IF NOT EXISTS solver_duration_ms INT,
ADD COLUMN IF NOT EXISTS forecast_correction_factor NUMERIC(6,4);
COMMENT ON COLUMN ems.planning_run.run_type IS
'Typ plánovacího běhu:
daily = hlavní denní plán (15:00, horizont 36h)
rolling = průběžný replan každých 15min
manual = spuštěno ručně z UI nebo API';
COMMENT ON COLUMN ems.planning_run.triggered_by IS
'Co spustilo tento plánovací běh:
scheduler:daily, scheduler:rolling, user:jan, api, override_change';
COMMENT ON COLUMN ems.planning_run.replan_from IS
'Od kterého slotu byl plán přepočítán (pro rolling). NULL pro daily plán.
Sloty před replan_from jsou převzaty z předchozího aktivního plánu.';
COMMENT ON COLUMN ems.planning_run.soc_at_replan_wh IS
'Skutečný SoC baterie v Wh v okamžiku replanningu (z telemetrie).
Vstupní podmínka pro solver zpřesňuje počáteční SoC oproti dennímu plánu.';
COMMENT ON COLUMN ems.planning_run.solver_duration_ms IS
'Čas výpočtu LP solveru v milisekundách. Pro monitoring výkonu.';
COMMENT ON COLUMN ems.planning_run.forecast_correction_factor IS
'Korekční faktor aplikovaný na FVE forecast při tomto replanningu.
Vypočten z poměru skutečné vs. předpovídané výroby za posledních 60 minut.
1.0 = žádná korekce, 0.8 = skutečnost byla 80% forecastu.';
-- ============================================================
-- Rozšíření planning_interval o per-EV setpointy
-- (nahrazuje jeden agregovaný ev_charge_power_w)
-- ============================================================
ALTER TABLE ems.planning_interval
ADD COLUMN IF NOT EXISTS ev1_setpoint_w INT,
ADD COLUMN IF NOT EXISTS ev2_setpoint_w INT,
ADD COLUMN IF NOT EXISTS ev1_via_bat_w INT NOT NULL DEFAULT 0,
ADD COLUMN IF NOT EXISTS ev2_via_bat_w INT NOT NULL DEFAULT 0;
COMMENT ON COLUMN ems.planning_interval.ev1_setpoint_w IS
'Plánovaný celkový výkon nabíjení EV nabíječky 1 (Tesla) v W. NULL = auto nepřipojeno.';
COMMENT ON COLUMN ems.planning_interval.ev2_setpoint_w IS
'Plánovaný celkový výkon nabíjení EV nabíječky 2 (Zoe) v W. NULL = auto nepřipojeno.';
COMMENT ON COLUMN ems.planning_interval.ev1_via_bat_w IS
'Část výkonu EV1 která jde přes baterii (round-trip ztráta). 0 = přímé napájení.';
COMMENT ON COLUMN ems.planning_interval.ev2_via_bat_w IS
'Část výkonu EV2 která jde přes baterii (round-trip ztráta). 0 = přímé napájení.';
-- ============================================================
-- Tabulka forecast korekcí pro analýzu přesnosti
-- ============================================================
CREATE TABLE IF NOT EXISTS ems.forecast_correction_log (
id SERIAL PRIMARY KEY,
site_id INT NOT NULL REFERENCES ems.site(id),
logged_at TIMESTAMPTZ NOT NULL DEFAULT now(),
window_start TIMESTAMPTZ NOT NULL, -- začátek okna pro výpočet faktoru
window_end TIMESTAMPTZ NOT NULL,
actual_pv_wh NUMERIC(12,3), -- skutečná výroba za okno
forecast_pv_wh NUMERIC(12,3), -- předpovídaná výroba za okno
correction_factor NUMERIC(6,4), -- actual / forecast
applied_to_run_id INT REFERENCES ems.planning_run(id)
);
COMMENT ON TABLE ems.forecast_correction_log IS
'Log výpočtu korekčních faktorů FVE forecastu. Každý rolling replan zaznamená
poměr skutečné vs. předpovídané výroby za posledních 60 minut. Slouží pro
analýzu přesnosti forecastu a ladění modelu.';
COMMENT ON COLUMN ems.forecast_correction_log.correction_factor IS
'Poměr actual_pv_wh / forecast_pv_wh. Hodnoty typicky 0.51.5.
Extrémní hodnoty (oblačnost, porucha) jsou odfiltrovány v kódu (clamp 0.51.5).';