fix(power-flow): dead sensors, balance-based Home total, dedup history #278

Merged
k.renner merged 1 commits from claude-bot/dash-power-flow into master 2026-07-17 11:21:05 +00:00
Member

Dashboard review: power-flow ("Power Flow")

Full review against live Prometheus/HA data, with surgical fixes (12 insertions / 11 deletions, no reformat). PR #273 (open3e repoint of Solar/Battery/SoC) was verified as correct and left untouched.

Before

Rendered 00:11 (Nacht: PV 0 W ist korrekt). Server 0 W und Garden 0 W sind tote Sensoren, Home 693 W ist massiv zu niedrig (Batterie entlädt allein 1,1 kW), die History-Legende zeigt jede Serie doppelt:

before

After

Server 287 W (Linie aus Keller), Wärmepumpe aus Keller statt EG, Home = 1,3 kW Bilanz, neuer grauer "Rest"-Knoten (380 W nicht submeterte Last), History dedupliziert mit Vorzeichen-Hinweisen:

after

Review report

Critical

  1. Server-Knoten zeigte stumm 0 W — sensor.keller_server_power existiert nicht mehr (HA: unavailable; die powercalc-Gruppe "Keller Server" wurde mit der toten USV entfernt). Das || 0 im ECharts-Script verschluckte den Ausfall.
    ✅ FIXED — Query zeigt jetzt auf sensor.kg_vorratskeller_wave_pm_mini_server_steckdose_electric_consumption_w ("Server Steckdose", live 316,9 W zur Verifikationszeit).

  2. Garden-Knoten zeigte stumm 0 W — sensor.eg_garten_teichpumpe_power_2 existiert nicht mehr (HA: unknown; das _2 war ein Twin-Entity-Rest).
    ✅ FIXED — sensor.shelly_teichpumpe_power_0 (live; nachts 0 W weil Pumpe aus, max_over_time[2d] = 77 W bestätigt den Sensor als aktiv).

  3. Home unterschlug ~40 % der realen Last. Der Knoten summierte nur die vier powercalc-Etagen (702 W zur Renderzeit), die reale Bilanz war ~1109 W (Batterie 1117 W Entladung − 8 W Einspeisung, PV 0). Die Etagen-Gruppen decken nur submeterte Kreise ab — der Flow "balancierte" nie gegen die Quellen.
    ✅ FIXED — Home = PV + Netz + Batterie (alle vorzeichenbehaftet, = Bilanz am Zähler). Die Etagen bleiben als Aufschlüsselung; ein neuer grauer "Rest"-Knoten trägt die Differenz (Bilanz − Etagen − Garten), damit das Diagramm sichtbar aufgeht. Gleiches für die History-Serie "Home" (vorher sum() der Etagen, jetzt Bilanz-Ausdruck).

Major

  1. History-Panel verdoppelte Serien. Im 6h-Fenster erschien jede Serie doppelt (Jobs home-assistant + home-assistant-bgp, Doppel-Scrape bis zum Fix am 16.07.) — und die alte "Home"-Serie war ein sum(), der in Alt-Fenstern echt verdoppelte (Legende zeigte Home mean 1,07 kW bei ~700 W Etagen-Summe).
    ✅ FIXED — alle Targets defensiv mit max by (entity) ummantelt; der Rest heilt sich mit der Retention selbst aus.

  2. Wärmepumpen-Flusslinie startete am EG-Knoten, Garten-Linie am OG-Knoten — beides falsch. stromverbrauch_heizungsanlage ist Mitglied der Keller-Gruppe (Area "Heizungsanlage" → Floor Keller, per HA-Template verifiziert); die Teichpumpe hängt an Area "Garten" → Floor Außenbereich und ist in keiner Etagen-Summe.
    ✅ FIXED — Wärmepumpe und Server zweigen vom Keller-Knoten ab; Garten hängt direkt an Home.

Minor

  1. Tote Sensoren rendern nie wieder stumm als 0: getVal liefert jetzt null bei fehlender Serie, die Consumer-Knoten (Server/Wärmepumpe/Garten) zeigen dann "n/a".
  2. Grid-Query selektierte über friendly_name ("Smart Meter Sum active instantaneous power") — bricht bei Umbenennung. ✅ FIXED — Entity-Selektor sensor.smart_meter_sum_active_instantaneous_power (beide Panels).
  3. Redundantes batteryIn-Target (… * -1) entfernt; Laden/Entladen wird aus dem einen vorzeichenbehafteten Sensor abgeleitet. Veraltete Script-Kommentare zu den ausgemusterten battery_power_in/out_absolute-Sensoren aktualisiert.
  4. Legenden ohne Vorzeichen-Semantik: jetzt "Battery (+ Entladen / − Laden)", "Grid (+ Bezug / − Einspeisung)" (Farb-Overrides mitgezogen); beide Panels haben eine description mit den Konventionen.

