TEL-14: PV sign declared per entity (pv_invert_entities)
checks / unit (pull_request) Successful in 8m39s

Some PV entities (kWh meters, ESPHome clamps in the PV circuit) read positive
for consumption and negative for production. `pv_invert_entities` lists the
ones to flip; the flip is applied per member inside pv.total(), before the sum,
so the MQTT `pv` row and the status page carry the corrected figure. Default []
is byte-identical to 0.12.0.

Shape measured in supervisor_shape_probe.py section H (Supervisor 2026.08.0):
a parallel list validates the 0.12.0 blob unchanged and renders as its own
translated repeatable field; dicts on pv_entities refuse 0.12.0's stored
strings; a prefix is invisible syntax; a global bool cannot describe a mixed
roster. Status page marks flipped entities and cautions per entity below
-50 W, saying ADD or REMOVE. Telemetry only: control documents unchanged.

Record: DECISIONS/TEL-14-pv-sign.md (reverses TEL-11 section 2).

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01BwRLw7eKYj2byVdwB6kbjU
This commit is contained in:
glenn schrooyen
2026-09-25 00:25:24 +02:00
co-authored by Claude Opus 5.5
parent 6e6527224a
commit 7559d21eda
10 changed files with 462 additions and 48 deletions
+12 -6
View File
@@ -159,12 +159,8 @@ options:
# So this takes whatever `sensor.*` the site's PV integration provides, any
# brand Home Assistant can read.
#
# ⚠️ POSITIVE IS PRODUCTION, and there is deliberately no `pv_invert` beside
# `meter_invert` and `batt_invert`. Those two quantities are bipolar AND are
# read by the control path, so a reversed sensor there is a plausible number
# the site acts on; production is unipolar and is read by nothing, so a
# reversed sensor announces itself as -4 kW at noon in the history this key
# exists to create. See DECISIONS/TEL-11-pv-production.md.
# POSITIVE IS PRODUCTION. An entity that reads the other way round goes in
# `pv_invert_entities` below - see DECISIONS/TEL-14-pv-sign.md.
#
# ⚠️ THE ENTITY'S OWN `unit_of_measurement` IS WHAT IS BELIEVED - W, kW, MW
# and the rest of Home Assistant's power units. A sensor with no unit, or with
@@ -215,6 +211,12 @@ options:
# which is also empty" - i.e. no PV channel at all, which is every install.
pv_entities: []
# TEL-14. Every PV entity listed here (in `pv_entity` or `pv_entities`) has
# its sign flipped, for a kWh meter or power clamp that reads production as
# negative. Per entity, because one roster can mix both conventions. `[]` is
# load-bearing like `pv_entities: []`; see DECISIONS/TEL-14-pv-sign.md.
pv_invert_entities: []
# ==========================================================================
# METER - where the grid reading comes from
# ==========================================================================
@@ -972,6 +974,10 @@ schema:
# `p1_phase_import_entities` is the shipped precedent for the pair.
pv_entities:
- str
# TEL-14. A parallel list, not a prefix or a dict: measured by
# tools/supervisor_shape_probe.py section H, DECISIONS/TEL-14-pv-sign.md.
pv_invert_entities:
- str
# ==========================================================================
# METER - where the grid reading comes from