HU1 studie: --pure-bess a --rt-eff flagy + výsledky čistého BESS
All checks were successful
CI and deploy / migration-check (push) Successful in 19s
CI and deploy / deploy (push) Successful in 1m5s

Zadání majitele: čistý BESS bez odběru, export povolen, varianta bez ztrát.
Výsledky (365 dní vč. zimy 25/26): arbitráž na spotu +129.4 tis. Kč/rok
(η=1.0) / +110.0 tis. (η=0.9); konzervativně (spready −30 % + deg 0.5)
+63.4 tis. Na fixní smlouvě jen ~24–35 tis. → spot je podmínka smysluplnosti
BESS. Léto ~378 Kč/den, zima ~308.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
This commit is contained in:
Dusan Vojacek
2026-06-12 22:11:41 +02:00
parent a889950eba
commit 55deae984e
2 changed files with 67 additions and 52 deletions

View File

@@ -152,8 +152,10 @@ async def load_site_params(conn: asyncpg.Connection) -> SiteParams:
usable_capacity_wh=float(b["usable_capacity_wh"]),
min_soc_wh=float(b["min_soc_wh"]),
soc_max_wh=float(b["soc_max_wh"]),
charge_efficiency=float(b["charge_efficiency"]),
discharge_efficiency=float(b["discharge_efficiency"]),
charge_efficiency=(RT_EFF_OVERRIDE ** 0.5 if RT_EFF_OVERRIDE is not None
else float(b["charge_efficiency"])),
discharge_efficiency=(RT_EFF_OVERRIDE ** 0.5 if RT_EFF_OVERRIDE is not None
else float(b["discharge_efficiency"])),
max_charge_power_w=float(b["max_charge_power_w"]),
max_discharge_power_w=float(b["max_discharge_power_w"]),
degradation_cost_czk_kwh=float(b["degradation_cost_czk_kwh"]),
@@ -230,8 +232,14 @@ async def load_ote_days(
# ---------------------------------------------------------------------------
# Odběrový profil a ceny
# ---------------------------------------------------------------------------
PURE_BESS = False #: True → nulový odběr (--pure-bess)
RT_EFF_OVERRIDE: float | None = None #: --rt-eff (1.0 = bez ztrát)
def load_profile_w(ts_utc: datetime) -> float:
"""Parametrizovaný průmyslový odběr (W) pro slot začínající ts_utc."""
if PURE_BESS:
return 0.0
local = ts_utc.astimezone(PRAGUE)
load = LOAD_BASE_W
is_workday = local.weekday() < 5 or not PEAK_WORKDAYS_ONLY
@@ -464,6 +472,9 @@ def annualize(rs: list[DayResult], getter) -> float:
# Main
# ---------------------------------------------------------------------------
async def run(args: argparse.Namespace) -> None:
global PURE_BESS, RT_EFF_OVERRIDE
PURE_BESS = bool(getattr(args, "pure_bess", False))
RT_EFF_OVERRIDE = getattr(args, "rt_eff", None)
dsn = _build_dsn(args)
try:
conn = await asyncpg.connect(dsn, timeout=15)
@@ -780,6 +791,10 @@ def main() -> None:
)
p.add_argument("--from", dest="range_from", default=None, help="YYYY-MM-DD (Prague)")
p.add_argument("--to", dest="range_to", default=None, help="YYYY-MM-DD (Prague), včetně")
p.add_argument("--pure-bess", action="store_true",
help="čistý BESS: nulový odběr (jen arbitráž nákup/prodej)")
p.add_argument("--rt-eff", default=None, type=float,
help="přepiš round-trip účinnost (např. 1.0 = bez ztrát, 0.9 = realisticky); default = hodnoty z DB")
p.add_argument("--fix-buy", default=FIX_BUY_CZK_KWH_DEFAULT, type=float,
help="dnešní fixní nákupní cena Kč/kWh (default proxy BA81)")
p.add_argument("--quick", action="store_true", help="jen posledních 60 dní (rychlý test)")