⚠️ NOT FIXED — Quellseitiger Befund (gehört ins homeassistant-Repo, nicht hierher)

sensor.keller_power (powercalc-Gruppe) enthält sowohl sensor.kg_waschkuche_waschmaschine_power (Steckdosen-Messung) als auch sensor.waschmaschine_current_power (ha_washdata-Spiegel derselben Maschine) — und trotz Ausschluss-Filter auch sensor.kg_waschkuche_waschmaschine_device_power (aktuell unknown, zählt daher nicht). Während eines Waschgangs zählt die Keller-Summe die Waschmaschine doppelt (Dito vermutlich trockner_current_power). Beeinflusst hier nur die Etagen-Aufschlüsselung, nicht mehr den Home-Wert (der ist jetzt bilanzbasiert). Sag Bescheid, dann mache ich dafür einen PR im homeassistant-Repo.

❓ QUESTION

Der "Rest"-Knoten lag nachts bei ~380 W (Grundlast ohne Submetering: Netzwerk/Kühl-/Standby-Geräte außerhalb der gemessenen Kreise). Mittags am 16.07. lag die Bilanz bei ~5,6 kW gegen ~1,6 kW Etagen — falls es einen nicht submeterten Großverbraucher gibt (Wallbox?), wäre ein eigener Knoten sinnvoll. Gibt es einen?

Verification

Alle Queries vor dem Schreiben gegen das live Prometheus (Port-Forward, instant + range) bzw. die HA-API geprüft:

  • vitocharge_vx3_vx3_pv_power 0 W (00:15, Nacht — plausibel), …battery_power +1117 W (Entladen), …battery_soc vorhanden; Mittags-Gegenprobe 16.07. 12:00Z: PV 7252 W, Netz −1643 W → negativ = Einspeisung bestätigt (konsistent mit grid_power −23 W, open3e-Doku).
  • Bilanzprobe: PV 0 + Netz −8 + Batterie +1117 ≈ 1109 W reale Last vs. 702 W Etagen-Summe → Befund 3.
  • keller_server_power / eg_garten_teichpumpe_power_2: keine Prometheus-Serie, HA unavailable/unknown → tot bestätigt.
  • Ersatz-Sensoren live verifiziert (Server-Steckdose 316,9 W; Teichpumpe max 77 W in 2d).
  • Etagen-Zuordnung per HA-Template: Area Heizungsanlage → Floor Keller; Area Garten → Floor Außenbereich; keller_power-Mitgliederliste enthält Server-Steckdose + stromverbrauch_heizungsanlage.
  • Doppel-Scrape: aktuell nur noch Job home-assistant (185 Serien); Duplikate im Fenster vor dem 16.07. real beobachtet (Screenshot Before, Legende).
  • JSON validiert; Dashboard als Temp-Preview power-flow-preview gerendert (Screenshot After) und danach gelöscht.

Hinweis: der After-Screenshot ist nachts entstanden — Solar-Fluss und Netz-Einspeisungs-Pfeil waren nicht sichtbar prüfbar. Die Logik dafür ist unverändert (nur batteryIn entfernt); bei Tageslicht prüfe ich gern nach.

