MAINT-13 round 2: read the price gate without a new main.py option read
checks / unit (pull_request) Successful in 34m35s
infra-pin / fresh (pull_request) Successful in 1s

test_static_tariff forbids main.py reading `static_profile`; a small
static_gated() in static_tariff.py answers it, and the Controller keeps the
answer in `_price_gated` beside `cheap`.

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Bdqr7PiaHcBnzPituu2yTC
This commit is contained in:
glenn schrooyen
2026-10-08 11:10:33 +02:00
co-authored by Claude Sonnet 5.5
parent 6f05b2e4be
commit f7b83cc75c
3 changed files with 33 additions and 9 deletions
+18 -4
View File
@@ -454,7 +454,12 @@ m = put_in_charge(c, 0, 40, CHARGE_TIMEOUT_MIN + 1)
one_cycle(c)
check("...and a pack past its charging time there fails at once (not 7 days)",
m.phase == IDLE and len(notes(h)) == 1)
def read(c):
asyncio.run(c.read_inputs())
c, h = controller(OPTS1, False)
read(c)
c.inverters[0].batt = -800.0
check("price gate closed but the pack is taking 800 W (sun): gate open",
c._charge_gate_open(c.inverters[0]) is True)
@@ -464,11 +469,20 @@ check("...closed and about idle: gate closed",
c.inverters[0].batt = None
check("...no battery reading: gate closed", c._charge_gate_open(c.inverters[0]) is False)
c, h = controller(OPTS1, True)
c.cheap = True
read(c)
check("price gate open: gate open", c._charge_gate_open(c.inverters[0]) is True)
c, h = controller(dict(NOTARIFF, static_profile="x"), False)
check("a fixed tariff set up counts as a gate (closed outside its cheap hours)",
c._charge_gate_open(c.inverters[0]) is False)
PROFILE = json.dumps({"periods": [
{"name": "day", "from": "07:00", "to": "22:00", "days": "all",
"eur_per_kwh": 0.29},
{"name": "night", "from": "22:00", "to": "07:00", "days": "all",
"eur_per_kwh": 0.19}]})
c, h = controller(dict(NOTARIFF, price_provider="off", static_profile=PROFILE),
False)
read(c)
check("a fixed tariff set up counts as a gate: outside its cheap hours a pack "
"that is not charging is closed, inside them it is open",
c._price_gated is True
and c._charge_gate_open(c.inverters[0]) is c.cheap)
# the save timer is reset on a phase change
mm = in_charge()