diff --git a/src/akkudoktoreos/prediction/elecpriceakkudoktor.py b/src/akkudoktoreos/prediction/elecpriceakkudoktor.py index 05f4de7b..492ed2c3 100644 --- a/src/akkudoktoreos/prediction/elecpriceakkudoktor.py +++ b/src/akkudoktoreos/prediction/elecpriceakkudoktor.py @@ -100,6 +100,10 @@ def _validate_data(cls, json_str: Union[bytes, Any]) -> AkkudoktorElecPrice: raise ValueError(error_msg) return akkudoktor_data + def historic_hours_min(self) -> int: + """Return the minimum historic prediction hours for Akkudoktor electricity price data.""" + return 5 * 7 * 24 # 5 weeks a 7 days a 24 hours + def _calculate_weighted_mean(self, day_of_week: int, hour: int) -> float: """Calculate the weighted mean price for given day_of_week and hour. diff --git a/src/akkudoktoreos/prediction/predictionabc.py b/src/akkudoktoreos/prediction/predictionabc.py index 5a6f6583..efa27da8 100644 --- a/src/akkudoktoreos/prediction/predictionabc.py +++ b/src/akkudoktoreos/prediction/predictionabc.py @@ -103,6 +103,13 @@ class PredictionStartEndKeepMixin(PredictionBase): system. Predictions cannot be computed if this value is `None`. """ + def historic_hours_min(self) -> int: + """Return the minimum historic prediction hours for specific data. + + To be implemented by derived classes if default 0 is not appropriate. + """ + return 0 + # Computed field for end_datetime and keep_datetime @computed_field # type: ignore[prop-decorator] @property @@ -136,11 +143,14 @@ def keep_datetime(self) -> Optional[DateTime]: Returns: Optional[DateTime]: The calculated retention cutoff datetime, or `None` if inputs are missing. """ - if self.start_datetime and self.config.prediction_historic_hours: - return self.start_datetime - to_duration( - f"{int(self.config.prediction_historic_hours)} hours" - ) - return None + if self.start_datetime is None: + return None + historic_hours = self.historic_hours_min() + if self.config.prediction_historic_hours and self.config.prediction_historic_hours > historic_hours: + historic_hours = int(self.config.prediction_historic_hours) + return self.start_datetime - to_duration( + f"{historic_hours} hours" + ) @computed_field # type: ignore[prop-decorator] @property