# Dashboard review: power-flow ("Power Flow") Full review against live Prometheus/HA data, with surgical fixes (12 insertions / 11 deletions, no reformat). PR #273 (open3e repoint of Solar/Battery/SoC) was verified as correct and left untouched. ## Before Rendered 00:11 (Nacht: PV 0 W ist korrekt). Server 0 W und Garden 0 W sind **tote Sensoren**, Home 693 W ist massiv zu niedrig (Batterie entlädt allein 1,1 kW), die History-Legende zeigt jede Serie doppelt: ![before](https://gitea.renner.uno/attachments/2fc7ee77-eb02-481b-b9e7-b8b98c6ff506) ## After Server 287 W (Linie aus Keller), Wärmepumpe aus Keller statt EG, Home = 1,3 kW Bilanz, neuer grauer "Rest"-Knoten (380 W nicht submeterte Last), History dedupliziert mit Vorzeichen-Hinweisen: ![after](https://gitea.renner.uno/attachments/1a2e3cbc-88cb-4357-aa84-38ee04a65b74) ## Review report ### Critical 1. **Server-Knoten zeigte stumm 0 W — `sensor.keller_server_power` existiert nicht mehr** (HA: `unavailable`; die powercalc-Gruppe "Keller Server" wurde mit der toten USV entfernt). Das `|| 0` im ECharts-Script verschluckte den Ausfall. ✅ FIXED — Query zeigt jetzt auf `sensor.kg_vorratskeller_wave_pm_mini_server_steckdose_electric_consumption_w` ("Server Steckdose", live 316,9 W zur Verifikationszeit). 2. **Garden-Knoten zeigte stumm 0 W — `sensor.eg_garten_teichpumpe_power_2` existiert nicht mehr** (HA: `unknown`; das `_2` war ein Twin-Entity-Rest). ✅ FIXED — `sensor.shelly_teichpumpe_power_0` (live; nachts 0 W weil Pumpe aus, `max_over_time[2d]` = 77 W bestätigt den Sensor als aktiv). 3. **Home unterschlug ~40 % der realen Last.** Der Knoten summierte nur die vier powercalc-Etagen (702 W zur Renderzeit), die reale Bilanz war ~1109 W (Batterie 1117 W Entladung − 8 W Einspeisung, PV 0). Die Etagen-Gruppen decken nur submeterte Kreise ab — der Flow "balancierte" nie gegen die Quellen. ✅ FIXED — Home = PV + Netz + Batterie (alle vorzeichenbehaftet, = Bilanz am Zähler). Die Etagen bleiben als Aufschlüsselung; ein neuer grauer **"Rest"-Knoten** trägt die Differenz (Bilanz − Etagen − Garten), damit das Diagramm sichtbar aufgeht. Gleiches für die History-Serie "Home" (vorher `sum()` der Etagen, jetzt Bilanz-Ausdruck). ### Major 4. **History-Panel verdoppelte Serien.** Im 6h-Fenster erschien jede Serie doppelt (Jobs `home-assistant` + `home-assistant-bgp`, Doppel-Scrape bis zum Fix am 16.07.) — und die alte "Home"-Serie war ein `sum()`, der in Alt-Fenstern **echt verdoppelte** (Legende zeigte Home mean 1,07 kW bei ~700 W Etagen-Summe). ✅ FIXED — alle Targets defensiv mit `max by (entity)` ummantelt; der Rest heilt sich mit der Retention selbst aus. 5. **Wärmepumpen-Flusslinie startete am EG-Knoten, Garten-Linie am OG-Knoten — beides falsch.** `stromverbrauch_heizungsanlage` ist Mitglied der Keller-Gruppe (Area "Heizungsanlage" → Floor Keller, per HA-Template verifiziert); die Teichpumpe hängt an Area "Garten" → Floor **Außenbereich** und ist in *keiner* Etagen-Summe. ✅ FIXED — Wärmepumpe und Server zweigen vom Keller-Knoten ab; Garten hängt direkt an Home. ### Minor 6. **Tote Sensoren rendern nie wieder stumm als 0:** `getVal` liefert jetzt `null` bei fehlender Serie, die Consumer-Knoten (Server/Wärmepumpe/Garten) zeigen dann **"n/a"**. 7. **Grid-Query selektierte über `friendly_name`** ("Smart Meter Sum active instantaneous power") — bricht bei Umbenennung. ✅ FIXED — Entity-Selektor `sensor.smart_meter_sum_active_instantaneous_power` (beide Panels). 8. **Redundantes `batteryIn`-Target** (`… * -1`) entfernt; Laden/Entladen wird aus dem einen vorzeichenbehafteten Sensor abgeleitet. Veraltete Script-Kommentare zu den ausgemusterten `battery_power_in/out_absolute`-Sensoren aktualisiert. 9. **Legenden ohne Vorzeichen-Semantik:** jetzt "Battery (+ Entladen / − Laden)", "Grid (+ Bezug / − Einspeisung)" (Farb-Overrides mitgezogen); beide Panels haben eine `description` mit den Konventionen. ### ⚠️ NOT FIXED — Quellseitiger Befund (gehört ins homeassistant-Repo, nicht hierher) `sensor.keller_power` (powercalc-Gruppe) enthält **sowohl** `sensor.kg_waschkuche_waschmaschine_power` (Steckdosen-Messung) **als auch** `sensor.waschmaschine_current_power` (ha_washdata-Spiegel derselben Maschine) — und trotz Ausschluss-Filter auch `sensor.kg_waschkuche_waschmaschine_device_power` (aktuell `unknown`, zählt daher nicht). Während eines Waschgangs zählt die Keller-Summe die Waschmaschine **doppelt** (Dito vermutlich `trockner_current_power`). Beeinflusst hier nur die Etagen-Aufschlüsselung, nicht mehr den Home-Wert (der ist jetzt bilanzbasiert). Sag Bescheid, dann mache ich dafür einen PR im homeassistant-Repo. ### ❓ QUESTION Der "Rest"-Knoten lag nachts bei ~380 W (Grundlast ohne Submetering: Netzwerk/Kühl-/Standby-Geräte außerhalb der gemessenen Kreise). Mittags am 16.07. lag die Bilanz bei ~5,6 kW gegen ~1,6 kW Etagen — falls es einen nicht submeterten Großverbraucher gibt (Wallbox?), wäre ein eigener Knoten sinnvoll. Gibt es einen? ## Verification Alle Queries vor dem Schreiben gegen das live Prometheus (Port-Forward, instant + range) bzw. die HA-API geprüft: - `vitocharge_vx3_vx3_pv_power` 0 W (00:15, Nacht — plausibel), `…battery_power` +1117 W (Entladen), `…battery_soc` vorhanden; Mittags-Gegenprobe 16.07. 12:00Z: PV 7252 W, Netz −1643 W → **negativ = Einspeisung bestätigt** (konsistent mit `grid_power` −23 W, open3e-Doku). - Bilanzprobe: PV 0 + Netz −8 + Batterie +1117 ≈ 1109 W reale Last vs. 702 W Etagen-Summe → Befund 3. - `keller_server_power` / `eg_garten_teichpumpe_power_2`: keine Prometheus-Serie, HA `unavailable`/`unknown` → tot bestätigt. - Ersatz-Sensoren live verifiziert (Server-Steckdose 316,9 W; Teichpumpe max 77 W in 2d). - Etagen-Zuordnung per HA-Template: Area Heizungsanlage → Floor Keller; Area Garten → Floor Außenbereich; `keller_power`-Mitgliederliste enthält Server-Steckdose + `stromverbrauch_heizungsanlage`. - Doppel-Scrape: aktuell nur noch Job `home-assistant` (185 Serien); Duplikate im Fenster vor dem 16.07. real beobachtet (Screenshot Before, Legende). - JSON validiert; Dashboard als Temp-Preview `power-flow-preview` gerendert (Screenshot After) und danach gelöscht. Hinweis: der After-Screenshot ist nachts entstanden — Solar-Fluss und Netz-Einspeisungs-Pfeil waren nicht sichtbar prüfbar. Die Logik dafür ist unverändert (nur `batteryIn` entfernt); bei Tageslicht prüfe ich gern nach.
claude-bot added 1 commit 2026-07-16 22:34:55 +00:00
- Server node: sensor.keller_server_power is dead (UPS retired) -> Wave PM
  Mini server outlet (kg_vorratskeller_wave_pm_mini_server_steckdose)
- Garden node: sensor.eg_garten_teichpumpe_power_2 is dead ->
  sensor.shelly_teichpumpe_power_0 (live, peaks ~77 W)
- Home node/series: floor sums only cover submetered circuits (702 W shown
  vs ~1.1 kW real); Home is now the meter balance PV + Grid + Battery, with
  a new grey 'Rest' node for the non-submetered remainder
- Flow lines: Heat Pump is metered inside Keller (was drawn from EG);
  Garden is on floor Aussenbereich, in no floor sum (was drawn from OG)
- Drop redundant batteryIn target (derived from the signed battery sensor);
  update stale comments from the retired *_absolute sensors
- History: max by (entity) guards against duplicate-scrape residue that
  doubled the summed Home series; sign hints in Battery/Grid legends;
  grid query pinned to entity id instead of friendly_name

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
k.renner merged commit 33cbf94cd8 into master 2026-07-17 11:21:05 +00:00
Sign in to join this conversation.