DB: bazénové čerpadlo přes Shelly relé (V085)
- ems.asset_pool_pump (endpoint http, rated_power_w, min_run_min, daily_runtime_min jako aktuální sezónní hodnota, schedulable) - ems.telemetry_pool_pump — 1min hypertable (is_on, power_w, energy_wh_total) - signal_def POOL_PUMP_ON (bool) pro ovládání přes signal infrastrukturu - fn_telemetry_pool_pump_sample (R__092), vw_asset_pool_pump_http_poll (R__093) - fn_signal_enqueue_bool (R__094) — SQL-first zařazení bool signálu do fronty Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
This commit is contained in:
32
db/routines/R__092_fn_telemetry_pool_pump_sample.sql
Normal file
32
db/routines/R__092_fn_telemetry_pool_pump_sample.sql
Normal 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.';
|
||||
59
db/routines/R__094_fn_signal_enqueue_bool.sql
Normal file
59
db/routines/R__094_fn_signal_enqueue_bool.sql
Normal 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);';
|
||||
Reference in New Issue
Block a user