-- ============================================================= -- V073 – číselník PV telemetrie + FK na asset_pv_array.telemetry_source -- -- Cíl: referenční integrita pro telemetry_source (povolené kódy), -- aby se zabránilo překlepům a nekonzistentním datům. -- ============================================================= create table if not exists ems.pv_telemetry_source_def ( code text primary key, description text not null, telemetry_inverter_expr text null, active boolean not null default true ); comment on table ems.pv_telemetry_source_def is 'Číselník zdrojů PV telemetrie (kanálů) pro asset_pv_array.telemetry_source.'; comment on column ems.pv_telemetry_source_def.code is 'Stabilní kód zdroje telemetrie (FK z asset_pv_array.telemetry_source).'; comment on column ems.pv_telemetry_source_def.telemetry_inverter_expr is 'Volitelně: lidsky čitelný výraz, jak se kanál počítá z telemetry_inverter (informativní; runtime logika je v routines).'; insert into ems.pv_telemetry_source_def (code, description, telemetry_inverter_expr) values ('gen_port', 'AC-coupled výroba na GEN portu (souhrn).', 'gen_port_power_w'), ('pv1', 'DC string/MPPT 1 (samostatně).', 'pv1_power_w'), ('pv2', 'DC string/MPPT 2 (samostatně).', 'pv2_power_w'), ('pv_strings', 'Součet DC stringů (pv1+pv2).', 'pv1_power_w + pv2_power_w'), ('pv_total', 'Souhrnná PV výroba (pokud nelze rozlišit).','pv_power_w') on conflict (code) do update set description = excluded.description, telemetry_inverter_expr = excluded.telemetry_inverter_expr, active = true; -- FK (idempotentně): NULL povolen (pole bez přímé telemetrie / fallback na forecast). do $$ begin if not exists ( select 1 from pg_constraint c join pg_class t on t.oid = c.conrelid join pg_namespace n on n.oid = t.relnamespace where n.nspname = 'ems' and t.relname = 'asset_pv_array' and c.conname = 'asset_pv_array_telemetry_source_fk' ) then alter table ems.asset_pv_array add constraint asset_pv_array_telemetry_source_fk foreign key (telemetry_source) references ems.pv_telemetry_source_def(code) on update cascade on delete restrict; end if; end; $$;