Merge: bazénové čerpadlo přes Shelly (telemetrie + signal ovládání)

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
This commit is contained in:
Dusan Vojacek
2026-06-12 00:12:43 +02:00
8 changed files with 637 additions and 0 deletions

View File

@@ -0,0 +1,32 @@
create or replace function ems.fn_telemetry_pool_pump_sample(
p_site_id int,
p_pump_id int,
p_measured_at timestamptz,
p_is_on boolean,
p_power_w int,
p_energy_wh_total bigint
)
returns void
language sql
as $fn$
insert into ems.telemetry_pool_pump (
site_id,
pump_id,
measured_at,
is_on,
power_w,
energy_wh_total
)
values (
p_site_id,
p_pump_id,
p_measured_at,
p_is_on,
p_power_w,
p_energy_wh_total
)
on conflict (pump_id, measured_at) do nothing;
$fn$;
comment on function ems.fn_telemetry_pool_pump_sample is
'Insert 1min telemetrie bazénového čerpadla (Shelly Switch.GetStatus: output, apower, aenergy.total). Volá telemetry_collector.poll_pool_pumps.';

View File

@@ -0,0 +1,59 @@
create or replace function ems.fn_signal_enqueue_bool(
p_site_id int,
p_signal_code text,
p_value boolean
)
returns int
language plpgsql
as $fn$
declare
v_route record;
v_value_text text;
v_count int := 0;
begin
-- Zařadí bool signál do odchozí fronty pro všechny aktivní routy (site, kód).
-- Transformaci na text dělá per route stejně jako backend (_bool_to_text):
-- transform_json->'map_bool'->>'true'/'false', default '1'/'0'.
for v_route in
select r.id, r.site_id, r.destination_type, r.destination_key, r.transform_json
from ems.signal_route r
where r.site_id = p_site_id
and r.signal_code = p_signal_code
and r.enabled = true
loop
v_value_text := coalesce(
v_route.transform_json -> 'map_bool' ->> (case when p_value then 'true' else 'false' end),
case when p_value then '1' else '0' end
);
insert into ems.signal_state (
site_id, signal_code, destination_type, destination_key,
last_desired_value_text, updated_at
)
values (
p_site_id, p_signal_code, v_route.destination_type, v_route.destination_key,
v_value_text, now()
)
on conflict (site_id, signal_code, destination_type, destination_key)
do update set
last_desired_value_text = excluded.last_desired_value_text,
updated_at = now();
insert into ems.signal_outbound_journal (
route_id, site_id, signal_code, value_text, value_num, status,
attempt_count, next_attempt_at
)
values (
v_route.id, p_site_id, p_signal_code, v_value_text,
case when p_value then 1 else 0 end, 'queued', 0, now()
);
v_count := v_count + 1;
end loop;
return v_count;
end;
$fn$;
comment on function ems.fn_signal_enqueue_bool is
'Zařadí bool signál (např. POOL_PUMP_ON) do signal_outbound_journal pro všechny aktivní routy daného site a kódu; doručení a verify řeší signal_service (každých 15 s). Vrací počet zařazených řádků. Použití: select ems.fn_signal_enqueue_bool(1, ''POOL_PUMP_ON'', true);';