-- ============================================================= -- 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.5–1.5. Extrémní hodnoty (oblačnost, porucha) jsou odfiltrovány v kódu (clamp 0.5–1.5).';