Files
ems/backend/tests/test_export_hard_limit.py
Dusan Vojacek 406b6a7f8f
All checks were successful
CI and deploy / migration-check (push) Successful in 18s
CI and deploy / deploy (push) Successful in 1m2s
HARD LIMIT exportu jako tvrdé pravidlo §4.19 + test
Překročení rezervovaného exportu na fakturačním elektroměru (home-01
13.5 kW) = pokuta v řádu desítek tisíc Kč/kW. Invariant: reg 143
(svorky) <= max_export_power_w (ulice) VŽDY; feed-forward navyšování
o měřenou spotřebu mezi střídačem a CT ZAKÁZÁNO (výpadek spotřeby =
přestřelení ulice). Návrh feed-forwardu z 2026-06-12 večer zavržen
před implementací na pokyn uživatele.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-12 20:40:11 +02:00

36 lines
1.2 KiB
Python

"""HARD LIMIT exportu (CLAUDE.md §4.19): reg 143 nikdy nad limit ulice.
Pokuta v řádu desítek tisíc Kč za každou kW překročení rezervovaného
exportního výkonu na fakturačním elektroměru. Terminálový limit (reg 143)
nesmí přesáhnout max_export_power_w za žádných okolností — žádný
feed-forward o měřenou spotřebu mezi střídačem a CT.
"""
from __future__ import annotations
import unittest
from services.control.setpoints import _deye_reg143_export_w
class ExportHardLimitTests(unittest.TestCase):
def test_reg143_never_exceeds_street_limit(self) -> None:
street_limit = 13_500
self.assertLessEqual(
_deye_reg143_export_w(False, street_limit), street_limit
)
def test_no_export_is_zero(self) -> None:
self.assertEqual(_deye_reg143_export_w(True, 13_500), 0)
def test_plan_export_limit_caps_not_raises(self) -> None:
# vzor z write_inverter_setpoints: export_lim = min(hw, plan) — plán
# smí limit jen SNÍŽIT, nikdy zvýšit
hw = _deye_reg143_export_w(False, 13_500)
plan_limit = 20_000
self.assertLessEqual(min(hw, plan_limit), 13_500)
if __name__ == "__main__":
unittest.main()