Files
ems/db/migration/V087__pool_shelly.sql
Dusan Vojacek 466c15fa84
All checks were successful
CI and deploy / migration-check (push) Successful in 16s
CI and deploy / deploy (push) Successful in 1m14s
Bazén: V085→V087 (out-of-order po V086) + seed Shelly Plug S Gen3 home-01
V088: endpoint shelly_http 172.16.1.15 + asset pool-pump-1 (rated 600 W odhad
— upřesní telemetrie; 480 min/den letní filtrace; schedulable=false =
telemetry-only start, ovládání signálem POOL_PUMP_ON po ověření).

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

108 lines
5.0 KiB
SQL

-- 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;