HU BESS
Some checks failed
CI and deploy / migration-check (push) Failing after 13s
CI and deploy / deploy (push) Has been skipped

This commit is contained in:
Dusan Vojacek
2026-05-23 21:35:36 +02:00
parent da52cf168b
commit b44f74b249
2 changed files with 185 additions and 0 deletions

View File

@@ -0,0 +1,181 @@
-- =============================================================
-- V080__seed_site_hulin_bess.sql
-- Idempotentní seed BESS lokality Hulín, Krátká 780 (bez FVE, nízká vlastní spotřeba).
-- Střídač Deye 2×20 kW (AC max 40 kW), baterie 4×32 kWh (128 kWh usable).
-- BMS z/do baterie max 2×350 A (~36 kW); jistič import ~63 A (~43 kW); export max 42 kW.
-- Viz docs/new-site-setup-template.md (sekce BESS bez FVE).
-- =============================================================
do $$
declare
v_site_code text := 'hulin-bess';
-- Modbus host doplnit před zapnutím endpointu (enabled = true).
v_host_deye text := '0.0.0.0';
v_port_deye int := 502;
v_site_id int;
v_ep_deye int;
v_inv_main int;
begin
insert into ems.site (code, name, timezone, latitude, longitude, active, notes)
values (
v_site_code,
'Hulín, Krátká 780 (BESS)',
'Europe/Prague',
49.312314,
17.474594,
true,
'Adresa: Krátká 780, 768 24 Hulín. BESS ukládání energie bez FVE, bez významné vlastní spotřeby. '
'Střídač Deye 2×20 kW; baterie 4×32 kWh; BMS max ~36 kW z/do baterie; jistič ~43 kW import, export 42 kW. '
'Souřadnice pro případnou budoucí FVE / počasí. Modbus endpoint zatím vypnutý doplnit IP a enabled.'
)
on conflict (code) do update set
name = excluded.name,
timezone = excluded.timezone,
latitude = excluded.latitude,
longitude = excluded.longitude,
active = excluded.active,
notes = excluded.notes
returning id into v_site_id;
select se.id into v_ep_deye
from ems.site_endpoint se
where se.site_id = v_site_id
and se.endpoint_type = 'modbus_tcp'
and se.notes ilike '%Deye%'
order by se.id
limit 1;
if v_ep_deye is null then
insert into ems.site_endpoint (
site_id, endpoint_type, host, port, protocol, unit_id, enabled, notes
)
values (
v_site_id, 'modbus_tcp', v_host_deye, v_port_deye, 'modbus_tcp', 1, false,
'Deye 2×20 kW Modbus TCP (Waveshare). Host/IP doplnit před enabled = true.'
)
returning id into v_ep_deye;
end if;
insert into ems.site_grid_connection (
site_id,
max_import_power_w,
max_export_power_w,
no_export,
reserved_capacity_w,
block_export_on_negative_sell,
notes
)
values (
v_site_id,
43000,
42000,
false,
0,
true,
'Hlavní jistič ~63 A → import cca 43 kW. Export do DS max 42 kW. '
'BESS bez FVE block_export_on_negative_sell pro zápornou výkupní cenu v LP.'
)
on conflict (site_id) do update set
max_import_power_w = excluded.max_import_power_w,
max_export_power_w = excluded.max_export_power_w,
no_export = excluded.no_export,
reserved_capacity_w = excluded.reserved_capacity_w,
block_export_on_negative_sell = excluded.block_export_on_negative_sell,
notes = excluded.notes;
if not exists (
select 1 from ems.site_market_config smc
where smc.site_id = v_site_id and smc.valid_to is null
) then
insert into ems.site_market_config (
site_id,
purchase_pricing_mode, sale_pricing_mode,
buy_margin_fixed_czk, buy_margin_percent,
sell_margin_fixed_czk, sell_margin_percent,
currency, valid_from, valid_to, notes,
tariff_id, hdo_code_id, system_services_czk_kwh, ote_fee_czk_kwh
)
values (
v_site_id,
'spot', 'spot',
0.050, 0,
-0.020, 0,
'CZK', now(), null,
'Výchozí spot nákup/prodej (marže jako home-01). Upřesnit dle smlouvy provozovatele BESS.',
null, null, 0, 0
);
end if;
insert into ems.site_operating_mode (site_id, mode_code, activated_by, notes)
values (
v_site_id,
'MANUAL',
'migration:V080_seed_site_hulin_bess',
'Start MANUAL (bez zápisů na Deye). Po ověření Modbus a SoC přepnout na AUTO.'
)
on conflict (site_id) do nothing;
select ai.id into v_inv_main
from ems.asset_inverter ai
where ai.site_id = v_site_id and ai.code = 'deye-main'
limit 1;
if v_inv_main is null then
insert into ems.asset_inverter (
site_id, code, manufacturer, model, endpoint_id,
max_charge_power_w, max_discharge_power_w, max_export_power_w,
max_ac_output_w, max_dc_input_w, max_battery_charge_w, max_battery_discharge_w,
gen_port_max_power_w,
deye_register_max_charge_a, deye_register_max_discharge_a,
deye_zero_export_mode,
controllable, active, notes
)
values (
v_site_id,
'deye-main',
'Deye',
'2× SUN-20K (40 kW AC)',
v_ep_deye,
36000, 36000, 42000,
40000, 0, 36000, 36000,
null,
350, 350,
2,
true, true,
'Hybrid 2×20 kW. BMS limit z/do baterie 2×350 A (~36 kW). AC/střídač max 40 kW. '
'Reg 108/109 cap 350 A. deye_zero_export_mode=2 (CT na odběrném místě) ověřit po instalaci.'
)
returning id into v_inv_main;
end if;
if not exists (
select 1 from ems.asset_battery ab
where ab.site_id = v_site_id and ab.code = 'bat-main'
) then
insert into ems.asset_battery (
site_id, inverter_id, code,
usable_capacity_wh, min_soc_percent, reserve_soc_percent, max_soc_percent,
charge_efficiency, discharge_efficiency, degradation_cost_czk_kwh,
max_charge_c_rate, max_discharge_c_rate, bms_max_charge_w, bms_max_discharge_w,
planner_max_soc_percent,
charge_slot_buffer, discharge_slot_buffer
)
values (
v_site_id, v_inv_main, 'bat-main',
128000,
10, 10, 95,
0.95, 0.95,
0.50,
0.5, 0.5,
36000, 36000,
100,
1.3, 1.5
);
end if;
-- Žádné asset_pv_array / EV / TČ čistý BESS arbitrážní uzel.
end;
$$;

