Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion packages/helpermodules/measurement_logging/process_log.py
Original file line number Diff line number Diff line change
Expand Up @@ -575,7 +575,7 @@ def analyse_percentage_totals(entries, totals):
totals["consumer"][key][f"energy_imported_{source}"] = decimal_add(
current_value, add_value)
for key, counter in entry["counter"].items():
if counter["grid"] is False:
if counter["grid"] is False and f"energy_imported_{source}" in counter:
if totals["counter"][key].get(f"energy_imported_{source}") is None:
totals["counter"][key].update({f"energy_imported_{source}": 0})
current_value = totals["counter"][key][f"energy_imported_{source}"]
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -248,6 +248,45 @@ def test_analyse_percentage_totals():
assert result["consumer"]["consumer7"]["energy_imported_cp"] == 246


def test_analyse_percentage_totals_entry_missing_grid_counter():
# Ein Eintrag, bei dem analyse_percentage() zuvor fehlgeschlagen ist (z.B. weil der EVU-Zähler
# nicht als "grid" markiert wurde), hat kein "energy_source" und calc_energy_imported_by_source()
# setzt für dessen Zähler dann kein "energy_imported_*". Das darf die Auswertung der übrigen,
# intakten Einträge nicht mit einem KeyError abbrechen.
entries = [
{
"hc": {},
"cp": {},
"consumer": {},
"counter": {
"counter0": {"grid": False}, # fehlerhafter Eintrag ohne "energy_imported_*"
},
},
{
"hc": {},
"cp": {},
"consumer": {},
"counter": {
"counter0": {"grid": False, "energy_imported_grid": 100, "energy_imported_pv": 50,
"energy_imported_bat": 20, "energy_imported_cp": 10},
},
},
]
totals = {
"hc": {},
"cp": {},
"consumer": {},
"counter": {"counter0": {"grid": False, "energy_imported": 100}},
}

result = analyse_percentage_totals(entries, totals)

assert result["counter"]["counter0"]["energy_imported_grid"] == 100
assert result["counter"]["counter0"]["energy_imported_pv"] == 50
assert result["counter"]["counter0"]["energy_imported_bat"] == 20
assert result["counter"]["counter0"]["energy_imported_cp"] == 10


def test_calc_energy_imported_by_source_message_filtering():
"""Test message filtering when component is in fault state and name is missing."""
# setup
Expand Down
16 changes: 10 additions & 6 deletions packages/helpermodules/measurement_logging/write_log.py
Original file line number Diff line number Diff line change
Expand Up @@ -272,20 +272,24 @@ def create_entry(log_type: LogType, sh_log_data: LegacySmartHomeLogData, previou

for counter in data.data.counter_data.values():
try:
# Der EVU-Zähler muss immer geloggt werden, unabhängig von Hausverbrauchs- oder
# extra_meter-Zuordnung - sonst findet process_log.get_grid_counter() keinen Netzzähler mehr.
is_grid_counter = counter_all_data.get_id_evu_counter() == counter.num
is_home_consumption_counter = is_home_consumption_by_counter.get(counter.num, False)
if is_home_consumption_counter and home_consumption_counter_count == 1:
if not is_grid_counter and is_home_consumption_counter and home_consumption_counter_count == 1:
continue
skip_counter = False
for consumer in data.data.consumer_data:
if counter.num == data.data.consumer_data[consumer].data.extra_meter:
skip_counter = True
break
if not is_grid_counter:
for consumer in data.data.consumer_data:
if counter.num == data.data.consumer_data[consumer].data.extra_meter:
skip_counter = True
break
if skip_counter is False:
counter_dict.update(
{f"counter{counter.num}": {
"imported": counter.data.get.imported,
"exported": counter.data.get.exported,
"grid": True if counter_all_data.get_id_evu_counter() == counter.num else False,
"grid": is_grid_counter,
"fault_state": counter.data.get.fault_state}})
except Exception:
log.exception("Fehler im Werte-Logging-Modul für Zähler "+str(counter))
Expand Down