diff --git a/packages/helpermodules/measurement_logging/process_log.py b/packages/helpermodules/measurement_logging/process_log.py index 9ff7c45c1a..092f9a3489 100644 --- a/packages/helpermodules/measurement_logging/process_log.py +++ b/packages/helpermodules/measurement_logging/process_log.py @@ -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}"] diff --git a/packages/helpermodules/measurement_logging/process_log_unit_test.py b/packages/helpermodules/measurement_logging/process_log_unit_test.py index acf78cf52f..054c387a32 100644 --- a/packages/helpermodules/measurement_logging/process_log_unit_test.py +++ b/packages/helpermodules/measurement_logging/process_log_unit_test.py @@ -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 diff --git a/packages/helpermodules/measurement_logging/write_log.py b/packages/helpermodules/measurement_logging/write_log.py index 5c31c94d0c..d0b83c7b2b 100644 --- a/packages/helpermodules/measurement_logging/write_log.py +++ b/packages/helpermodules/measurement_logging/write_log.py @@ -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))