Skip to content

Fix Hausverbrauchszähler: EVU-Zähler darf nie aus dem Log ausgeschlossen werden - #3930

Merged
LKuemmel merged 1 commit into
openWB:masterfrom
seaspotter:fix-grid-counter-excluded-from-log
Sep 14, 2026
Merged

LKuemmel merged 1 commit into
openWB:masterfrom
seaspotter:fix-grid-counter-excluded-from-log

Conversation

@seaspotter

Copy link
Copy Markdown
Collaborator

Problem

Wer für den EVU-/Netzzähler unter "Im Hausverbrauch berücksichtigen?" "Ja" einstellt (der einzig sinnvolle Weg, den Hausverbrauch berechnen zu lassen, wenn kein dedizierter Hausverbrauchs-Zähler vorhanden ist - bei "Automatisch" wird der oberste Zähler wie "Nein" behandelt, siehe Hinweistext in den Zähler-Einstellungen), bekommt ab dann bei jedem Log-Eintrag folgende Fehler:

2026-09-11 20:47:52,759 - {helpermodules.measurement_logging.process_log:470} - {ERROR:Commands} - Fehler beim Berechnen des Strom-Mix von 1789152301
Traceback (most recent call last):
File ".../process_log.py", line 422, in analyse_percentage
grid_counter = get_grid_counter(entry)
File ".../process_log.py", line 418, in get_grid_counter
raise KeyError(f"Kein Zähler für das Netz gefunden in Eintrag '{entry['timestamp']}'.")
KeyError: "Kein Zähler für das Netz gefunden in Eintrag '1789152301'."

Sobald die Tagesauswertung diese Einträge zusammenfasst, bricht die Berechnung komplett ab:

2026-09-11 21:17:14,465 - {helpermodules.measurement_logging.process_log:398} - {ERROR:Commands} - Fehler beim Analysieren der Energiequellen
Traceback (most recent call last):
File ".../process_log.py", line 396, in analyse_energy_source
data["totals"] = analyse_percentage_totals(data["entries"], data["totals"])
File ".../process_log.py", line 582, in analyse_percentage_totals
add_value = counter[f"energy_imported{source}"]
KeyError: 'energy_imported_grid'
2026-09-11 21:17:14,493 - {helpermodules.messaging:60} - {ERROR:Commands} - Messaging: Fehlermeldung: {'source': 'command', 'type': 'danger', 'message': 'Fehler beim Berechnen des Strom-Mix', ...}

Ergebnis: Der komplette Strom-Mix (Anteile Netz/PV/Speicher/Ladepunkt am Verbrauch) fällt für den ganzen Tag aus, dauerhaft, bei jedem Aufruf erneut.

Root Cause

write_log.py baut bei jedem Log-Eintrag einen counter_dict und überspringt darin Zähler aus zwei Gründen: (1) wenn sie der (einzige) Hausverbrauchs-Zähler sind, (2) wenn sie als extra_meter einem Verbraucher zugeordnet sind. Beides schließt bislang auch den EVU-/Netzzähler selbst mit ein:

for counter in data.data.counter_data.values():
    is_home_consumption_counter = is_home_consumption_by_counter.get(counter.num, False)
    if is_home_consumption_counter and home_consumption_counter_count == 1:
        continue
    ...
    counter_dict.update({f"counter{counter.num}": {..., "grid": True if get_id_evu_counter() == counter.num else False, ...}})

Ist der EVU-Zähler explizit als Hausverbrauchs-Zähler markiert ("Ja"), wird er hier komplett aus dem counter_dict ausgeschlossen - inklusive seines "grid": true-Eintrags. get_grid_counter() in process_log.py verlangt aber zwingend genau einen Zähler mit grid: true pro Eintrag und wirft sonst einen KeyError. Dieser propagiert ungefangen bis in analyse_percentage_totals(), die für alle Einträge des Tages läuft - ein einziger betroffener Eintrag reißt die komplette Auswertung mit.

Das betrifft nicht nur eine Rand-Konfiguration: Für jede Anlage ohne dedizierten Hausverbrauchs-Zähler ist "EVU-Zähler = Hausverbrauchs-Zähler" die naheliegendste bzw. einzige Möglichkeit, den Hausverbrauch überhaupt zu erfassen.

Fix

write_log.py : EVU-/Netzzähler wird nie mehr übersprungen, unabhängig von Hausverbrauchs- oder extra_meter-Zuordnung - er behält immer seinen "grid": true-Eintrag im Log.
process_log.py::analyse_percentage_totals(): zusätzlich defensiv gemacht, analog zu den bereits vorhandenen Guards für cp/consumer/hc - ein einzelner Eintrag ohne energy_imported_* (z.B. weil er noch mit dem alten, fehlerhaften Log geschrieben wurde) überspringt nur sich selbst statt die gesamte Tagesauswertung abzubrechen.
Wichtig: Punkt 2 repariert nicht rückwirkend bereits geschriebene, fehlerhafte Log-Einträge (denen fehlt der Netzzähler schlicht), verhindert aber, dass ein einzelner solcher Alt-Eintrag die Auswertung für den Rest des Tages mitreißt.

@seaspotter

Copy link
Copy Markdown
Collaborator Author

Update: drittes Symptom - daily_imported/daily_exported frieren ein

Bestätigt von einem weiteren Nutzer mit E3DC in discussions#3908, nachdem er seinen EVU-Zähler ebenfalls auf "Ja" gestellt hat:

Seit der neuesten Version ist der Netzbezug mit derzeit 73Wh falsch. [...] Die 73Wh sind anscheinend eingefroren.

Log-Beleg (drei Snapshots im Abstand von ~10s):

CounterData(... daily_exported=18855.114, daily_imported=73.251, ... imported=9610316.619592372, ...)
CounterData(... daily_exported=18855.114, daily_imported=73.251, ... imported=9610346.772613637, ...)
CounterData(... daily_exported=18855.114, daily_imported=73.251, ... imported=9610378.169087142, ...)

imported (Zählerstand) steigt normal, daily_imported/daily_exported bleiben stehen - ohne jede Fehlermeldung im Log.

Ursache

daily_imported/daily_exported werden über update_daily_yields() → get_totals() → process_entry() aus den Log-Einträgen berechnet. Dort wird pro Zähler die Differenz zwischen zwei aufeinanderfolgenden Einträgen gebildet; fehlt ein Zähler-Modul (z.B. der EVU-Zähler) komplett in einem Eintrag, greift ein except KeyError-Fallback und liefert einfach den bisherigen Wert zurück - macht energy_imported = 0 für dieses Intervall. Ab dann taucht der Zähler in der Schleife gar nicht mehr auf und trägt für immer nichts mehr bei, ganz ohne Exception.

Der bereits beschriebene Bug in write_log.py (EVU-Zähler verschwindet aus dem Log, sobald "Im Hausverbrauch berücksichtigen?" auf "Ja" steht) ist also nicht nur für den abstürzenden Strom-Mix verantwortlich, sondern lässt zusätzlich die Tageswerte lautlos einfrieren. Der vorgeschlagene Fix behebt beides.

@LKuemmel
LKuemmel merged commit ffae46f into openWB:master Sep 14, 2026
1 check passed
@seaspotter
seaspotter deleted the fix-grid-counter-excluded-from-log branch September 14, 2026 10:09
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants