diff --git a/goodwe_controller/test_modes_p4.py b/goodwe_controller/test_modes_p4.py index c2079d9..c31e4ee 100644 --- a/goodwe_controller/test_modes_p4.py +++ b/goodwe_controller/test_modes_p4.py @@ -540,6 +540,12 @@ rp.Hass.state = _sensor rp_start = [UTC0] FC_OPTS = {"pv_forecast_entity": "sensor.energy_production_today_remaining", "cycle_cost_threshold_eur": 0.20} +# TARIFF-24 round 2: with a forecast read, a price mode needs the cycle cost +# itself (0.20 here), no longer 1.5 times it (0.30). These scenarios were +# written for a 0.30 gap, and a midday 0.21 gap now plans a grid top-up they +# are not about, so they ask for 0.30 with the forecast; the no-forecast leg +# (`rows_nf`) keeps 0.20, which is 0.30 widened: the same gate on both sides. +GATE_030 = {"cycle_cost_threshold_eur": 0.30} def seed_profile(c): @@ -597,7 +603,8 @@ def invariants(tag, rows, c): # Sunny: 40 kWh forecast. B (Leftover solar) at 30 % needs nothing. -rows, st_, c = run_day(SF_LS, fc=40.0, soc0={"a": 60.0, "b": 30.0}) +rows, st_, c = run_day(SF_LS, fc=40.0, soc0={"a": 60.0, "b": 30.0}, + extra=GATE_030) charge = invariants("sunny", rows, c) _last = nth(rows, -1, "a cycle") print(f" sunny: verdict {present(_last) and _last['plan'] and _last['plan'].verdict}, " @@ -623,7 +630,8 @@ check("dark: A rests while B charges", all(r["roles"][A] == modetrade.REST for r in charge)) # Cheap hours on a partly sunny day: ignores the plan, fills as in P3. -rows, st_, c = run_day(SF_CH, fc=14.0, soc0={"a": 60.0, "b": 30.0}) +rows, st_, c = run_day(SF_CH, fc=14.0, soc0={"a": 60.0, "b": 30.0}, + extra=GATE_030) charge = invariants("cheap hours, partly", rows, c) top = max(r["soc"]["b"] for r in rows) print(f" cheap hours partly: B reached {top:.1f} %") @@ -648,7 +656,8 @@ check("forecast lost mid-run: Leftover solar was charging, and stops within " # The forecast is far too high (40 kWh, and there is no sun at all): no grid # charge, so B covers less of the evening - a money risk, never a safety one. -rows, st_, c = run_day(SF_LS, fc=40.0, soc0={"a": 30.0, "b": 30.0}) +rows, st_, c = run_day(SF_LS, fc=40.0, soc0={"a": 30.0, "b": 30.0}, + extra=GATE_030) invariants("forecast too high", rows, c) check("forecast too high: no grid charge, and B still keeps its power for " "the dear run", not [r for r in rows if r["action"] @@ -658,7 +667,7 @@ check("forecast too high: no grid charge, and B still keeps its power for " # A refusal wins over the plan. rows, st_, c = run_day(SF_LS, fc=1.0, soc0={"a": 60.0, "b": 30.0}, - refuse=("b",)) + refuse=("b",), extra=GATE_030) invariants("refusal", rows, c) check("refusal: B refuses to charge, so the plan's charge ends and B is " "never a charger after it", rows and not [