implmemtace cuttoff genportu
Some checks failed
CI and deploy / migration-check (push) Failing after 9s
CI and deploy / deploy (push) Has been skipped

This commit is contained in:
Dusan Vojacek
2026-04-20 10:41:10 +02:00
parent d8dbb284fd
commit b8515f30df
15 changed files with 265 additions and 5 deletions

View File

@@ -0,0 +1,9 @@
-- Feature flag: řízení microinverter export cutoff přes Deye Modbus (GEN / AC coupling).
-- Použito pro instalace typu BA81, kde při BLOCK_EXPORT (sell_price < 0) musíme odpojit / zakázat export z MI na GEN portu.
alter table ems.asset_inverter
add column if not exists deye_gen_microinverter_cutoff_enabled boolean not null default false;
comment on column ems.asset_inverter.deye_gen_microinverter_cutoff_enabled is
'Pokud true, EMS při BLOCK_EXPORT přepíná Deye reg 179 (Control board special 1) bits01 pro MI export cutoff na GEN portu.';

View File

@@ -0,0 +1,10 @@
-- BA81: při BLOCK_EXPORT (sell_price < 0) je potřeba aktivovat „MI export to Grid cutoff“.
-- EMS to řeší přes Deye reg 179 bits 01 (masked RMW) pouze když je tento feature flag zapnutý.
update ems.asset_inverter ai
set deye_gen_microinverter_cutoff_enabled = true
from ems.site s
where s.id = ai.site_id
and s.code = 'BA81'
and ai.code = 'deye-main';

View File

@@ -0,0 +1,10 @@
-- Explicitní flag pro řízení odpojení GEN portu (mikroinvertory / AC coupling) v daném slotu.
-- Použito hlavně u BA81: při záporné výkupní ceně a očekávaném přebytku nechceme exportovat, takže solver může zvolit cut-off.
alter table ems.planning_interval
add column if not exists deye_gen_cutoff_enabled boolean;
comment on column ems.planning_interval.deye_gen_cutoff_enabled is
'True = v daném slotu odpojit GEN port (MI export cutoff) přes Deye reg 179 bits01.
NULL = lokalita / instalace GEN cut-off nepoužívá nebo flag není relevantní.';

View File

@@ -51,6 +51,7 @@ begin
battery_setpoint_w, battery_soc_target_pct,
grid_setpoint_w,
deye_physical_mode,
deye_gen_cutoff_enabled,
ev1_setpoint_w, ev2_setpoint_w, ev1_via_bat_w, ev2_via_bat_w,
heat_pump_enabled, heat_pump_setpoint_w,
pv_a_curtailed_w, expected_cost_czk,
@@ -66,6 +67,7 @@ begin
(r.value->>'battery_soc_target_pct')::numeric,
(r.value->>'grid_setpoint_w')::int,
nullif(trim(r.value->>'deye_physical_mode'), ''),
(r.value->>'deye_gen_cutoff_enabled')::boolean,
nullif(r.value->>'ev1_setpoint_w', '')::int,
nullif(r.value->>'ev2_setpoint_w', '')::int,
coalesce((r.value->>'ev1_via_bat_w')::int, 0),
@@ -89,6 +91,7 @@ begin
battery_setpoint_w, battery_soc_target_pct,
grid_setpoint_w,
deye_physical_mode,
deye_gen_cutoff_enabled,
ev1_setpoint_w, ev2_setpoint_w, ev1_via_bat_w, ev2_via_bat_w,
heat_pump_enabled, heat_pump_setpoint_w,
pv_a_curtailed_w, expected_cost_czk,
@@ -101,6 +104,7 @@ begin
(r.value->>'battery_soc_target_pct')::numeric,
(r.value->>'grid_setpoint_w')::int,
nullif(trim(r.value->>'deye_physical_mode'), ''),
(r.value->>'deye_gen_cutoff_enabled')::boolean,
nullif(r.value->>'ev1_setpoint_w', '')::int,
nullif(r.value->>'ev2_setpoint_w', '')::int,
coalesce((r.value->>'ev1_via_bat_w')::int, 0),

View File

@@ -102,7 +102,17 @@ begin
select jsonb_build_object(
'max_import_power_w', sgc.max_import_power_w,
'max_export_power_w', sgc.max_export_power_w
'max_export_power_w', sgc.max_export_power_w,
'deye_gen_microinverter_cutoff_enabled', coalesce(
(
select ai.deye_gen_microinverter_cutoff_enabled
from ems.asset_inverter ai
where ai.site_id = p_site_id
and ai.code = 'deye-main'
limit 1
),
false
)
)
into v_grid
from ems.site_grid_connection sgc