Files
ems/db/migration/V098__ev_weekly_requirement.sql
Dusan Vojacek 60eda46dd7 V098: týdenní požadavky EV (ev_weekly_requirement) + fn_ev_session_defaults
Tabulka ems.ev_weekly_requirement (dow 0=pondělí..6, target_soc_pct,
deadline_hour Europe/Prague, enabled; unique per vozidlo+den) se seedem
tesla-my pondělí 07:00 → 90 %. Nová ems.fn_ev_session_defaults(vehicle,
arrival) → jsonb {target_soc_pct, deadline, source}: kaskáda týdenní
požadavek (výskyt do 48 h) → forecast z ev_usage_stats
(target_soc_forecast_enabled, chování V089 beze změny) → defaulty vozidla
(deadline = příští výskyt default_deadline_hour). fn_ev_session_transition
ji volá při založení session (SQL-first, Python beze změny); comment
funkce sjednocen na styl bez parametrů.

Docs: ev-charging.md sekce Týdenní požadavky + kaskáda, CLAUDE.md seznam fn.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-12 19:14:40 +02:00

37 lines
2.1 KiB
SQL

-- Týdenní požadavky na EV: explicitní cíl (target SoC) + deadline pro den
-- v týdnu (0 = pondělí .. 6 = neděle; čas Europe/Prague). Při příjezdu vozidla
-- je čte ems.fn_ev_session_defaults (R__099): nejbližší budoucí výskyt do 48 h
-- má přednost před forecastem z ev_usage_stats i před defaulty vozidla.
-- Ruční přepis (Discord výběry / UI → fn_ev_session_apply_patch) vždy vyhrává.
create table ems.ev_weekly_requirement (
id serial primary key,
vehicle_id int not null references ems.asset_vehicle (id),
dow int not null check (dow between 0 and 6),
target_soc_pct numeric(5, 2) not null check (target_soc_pct between 0 and 100),
deadline_hour int not null check (deadline_hour between 0 and 23),
enabled boolean not null default true,
created_at timestamptz not null default now(),
unique (vehicle_id, dow)
);
comment on table ems.ev_weekly_requirement is
'Týdenní požadavek na nabití vozidla: v den dow (0 = pondělí .. 6 = neděle) v deadline_hour (Europe/Prague) má mít vozidlo target_soc_pct. Vstup ems.fn_ev_session_defaults při zakládání ev_session (přednost před forecastem i defaulty).';
comment on column ems.ev_weekly_requirement.vehicle_id is
'Vozidlo (ems.asset_vehicle), max. 1 řádek na den v týdnu.';
comment on column ems.ev_weekly_requirement.dow is
'Den v týdnu DEADLINE: 0 = pondělí .. 6 = neděle (ISO pořadí, POZOR: ne postgres extract(dow) ani ev_usage_stats, kde 0 = neděle).';
comment on column ems.ev_weekly_requirement.target_soc_pct is
'Cílový SoC vozidla (%) v okamžiku deadline.';
comment on column ems.ev_weekly_requirement.deadline_hour is
'Hodina deadline v Europe/Prague (7 = 07:00 daného dne dow).';
comment on column ems.ev_weekly_requirement.enabled is
'false = řádek se při výběru defaultů ignoruje (požadavek dočasně vypnut bez smazání).';
-- Seed: Tesla Model Y (home-01) — pondělí 07:00 nabitá na 90 % (služebka).
insert into ems.ev_weekly_requirement (vehicle_id, dow, target_soc_pct, deadline_hour)
select av.id, 0, 90.0, 7
from ems.asset_vehicle av
join ems.site s on s.id = av.site_id
where s.code = 'home-01' and av.code = 'tesla-my';