2024-12-15 14:40:03 +01:00
|
|
|
"""Weather forecast module for weather predictions."""
|
|
|
|
|
|
|
|
|
|
from typing import Optional
|
|
|
|
|
|
2025-12-30 22:08:21 +01:00
|
|
|
from pydantic import Field, computed_field, field_validator
|
2024-12-15 14:40:03 +01:00
|
|
|
|
|
|
|
|
from akkudoktoreos.config.configabc import SettingsBaseModel
|
2026-02-22 14:12:42 +01:00
|
|
|
from akkudoktoreos.core.coreabc import get_prediction
|
2025-03-27 21:53:01 +01:00
|
|
|
from akkudoktoreos.prediction.weatherabc import WeatherProvider
|
2025-01-12 05:19:37 +01:00
|
|
|
from akkudoktoreos.prediction.weatherimport import WeatherImportCommonSettings
|
2024-12-15 14:40:03 +01:00
|
|
|
|
2025-03-27 21:53:01 +01:00
|
|
|
|
2026-02-22 14:12:42 +01:00
|
|
|
def weather_provider_ids() -> list[str]:
|
|
|
|
|
"""Valid weather provider ids."""
|
|
|
|
|
try:
|
|
|
|
|
prediction_eos = get_prediction()
|
2026-07-20 01:11:33 +02:00
|
|
|
except Exception:
|
2026-02-22 14:12:42 +01:00
|
|
|
# Prediction may not be initialized
|
|
|
|
|
# Return at least provider used in example
|
|
|
|
|
return ["WeatherImport"]
|
|
|
|
|
|
|
|
|
|
return [
|
|
|
|
|
provider.provider_id()
|
|
|
|
|
for provider in prediction_eos.providers
|
|
|
|
|
if isinstance(provider, WeatherProvider)
|
|
|
|
|
]
|
2025-03-27 21:53:01 +01:00
|
|
|
|
2024-12-15 14:40:03 +01:00
|
|
|
|
2025-10-28 02:50:31 +01:00
|
|
|
class WeatherCommonProviderSettings(SettingsBaseModel):
|
|
|
|
|
"""Weather Forecast Provider Configuration."""
|
|
|
|
|
|
|
|
|
|
WeatherImport: Optional[WeatherImportCommonSettings] = Field(
|
2025-11-10 16:57:44 +01:00
|
|
|
default=None,
|
|
|
|
|
json_schema_extra={"description": "WeatherImport settings", "examples": [None]},
|
2025-10-28 02:50:31 +01:00
|
|
|
)
|
|
|
|
|
|
|
|
|
|
|
2024-12-15 14:40:03 +01:00
|
|
|
class WeatherCommonSettings(SettingsBaseModel):
|
2025-01-15 00:54:45 +01:00
|
|
|
"""Weather Forecast Configuration."""
|
|
|
|
|
|
2025-01-18 14:26:34 +01:00
|
|
|
provider: Optional[str] = Field(
|
2025-01-15 00:54:45 +01:00
|
|
|
default=None,
|
2025-11-10 16:57:44 +01:00
|
|
|
json_schema_extra={
|
|
|
|
|
"description": "Weather provider id of provider to be used.",
|
|
|
|
|
"examples": ["WeatherImport"],
|
|
|
|
|
},
|
2024-12-15 14:40:03 +01:00
|
|
|
)
|
2025-01-12 05:19:37 +01:00
|
|
|
|
2025-10-28 02:50:31 +01:00
|
|
|
provider_settings: WeatherCommonProviderSettings = Field(
|
|
|
|
|
default_factory=WeatherCommonProviderSettings,
|
2025-11-10 16:57:44 +01:00
|
|
|
json_schema_extra={
|
|
|
|
|
"description": "Provider settings",
|
|
|
|
|
"examples": [
|
|
|
|
|
# Example 1: Empty/default settings (all providers None)
|
|
|
|
|
{
|
|
|
|
|
"WeatherImport": None,
|
|
|
|
|
},
|
|
|
|
|
],
|
|
|
|
|
},
|
2025-01-15 00:54:45 +01:00
|
|
|
)
|
2025-03-27 21:53:01 +01:00
|
|
|
|
2025-12-30 22:08:21 +01:00
|
|
|
@computed_field # type: ignore[prop-decorator]
|
|
|
|
|
@property
|
|
|
|
|
def providers(self) -> list[str]:
|
|
|
|
|
"""Available weather provider ids."""
|
2026-02-22 14:12:42 +01:00
|
|
|
return weather_provider_ids()
|
2025-12-30 22:08:21 +01:00
|
|
|
|
2025-03-27 21:53:01 +01:00
|
|
|
# Validators
|
|
|
|
|
@field_validator("provider", mode="after")
|
|
|
|
|
@classmethod
|
|
|
|
|
def validate_provider(cls, value: Optional[str]) -> Optional[str]:
|
2026-02-22 14:12:42 +01:00
|
|
|
if value is None or value in weather_provider_ids():
|
2025-03-27 21:53:01 +01:00
|
|
|
return value
|
|
|
|
|
raise ValueError(
|
2026-02-22 14:12:42 +01:00
|
|
|
f"Provider '{value}' is not a valid weather provider: {weather_provider_ids()}."
|
2025-03-27 21:53:01 +01:00
|
|
|
)
|