Files
EOS/src/akkudoktoreos/prediction/elecfee.py
T

66 lines
2.2 KiB
Python
Raw Normal View History

from typing import Optional
from pydantic import Field, computed_field, field_validator
from akkudoktoreos.config.configabc import SettingsBaseModel
from akkudoktoreos.core.coreabc import get_prediction
from akkudoktoreos.prediction.elecfeeabc import ElecFeeProvider
from akkudoktoreos.prediction.elecfeefixed import ElecFeeFixedCommonSettings
from akkudoktoreos.prediction.elecfeeimport import ElecFeeImportCommonSettings
def elecfee_provider_ids() -> list[str]:
"""Valid elecfee provider ids."""
try:
prediction_eos = get_prediction()
except Exception:
# Prediction may not be initialized. Return static built-in provider ids.
return [
"ElecFeeFixed",
"ElecFeeImport",
]
return [
provider.provider_id()
for provider in prediction_eos.providers
if isinstance(provider, ElecFeeProvider)
]
class ElecFeeCommonSettings(SettingsBaseModel):
"""Electricity Price Prediction Configuration."""
provider: Optional[str] = Field(
default=None,
json_schema_extra={
"description": "Electricity fee provider id of provider to be used.",
"examples": ["ElecFeeFixed"],
},
)
elecfeefixed: ElecFeeFixedCommonSettings = Field(
default_factory=ElecFeeFixedCommonSettings,
json_schema_extra={"description": "Fixed electricity fees provider settings."},
)
elecfeeimport: ElecFeeImportCommonSettings = Field(
default_factory=ElecFeeImportCommonSettings,
json_schema_extra={"description": "Electricity fees import provider settings."},
)
@computed_field # type: ignore[prop-decorator]
@property
def providers(self) -> list[str]:
"""Available electricity fee provider ids."""
return elecfee_provider_ids()
# Validators
@field_validator("provider", mode="after")
@classmethod
def validate_provider(cls, value: Optional[str]) -> Optional[str]:
if value is None or value in elecfee_provider_ids():
return value
raise ValueError(
f"Provider '{value}' is not a valid electricity fees provider: {elecfee_provider_ids()}."
)