-- Bazénové čerpadlo přes Shelly relé (Gen2 RPC). -- (a) asset + 1min telemetrie vlastním pollingem (Shelly drží jen okamžitý stav a čítač -- aenergy.total — historii si stavíme sami jako u ostatních zařízení, 60 s), -- (b) ovládání on/off přes existující signal infrastrukturu (signal_def POOL_PUMP_ON, -- route http_rest na Switch.Set — route je per site, seed v docs/04-modules/pool-shelly.md), -- (c) plánovač: odložitelná zátěž s denní povinnou dobou filtrace (follow-up, viz docs). -- ------------------------------------------------------------ -- Aktivum: bazénové čerpadlo za Shelly relé -- ------------------------------------------------------------ create table ems.asset_pool_pump ( id serial primary key, site_id int not null references ems.site (id), code text not null, manufacturer text, model text, endpoint_id int references ems.site_endpoint (id), shelly_switch_id int not null default 0, rated_power_w int not null, min_run_min int not null default 15, daily_runtime_min int not null default 240, schedulable boolean not null default true, notes text, constraint uq_asset_pool_pump_site_code unique (site_id, code) ); comment on table ems.asset_pool_pump is 'Bazénové (filtrační) čerpadlo spínané přes Shelly relé (Gen2 RPC, HTTP). Konstantní příkon, odložitelná zátěž s denní povinnou dobou běhu.'; comment on column ems.asset_pool_pump.site_id is 'Vazba na lokalitu.'; comment on column ems.asset_pool_pump.code is 'Kód aktiva, unikátní v rámci lokality. Příklad: pool-pump-01.'; comment on column ems.asset_pool_pump.endpoint_id is 'HTTP endpoint Shelly relé (ems.site_endpoint, endpoint_type http_api nebo shelly_http). Bez endpointu se čerpadlo nepolluje.'; comment on column ems.asset_pool_pump.shelly_switch_id is 'Id Switch komponenty v Shelly Gen2 RPC (Switch.GetStatus?id=N). U 1kanálových relé 0.'; comment on column ems.asset_pool_pump.rated_power_w is 'Jmenovitý příkon čerpadla ve W. Plánovač s ním počítá jako s konstantním výkonem při běhu.'; comment on column ems.asset_pool_pump.min_run_min is 'Minimální nepřerušený běh v minutách (ochrana čerpadla před krátkým cyklováním). Násobky 15min slotů.'; comment on column ems.asset_pool_pump.daily_runtime_min is 'Denní povinná doba filtrace v minutách — AKTUÁLNÍ sezónní hodnota (léto typ. více, zima méně / 0). Mění ji provozovatel ručně podle sezóny; plnohodnotný sezónní profil (tabulka měsíc → minuty) je follow-up, viz docs/04-modules/pool-shelly.md. 0 = filtrace vypnutá (mimo sezónu).'; comment on column ems.asset_pool_pump.schedulable is 'true = plánovač smí rozkládat běh do levných/přebytkových slotů; false = EMS jen měří, nespíná.'; -- ------------------------------------------------------------ -- 1min telemetrie (TimescaleDB hypertable) -- ------------------------------------------------------------ create table ems.telemetry_pool_pump ( site_id int not null references ems.site (id), pump_id int not null references ems.asset_pool_pump (id), measured_at timestamptz not null, is_on boolean, power_w int, energy_wh_total bigint, primary key (pump_id, measured_at) ); comment on table ems.telemetry_pool_pump is 'Telemetrie bazénového čerpadla ze Shelly relé (Gen2 Switch.GetStatus), 1min polling. TimescaleDB hypertable. Historie se staví výhradně tady — Shelly ji nedrží.'; comment on column ems.telemetry_pool_pump.site_id is 'Vazba na lokalitu.'; comment on column ems.telemetry_pool_pump.pump_id is 'Vazba na ems.asset_pool_pump.'; comment on column ems.telemetry_pool_pump.measured_at is 'Čas měření (UTC).'; comment on column ems.telemetry_pool_pump.is_on is 'Stav relé (Switch.GetStatus output).'; comment on column ems.telemetry_pool_pump.power_w is 'Okamžitý činný příkon ve W (Switch.GetStatus apower). NULL pokud model neměří výkon.'; comment on column ems.telemetry_pool_pump.energy_wh_total is 'Kumulativní čítač energie ve Wh (Switch.GetStatus aenergy.total). Po výpadku napájení Shelly může čítač začít znovu — energii za interval počítat jako kladnou diferenci.'; select create_hypertable( 'ems.telemetry_pool_pump', 'measured_at', chunk_time_interval => interval '1 week', if_not_exists => true ); create index idx_telemetry_pool_pump_site_time on ems.telemetry_pool_pump (site_id, measured_at desc); -- ------------------------------------------------------------ -- Signál pro ovládání relé (route per site se seeduje provozně, šablona v docs) -- ------------------------------------------------------------ insert into ems.signal_def (code, value_type, description) values ( 'POOL_PUMP_ON', 'bool', 'Požadovaný stav bazénového čerpadla (Shelly relé). Doručuje signal_service přes signal_route http_rest na Shelly Gen2 Switch.Set, readback verify přes Switch.GetStatus. Hodnotu nastavuje plánovač / operátor (fn_signal_enqueue_bool).' ) on conflict (code) do nothing;