telemetrie per pv_array, fix predictinos
Some checks failed
CI and deploy / migration-check (push) Failing after 24s
CI and deploy / deploy (push) Has been skipped

This commit is contained in:
Dusan Vojacek
2026-04-29 13:03:41 +02:00
parent afee62ba4e
commit 9d37efb991
6 changed files with 179 additions and 23 deletions

View File

@@ -0,0 +1,52 @@
-- =============================================================
-- V072 asset_pv_array.telemetry_group + rozšíření telemetry_source
--
-- Cíl:
-- - umožnit mapování PV pole → měřicí kanál (pv1/pv2/pv_strings/pv_total/gen_port),
-- - umožnit sdílené měření pro více polí (telemetry_group) a následnou alokaci (v routines).
-- =============================================================
alter table ems.asset_pv_array
add column if not exists telemetry_group text;
comment on column ems.asset_pv_array.telemetry_source is
'Který sloupec v telemetry_inverter odpovídá tomuto poli.
gen_port = gen_port_power_w (AC-coupled pole na GEN portu),
pv1 = pv1_power_w (DC string 1 / MPPT1),
pv2 = pv2_power_w (DC string 2 / MPPT2),
pv_strings = pv1_power_w + pv2_power_w (souhrn DC stringů, pokud nejde rozlišit),
pv_total = pv_power_w (souhrnné PV, pokud nejde rozlišit).
NULL = pole nemá přímou telemetrii (fallback na forecast).';
comment on column ems.asset_pv_array.telemetry_group is
'Volitelná skupina pro sdílené měření: pokud více pv_array sdílí jeden telemetrický kanál (např. GEN port rozdělený do více orientací),
pak mají shodné (site_id, telemetry_source, telemetry_group) a routines alokují actual proporčně podle forecastu.';
-- --- Seed / upgrade stávajících referenčních lokalit ---
-- home-01: dvě GEN pole sdílí jeden GEN port → stejné telemetry_group
update ems.asset_pv_array
set telemetry_source = 'gen_port',
telemetry_group = 'gen_port_1'
where site_id = (select id from ems.site where code = 'home-01')
and code in ('pv-b', 'pv-b-flat');
-- BA81: stringy mapujeme na PV1/PV2, mikroinvertory sdílí GEN port (alokace podle forecastu).
update ems.asset_pv_array
set telemetry_source = 'pv1',
telemetry_group = null
where site_id = (select id from ems.site where code = 'BA81')
and code = 'pv-str-1';
update ems.asset_pv_array
set telemetry_source = 'pv2',
telemetry_group = null
where site_id = (select id from ems.site where code = 'BA81')
and code = 'pv-str-2';
update ems.asset_pv_array
set telemetry_source = 'gen_port',
telemetry_group = 'gen_port_1'
where site_id = (select id from ems.site where code = 'BA81')
and code in ('pv-mi-1', 'pv-mi-2');

View File

@@ -0,0 +1,56 @@
-- =============================================================
-- 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;
$$;