You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
{{ message }}
Repository navigation
Fix Hausverbrauchszähler: EVU-Zähler darf nie aus dem Log ausgeschlossen werden - #3930
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.
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.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
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:
Sobald die Tagesauswertung diese Einträge zusammenfasst, bricht die Berechnung komplett ab:
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.pybaut bei jedem Log-Eintrag einencounter_dictund überspringt darin Zähler aus zwei Gründen: (1) wenn sie der (einzige) Hausverbrauchs-Zähler sind, (2) wenn sie alsextra_metereinem Verbraucher zugeordnet sind. Beides schließt bislang auch den EVU-/Netzzähler selbst mit ein:Ist der EVU-Zähler explizit als Hausverbrauchs-Zähler markiert ("Ja"), wird er hier komplett aus dem
counter_dictausgeschlossen - inklusive seines"grid": true-Eintrags.get_grid_counter()inprocess_log.pyverlangt aber zwingend genau einen Zähler mitgrid: truepro Eintrag und wirft sonst einenKeyError. Dieser propagiert ungefangen bis inanalyse_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- oderextra_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ürcp/consumer/hc- ein einzelner Eintrag ohneenergy_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.