92 lines
4.4 KiB
SQL
92 lines
4.4 KiB
SQL
-- =============================================================
|
||
-- 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).';
|