From 93f349a6aff6dbab74ad9c222b71df1eeb37783e Mon Sep 17 00:00:00 2001 From: admin Date: Fri, 25 Sep 2026 01:10:13 +0200 Subject: [PATCH] TEL-14 B1: pin stray caution on the reported case and whitespace normalisation end to end Co-Authored-By: Claude Opus 5.5 Claude-Session: https://claude.ai/code/session_01BwRLw7eKYj2byVdwB6kbjU --- goodwe_controller/test_pv.py | 20 ++++++++++++++++++-- 1 file changed, 18 insertions(+), 2 deletions(-) diff --git a/goodwe_controller/test_pv.py b/goodwe_controller/test_pv.py index 1c3b9fa..71385bc 100644 --- a/goodwe_controller/test_pv.py +++ b/goodwe_controller/test_pv.py @@ -1127,15 +1127,31 @@ _c_own0, _, _ = run(cycles=1, by_entity={_OWN: [state("13", "W")]}, pv_entity=_OWN) check("⭐ THE REPORTED CASE: 13 W of night-time standby on a reversed meter is " "-13 W once flipped, the row says so and marks it - and it raises NO " - "negative caution, because -13 W is standby and not a reversed sign", + "negative caution, because -13 W is standby and not a reversed sign - " + "and NO stray caution, because a lone `pv_entity` is in the roster", _c_own.pv_w == -13.0 and [r["text"] for r in _row(_c_own, "PV production: -13 W")] == [f"PV production: -13 W from {_OWN} (reported in W) [sign inverted]"] - and _row(_c_own, "probably reversed") == []) + and _row(_c_own, "probably reversed") == [] + and _row(_c_own, "flips nothing") == []) check("...and WITHOUT the option it is 0.12.0's row, byte for byte", [r["text"] for r in _row(_c_own0, "PV production:")] == [f"PV production: 13 W from {_OWN} (reported in W)"]) +# Whitespace: the roster entry and the invert entry differ only by padding. Both +# sides must normalise the same way, or the read path leaves the sign unflipped +# while the page marks it, or the page calls a flipped entity a stray. +_c_pad, _, _ = run(cycles=1, by_entity=MIX, + pv_entities=[E1, f" {E2}", E3], + pv_invert_entities=[f"{E2} "]) +check("⭐ PADDING: ` sensor.x` in the roster and `sensor.x ` in " + "`pv_invert_entities` are the same entity - flipped on the read path, " + "marked on the page, and no stray caution", + _c_pad.pv_w == MIX_TOTAL + and f"{E2} 2100 W in kW [sign inverted]" + in (_at(_row(_c_pad, "W from 3 entities"), 0) or {}).get("text", "") + and _row(_c_pad, "flips nothing") == []) + # --- the negative caution ------------------------------------------------------- def _neg(watts_by_entity, flip=()): opts = dict(PV_MANY, pv_invert_entities=list(flip))