- 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>
60 lines
2.0 KiB
PL/PgSQL
60 lines
2.0 KiB
PL/PgSQL
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);';
|