zkraceni intervalu planneru na max 35h
This commit is contained in:
@@ -179,8 +179,8 @@ BEGIN
|
||||
'backend/services/control_exporter.py (mapování na Deye)',
|
||||
'CLAUDE.md bod 15–19 (baseline, horizont, režimy, MILP export)'
|
||||
],
|
||||
'slot_weights_hours_from_horizon_start',
|
||||
'0–36: váha 1.0; 36–72: 0.7; 72–96: 0.4 (účelovka LP; sloupec hours_from_plan_horizon_start u každého intervalu).'
|
||||
'horizon_and_objective',
|
||||
'Dynamický horizont: ems.fn_planning_horizon_end (OTE + strop/min v SQL). Účelovka LP bez vzdálenostních vah; terminal SoC shadow price (avg buy × 0,9 / 1000 × soc_end). Sloupec hours_from_plan_horizon_start u intervalů jen pro čtení.'
|
||||
)
|
||||
);
|
||||
END;
|
||||
|
||||
51
db/routines/R__074_fn_last_effective_ote.sql
Normal file
51
db/routines/R__074_fn_last_effective_ote.sql
Normal file
@@ -0,0 +1,51 @@
|
||||
-- Poslední konec 15min intervalu s efektivní OTE cenou pro site (dynamický horizont plánu).
|
||||
|
||||
create or replace function ems.fn_last_effective_ote(p_site_id int)
|
||||
returns timestamptz
|
||||
language sql
|
||||
stable
|
||||
as $$
|
||||
select max(interval_end)
|
||||
from ems.vw_site_effective_price
|
||||
where site_id = p_site_id
|
||||
and effective_buy_price_czk_kwh is not null
|
||||
and effective_sell_price_czk_kwh is not null;
|
||||
$$;
|
||||
|
||||
comment on function ems.fn_last_effective_ote(int) is
|
||||
'Nejvzdálenější konec intervalu s efektivní nákupní i prodejní cenou (OTE přes vw_site_effective_price).
|
||||
Používá planning_engine pro dynamický horizont – jen reálná data, bez predikce.';
|
||||
|
||||
|
||||
-- Konec horizontu pro LP: min(konec OTE, from + max_h), NULL pokud je k dispozici méně než min_h dat.
|
||||
|
||||
create or replace function ems.fn_planning_horizon_end(
|
||||
p_site_id int,
|
||||
p_horizon_from timestamptz,
|
||||
p_max_hours numeric default 36,
|
||||
p_min_hours numeric default 1
|
||||
)
|
||||
returns timestamptz
|
||||
language plpgsql
|
||||
stable
|
||||
as $fn$
|
||||
declare
|
||||
v_last timestamptz;
|
||||
v_cap timestamptz;
|
||||
v_min_end timestamptz;
|
||||
begin
|
||||
v_last := ems.fn_last_effective_ote(p_site_id);
|
||||
if v_last is null then
|
||||
return null;
|
||||
end if;
|
||||
v_cap := least(v_last, p_horizon_from + p_max_hours * interval '1 hour');
|
||||
v_min_end := p_horizon_from + p_min_hours * interval '1 hour';
|
||||
if v_cap < v_min_end then
|
||||
return null;
|
||||
end if;
|
||||
return v_cap;
|
||||
end;
|
||||
$fn$;
|
||||
|
||||
comment on function ems.fn_planning_horizon_end(int, timestamptz, numeric, numeric) is
|
||||
'Konec plánovacího okna: min(poslední OTE interval, p_horizon_from + p_max_hours). NULL pokud OTE končí dřív než p_min_hours od p_horizon_from (rolling se přeskočí). Výchozí strop 36 h, min 1 h – měnit přes volitelné argumenty nebo novou verzi funkce.';
|
||||
Reference in New Issue
Block a user