diff --git a/docs/_generated/configexample.md b/docs/_generated/configexample.md index 15c280d..9dd30d9 100644 --- a/docs/_generated/configexample.md +++ b/docs/_generated/configexample.md @@ -120,7 +120,7 @@ } }, "general": { - "version": "0.2.0.dev2602242106748274", + "version": "0.2.0.dev2602250574650225", "data_folder_path": "/home/user/.local/share/net.akkudoktoreos.net", "data_output_subpath": "output", "latitude": 52.52, @@ -128,10 +128,16 @@ }, "load": { "provider": "LoadAkkudoktor", - "provider_settings": { - "LoadAkkudoktor": null, - "LoadVrm": null, - "LoadImport": null + "loadakkudoktor": { + "loadakkudoktor_year_energy_kwh": null + }, + "loadvrm": { + "load_vrm_token": "your-token", + "load_vrm_idsite": 12345 + }, + "loadimport": { + "import_file_path": null, + "import_json": null } }, "logging": { diff --git a/docs/_generated/configgeneral.md b/docs/_generated/configgeneral.md index 2179985..f25cabc 100644 --- a/docs/_generated/configgeneral.md +++ b/docs/_generated/configgeneral.md @@ -16,7 +16,7 @@ | latitude | `EOS_GENERAL__LATITUDE` | `Optional[float]` | `rw` | `52.52` | Latitude in decimal degrees between -90 and 90. North is positive (ISO 19115) (°) | | longitude | `EOS_GENERAL__LONGITUDE` | `Optional[float]` | `rw` | `13.405` | Longitude in decimal degrees within -180 to 180 (°) | | timezone | | `Optional[str]` | `ro` | `N/A` | Computed timezone based on latitude and longitude. | -| version | `EOS_GENERAL__VERSION` | `str` | `rw` | `0.2.0.dev2602242106748274` | Configuration file version. Used to check compatibility. | +| version | `EOS_GENERAL__VERSION` | `str` | `rw` | `0.2.0.dev2602250574650225` | Configuration file version. Used to check compatibility. | ::: @@ -28,7 +28,7 @@ ```json { "general": { - "version": "0.2.0.dev2602242106748274", + "version": "0.2.0.dev2602250574650225", "data_folder_path": "/home/user/.local/share/net.akkudoktoreos.net", "data_output_subpath": "output", "latitude": 52.52, @@ -46,7 +46,7 @@ ```json { "general": { - "version": "0.2.0.dev2602242106748274", + "version": "0.2.0.dev2602250574650225", "data_folder_path": "/home/user/.local/share/net.akkudoktoreos.net", "data_output_subpath": "output", "latitude": 52.52, diff --git a/docs/_generated/configload.md b/docs/_generated/configload.md index 1be86c4..419da2f 100644 --- a/docs/_generated/configload.md +++ b/docs/_generated/configload.md @@ -7,8 +7,10 @@ | Name | Environment Variable | Type | Read-Only | Default | Description | | ---- | -------------------- | ---- | --------- | ------- | ----------- | +| loadakkudoktor | `EOS_LOAD__LOADAKKUDOKTOR` | `LoadAkkudoktorCommonSettings` | `rw` | `required` | LoadAkkudoktor provider settings. | +| loadimport | `EOS_LOAD__LOADIMPORT` | `LoadImportCommonSettings` | `rw` | `required` | LoadImport provider settings. | +| loadvrm | `EOS_LOAD__LOADVRM` | `LoadVrmCommonSettings` | `rw` | `required` | LoadVrm provider settings. | | provider | `EOS_LOAD__PROVIDER` | `Optional[str]` | `rw` | `None` | Load provider id of provider to be used. | -| provider_settings | `EOS_LOAD__PROVIDER_SETTINGS` | `LoadCommonProviderSettings` | `rw` | `required` | Provider settings | | providers | | `list[str]` | `ro` | `N/A` | Available load provider ids. | ::: @@ -22,10 +24,16 @@ { "load": { "provider": "LoadAkkudoktor", - "provider_settings": { - "LoadAkkudoktor": null, - "LoadVrm": null, - "LoadImport": null + "loadakkudoktor": { + "loadakkudoktor_year_energy_kwh": null + }, + "loadvrm": { + "load_vrm_token": "your-token", + "load_vrm_idsite": 12345 + }, + "loadimport": { + "import_file_path": null, + "import_json": null } } } @@ -41,10 +49,16 @@ { "load": { "provider": "LoadAkkudoktor", - "provider_settings": { - "LoadAkkudoktor": null, - "LoadVrm": null, - "LoadImport": null + "loadakkudoktor": { + "loadakkudoktor_year_energy_kwh": null + }, + "loadvrm": { + "load_vrm_token": "your-token", + "load_vrm_idsite": 12345 + }, + "loadimport": { + "import_file_path": null, + "import_json": null }, "providers": [ "LoadAkkudoktor", @@ -57,43 +71,10 @@ ``` -### Common settings for load data import from file or JSON string - - -:::{table} load::provider_settings::LoadImport -:widths: 10 10 5 5 30 -:align: left - -| Name | Type | Read-Only | Default | Description | -| ---- | ---- | --------- | ------- | ----------- | -| import_file_path | `Union[str, pathlib.Path, NoneType]` | `rw` | `None` | Path to the file to import load data from. | -| import_json | `Optional[str]` | `rw` | `None` | JSON string, dictionary of load forecast value lists. | -::: - - - -**Example Input/Output** - - - -```json - { - "load": { - "provider_settings": { - "LoadImport": { - "import_file_path": null, - "import_json": "{\"load0_mean\": [676.71, 876.19, 527.13]}" - } - } - } - } -``` - - ### Common settings for load forecast VRM API -:::{table} load::provider_settings::LoadVrm +:::{table} load::loadvrm :widths: 10 10 5 5 30 :align: left @@ -112,11 +93,40 @@ ```json { "load": { - "provider_settings": { - "LoadVrm": { - "load_vrm_token": "your-token", - "load_vrm_idsite": 12345 - } + "loadvrm": { + "load_vrm_token": "your-token", + "load_vrm_idsite": 12345 + } + } + } +``` + + +### Common settings for load data import from file or JSON string + + +:::{table} load::loadimport +:widths: 10 10 5 5 30 +:align: left + +| Name | Type | Read-Only | Default | Description | +| ---- | ---- | --------- | ------- | ----------- | +| import_file_path | `Union[str, pathlib.Path, NoneType]` | `rw` | `None` | Path to the file to import load data from. | +| import_json | `Optional[str]` | `rw` | `None` | JSON string, dictionary of load forecast value lists. | +::: + + + +**Example Input/Output** + + + +```json + { + "load": { + "loadimport": { + "import_file_path": null, + "import_json": "{\"load0_mean\": [676.71, 876.19, 527.13]}" } } } @@ -126,7 +136,7 @@ ### Common settings for load data import from file -:::{table} load::provider_settings::LoadAkkudoktor +:::{table} load::loadakkudoktor :widths: 10 10 5 5 30 :align: left @@ -144,43 +154,8 @@ ```json { "load": { - "provider_settings": { - "LoadAkkudoktor": { - "loadakkudoktor_year_energy_kwh": 40421.0 - } - } - } - } -``` - - -### Load Prediction Provider Configuration - - -:::{table} load::provider_settings -:widths: 10 10 5 5 30 -:align: left - -| Name | Type | Read-Only | Default | Description | -| ---- | ---- | --------- | ------- | ----------- | -| LoadAkkudoktor | `Optional[akkudoktoreos.prediction.loadakkudoktor.LoadAkkudoktorCommonSettings]` | `rw` | `None` | LoadAkkudoktor settings | -| LoadImport | `Optional[akkudoktoreos.prediction.loadimport.LoadImportCommonSettings]` | `rw` | `None` | LoadImport settings | -| LoadVrm | `Optional[akkudoktoreos.prediction.loadvrm.LoadVrmCommonSettings]` | `rw` | `None` | LoadVrm settings | -::: - - - -**Example Input/Output** - - - -```json - { - "load": { - "provider_settings": { - "LoadAkkudoktor": null, - "LoadVrm": null, - "LoadImport": null + "loadakkudoktor": { + "loadakkudoktor_year_energy_kwh": 40421.0 } } } diff --git a/docs/_generated/openapi.md b/docs/_generated/openapi.md index 910b0a8..58e28e9 100644 --- a/docs/_generated/openapi.md +++ b/docs/_generated/openapi.md @@ -1,6 +1,6 @@ # Akkudoktor-EOS -**Version**: `v0.2.0.dev2602242106748274` +**Version**: `v0.2.0.dev2602250574650225` **Description**: This project provides a comprehensive solution for simulating and optimizing an energy system based on renewable energy sources. With a focus on photovoltaic (PV) systems, battery storage (batteries), load management (consumer requirements), heat pumps, electric vehicles, and consideration of electricity price data, this system enables forecasting and optimization of energy flow and costs over a specified period. diff --git a/openapi.json b/openapi.json index d7b1048..01a4257 100644 --- a/openapi.json +++ b/openapi.json @@ -8,7 +8,7 @@ "name": "Apache 2.0", "url": "https://www.apache.org/licenses/LICENSE-2.0.html" }, - "version": "v0.2.0.dev2602242106748274" + "version": "v0.2.0.dev2602250574650225" }, "paths": { "/v1/admin/cache/clear": { @@ -4451,7 +4451,7 @@ "type": "string", "title": "Version", "description": "Configuration file version. Used to check compatibility.", - "default": "0.2.0.dev2602242106748274" + "default": "0.2.0.dev2602250574650225" }, "data_folder_path": { "type": "string", @@ -4514,7 +4514,7 @@ "type": "string", "title": "Version", "description": "Configuration file version. Used to check compatibility.", - "default": "0.2.0.dev2602242106748274" + "default": "0.2.0.dev2602250574650225" }, "data_folder_path": { "type": "string", @@ -5942,55 +5942,6 @@ "title": "LoadAkkudoktorCommonSettings", "description": "Common settings for load data import from file." }, - "LoadCommonProviderSettings": { - "properties": { - "LoadAkkudoktor": { - "anyOf": [ - { - "$ref": "#/components/schemas/LoadAkkudoktorCommonSettings" - }, - { - "type": "null" - } - ], - "description": "LoadAkkudoktor settings", - "examples": [ - null - ] - }, - "LoadVrm": { - "anyOf": [ - { - "$ref": "#/components/schemas/LoadVrmCommonSettings" - }, - { - "type": "null" - } - ], - "description": "LoadVrm settings", - "examples": [ - null - ] - }, - "LoadImport": { - "anyOf": [ - { - "$ref": "#/components/schemas/LoadImportCommonSettings" - }, - { - "type": "null" - } - ], - "description": "LoadImport settings", - "examples": [ - null - ] - } - }, - "type": "object", - "title": "LoadCommonProviderSettings", - "description": "Load Prediction Provider Configuration." - }, "LoadCommonSettings-Input": { "properties": { "provider": { @@ -6008,12 +5959,17 @@ "LoadAkkudoktor" ] }, - "provider_settings": { - "$ref": "#/components/schemas/LoadCommonProviderSettings", - "description": "Provider settings", - "examples": [ - {} - ] + "loadakkudoktor": { + "$ref": "#/components/schemas/LoadAkkudoktorCommonSettings", + "description": "LoadAkkudoktor provider settings." + }, + "loadvrm": { + "$ref": "#/components/schemas/LoadVrmCommonSettings", + "description": "LoadVrm provider settings." + }, + "loadimport": { + "$ref": "#/components/schemas/LoadImportCommonSettings", + "description": "LoadImport provider settings." } }, "type": "object", @@ -6037,12 +5993,17 @@ "LoadAkkudoktor" ] }, - "provider_settings": { - "$ref": "#/components/schemas/LoadCommonProviderSettings", - "description": "Provider settings", - "examples": [ - {} - ] + "loadakkudoktor": { + "$ref": "#/components/schemas/LoadAkkudoktorCommonSettings", + "description": "LoadAkkudoktor provider settings." + }, + "loadvrm": { + "$ref": "#/components/schemas/LoadVrmCommonSettings", + "description": "LoadVrm provider settings." + }, + "loadimport": { + "$ref": "#/components/schemas/LoadImportCommonSettings", + "description": "LoadImport provider settings." }, "providers": { "items": { @@ -8785,13 +8746,6 @@ "type": { "type": "string", "title": "Error Type" - }, - "input": { - "title": "Input" - }, - "ctx": { - "type": "object", - "title": "Context" } }, "type": "object", diff --git a/src/akkudoktoreos/config/configmigrate.py b/src/akkudoktoreos/config/configmigrate.py index 4bbdec5..9aab653 100644 --- a/src/akkudoktoreos/config/configmigrate.py +++ b/src/akkudoktoreos/config/configmigrate.py @@ -43,16 +43,21 @@ MIGRATION_MAP: Dict[ # 0.2.0 -> 0.2.0+dev "elecprice/provider_settings/ElecPriceImport/import_file_path": "elecprice/elecpriceimport/import_file_path", "elecprice/provider_settings/ElecPriceImport/import_json": "elecprice/elecpriceimport/import_json", + "load/provider_settings/LoadAkkudoktor/loadakkudoktor_year_energy_kwh": "load/loadakkudoktor/loadakkudoktor_year_energy_kwh", + "load/provider_settings/LoadVrm/load_vrm_idsite": "load/loadvrm/load_vrm_idsite", + "load/provider_settings/LoadVrm/load_vrm_token": "load/loadvrm/load_vrm_token", + "load/provider_settings/LoadImport/import_file_path": "load/loadimport/import_file_path", + "load/provider_settings/LoadImport/import_json": "load/loadimport/import_json", # 0.1.0 -> 0.2.0+dev "devices/batteries/0/initial_soc_percentage": None, "devices/electric_vehicles/0/initial_soc_percentage": None, "elecprice/provider_settings/import_file_path": "elecprice/elecpriceimport/import_file_path", "elecprice/provider_settings/import_json": "elecprice/elecpriceimport/import_json", - "load/provider_settings/import_file_path": "load/provider_settings/LoadImport/import_file_path", - "load/provider_settings/import_json": "load/provider_settings/LoadImport/import_json", - "load/provider_settings/loadakkudoktor_year_energy": "load/provider_settings/LoadAkkudoktor/loadakkudoktor_year_energy_kwh", - "load/provider_settings/load_vrm_idsite": "load/provider_settings/LoadVrm/load_vrm_idsite", - "load/provider_settings/load_vrm_token": "load/provider_settings/LoadVrm/load_vrm_token", + "load/provider_settings/import_file_path": "load/loadimport/import_file_path", + "load/provider_settings/import_json": "load/loadimport/import_json", + "load/provider_settings/loadakkudoktor_year_energy": "load/loadakkudoktor/loadakkudoktor_year_energy_kwh", + "load/provider_settings/load_vrm_idsite": "load/loadvrm/load_vrm_idsite", + "load/provider_settings/load_vrm_token": "load/loadvrm/load_vrm_token", "logging/level": "logging/console_level", "logging/root_level": None, "measurement/load0_name": "measurement/load_emr_keys/0", diff --git a/src/akkudoktoreos/core/dataabc.py b/src/akkudoktoreos/core/dataabc.py index c035076..89cad5a 100644 --- a/src/akkudoktoreos/core/dataabc.py +++ b/src/akkudoktoreos/core/dataabc.py @@ -1982,8 +1982,14 @@ class DataContainer(SingletonMixin, DataABC, MutableMapping): provider.update_data(force_enable=force_enable, force_update=force_update) except Exception as ex: error = f"Provider {provider.provider_id()} fails on update - enabled={provider.enabled()}, force_enable={force_enable}, force_update={force_update}: {ex}" - logger.error(error) - raise RuntimeError(error) + if provider.enabled(): + # The active provider failed — this is a real error worth propagating. + logger.error(error) + raise RuntimeError(error) + else: + # A non-active provider failed (e.g. missing config while force_enable=True). + # Log as warning and continue so the remaining providers still run. + logger.warning(error) def key_to_series( self, diff --git a/src/akkudoktoreos/optimization/genetic/geneticparams.py b/src/akkudoktoreos/optimization/genetic/geneticparams.py index f073801..7016765 100644 --- a/src/akkudoktoreos/optimization/genetic/geneticparams.py +++ b/src/akkudoktoreos/optimization/genetic/geneticparams.py @@ -337,10 +337,8 @@ class GeneticOptimizationParameters( { "load": { "provider": "LoadAkkudoktor", - "provider_settings": { - "LoadAkkudoktor": { - "loadakkudoktor_year_energy_kwh": "3000", - }, + "loadakkudoktor": { + "loadakkudoktor_year_energy_kwh": "3000", }, }, } diff --git a/src/akkudoktoreos/prediction/load.py b/src/akkudoktoreos/prediction/load.py index 92def68..6800bf2 100644 --- a/src/akkudoktoreos/prediction/load.py +++ b/src/akkudoktoreos/prediction/load.py @@ -28,21 +28,6 @@ def load_providers() -> list[str]: ] -class LoadCommonProviderSettings(SettingsBaseModel): - """Load Prediction Provider Configuration.""" - - LoadAkkudoktor: Optional[LoadAkkudoktorCommonSettings] = Field( - default=None, - json_schema_extra={"description": "LoadAkkudoktor settings", "examples": [None]}, - ) - LoadVrm: Optional[LoadVrmCommonSettings] = Field( - default=None, json_schema_extra={"description": "LoadVrm settings", "examples": [None]} - ) - LoadImport: Optional[LoadImportCommonSettings] = Field( - default=None, json_schema_extra={"description": "LoadImport settings", "examples": [None]} - ) - - class LoadCommonSettings(SettingsBaseModel): """Load Prediction Configuration.""" @@ -54,19 +39,19 @@ class LoadCommonSettings(SettingsBaseModel): }, ) - provider_settings: LoadCommonProviderSettings = Field( - default_factory=LoadCommonProviderSettings, - json_schema_extra={ - "description": "Provider settings", - "examples": [ - # Example 1: Empty/default settings (all providers None) - { - "LoadAkkudoktor": None, - "LoadVrm": None, - "LoadImport": None, - }, - ], - }, + loadakkudoktor: LoadAkkudoktorCommonSettings = Field( + default_factory=LoadAkkudoktorCommonSettings, + json_schema_extra={"description": "LoadAkkudoktor provider settings."}, + ) + + loadvrm: LoadVrmCommonSettings = Field( + default_factory=LoadVrmCommonSettings, + json_schema_extra={"description": "LoadVrm provider settings."}, + ) + + loadimport: LoadImportCommonSettings = Field( + default_factory=LoadImportCommonSettings, + json_schema_extra={"description": "LoadImport provider settings."}, ) @computed_field # type: ignore[prop-decorator] diff --git a/src/akkudoktoreos/prediction/loadakkudoktor.py b/src/akkudoktoreos/prediction/loadakkudoktor.py index c34f4e0..83aa8ab 100644 --- a/src/akkudoktoreos/prediction/loadakkudoktor.py +++ b/src/akkudoktoreos/prediction/loadakkudoktor.py @@ -56,9 +56,7 @@ class LoadAkkudoktor(LoadProvider): ) # Calculate values in W by relative profile data and yearly consumption given in kWh data_year_energy = ( - profile_data - * self.config.load.provider_settings.LoadAkkudoktor.loadakkudoktor_year_energy_kwh - * 1000 + profile_data * self.config.load.loadakkudoktor.loadakkudoktor_year_energy_kwh * 1000 ) except FileNotFoundError: error_msg = f"Error: File {load_file} not found." diff --git a/src/akkudoktoreos/prediction/loadimport.py b/src/akkudoktoreos/prediction/loadimport.py index bbb7750..e171ed31 100644 --- a/src/akkudoktoreos/prediction/loadimport.py +++ b/src/akkudoktoreos/prediction/loadimport.py @@ -9,7 +9,6 @@ format, enabling consistent access to forecasted and historical load attributes. from pathlib import Path from typing import Optional, Union -from loguru import logger from pydantic import Field, field_validator from akkudoktoreos.config.configabc import SettingsBaseModel @@ -64,14 +63,7 @@ class LoadImport(LoadProvider, PredictionImportProvider): return "LoadImport" def _update_data(self, force_update: Optional[bool] = False) -> None: - if self.config.load.provider_settings.LoadImport is None: - logger.debug(f"{self.provider_id()} data update without provider settings.") - return - if self.config.load.provider_settings.LoadImport.import_file_path: - self.import_from_file( - self.config.provider_settings.LoadImport.import_file_path, key_prefix="load" - ) - if self.config.load.provider_settings.LoadImport.import_json: - self.import_from_json( - self.config.load.provider_settings.LoadImport.import_json, key_prefix="load" - ) + if self.config.load.loadimport.import_file_path: + self.import_from_file(self.config.load.loadimport.import_file_path, key_prefix="load") + if self.config.load.loadimport.import_json: + self.import_from_json(self.config.load.loadimport.import_json, key_prefix="load") diff --git a/src/akkudoktoreos/prediction/loadvrm.py b/src/akkudoktoreos/prediction/loadvrm.py index ead31bb..b3958ad 100644 --- a/src/akkudoktoreos/prediction/loadvrm.py +++ b/src/akkudoktoreos/prediction/loadvrm.py @@ -62,8 +62,9 @@ class LoadVrm(LoadProvider): def _request_forecast(self, start_ts: int, end_ts: int) -> VrmForecastResponse: """Fetch forecast data from Victron VRM API.""" base_url = "https://vrmapi.victronenergy.com/v2/installations" - installation_id = self.config.load.provider_settings.LoadVrm.load_vrm_idsite - api_token = self.config.load.provider_settings.LoadVrm.load_vrm_token + vrm_settings = self.config.load.loadvrm + installation_id = vrm_settings.load_vrm_idsite + api_token = vrm_settings.load_vrm_token url = f"{base_url}/{installation_id}/stats?type=forecast&start={start_ts}&end={end_ts}&interval=hours" headers = {"X-Authorization": f"Token {api_token}", "Content-Type": "application/json"} @@ -85,6 +86,9 @@ class LoadVrm(LoadProvider): def _update_data(self, force_update: Optional[bool] = False) -> None: """Fetch and store VRM load forecast as loadforecast_power_w and related values.""" + if self.enabled is False: + logger.info("LoadVrm is disabled, skipping update.") + return start_date = self.ems_start_datetime.start_of("day") end_date = self.ems_start_datetime.add(hours=self.config.prediction.hours) start_ts = int(start_date.timestamp()) diff --git a/src/akkudoktoreos/prediction/pvforecastvrm.py b/src/akkudoktoreos/prediction/pvforecastvrm.py index 1888468..4a1db34 100644 --- a/src/akkudoktoreos/prediction/pvforecastvrm.py +++ b/src/akkudoktoreos/prediction/pvforecastvrm.py @@ -85,6 +85,9 @@ class PVForecastVrm(PVForecastProvider): def _update_data(self, force_update: Optional[bool] = False) -> None: """Update forecast data in the PVForecastDataRecord format.""" + if self.enabled is False: + logger.info("PVForecastVrm is disabled, skipping update.") + return start_date = self.ems_start_datetime.start_of("day") end_date = self.ems_start_datetime.add(hours=self.config.prediction.hours) start_ts = int(start_date.timestamp()) diff --git a/src/akkudoktoreos/server/dash/prediction.py b/src/akkudoktoreos/server/dash/prediction.py index 7e86d78..efb8627 100644 --- a/src/akkudoktoreos/server/dash/prediction.py +++ b/src/akkudoktoreos/server/dash/prediction.py @@ -154,9 +154,7 @@ def LoadForecast(predictions: pd.DataFrame, config: dict, date_time_tz: str, dar source = ColumnDataSource(predictions) provider = config["load"]["provider"] if provider == "LoadAkkudoktorAdjusted": - year_energy = config["load"]["provider_settings"]["LoadAkkudoktor"][ - "loadakkudoktor_year_energy_kwh" - ] + year_energy = config["load"]["loadakkudoktor"]["loadakkudoktor_year_energy_kwh"] provider = f"{provider}, {year_energy} kWh" plot = figure( diff --git a/src/akkudoktoreos/server/eos.py b/src/akkudoktoreos/server/eos.py index 11ed1c1..811e199 100755 --- a/src/akkudoktoreos/server/eos.py +++ b/src/akkudoktoreos/server/eos.py @@ -54,7 +54,7 @@ from akkudoktoreos.optimization.genetic.geneticparams import ( from akkudoktoreos.optimization.genetic.geneticsolution import GeneticSolution from akkudoktoreos.optimization.optimization import OptimizationSolution from akkudoktoreos.prediction.elecprice import ElecPriceCommonSettings -from akkudoktoreos.prediction.load import LoadCommonProviderSettings, LoadCommonSettings +from akkudoktoreos.prediction.load import LoadCommonSettings from akkudoktoreos.prediction.loadakkudoktor import LoadAkkudoktorCommonSettings from akkudoktoreos.prediction.pvforecast import PVForecastCommonSettings from akkudoktoreos.server.rest.cli import cli_apply_args_to_config, cli_parse_args @@ -1074,10 +1074,8 @@ async def fastapi_gesamtlast(request: GesamtlastRequest) -> list[float]: }, "load": { "provider": "LoadAkkudoktorAdjusted", - "provider_settings": { - "LoadAkkudoktor": { - "loadakkudoktor_year_energy_kwh": request.year_energy, - }, + "loadakkudoktor": { + "loadakkudoktor_year_energy_kwh": request.year_energy, }, }, "measurement": { @@ -1174,10 +1172,8 @@ async def fastapi_gesamtlast_simple(year_energy: float) -> list[float]: settings = SettingsEOS( load=LoadCommonSettings( provider="LoadAkkudoktor", - provider_settings=LoadCommonProviderSettings( - LoadAkkudoktor=LoadAkkudoktorCommonSettings( - loadakkudoktor_year_energy_kwh=year_energy / 1000, # Convert to kWh - ), + loadakkudoktor=LoadAkkudoktorCommonSettings( + loadakkudoktor_year_energy_kwh=year_energy / 1000, # Convert to kWh ), ) ) diff --git a/tests/single_test_optimization.py b/tests/single_test_optimization.py index 76a22d9..f8856dc 100755 --- a/tests/single_test_optimization.py +++ b/tests/single_test_optimization.py @@ -97,10 +97,8 @@ def prepare_optimization_real_parameters() -> GeneticOptimizationParameters: # Load Forecast "load": { "provider": "LoadAkkudoktor", - "provider_settings": { - "LoadAkkudoktor": { - "loadakkudoktor_year_energy_kwh": 5000, # Energy consumption per year in kWh - }, + "loadakkudoktor": { + "loadakkudoktor_year_energy_kwh": 5000, # Energy consumption per year in kWh }, }, # -- Simulations -- diff --git a/tests/test_loadakkudoktor.py b/tests/test_loadakkudoktor.py index 2b646f9..3fae5ea 100644 --- a/tests/test_loadakkudoktor.py +++ b/tests/test_loadakkudoktor.py @@ -20,16 +20,14 @@ def loadakkudoktor(config_eos): settings = { "load": { "provider": "LoadAkkudoktor", - "provider_settings": { - "LoadAkkudoktor": { - "loadakkudoktor_year_energy_kwh": "1000", - }, + "loadakkudoktor": { + "loadakkudoktor_year_energy_kwh": "1000", }, }, } config_eos.merge_settings_from_dict(settings) assert config_eos.load.provider == "LoadAkkudoktor" - assert config_eos.load.provider_settings.LoadAkkudoktor.loadakkudoktor_year_energy_kwh == 1000 + assert config_eos.load.loadakkudoktor.loadakkudoktor_year_energy_kwh == 1000 return LoadAkkudoktor() @pytest.fixture @@ -38,10 +36,8 @@ def loadakkudoktoradjusted(config_eos): settings = { "load": { "provider": "LoadAkkudoktorAdjusted", - "provider_settings": { - "LoadAkkudoktor": { - "loadakkudoktor_year_energy_kwh": "1000", - }, + "loadakkudoktor": { + "loadakkudoktor_year_energy_kwh": "1000", }, }, "measurement": { @@ -50,7 +46,7 @@ def loadakkudoktoradjusted(config_eos): } config_eos.merge_settings_from_dict(settings) assert config_eos.load.provider == "LoadAkkudoktorAdjusted" - assert config_eos.load.provider_settings.LoadAkkudoktor.loadakkudoktor_year_energy_kwh == 1000 + assert config_eos.load.loadakkudoktor.loadakkudoktor_year_energy_kwh == 1000 return LoadAkkudoktorAdjusted() @pytest.fixture diff --git a/tests/test_loadvrm.py b/tests/test_loadvrm.py index 918b068..9dae014 100644 --- a/tests/test_loadvrm.py +++ b/tests/test_loadvrm.py @@ -18,12 +18,10 @@ def load_vrm_instance(config_eos): settings = { "load": { "provider": "LoadVrm", - "provider_settings": { - "LoadVrm": { - "load_vrm_token": "dummy-token", - "load_vrm_idsite": 12345, - }, - } + "loadvrm": { + "load_vrm_token": "dummy-token", + "load_vrm_idsite": 12345, + }, } } config_eos.merge_settings_from_dict(settings) diff --git a/tests/testdata/eos_config_andreas_now.json b/tests/testdata/eos_config_andreas_now.json index 3391bec..9401e9e 100644 --- a/tests/testdata/eos_config_andreas_now.json +++ b/tests/testdata/eos_config_andreas_now.json @@ -56,10 +56,8 @@ "charges_kwh": 0.21 }, "load": { - "provider_settings": { - "LoadAkkudoktor": { - "loadakkudoktor_year_energy_kwh": 13000 - } + "loadakkudoktor": { + "loadakkudoktor_year_energy_kwh": 13000 } }, "pvforecast": { diff --git a/tests/testdata/eosserver_config_1.json b/tests/testdata/eosserver_config_1.json index 614bf7f..6c4811d 100644 --- a/tests/testdata/eosserver_config_1.json +++ b/tests/testdata/eosserver_config_1.json @@ -13,10 +13,8 @@ }, "load": { "provider": "LoadImport", - "provider_settings": { - "LoadAkkudoktor": { - "loadakkudoktor_year_energy_kwh": 20000 - } + "loadakkudoktor": { + "loadakkudoktor_year_energy_kwh": 20000 } }, "optimization": {