From 572842fb8324c8f02ec04bd15c75f9efb8f607c9 Mon Sep 17 00:00:00 2001 From: LKuemmel Date: Mon, 12 May 2025 10:30:37 +0200 Subject: [PATCH] electricity tariff: remove outdated prices --- .../modules/common/configurable_tariff.py | 16 ++++++--- .../common/configurable_tariff_test.py | 34 +++++++++++++++++++ 2 files changed, 45 insertions(+), 5 deletions(-) create mode 100644 packages/modules/common/configurable_tariff_test.py diff --git a/packages/modules/common/configurable_tariff.py b/packages/modules/common/configurable_tariff.py index f7091fda91..0b92b45b11 100644 --- a/packages/modules/common/configurable_tariff.py +++ b/packages/modules/common/configurable_tariff.py @@ -3,6 +3,7 @@ from modules.common import store from modules.common.component_context import SingleComponentUpdateContext +from modules.common.component_state import TariffState from modules.common.component_type import ComponentType from modules.common.fault_state import ComponentInfo, FaultState @@ -24,14 +25,19 @@ def update(self): if hasattr(self, "_component_updater"): # Wenn beim Initialisieren etwas schief gelaufen ist, ursprüngliche Fehlermeldung beibehalten with SingleComponentUpdateContext(self.fault_state): - tariff_state = self._component_updater() - current_hour = str(int(create_unix_timestamp_current_full_hour())) + tariff_state = self._remove_outdated_prices(self._component_updater()) self.store.set(tariff_state) self.store.update() - for timestamp in tariff_state.prices.keys(): - if timestamp < current_hour: - self.fault_state.warning('Die Preisliste startet nicht mit der aktuellen Stunde.') if len(tariff_state.prices) < 24: self.fault_state.no_error( f'Die Preisliste hat nicht 24, sondern {len(tariff_state.prices)} Einträge. ' 'Die Strompreise werden vom Anbieter erst um 14:00 für den Folgetag aktualisiert.') + + def _remove_outdated_prices(self, tariff_state: TariffState) -> TariffState: + current_hour = str(int(create_unix_timestamp_current_full_hour())) + for timestamp in list(tariff_state.prices.keys()): + if timestamp < current_hour: + self.fault_state.warning( + 'Die Preisliste startet nicht mit der aktuellen Stunde. Abgelaufene Einträge wurden entfernt.') + tariff_state.prices.pop(timestamp) + return tariff_state diff --git a/packages/modules/common/configurable_tariff_test.py b/packages/modules/common/configurable_tariff_test.py new file mode 100644 index 0000000000..c2b0f7e3c8 --- /dev/null +++ b/packages/modules/common/configurable_tariff_test.py @@ -0,0 +1,34 @@ + +from unittest.mock import Mock +import pytest + +from modules.common.component_state import TariffState +from modules.common.configurable_tariff import ConfigurableElectricityTariff +from modules.electricity_tariffs.awattar.config import AwattarTariff + + +@pytest.mark.parametrize( + "tariff_state, expected", + [ + pytest.param(TariffState(prices={"1652680800": -5.87e-06, + "1652684400": 5.467e-05, + "1652688000": 10.72e-05}), + TariffState(prices={"1652680800": -5.87e-06, + "1652684400": 5.467e-05, + "1652688000": 10.72e-05}), id="keine veralteten Einträge"), + pytest.param(TariffState(prices={"1652677200": -5.87e-06, + "1652680800": 5.467e-05, + "1652684400": 10.72e-05}), + TariffState(prices={"1652680800": 5.467e-05, + "1652684400": 10.72e-05}), id="Lösche ersten Eintrag"), + ], +) +def test_remove_outdated_prices(tariff_state: TariffState, expected: TariffState, monkeypatch): + # setup + tariff = ConfigurableElectricityTariff(AwattarTariff(), Mock()) + + # test + result = tariff._remove_outdated_prices(tariff_state) + + # assert + assert result.prices == expected.prices