Initial commit

Made-with: Cursor
This commit is contained in:
Dusan Vojacek
2026-03-20 13:27:37 +01:00
commit 8b4af663d8
77 changed files with 13337 additions and 0 deletions

View File

@@ -0,0 +1,91 @@
-- =============================================================
-- 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).';