Investiční studie v2: POTENCIÁLNÍ výroba místo telemetrie (škrcení 81 %!)
Klíčová oprava (postřeh uživatele): při sell<0 lokality škrtí výrobu (reg 340 / GEN cutoff) — telemetrie ukázala 357 kWh, predikce 1879 kWh (96 % minut v derating). Studie nyní používají max(skutečnost, kanonický forecast per pole) v sell<0 slotech. Nové výsledky (horní meze): BA81 32 kWh +35/+46 Kč/den (výkon 6.25/12 kW); KV1 25 kWh +20/+22 Kč/den (stará smlouva); HU1 fixní: 75 Kč/den bez sdílení, 149 Kč/den s EDC sdílením @1.5 Kč distribuce (sdílitelných ~49 kWh/den!); HU1 spot: 372 Kč/den, sdílení +0. + docs/onboarding-wallbox-tc-2026-06.md. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
This commit is contained in:
35
docs/onboarding-wallbox-tc-2026-06.md
Normal file
35
docs/onboarding-wallbox-tc-2026-06.md
Normal file
@@ -0,0 +1,35 @@
|
|||||||
|
# Oživení: nový Teltonika wallbox + tepelné čerpadlo (draft 2026-06-11)
|
||||||
|
|
||||||
|
Stav: ČEKÁ NA VSTUPY od uživatele (sekce 1). Postup ověřen proti kódu
|
||||||
|
(telemetry_collector, control/outputs, views vw_asset_*_modbus_poll) a seedu
|
||||||
|
home-01 (V003). Plný checklist se vzorovými SQL: viz analýza agenta / tento dokument.
|
||||||
|
|
||||||
|
## 1. Chybějící vstupy (dodá člověk)
|
||||||
|
|
||||||
|
| Zařízení | Údaj |
|
||||||
|
|----------|------|
|
||||||
|
| Wallbox | **lokalita** (site code), IP Waveshare + unit ID, max proud (A), fáze |
|
||||||
|
| Wallbox | Modbus registry TeltoCharge: status / proud / energie (datasheet) |
|
||||||
|
| TČ | **lokalita**, model (Samsung EHS …?), IP + unit ID |
|
||||||
|
| TČ | jmenovitý výkon (W), COP@7°C, objem TUV (l), registry: stav/výkon/teploty/enable |
|
||||||
|
| Vozidlo | kapacita baterie (kWh), max AC výkon, default target SoC + deadline |
|
||||||
|
|
||||||
|
## 2. Postup (po dodání vstupů)
|
||||||
|
|
||||||
|
1. Flyway migrace `V085__seed_<site>_wallbox_tc.sql`: `site_endpoint` (modbus_tcp)
|
||||||
|
+ `asset_ev_charger` (+ `asset_vehicle`) + `asset_heat_pump` — šablony dle seedu V003.
|
||||||
|
2. Deploy (push na main) → collector čte `vw_asset_ev_charger_modbus_poll` /
|
||||||
|
`vw_asset_heat_pump_modbus_poll` → po restartu backendu začne pollovat.
|
||||||
|
3. **Pozor:** v `telemetry_collector.py` a `control/outputs.py` jsou pro
|
||||||
|
Teltoniku/Samsung části registrové mapy jako TODO — po dodání datasheetů
|
||||||
|
doplnit čtení (status/proud/energie; teploty/stav) a zápis (proud limit /
|
||||||
|
enable) přes FC dle zařízení + journal `modbus_command`.
|
||||||
|
4. Ověření: `vw_latest_ev_charger` / `vw_latest_heat_pump` (data_age < 2 min);
|
||||||
|
příjezd EV → `ev_session` + `fn_update_ev_arrival_stats`; TČ →
|
||||||
|
`tuv_delta_stats` po pár dnech (job 00:45) → solver začne TUV plánovat.
|
||||||
|
|
||||||
|
## 3. Co EMS po oživení umí hned
|
||||||
|
|
||||||
|
- EV: detekce příjezdu/odjezdu, session s deadline, plánované nabíjení v levných
|
||||||
|
slotech (v2: EV deadline constraint s placeným deficitem).
|
||||||
|
- TČ: TUV look-ahead v plánu (musí-topit okna), enable řízení exporterem.
|
||||||
@@ -131,12 +131,34 @@ async def _load_slots(conn: asyncpg.Connection, site_id: int) -> list[Slot]:
|
|||||||
select a.interval_start,
|
select a.interval_start,
|
||||||
p.effective_buy_price_czk_kwh as buy,
|
p.effective_buy_price_czk_kwh as buy,
|
||||||
p.effective_sell_price_czk_kwh as sell,
|
p.effective_sell_price_czk_kwh as sell,
|
||||||
greatest(0, coalesce(a.actual_pv_production_wh,0) - coalesce(a.pv_b_production_wh,0)) as pv_a,
|
-- POTENCIÁL: při sell<0 lokalita škrtí výrobu (reg 340 / GEN cutoff),
|
||||||
coalesce(a.pv_b_production_wh,0) as pv_b,
|
-- telemetrie ji nevidí → použij max(skutečnost, predikce) per pole.
|
||||||
|
case when p.effective_sell_price_czk_kwh < 0
|
||||||
|
then greatest(coalesce(a.actual_pv_production_wh,0) - coalesce(a.pv_b_production_wh,0),
|
||||||
|
coalesce(fc.fc_a_wh, 0))
|
||||||
|
else greatest(0, coalesce(a.actual_pv_production_wh,0) - coalesce(a.pv_b_production_wh,0))
|
||||||
|
end as pv_a,
|
||||||
|
case when p.effective_sell_price_czk_kwh < 0
|
||||||
|
then greatest(coalesce(a.pv_b_production_wh,0), coalesce(fc.fc_b_wh, 0))
|
||||||
|
else coalesce(a.pv_b_production_wh,0)
|
||||||
|
end as pv_b,
|
||||||
coalesce(a.actual_load_consumption_wh,0) as load
|
coalesce(a.actual_load_consumption_wh,0) as load
|
||||||
from ems.audit_interval a
|
from ems.audit_interval a
|
||||||
join ems.vw_site_effective_price p
|
join ems.vw_site_effective_price p
|
||||||
on p.site_id = a.site_id and p.interval_start = a.interval_start
|
on p.site_id = a.site_id and p.interval_start = a.interval_start
|
||||||
|
left join lateral (
|
||||||
|
select
|
||||||
|
sum(power_w) filter (where pa.controllable) * 0.25 as fc_a_wh,
|
||||||
|
sum(power_w) filter (where not pa.controllable) * 0.25 as fc_b_wh
|
||||||
|
from (
|
||||||
|
select distinct on (fpr.pv_array_id) fpi2.power_w, fpr.pv_array_id
|
||||||
|
from ems.forecast_pv_interval fpi2
|
||||||
|
join ems.forecast_pv_run fpr on fpr.id = fpi2.run_id
|
||||||
|
where fpi2.interval_start = a.interval_start
|
||||||
|
order by fpr.pv_array_id, fpr.created_at desc
|
||||||
|
) x
|
||||||
|
join ems.asset_pv_array pa on pa.id = x.pv_array_id and pa.site_id = a.site_id
|
||||||
|
) fc on true
|
||||||
where a.site_id = $1 and a.actual_load_consumption_wh is not null
|
where a.site_id = $1 and a.actual_load_consumption_wh is not null
|
||||||
order by a.interval_start
|
order by a.interval_start
|
||||||
""",
|
""",
|
||||||
|
|||||||
@@ -60,15 +60,31 @@ async def _load(conn: asyncpg.Connection, price_site: int = 3) -> list[Slot]:
|
|||||||
else p.effective_buy_price_czk_kwh end as buy,
|
else p.effective_buy_price_czk_kwh end as buy,
|
||||||
case when $1 = 5 then p2.effective_sell_price_czk_kwh
|
case when $1 = 5 then p2.effective_sell_price_czk_kwh
|
||||||
else p.effective_sell_price_czk_kwh end as sell,
|
else p.effective_sell_price_czk_kwh end as sell,
|
||||||
|
-- POTENCIÁL: BA81 při sell<0 škrtí (81 % výroby v datech chybí)
|
||||||
case when p.effective_sell_price_czk_kwh < 0
|
case when p.effective_sell_price_czk_kwh < 0
|
||||||
then greatest(0, coalesce(a.actual_pv_production_wh,0)
|
then greatest(0,
|
||||||
- coalesce(a.actual_load_consumption_wh,0))
|
greatest(coalesce(a.actual_pv_production_wh,0),
|
||||||
|
coalesce(fc.fc_a_wh,0) + coalesce(fc.fc_b_wh,0))
|
||||||
|
- coalesce(a.actual_load_consumption_wh,0))
|
||||||
else 0 end as share_wh
|
else 0 end as share_wh
|
||||||
from ems.audit_interval a
|
from ems.audit_interval a
|
||||||
join ems.vw_site_effective_price p
|
join ems.vw_site_effective_price p
|
||||||
on p.site_id = a.site_id and p.interval_start = a.interval_start
|
on p.site_id = a.site_id and p.interval_start = a.interval_start
|
||||||
left join ems.vw_site_effective_price p2
|
left join ems.vw_site_effective_price p2
|
||||||
on p2.site_id = 5 and p2.interval_start = a.interval_start
|
on p2.site_id = 5 and p2.interval_start = a.interval_start
|
||||||
|
left join lateral (
|
||||||
|
select
|
||||||
|
sum(power_w) filter (where pa.controllable) * 0.25 as fc_a_wh,
|
||||||
|
sum(power_w) filter (where not pa.controllable) * 0.25 as fc_b_wh
|
||||||
|
from (
|
||||||
|
select distinct on (fpr.pv_array_id) fpi2.power_w, fpr.pv_array_id
|
||||||
|
from ems.forecast_pv_interval fpi2
|
||||||
|
join ems.forecast_pv_run fpr on fpr.id = fpi2.run_id
|
||||||
|
where fpi2.interval_start = a.interval_start
|
||||||
|
order by fpr.pv_array_id, fpr.created_at desc
|
||||||
|
) x
|
||||||
|
join ems.asset_pv_array pa on pa.id = x.pv_array_id and pa.site_id = a.site_id
|
||||||
|
) fc on true
|
||||||
where a.site_id = 3 and a.actual_load_consumption_wh is not null
|
where a.site_id = 3 and a.actual_load_consumption_wh is not null
|
||||||
and p2.effective_buy_price_czk_kwh is not null
|
and p2.effective_buy_price_czk_kwh is not null
|
||||||
order by a.interval_start
|
order by a.interval_start
|
||||||
|
|||||||
33
scripts/harness/investment_study_results_2026-06-11.txt
Normal file
33
scripts/harness/investment_study_results_2026-06-11.txt
Normal file
@@ -0,0 +1,33 @@
|
|||||||
|
# Studie navýšení baterie — perfect-hindsight nad reálnými daty (audit_interval)
|
||||||
|
# Okna 7 dní s navazujícím SoC; Δ = horní mez ročního přínosu
|
||||||
|
|
||||||
|
## BA81 (2026-04-26 … 2026-06-11; block_neg=False, pv_b_shed=True, export cap 16 kW)
|
||||||
|
current 12.5 kWh / 6.25 kW -4579 Kč / 45 dní
|
||||||
|
upgrade 32 kWh / 6.25 kW (výkon beze změny) -6144 Kč Δ +1565 Kč (+34.77 Kč/den; rok ~7615–12692 Kč)
|
||||||
|
upgrade 32 kWh / 12.00 kW (0.5C, cap AC stridace) -6657 Kč Δ +2078 Kč (+46.19 Kč/den; rok ~10115–16858 Kč)
|
||||||
|
|
||||||
|
## KV1 (2026-04-30 … 2026-06-11; block_neg=True, pv_b_shed=False, export cap 8 kW)
|
||||||
|
current 12.5 kWh / 6.25 kW -2149 Kč / 41 dní
|
||||||
|
upgrade 25 kWh / 6.25 kW (výkon beze změny) -2952 Kč Δ +803 Kč (+19.58 Kč/den; rok ~4289–7148 Kč)
|
||||||
|
upgrade 25 kWh / 12.00 kW (0.5C, cap AC stridace) -3056 Kč Δ +907 Kč (+22.12 Kč/den; rok ~4844–8073 Kč)
|
||||||
|
|
||||||
|
Pozn.: rok = Kč/den × 365; dolní odhad ×0.6 (zima: méně PV, menší spready).
|
||||||
|
Horní mez (dokonalá předpověď) — reálný plánovač zachytí typicky 70–90 %.
|
||||||
|
# HU1 BESS studie — 128 kWh / 36 kW / AC 40 kW; ceny site 3 (fixní nákup BA81)
|
||||||
|
# Období: 18 dní (BA81 audit); sdílitelný přebytek BA81 při sell<0: 882 kWh
|
||||||
|
|
||||||
|
bez EDC sdílení výnos 1351 Kč = 75.06 Kč/den (rok ~16438–27396 Kč)
|
||||||
|
EDC sdílení, distribuce 2.0 Kč/kWh výnos 2251 Kč = 125.05 Kč/den (rok ~27386–45643 Kč)
|
||||||
|
EDC sdílení, distribuce 1.5 Kč/kWh výnos 2689 Kč = 149.37 Kč/den (rok ~32712–54520 Kč)
|
||||||
|
EDC sdílení, distribuce 1.0 Kč/kWh výnos 3130 Kč = 173.86 Kč/den (rok ~38076–63460 Kč)
|
||||||
|
|
||||||
|
Pozn.: horní mez (perfect hindsight); jaro = nejsilnější sezóna pro spot spready.
|
||||||
|
# HU1 BESS studie — 128 kWh / 36 kW / AC 40 kW; ceny site 5 (SPOT nákup i prodej (site 5))
|
||||||
|
# Období: 18 dní (BA81 audit); sdílitelný přebytek BA81 při sell<0: 882 kWh
|
||||||
|
|
||||||
|
bez EDC sdílení výnos 6699 Kč = 372.17 Kč/den (rok ~81505–135842 Kč)
|
||||||
|
EDC sdílení, distribuce 2.0 Kč/kWh výnos 6699 Kč = 372.17 Kč/den (rok ~81505–135842 Kč)
|
||||||
|
EDC sdílení, distribuce 1.5 Kč/kWh výnos 6699 Kč = 372.17 Kč/den (rok ~81505–135842 Kč)
|
||||||
|
EDC sdílení, distribuce 1.0 Kč/kWh výnos 6699 Kč = 372.17 Kč/den (rok ~81505–135842 Kč)
|
||||||
|
|
||||||
|
Pozn.: horní mez (perfect hindsight); jaro = nejsilnější sezóna pro spot spready.
|
||||||
Reference in New Issue
Block a user