From 86ab84af0bc3eaca1bb1406fed39f60a2f196354 Mon Sep 17 00:00:00 2001 From: ndrsnhs Date: Mon, 22 Jun 2026 11:44:24 +0200 Subject: [PATCH 1/7] filter energy exceeding 50 years --- packages/modules/common/utils/peak_filter.py | 12 ++++++++++++ packages/modules/common/utils/test_peak_filter.py | 2 ++ 2 files changed, 14 insertions(+) diff --git a/packages/modules/common/utils/peak_filter.py b/packages/modules/common/utils/peak_filter.py index 70957af5da..2c0399d2b6 100644 --- a/packages/modules/common/utils/peak_filter.py +++ b/packages/modules/common/utils/peak_filter.py @@ -53,6 +53,18 @@ def check_imported_exported( exported: Optional[float] = None, ) -> tuple[Optional[float], Optional[float]]: if max_power > 0: + # filtere den Zählerstand wenn er größer ist als die maximal mögliche Energiemenge + # in 50 Jahren + # max. Leistung × 24 h/Tag × 365 Tage/Jahr × 50 Jahre + max_energy = max_power * 24 * 365 * 50 + if imported is not None and imported > max_energy: + log.debug(f"PeakFilter: Unplausibler importierter Zählerstand: {imported / 1000}kWh. " + f"Maximal mögliche Energiemenge in 50 Jahren: {max_energy / 1000}kWh.") + imported = None + if exported is not None and exported > max_energy: + log.debug(f"PeakFilter: Unplausibler exportierter Zählerstand: {exported / 1000}kWh. " + f"Maximal mögliche Energiemenge in 50 Jahren: {max_energy / 1000}kWh.") + exported = None # Die erlaubte Abweichung ist doppelt so groß wie die mögliche # Energiemenge pro Intervall bei maximaler Leistung control_interval = data.data.general_data.data.control_interval diff --git a/packages/modules/common/utils/test_peak_filter.py b/packages/modules/common/utils/test_peak_filter.py index 14ed6a33d3..9506ce110f 100644 --- a/packages/modules/common/utils/test_peak_filter.py +++ b/packages/modules/common/utils/test_peak_filter.py @@ -73,6 +73,8 @@ class Params: Params("Imp/ Exp Speicher - Werte invalide", ComponentType.BAT, 1000, 500, 400, 1300, 800, None, None), Params("Imp/ Exp Speicher - Import invalide", ComponentType.BAT, 1000, 500, 400, 1300, 505, None, 505), Params("Imp/ Exp Speicher - Export invalide", ComponentType.BAT, 1000, 500, 400, 1005, 800, 1005, None), + Params("Imp/ Exp Speicher - Export > 50Y", ComponentType.BAT, 1000, 500000000, 400, 1005, 500000000, 1005, None), + Params("Imp/ Exp Speicher - Export ~ 40Y", ComponentType.BAT, 1000, 400000000, 400, 1005, 400000000, 1005, 400000000), ] From c2997755063c58274857ec8cb28ba1001c74bc8f Mon Sep 17 00:00:00 2001 From: ndrsnhs Date: Mon, 22 Jun 2026 11:50:17 +0200 Subject: [PATCH 2/7] remove whtespace --- packages/modules/common/utils/peak_filter.py | 2 +- packages/modules/common/utils/test_peak_filter.py | 3 ++- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/packages/modules/common/utils/peak_filter.py b/packages/modules/common/utils/peak_filter.py index 2c0399d2b6..10e5315ec8 100644 --- a/packages/modules/common/utils/peak_filter.py +++ b/packages/modules/common/utils/peak_filter.py @@ -54,7 +54,7 @@ def check_imported_exported( ) -> tuple[Optional[float], Optional[float]]: if max_power > 0: # filtere den Zählerstand wenn er größer ist als die maximal mögliche Energiemenge - # in 50 Jahren + # in 50 Jahren # max. Leistung × 24 h/Tag × 365 Tage/Jahr × 50 Jahre max_energy = max_power * 24 * 365 * 50 if imported is not None and imported > max_energy: diff --git a/packages/modules/common/utils/test_peak_filter.py b/packages/modules/common/utils/test_peak_filter.py index 9506ce110f..ca2a2ed71f 100644 --- a/packages/modules/common/utils/test_peak_filter.py +++ b/packages/modules/common/utils/test_peak_filter.py @@ -74,7 +74,8 @@ class Params: Params("Imp/ Exp Speicher - Import invalide", ComponentType.BAT, 1000, 500, 400, 1300, 505, None, 505), Params("Imp/ Exp Speicher - Export invalide", ComponentType.BAT, 1000, 500, 400, 1005, 800, 1005, None), Params("Imp/ Exp Speicher - Export > 50Y", ComponentType.BAT, 1000, 500000000, 400, 1005, 500000000, 1005, None), - Params("Imp/ Exp Speicher - Export ~ 40Y", ComponentType.BAT, 1000, 400000000, 400, 1005, 400000000, 1005, 400000000), + Params("Imp/ Exp Speicher - Export ~ 40Y", ComponentType.BAT, + 1000, 400000000, 400, 1005, 400000000, 1005, 400000000), ] From 9bd760f68483177191ceceb09096c257e11194ab Mon Sep 17 00:00:00 2001 From: ndrsnhs Date: Tue, 23 Jun 2026 09:27:38 +0200 Subject: [PATCH 3/7] add tests, improve energy check --- packages/modules/common/utils/peak_filter.py | 23 ++++++++----------- .../modules/common/utils/test_peak_filter.py | 5 +++- 2 files changed, 13 insertions(+), 15 deletions(-) diff --git a/packages/modules/common/utils/peak_filter.py b/packages/modules/common/utils/peak_filter.py index 10e5315ec8..0e4ac36729 100644 --- a/packages/modules/common/utils/peak_filter.py +++ b/packages/modules/common/utils/peak_filter.py @@ -53,27 +53,18 @@ def check_imported_exported( exported: Optional[float] = None, ) -> tuple[Optional[float], Optional[float]]: if max_power > 0: - # filtere den Zählerstand wenn er größer ist als die maximal mögliche Energiemenge - # in 50 Jahren + # maximal mögliche Energiemenge in 50 Jahren: # max. Leistung × 24 h/Tag × 365 Tage/Jahr × 50 Jahre max_energy = max_power * 24 * 365 * 50 - if imported is not None and imported > max_energy: - log.debug(f"PeakFilter: Unplausibler importierter Zählerstand: {imported / 1000}kWh. " - f"Maximal mögliche Energiemenge in 50 Jahren: {max_energy / 1000}kWh.") - imported = None - if exported is not None and exported > max_energy: - log.debug(f"PeakFilter: Unplausibler exportierter Zählerstand: {exported / 1000}kWh. " - f"Maximal mögliche Energiemenge in 50 Jahren: {max_energy / 1000}kWh.") - exported = None # Die erlaubte Abweichung ist doppelt so groß wie die mögliche # Energiemenge pro Intervall bei maximaler Leistung control_interval = data.data.general_data.data.control_interval allowed_deviation = 2 * (control_interval / 3600) * max_power - imp = self.check_total_energy(imported, self.imported, allowed_deviation) + imp = self.check_total_energy(imported, self.imported, allowed_deviation, max_energy) self.imported = imported - exp = self.check_total_energy(exported, self.exported, allowed_deviation) + exp = self.check_total_energy(exported, self.exported, allowed_deviation, max_energy) self.exported = exported return imp, exp return imported, exported @@ -82,10 +73,14 @@ def check_total_energy( self, total_energy: Optional[float], previous_total_energy: Optional[float], - allowed_deviation: float + allowed_deviation: float, + max_energy: float ) -> Optional[float]: if total_energy is not None: - if previous_total_energy is None: + if total_energy > max_energy: + log.debug(f"PeakFilter: Unplausibler Zählerwert: {total_energy / 1000}kWh. " + f"Maximal mögliche Energiemenge in 50 Jahren: {max_energy / 1000}kWh.") + elif previous_total_energy is None: if allowed_deviation > 0: self.fault_state.warning("PeakFilter: Vorheriger Wert None (Startup), " f"aktueller Zählerwert: {total_energy / 1000 }kWh. " diff --git a/packages/modules/common/utils/test_peak_filter.py b/packages/modules/common/utils/test_peak_filter.py index ca2a2ed71f..4445bc07cf 100644 --- a/packages/modules/common/utils/test_peak_filter.py +++ b/packages/modules/common/utils/test_peak_filter.py @@ -73,9 +73,12 @@ class Params: Params("Imp/ Exp Speicher - Werte invalide", ComponentType.BAT, 1000, 500, 400, 1300, 800, None, None), Params("Imp/ Exp Speicher - Import invalide", ComponentType.BAT, 1000, 500, 400, 1300, 505, None, 505), Params("Imp/ Exp Speicher - Export invalide", ComponentType.BAT, 1000, 500, 400, 1005, 800, 1005, None), + Params("Imp/ Exp Speicher - Import > 50Y", ComponentType.BAT, 500000000, 500, 400, 500000000, 505, None, 505), Params("Imp/ Exp Speicher - Export > 50Y", ComponentType.BAT, 1000, 500000000, 400, 1005, 500000000, 1005, None), - Params("Imp/ Exp Speicher - Export ~ 40Y", ComponentType.BAT, + Params("Imp/ Exp Speicher - Export ~ 45Y", ComponentType.BAT, 1000, 400000000, 400, 1005, 400000000, 1005, 400000000), + Params("Imp/ Exp Speicher - Import > 50Y", ComponentType.BAT, + 400000000, 500, 400, 400000000, 505, 400000000, 505) ] From 91d0f30ccbae2a675712ab00d758a9e8659d91de Mon Sep 17 00:00:00 2001 From: ndrsnhs Date: Tue, 7 Jul 2026 11:55:33 +0200 Subject: [PATCH 4/7] change name of test --- packages/modules/common/utils/test_peak_filter.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/modules/common/utils/test_peak_filter.py b/packages/modules/common/utils/test_peak_filter.py index 4445bc07cf..b50d9eedd8 100644 --- a/packages/modules/common/utils/test_peak_filter.py +++ b/packages/modules/common/utils/test_peak_filter.py @@ -77,7 +77,7 @@ class Params: Params("Imp/ Exp Speicher - Export > 50Y", ComponentType.BAT, 1000, 500000000, 400, 1005, 500000000, 1005, None), Params("Imp/ Exp Speicher - Export ~ 45Y", ComponentType.BAT, 1000, 400000000, 400, 1005, 400000000, 1005, 400000000), - Params("Imp/ Exp Speicher - Import > 50Y", ComponentType.BAT, + Params("Imp/ Exp Speicher - Import ~ 45Y", ComponentType.BAT, 400000000, 500, 400, 400000000, 505, 400000000, 505) ] From 254f86a5a535e228e121d7f21cbffbe390725763 Mon Sep 17 00:00:00 2001 From: ndrsnhs Date: Tue, 7 Jul 2026 12:03:39 +0200 Subject: [PATCH 5/7] filter negative values --- packages/modules/common/utils/peak_filter.py | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/packages/modules/common/utils/peak_filter.py b/packages/modules/common/utils/peak_filter.py index 0e4ac36729..33a9d959df 100644 --- a/packages/modules/common/utils/peak_filter.py +++ b/packages/modules/common/utils/peak_filter.py @@ -85,7 +85,9 @@ def check_total_energy( self.fault_state.warning("PeakFilter: Vorheriger Wert None (Startup), " f"aktueller Zählerwert: {total_energy / 1000 }kWh. " "Warte einen Regelintervall.") - elif allowed_deviation > 0 and (total_energy - previous_total_energy) > allowed_deviation: + elif (allowed_deviation > 0 and \ + ((total_energy - previous_total_energy) > allowed_deviation or + (total_energy - previous_total_energy) < 0)): log.debug(f"PeakFilter: Unplausibler Zählerwert: {total_energy / 1000}kWh. " f"Differenz zum vorherigen Wert: {total_energy - previous_total_energy}Wh. " f"erlaubte Differenz: {round(allowed_deviation, 2)}Wh.") From 2b21c76b3741d02758443696bd47c115baf31701 Mon Sep 17 00:00:00 2001 From: ndrsnhs Date: Tue, 7 Jul 2026 12:08:40 +0200 Subject: [PATCH 6/7] fix identation --- packages/modules/common/utils/peak_filter.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/modules/common/utils/peak_filter.py b/packages/modules/common/utils/peak_filter.py index 33a9d959df..99e3367487 100644 --- a/packages/modules/common/utils/peak_filter.py +++ b/packages/modules/common/utils/peak_filter.py @@ -85,7 +85,7 @@ def check_total_energy( self.fault_state.warning("PeakFilter: Vorheriger Wert None (Startup), " f"aktueller Zählerwert: {total_energy / 1000 }kWh. " "Warte einen Regelintervall.") - elif (allowed_deviation > 0 and \ + elif (allowed_deviation > 0 and ((total_energy - previous_total_energy) > allowed_deviation or (total_energy - previous_total_energy) < 0)): log.debug(f"PeakFilter: Unplausibler Zählerwert: {total_energy / 1000}kWh. " From b19a878e83a64fa935bca891384cc02b1de7f695 Mon Sep 17 00:00:00 2001 From: ndrsnhs Date: Tue, 7 Jul 2026 12:14:53 +0200 Subject: [PATCH 7/7] fix identation --- packages/modules/common/utils/peak_filter.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/modules/common/utils/peak_filter.py b/packages/modules/common/utils/peak_filter.py index 99e3367487..fb7b07aa43 100644 --- a/packages/modules/common/utils/peak_filter.py +++ b/packages/modules/common/utils/peak_filter.py @@ -87,7 +87,7 @@ def check_total_energy( "Warte einen Regelintervall.") elif (allowed_deviation > 0 and ((total_energy - previous_total_energy) > allowed_deviation or - (total_energy - previous_total_energy) < 0)): + (total_energy - previous_total_energy) < 0)): log.debug(f"PeakFilter: Unplausibler Zählerwert: {total_energy / 1000}kWh. " f"Differenz zum vorherigen Wert: {total_energy - previous_total_energy}Wh. " f"erlaubte Differenz: {round(allowed_deviation, 2)}Wh.")