View File

@@ -74,6 +74,10 @@ Pro **`site.active = true`** scheduler zpracovává mimo jiné: telemetrii, denn
- Nová data pro novou lokalitu: **nový Flyway soubor** `Vxxx__seed_site_<kód>.sql` (neupravovat už aplikované `V00x__*.sql`). - Nová data pro novou lokalitu: **nový Flyway soubor** `Vxxx__seed_site_<kód>.sql` (neupravovat už aplikované `V00x__*.sql`).
- Repeatable SQL (`db/routines`, `db/views`) se nemění kvůli jedné nové site, pokud nepotřebuješ obecnou úpravu. - Repeatable SQL (`db/routines`, `db/views`) se nemění kvůli jedné nové site, pokud nepotřebuješ obecnou úpravu.
### BESS bez FVE (příklad v repu)
Lokalita **`hulin-bess`** ([`db/migration/V080__seed_site_hulin_bess.sql`](../db/migration/V080__seed_site_hulin_bess.sql)): jen `site`, grid, market, `deye-main`, `bat-main`; **bez** `asset_pv_array`, EV, TČ. `site_grid_connection.block_export_on_negative_sell = true`. Plánovač a forecast PV fungují s nulovou FVE; baseline bez `consumption_baseline_stats` používá default **500 W** ve `fn_load_planning_slots_full` (po telemetrii přepočítat `fn_update_baseline_stats` / `fn_rebuild_consumption_baseline_stats`).
--- ---
## 8. SQL šablona (kopie do verzované Flyway migrace) ## 8. SQL šablona (kopie do verzované Flyway migrace)