From 5c350fabaebddf71e89c419cf14d356d20316709 Mon Sep 17 00:00:00 2001 From: LKuemmel Date: Tue, 11 Mar 2025 07:54:07 +0100 Subject: [PATCH 1/4] percentage for imported counters --- .../measurement_logging/process_log.py | 31 +++++++++++++------ 1 file changed, 21 insertions(+), 10 deletions(-) diff --git a/packages/helpermodules/measurement_logging/process_log.py b/packages/helpermodules/measurement_logging/process_log.py index df1bc191ee..32fdfe4aee 100644 --- a/packages/helpermodules/measurement_logging/process_log.py +++ b/packages/helpermodules/measurement_logging/process_log.py @@ -390,6 +390,13 @@ def get_grid_from(entry) -> Tuple[float, float]: raise KeyError(f"Kein Zähler für das Netz gefunden in Eintrag '{entry['timestamp']}'.") return sum(grid["energy_imported"] for grid in grids), sum(grid["energy_exported"] for grid in grids) + def calc_energy_imported_by_source(energy_imported, energy_source): + value = (Decimal(str(energy_imported)) * + Decimal(str(energy_source))).quantize(Decimal('0.001')) # limit precision + value = f'{value: f}' + value = string_to_float(value) if "." in value else string_to_int(value) + return value + try: bat_imported = entry["bat"]["all"]["energy_imported"] if "all" in entry["bat"].keys() else 0 bat_exported = entry["bat"]["all"]["energy_exported"] if "all" in entry["bat"].keys() else 0 @@ -417,17 +424,16 @@ def get_grid_from(entry) -> Tuple[float, float]: entry["energy_source"] = {"grid": 0, "pv": 0, "bat": 0, "cp": 0} for source in ("grid", "pv", "bat", "cp"): if "all" in entry["hc"].keys(): - value = (Decimal(str(entry["hc"]["all"]["energy_imported"])) * - Decimal(str(entry["energy_source"][source]))).quantize(Decimal('0.001')) # limit precision - value = f'{value: f}' - value = string_to_float(value) if "." in value else string_to_int(value) - entry["hc"]["all"][f"energy_imported_{source}"] = value + entry["hc"]["all"][f"energy_imported_{source}"] = calc_energy_imported_by_source( + entry["hc"]["all"]["energy_imported"], entry["energy_source"][source]) if "all" in entry["cp"].keys(): - value = (Decimal(str(entry["cp"]["all"]["energy_imported"])) * - Decimal(str(entry["energy_source"][source]))).quantize(Decimal('0.001')) # limit precision - value = f'{value: f}' - value = string_to_float(value) if "." in value else string_to_int(value) - entry["cp"]["all"][f"energy_imported_{source}"] = value + entry["cp"]["all"][f"energy_imported_{source}"] = calc_energy_imported_by_source( + entry["cp"]["all"]["energy_imported"], entry["energy_source"][source]) + for counter in entry["counter"].values(): + if counter["exported"] == 0: + counter[f"energy_imported_{source}"] = calc_energy_imported_by_source( + counter["energy_imported"], entry["energy_source"][source]) + except Exception: log.exception(f"Fehler beim Berechnen des Strom-Mix von {entry['timestamp']}") finally: @@ -447,6 +453,11 @@ def analyse_percentage_totals(entries, totals): f"energy_imported_{source}", 0)*1000 if "all" in entry["cp"].keys() and f"energy_imported_{source}" in entry["cp"]["all"].keys(): totals["cp"]["all"][f"energy_imported_{source}"] += entry["cp"]["all"][f"energy_imported_{source}"]*1000 + for key, counter in entry["counter"].items(): + if counter["exported"] == 0: + if totals["counter"][key].get(f"energy_imported_{source}") is None: + totals["counter"][key].update({f"energy_imported_{source}": 0}) + totals["counter"][key][f"energy_imported_{source}"] += counter[f"energy_imported_{source}"]*1000 return totals From 419fdc51a3018eb1ca0b6c2a5c8754ced86b0c7f Mon Sep 17 00:00:00 2001 From: LKuemmel Date: Wed, 12 Mar 2025 10:35:56 +0100 Subject: [PATCH 2/4] catch percentage error --- .../helpermodules/measurement_logging/process_log.py | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/packages/helpermodules/measurement_logging/process_log.py b/packages/helpermodules/measurement_logging/process_log.py index 32fdfe4aee..d2d138980e 100644 --- a/packages/helpermodules/measurement_logging/process_log.py +++ b/packages/helpermodules/measurement_logging/process_log.py @@ -9,6 +9,7 @@ from helpermodules import timecheck from helpermodules.measurement_logging.write_log import (LegacySmartHomeLogData, LogType, create_entry, get_previous_entry) +from helpermodules.messaging import MessageType, pub_system_message log = logging.getLogger(__name__) @@ -374,9 +375,12 @@ def add_daily_log(day: str) -> None: def _analyse_energy_source(data) -> Dict: if data and len(data["entries"]) > 0: - for i in range(0, len(data["entries"])): - data["entries"][i] = analyse_percentage(data["entries"][i]) - data["totals"] = analyse_percentage_totals(data["entries"], data["totals"]) + try: + for i in range(0, len(data["entries"])): + data["entries"][i] = analyse_percentage(data["entries"][i]) + data["totals"] = analyse_percentage_totals(data["entries"], data["totals"]) + except Exception: + pub_system_message({}, "Fehler beim Berechnen des Strom-Mix", MessageType.ERROR) return data From 3a2646f04e87bd3c1f173edad216d10632dfef5e Mon Sep 17 00:00:00 2001 From: LKuemmel Date: Thu, 13 Mar 2025 09:01:43 +0100 Subject: [PATCH 3/4] percentage for each chargepoint --- .../measurement_logging/process_log.py | 14 ++++++++------ 1 file changed, 8 insertions(+), 6 deletions(-) diff --git a/packages/helpermodules/measurement_logging/process_log.py b/packages/helpermodules/measurement_logging/process_log.py index d2d138980e..5f1dcd2c9e 100644 --- a/packages/helpermodules/measurement_logging/process_log.py +++ b/packages/helpermodules/measurement_logging/process_log.py @@ -430,9 +430,9 @@ def calc_energy_imported_by_source(energy_imported, energy_source): if "all" in entry["hc"].keys(): entry["hc"]["all"][f"energy_imported_{source}"] = calc_energy_imported_by_source( entry["hc"]["all"]["energy_imported"], entry["energy_source"][source]) - if "all" in entry["cp"].keys(): - entry["cp"]["all"][f"energy_imported_{source}"] = calc_energy_imported_by_source( - entry["cp"]["all"]["energy_imported"], entry["energy_source"][source]) + for key in entry["cp"].keys(): + entry["cp"][key][f"energy_imported_{source}"] = calc_energy_imported_by_source( + entry["cp"][key]["energy_imported"], entry["energy_source"][source]) for counter in entry["counter"].values(): if counter["exported"] == 0: counter[f"energy_imported_{source}"] = calc_energy_imported_by_source( @@ -450,13 +450,15 @@ def analyse_percentage_totals(entries, totals): totals[section]["all"] = {} for source in ("grid", "pv", "bat", "cp"): totals["hc"]["all"].update({f"energy_imported_{source}": 0}) - totals["cp"]["all"].update({f"energy_imported_{source}": 0}) for entry in entries: if "hc" in entry.keys() and "all" in entry["hc"].keys(): totals["hc"]["all"][f"energy_imported_{source}"] += entry["hc"]["all"].get( f"energy_imported_{source}", 0)*1000 - if "all" in entry["cp"].keys() and f"energy_imported_{source}" in entry["cp"]["all"].keys(): - totals["cp"]["all"][f"energy_imported_{source}"] += entry["cp"]["all"][f"energy_imported_{source}"]*1000 + for key in entry["cp"].keys(): + if f"energy_imported_{source}" in entry["cp"][key].keys(): + if totals["cp"][key].get(f"energy_imported_{source}") is None: + totals["cp"][key].update({f"energy_imported_{source}": 0}) + totals["cp"][key][f"energy_imported_{source}"] += entry["cp"][key][f"energy_imported_{source}"]*1000 for key, counter in entry["counter"].items(): if counter["exported"] == 0: if totals["counter"][key].get(f"energy_imported_{source}") is None: From 19b5c095fdae7c1019baa68a1f395eb73a4eb55a Mon Sep 17 00:00:00 2001 From: LKuemmel Date: Mon, 17 Mar 2025 11:55:47 +0100 Subject: [PATCH 4/4] fix pytest --- .../measurement_logging/conftest.py | 113 ++++++++++++++++++ .../measurement_logging/process_log_test.py | 6 +- 2 files changed, 116 insertions(+), 3 deletions(-) diff --git a/packages/helpermodules/measurement_logging/conftest.py b/packages/helpermodules/measurement_logging/conftest.py index 48200d8b46..1a87dd9614 100644 --- a/packages/helpermodules/measurement_logging/conftest.py +++ b/packages/helpermodules/measurement_logging/conftest.py @@ -198,3 +198,116 @@ def daily_log_entry_kw(): 'power_average': 0.12, 'power_exported': 0.0, 'power_imported': 0.12}}} + + +@pytest.fixture() +def daily_log_entry_kw_percentage(): + return { + 'bat': {'all': {'energy_exported': 0.275, + 'energy_imported': 0.0, + 'exported': 1742.135, + 'imported': 2.42, + 'power_average': -3.316, + 'power_exported': 3.316, + 'power_imported': 0.0, + 'soc': 15}, + 'bat2': {'energy_exported': 0.275, + 'energy_imported': 0.0, + 'exported': 1742.135, + 'imported': 2.42, + 'power_average': -3.316, + 'power_exported': 3.316, + 'power_imported': 0.0, + 'soc': 15}}, + 'counter': {'counter0': {'energy_exported': 0.0, + 'energy_imported': 0.746, + 'exported': 2.396, + 'grid': True, + 'imported': 4686.054, + 'power_average': 8.983, + 'power_exported': 0.0, + 'power_imported': 8.983}}, + 'cp': {'all': {'energy_exported': 0.0, + 'energy_imported': 0.96, + 'energy_imported_bat': 0.23, + 'energy_imported_cp': 0.0, + 'energy_imported_grid': 0.624, + 'energy_imported_pv': 0.105, + 'exported': 0, + 'imported': 6028.183, + 'power_average': 11.556, + 'power_exported': 0.0, + 'power_imported': 11.556}, + 'cp3': {'energy_exported': 0.0, + 'energy_imported': 0.576, + 'energy_imported_bat': 0.138, + 'energy_imported_cp': 0.0, + 'energy_imported_grid': 0.375, + 'energy_imported_pv': 0.063, + 'exported': 0, + 'imported': 3620.971, + 'power_average': 6.932, + 'power_exported': 0.0, + 'power_imported': 6.932}, + 'cp4': {'energy_exported': 0.0, + 'energy_imported': 0.192, + 'energy_imported_bat': 0.046, + 'energy_imported_cp': 0.0, + 'energy_imported_grid': 0.125, + 'energy_imported_pv': 0.021, + 'exported': 0, + 'imported': 1198.566, + 'power_average': 2.313, + 'power_exported': 0.0, + 'power_imported': 2.313}, + 'cp5': {'energy_exported': 0.0, + 'energy_imported': 0.192, + 'energy_imported_bat': 0.046, + 'energy_imported_cp': 0.0, + 'energy_imported_grid': 0.125, + 'energy_imported_pv': 0.021, + 'exported': 0, + 'imported': 1208.646, + 'power_average': 2.311, + 'power_exported': 0.0, + 'power_imported': 2.311}}, + 'date': '09:35', + 'energy_source': {'bat': 0.2398, + 'cp': 0.0, + 'grid': 0.6504, + 'pv': 0.1098}, + 'ev': {'ev0': {'soc': 0}}, + 'hc': {'all': {'energy_exported': 0.0, + 'energy_imported': 0.01, + 'energy_imported_bat': 0.002, + 'energy_imported_cp': 0.0, + 'energy_imported_grid': 0.007, + 'energy_imported_pv': 0.001, + 'imported': 100, + 'power_average': 0.12, + 'power_exported': 0.0, + 'power_imported': 0.12}}, + 'pv': {'all': {'energy_exported': 0.126, + 'energy_imported': 0.0, + 'exported': 804, + 'power_average': -1.517, + 'power_exported': 1.517, + 'power_imported': 0.0}, + 'pv1': {'energy_exported': 0.126, + 'energy_imported': 0.0, + 'exported': 804, + 'power_average': -1.517, + 'power_exported': 1.517, + 'power_imported': 0.0}}, + 'sh': {'sh1': {'energy_exported': 0.0, + 'energy_imported': 0.0, + 'exported': 0, + 'imported': 0.1, + 'power_average': 0.001, + 'power_exported': 0.0, + 'power_imported': 0.001, + 'temp0': 300, + 'temp1': 300, + 'temp2': 300}}, + 'timestamp': 1690529761, + } diff --git a/packages/helpermodules/measurement_logging/process_log_test.py b/packages/helpermodules/measurement_logging/process_log_test.py index 32fdfef405..cd969fc8ee 100644 --- a/packages/helpermodules/measurement_logging/process_log_test.py +++ b/packages/helpermodules/measurement_logging/process_log_test.py @@ -16,9 +16,9 @@ def test_get_totals(daily_log_sample, daily_log_totals): assert totals == daily_log_totals -def test_analyse_percentage(daily_log_entry_kw): +def test_analyse_percentage(daily_log_entry_kw_percentage): # setup - expected = deepcopy(daily_log_entry_kw) + expected = deepcopy(daily_log_entry_kw_percentage) expected.update({"energy_source": {'bat': 0.2398, 'cp': 0.0, 'grid': 0.6504, 'pv': 0.1098}}) expected["cp"]["all"].update({ "energy_imported_bat": 0.23, @@ -32,7 +32,7 @@ def test_analyse_percentage(daily_log_entry_kw): "energy_imported_pv": 0.001}) # execution - entry = analyse_percentage(daily_log_entry_kw) + entry = analyse_percentage(daily_log_entry_kw_percentage) # evaluation assert entry == expected