EOS/docs/_generated/config.md
Bobby Noelte ab6a518b5f Improve EOSdash.
Make EOSdash use UI components from MonsterUI to ease further development.

- Add a first menu with some dummy pages and the configuration page.
- Make the configuration scrollable.
- Add markdown component that uses markdown-it-py (same as used by
  the myth-parser for documentation generation).
- Add bokeh (https://docs.bokeh.org/) component for charts
- Added several prediction charts to demo
- Add a footer that displays connection status with EOS server
- Add logo and favicon

Update EOS server:

- Move error message generation to extra module
- Use redirect instead of proxy

Signed-off-by: Bobby Noelte <b0661n0e17e@gmail.com>
2025-02-15 14:09:53 +01:00

34 KiB

Configuration Table

Settings for common configuration

General configuration to set directories of cache and output files and system location (latitude and longitude). Validators ensure each parameter is within a specified range. A computed property, timezone, determines the time zone based on latitude and longitude.

Attributes: latitude (Optional[float]): Latitude in degrees, must be between -90 and 90. longitude (Optional[float]): Longitude in degrees, must be between -180 and 180.

Properties: timezone (Optional[str]): Computed time zone string based on the specified latitude and longitude.

Validators: validate_latitude (float): Ensures latitude is within the range -90 to 90. validate_longitude (float): Ensures longitude is within the range -180 to 180.

:::{table} general :widths: 10 20 10 5 5 30 :align: left

Name Environment Variable Type Read-Only Default Description
data_folder_path EOS_GENERAL__DATA_FOLDER_PATH Optional[pathlib.Path] rw None Path to EOS data directory.
data_output_subpath EOS_GENERAL__DATA_OUTPUT_SUBPATH Optional[pathlib.Path] rw output Sub-path for the EOS output data directory.
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 Compute timezone based on latitude and longitude.
data_output_path Optional[pathlib.Path] ro N/A Compute data_output_path based on data_folder_path.
config_folder_path Optional[pathlib.Path] ro N/A Path to EOS configuration directory.
config_file_path Optional[pathlib.Path] ro N/A Path to EOS configuration file.
:::

Example Input

.. code-block:: json

   {
       "general": {
           "data_folder_path": null,
           "data_output_subpath": "output",
           "latitude": 52.52,
           "longitude": 13.405
       }
   }

Example Output

.. code-block:: json

   {
       "general": {
           "data_folder_path": null,
           "data_output_subpath": "output",
           "latitude": 52.52,
           "longitude": 13.405,
           "timezone": "Europe/Berlin",
           "data_output_path": null,
           "config_folder_path": "/home/user/.config/net.akkudoktoreos.net",
           "config_file_path": "/home/user/.config/net.akkudoktoreos.net/EOS.config.json"
       }
   }

Cache Configuration

:::{table} cache :widths: 10 20 10 5 5 30 :align: left

Name Environment Variable Type Read-Only Default Description
subpath EOS_CACHE__SUBPATH Optional[pathlib.Path] rw cache Sub-path for the EOS cache data directory.
cleanup_interval EOS_CACHE__CLEANUP_INTERVAL float rw 300 Intervall in seconds for EOS file cache cleanup.
:::

Example Input/Output

.. code-block:: json

   {
       "cache": {
           "subpath": "cache",
           "cleanup_interval": 300.0
       }
   }

Energy Management Configuration

:::{table} ems :widths: 10 20 10 5 5 30 :align: left

Name Environment Variable Type Read-Only Default Description
startup_delay EOS_EMS__STARTUP_DELAY float rw 5 Startup delay in seconds for EOS energy management runs.
interval EOS_EMS__INTERVAL Optional[float] rw None Intervall in seconds between EOS energy management runs.
:::

Example Input/Output

.. code-block:: json

   {
       "ems": {
           "startup_delay": 5.0,
           "interval": 300.0
       }
   }

Logging Configuration

:::{table} logging :widths: 10 20 10 5 5 30 :align: left

Name Environment Variable Type Read-Only Default Description
level EOS_LOGGING__LEVEL Optional[str] rw None EOS default logging level.
root_level str ro N/A Root logger logging level.
:::

Example Input

.. code-block:: json

   {
       "logging": {
           "level": "INFO"
       }
   }

Example Output

.. code-block:: json

   {
       "logging": {
           "level": "INFO",
           "root_level": "INFO"
       }
   }

Base configuration for devices simulation settings

:::{table} devices :widths: 10 20 10 5 5 30 :align: left

Name Environment Variable Type Read-Only Default Description
batteries EOS_DEVICES__BATTERIES Optional[list[akkudoktoreos.devices.battery.BaseBatteryParameters]] rw None List of battery/ev devices
inverters EOS_DEVICES__INVERTERS Optional[list[akkudoktoreos.devices.inverter.InverterParameters]] rw None List of inverters
home_appliances EOS_DEVICES__HOME_APPLIANCES Optional[list[akkudoktoreos.devices.generic.HomeApplianceParameters]] rw None List of home appliances
:::

Example Input/Output

.. code-block:: json

   {
       "devices": {
           "batteries": [
               {
                   "device_id": "battery1",
                   "hours": null,
                   "capacity_wh": 8000,
                   "charging_efficiency": 0.88,
                   "discharging_efficiency": 0.88,
                   "max_charge_power_w": 5000,
                   "initial_soc_percentage": 0,
                   "min_soc_percentage": 0,
                   "max_soc_percentage": 100
               }
           ],
           "inverters": [],
           "home_appliances": []
       }
   }

Home Appliance Device Simulation Configuration

:::{table} devices::home_appliances::list :widths: 10 10 5 5 30 :align: left

Name Type Read-Only Default Description
device_id str rw required ID of home appliance
hours Optional[int] rw None Number of prediction hours. Defaults to global config prediction hours.
consumption_wh int rw required An integer representing the energy consumption of a household device in watt-hours.
duration_h int rw required An integer representing the usage duration of a household device in hours.
:::

Example Input/Output

.. code-block:: json

   {
       "devices": {
           "home_appliances": [
               {
                   "device_id": "dishwasher",
                   "hours": null,
                   "consumption_wh": 2000,
                   "duration_h": 3
               }
           ]
       }
   }

Inverter Device Simulation Configuration

:::{table} devices::inverters::list :widths: 10 10 5 5 30 :align: left

Name Type Read-Only Default Description
device_id str rw required ID of inverter
hours Optional[int] rw None Number of prediction hours. Defaults to global config prediction hours.
max_power_wh float rw required -
battery_id Optional[str] rw None ID of battery
:::

Example Input/Output

.. code-block:: json

   {
       "devices": {
           "inverters": [
               {
                   "device_id": "inverter1",
                   "hours": null,
                   "max_power_wh": 10000.0,
                   "battery_id": null
               }
           ]
       }
   }

Battery Device Simulation Configuration

:::{table} devices::batteries::list :widths: 10 10 5 5 30 :align: left

Name Type Read-Only Default Description
device_id str rw required ID of battery
hours Optional[int] rw None Number of prediction hours. Defaults to global config prediction hours.
capacity_wh int rw required An integer representing the capacity of the battery in watt-hours.
charging_efficiency float rw 0.88 A float representing the charging efficiency of the battery.
discharging_efficiency float rw 0.88 A float representing the discharge efficiency of the battery.
max_charge_power_w Optional[float] rw 5000 Maximum charging power in watts.
initial_soc_percentage int rw 0 An integer representing the state of charge of the battery at the start of the current hour (not the current state).
min_soc_percentage int rw 0 An integer representing the minimum state of charge (SOC) of the battery in percentage.
max_soc_percentage int rw 100 An integer representing the maximum state of charge (SOC) of the battery in percentage.
:::

Example Input/Output

.. code-block:: json

   {
       "devices": {
           "batteries": [
               {
                   "device_id": "battery1",
                   "hours": null,
                   "capacity_wh": 8000,
                   "charging_efficiency": 0.88,
                   "discharging_efficiency": 0.88,
                   "max_charge_power_w": 5000.0,
                   "initial_soc_percentage": 42,
                   "min_soc_percentage": 10,
                   "max_soc_percentage": 100
               }
           ]
       }
   }

Measurement Configuration

:::{table} measurement :widths: 10 20 10 5 5 30 :align: left

Name Environment Variable Type Read-Only Default Description
load0_name EOS_MEASUREMENT__LOAD0_NAME Optional[str] rw None Name of the load0 source
load1_name EOS_MEASUREMENT__LOAD1_NAME Optional[str] rw None Name of the load1 source
load2_name EOS_MEASUREMENT__LOAD2_NAME Optional[str] rw None Name of the load2 source
load3_name EOS_MEASUREMENT__LOAD3_NAME Optional[str] rw None Name of the load3 source
load4_name EOS_MEASUREMENT__LOAD4_NAME Optional[str] rw None Name of the load4 source
:::

Example Input/Output

.. code-block:: json

   {
       "measurement": {
           "load0_name": "Household",
           "load1_name": null,
           "load2_name": null,
           "load3_name": null,
           "load4_name": null
       }
   }

General Optimization Configuration

Attributes: hours (int): Number of hours for optimizations.

:::{table} optimization :widths: 10 20 10 5 5 30 :align: left

Name Environment Variable Type Read-Only Default Description
hours EOS_OPTIMIZATION__HOURS Optional[int] rw 48 Number of hours into the future for optimizations.
penalty EOS_OPTIMIZATION__PENALTY Optional[int] rw 10 Penalty factor used in optimization.
ev_available_charge_rates_percent EOS_OPTIMIZATION__EV_AVAILABLE_CHARGE_RATES_PERCENT Optional[List[float]] rw [0.0, 0.375, 0.5, 0.625, 0.75, 0.875, 1.0] Charge rates available for the EV in percent of maximum charge.
:::

Example Input/Output

.. code-block:: json

   {
       "optimization": {
           "hours": 48,
           "penalty": 10,
           "ev_available_charge_rates_percent": [
               0.0,
               0.375,
               0.5,
               0.625,
               0.75,
               0.875,
               1.0
           ]
       }
   }

General Prediction Configuration

This class provides configuration for prediction settings, allowing users to specify parameters such as the forecast duration (in hours). Validators ensure each parameter is within a specified range.

Attributes: hours (Optional[int]): Number of hours into the future for predictions. Must be non-negative. historic_hours (Optional[int]): Number of hours into the past for historical data. Must be non-negative.

Validators: validate_hours (int): Ensures hours is a non-negative integer. validate_historic_hours (int): Ensures historic_hours is a non-negative integer.

:::{table} prediction :widths: 10 20 10 5 5 30 :align: left

Name Environment Variable Type Read-Only Default Description
hours EOS_PREDICTION__HOURS Optional[int] rw 48 Number of hours into the future for predictions
historic_hours EOS_PREDICTION__HISTORIC_HOURS Optional[int] rw 48 Number of hours into the past for historical predictions data
:::

Example Input/Output

.. code-block:: json

   {
       "prediction": {
           "hours": 48,
           "historic_hours": 48
       }
   }

Electricity Price Prediction Configuration

:::{table} elecprice :widths: 10 20 10 5 5 30 :align: left

Name Environment Variable Type Read-Only Default Description
provider EOS_ELECPRICE__PROVIDER Optional[str] rw None Electricity price provider id of provider to be used.
charges_kwh EOS_ELECPRICE__CHARGES_KWH Optional[float] rw None Electricity price charges (€/kWh).
provider_settings EOS_ELECPRICE__PROVIDER_SETTINGS Optional[akkudoktoreos.prediction.elecpriceimport.ElecPriceImportCommonSettings] rw None Provider settings
:::

Example Input/Output

.. code-block:: json

   {
       "elecprice": {
           "provider": "ElecPriceAkkudoktor",
           "charges_kwh": 0.21,
           "provider_settings": null
       }
   }

Common settings for elecprice data import from file or JSON String

:::{table} elecprice::provider_settings :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 elecprice data from.
import_json Optional[str] rw None JSON string, dictionary of electricity price forecast value lists.
:::

Example Input/Output

.. code-block:: json

   {
       "elecprice": {
           "provider_settings": {
               "import_file_path": null,
               "import_json": "{\"elecprice_marketprice_wh\": [0.0003384, 0.0003318, 0.0003284]}"
           }
       }
   }

Load Prediction Configuration

:::{table} load :widths: 10 20 10 5 5 30 :align: left

Name Environment Variable Type Read-Only Default Description
provider EOS_LOAD__PROVIDER Optional[str] rw None Load provider id of provider to be used.
provider_settings EOS_LOAD__PROVIDER_SETTINGS Union[akkudoktoreos.prediction.loadakkudoktor.LoadAkkudoktorCommonSettings, akkudoktoreos.prediction.loadimport.LoadImportCommonSettings, NoneType] rw None Provider settings
:::

Example Input/Output

.. code-block:: json

   {
       "load": {
           "provider": "LoadAkkudoktor",
           "provider_settings": null
       }
   }

Common settings for load data import from file or JSON string

:::{table} load::provider_settings :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

.. code-block:: json

   {
       "load": {
           "provider_settings": {
               "import_file_path": null,
               "import_json": "{\"load0_mean\": [676.71, 876.19, 527.13]}"
           }
       }
   }

Common settings for load data import from file

:::{table} load::provider_settings :widths: 10 10 5 5 30 :align: left

Name Type Read-Only Default Description
loadakkudoktor_year_energy Optional[float] rw None Yearly energy consumption (kWh).
:::

Example Input/Output

.. code-block:: json

   {
       "load": {
           "provider_settings": {
               "loadakkudoktor_year_energy": 40421.0
           }
       }
   }

PV Forecast Configuration

:::{table} pvforecast :widths: 10 20 10 5 5 30 :align: left

Name Environment Variable Type Read-Only Default Description
provider EOS_PVFORECAST__PROVIDER Optional[str] rw None PVForecast provider id of provider to be used.
planes EOS_PVFORECAST__PLANES Optional[list[akkudoktoreos.prediction.pvforecast.PVForecastPlaneSetting]] rw None Plane configuration.
provider_settings EOS_PVFORECAST__PROVIDER_SETTINGS Optional[akkudoktoreos.prediction.pvforecastimport.PVForecastImportCommonSettings] rw None Provider settings
planes_peakpower List[float] ro N/A Compute a list of the peak power per active planes.
planes_azimuth List[float] ro N/A Compute a list of the azimuths per active planes.
planes_tilt List[float] ro N/A Compute a list of the tilts per active planes.
planes_userhorizon Any ro N/A Compute a list of the user horizon per active planes.
planes_inverter_paco Any ro N/A Compute a list of the maximum power rating of the inverter per active planes.
:::

Example Input

.. code-block:: json

   {
       "pvforecast": {
           "provider": "PVForecastAkkudoktor",
           "planes": [
               {
                   "surface_tilt": 10.0,
                   "surface_azimuth": 10.0,
                   "userhorizon": [
                       10.0,
                       20.0,
                       30.0
                   ],
                   "peakpower": 5.0,
                   "pvtechchoice": "crystSi",
                   "mountingplace": "free",
                   "loss": 14.0,
                   "trackingtype": 0,
                   "optimal_surface_tilt": false,
                   "optimalangles": false,
                   "albedo": null,
                   "module_model": null,
                   "inverter_model": null,
                   "inverter_paco": 6000,
                   "modules_per_string": 20,
                   "strings_per_inverter": 2
               },
               {
                   "surface_tilt": 20.0,
                   "surface_azimuth": 20.0,
                   "userhorizon": [
                       5.0,
                       15.0,
                       25.0
                   ],
                   "peakpower": 3.5,
                   "pvtechchoice": "crystSi",
                   "mountingplace": "free",
                   "loss": 14.0,
                   "trackingtype": 1,
                   "optimal_surface_tilt": false,
                   "optimalangles": false,
                   "albedo": null,
                   "module_model": null,
                   "inverter_model": null,
                   "inverter_paco": 4000,
                   "modules_per_string": 20,
                   "strings_per_inverter": 2
               }
           ],
           "provider_settings": null
       }
   }

Example Output

.. code-block:: json

   {
       "pvforecast": {
           "provider": "PVForecastAkkudoktor",
           "planes": [
               {
                   "surface_tilt": 10.0,
                   "surface_azimuth": 10.0,
                   "userhorizon": [
                       10.0,
                       20.0,
                       30.0
                   ],
                   "peakpower": 5.0,
                   "pvtechchoice": "crystSi",
                   "mountingplace": "free",
                   "loss": 14.0,
                   "trackingtype": 0,
                   "optimal_surface_tilt": false,
                   "optimalangles": false,
                   "albedo": null,
                   "module_model": null,
                   "inverter_model": null,
                   "inverter_paco": 6000,
                   "modules_per_string": 20,
                   "strings_per_inverter": 2
               },
               {
                   "surface_tilt": 20.0,
                   "surface_azimuth": 20.0,
                   "userhorizon": [
                       5.0,
                       15.0,
                       25.0
                   ],
                   "peakpower": 3.5,
                   "pvtechchoice": "crystSi",
                   "mountingplace": "free",
                   "loss": 14.0,
                   "trackingtype": 1,
                   "optimal_surface_tilt": false,
                   "optimalangles": false,
                   "albedo": null,
                   "module_model": null,
                   "inverter_model": null,
                   "inverter_paco": 4000,
                   "modules_per_string": 20,
                   "strings_per_inverter": 2
               }
           ],
           "provider_settings": null,
           "planes_peakpower": [
               5.0,
               3.5
           ],
           "planes_azimuth": [
               10.0,
               20.0
           ],
           "planes_tilt": [
               10.0,
               20.0
           ],
           "planes_userhorizon": [
               [
                   10.0,
                   20.0,
                   30.0
               ],
               [
                   5.0,
                   15.0,
                   25.0
               ]
           ],
           "planes_inverter_paco": [
               6000.0,
               4000.0
           ]
       }
   }

Common settings for pvforecast data import from file or JSON string

:::{table} pvforecast::provider_settings :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 PV forecast data from.
import_json Optional[str] rw None JSON string, dictionary of PV forecast value lists.
:::

Example Input/Output

.. code-block:: json

   {
       "pvforecast": {
           "provider_settings": {
               "import_file_path": null,
               "import_json": "{\"pvforecast_ac_power\": [0, 8.05, 352.91]}"
           }
       }
   }

PV Forecast Plane Configuration

:::{table} pvforecast::planes::list :widths: 10 10 5 5 30 :align: left

Name Type Read-Only Default Description
surface_tilt Optional[float] rw None Tilt angle from horizontal plane. Ignored for two-axis tracking.
surface_azimuth Optional[float] rw None Orientation (azimuth angle) of the (fixed) plane. Clockwise from north (north=0, east=90, south=180, west=270).
userhorizon Optional[List[float]] rw None Elevation of horizon in degrees, at equally spaced azimuth clockwise from north.
peakpower Optional[float] rw None Nominal power of PV system in kW.
pvtechchoice Optional[str] rw crystSi PV technology. One of 'crystSi', 'CIS', 'CdTe', 'Unknown'.
mountingplace Optional[str] rw free Type of mounting for PV system. Options are 'free' for free-standing and 'building' for building-integrated.
loss Optional[float] rw 14.0 Sum of PV system losses in percent
trackingtype Optional[int] rw None Type of suntracking. 0=fixed, 1=single horizontal axis aligned north-south, 2=two-axis tracking, 3=vertical axis tracking, 4=single horizontal axis aligned east-west, 5=single inclined axis aligned north-south.
optimal_surface_tilt Optional[bool] rw False Calculate the optimum tilt angle. Ignored for two-axis tracking.
optimalangles Optional[bool] rw False Calculate the optimum tilt and azimuth angles. Ignored for two-axis tracking.
albedo Optional[float] rw None Proportion of the light hitting the ground that it reflects back.
module_model Optional[str] rw None Model of the PV modules of this plane.
inverter_model Optional[str] rw None Model of the inverter of this plane.
inverter_paco Optional[int] rw None AC power rating of the inverter. [W]
modules_per_string Optional[int] rw None Number of the PV modules of the strings of this plane.
strings_per_inverter Optional[int] rw None Number of the strings of the inverter of this plane.
:::

Example Input/Output

.. code-block:: json

   {
       "pvforecast": {
           "planes": [
               {
                   "surface_tilt": 10.0,
                   "surface_azimuth": 10.0,
                   "userhorizon": [
                       10.0,
                       20.0,
                       30.0
                   ],
                   "peakpower": 5.0,
                   "pvtechchoice": "crystSi",
                   "mountingplace": "free",
                   "loss": 14.0,
                   "trackingtype": 0,
                   "optimal_surface_tilt": false,
                   "optimalangles": false,
                   "albedo": null,
                   "module_model": null,
                   "inverter_model": null,
                   "inverter_paco": 6000,
                   "modules_per_string": 20,
                   "strings_per_inverter": 2
               },
               {
                   "surface_tilt": 20.0,
                   "surface_azimuth": 20.0,
                   "userhorizon": [
                       5.0,
                       15.0,
                       25.0
                   ],
                   "peakpower": 3.5,
                   "pvtechchoice": "crystSi",
                   "mountingplace": "free",
                   "loss": 14.0,
                   "trackingtype": 1,
                   "optimal_surface_tilt": false,
                   "optimalangles": false,
                   "albedo": null,
                   "module_model": null,
                   "inverter_model": null,
                   "inverter_paco": 4000,
                   "modules_per_string": 20,
                   "strings_per_inverter": 2
               }
           ]
       }
   }

Weather Forecast Configuration

:::{table} weather :widths: 10 20 10 5 5 30 :align: left

Name Environment Variable Type Read-Only Default Description
provider EOS_WEATHER__PROVIDER Optional[str] rw None Weather provider id of provider to be used.
provider_settings EOS_WEATHER__PROVIDER_SETTINGS Optional[akkudoktoreos.prediction.weatherimport.WeatherImportCommonSettings] rw None Provider settings
:::

Example Input/Output

.. code-block:: json

   {
       "weather": {
           "provider": "WeatherImport",
           "provider_settings": null
       }
   }

Common settings for weather data import from file or JSON string

:::{table} weather::provider_settings :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 weather data from.
import_json Optional[str] rw None JSON string, dictionary of weather forecast value lists.
:::

Example Input/Output

.. code-block:: json

   {
       "weather": {
           "provider_settings": {
               "import_file_path": null,
               "import_json": "{\"weather_temp_air\": [18.3, 17.8, 16.9]}"
           }
       }
   }

Server Configuration

:::{table} server :widths: 10 20 10 5 5 30 :align: left

Name Environment Variable Type Read-Only Default Description
host EOS_SERVER__HOST Optional[pydantic.networks.IPvAnyAddress] rw 0.0.0.0 EOS server IP address.
port EOS_SERVER__PORT Optional[int] rw 8503 EOS server IP port number.
verbose EOS_SERVER__VERBOSE Optional[bool] rw False Enable debug output
startup_eosdash EOS_SERVER__STARTUP_EOSDASH Optional[bool] rw True EOS server to start EOSdash server.
eosdash_host EOS_SERVER__EOSDASH_HOST Optional[pydantic.networks.IPvAnyAddress] rw 0.0.0.0 EOSdash server IP address.
eosdash_port EOS_SERVER__EOSDASH_PORT Optional[int] rw 8504 EOSdash server IP port number.
:::

Example Input/Output

.. code-block:: json

   {
       "server": {
           "host": "0.0.0.0",
           "port": 8503,
           "verbose": false,
           "startup_eosdash": true,
           "eosdash_host": "0.0.0.0",
           "eosdash_port": 8504
       }
   }

Utils Configuration

:::{table} utils :widths: 10 20 10 5 5 30 :align: left

Name Environment Variable Type Read-Only Default Description
:::

Example Input/Output

.. code-block:: json

   {
       "utils": {}
   }

Full example Config

.. code-block:: json

   {
       "general": {
           "data_folder_path": null,
           "data_output_subpath": "output",
           "latitude": 52.52,
           "longitude": 13.405
       },
       "cache": {
           "subpath": "cache",
           "cleanup_interval": 300.0
       },
       "ems": {
           "startup_delay": 5.0,
           "interval": 300.0
       },
       "logging": {
           "level": "INFO"
       },
       "devices": {
           "batteries": [
               {
                   "device_id": "battery1",
                   "hours": null,
                   "capacity_wh": 8000,
                   "charging_efficiency": 0.88,
                   "discharging_efficiency": 0.88,
                   "max_charge_power_w": 5000,
                   "initial_soc_percentage": 0,
                   "min_soc_percentage": 0,
                   "max_soc_percentage": 100
               }
           ],
           "inverters": [],
           "home_appliances": []
       },
       "measurement": {
           "load0_name": "Household",
           "load1_name": null,
           "load2_name": null,
           "load3_name": null,
           "load4_name": null
       },
       "optimization": {
           "hours": 48,
           "penalty": 10,
           "ev_available_charge_rates_percent": [
               0.0,
               0.375,
               0.5,
               0.625,
               0.75,
               0.875,
               1.0
           ]
       },
       "prediction": {
           "hours": 48,
           "historic_hours": 48
       },
       "elecprice": {
           "provider": "ElecPriceAkkudoktor",
           "charges_kwh": 0.21,
           "provider_settings": null
       },
       "load": {
           "provider": "LoadAkkudoktor",
           "provider_settings": null
       },
       "pvforecast": {
           "provider": "PVForecastAkkudoktor",
           "planes": [
               {
                   "surface_tilt": 10.0,
                   "surface_azimuth": 10.0,
                   "userhorizon": [
                       10.0,
                       20.0,
                       30.0
                   ],
                   "peakpower": 5.0,
                   "pvtechchoice": "crystSi",
                   "mountingplace": "free",
                   "loss": 14.0,
                   "trackingtype": 0,
                   "optimal_surface_tilt": false,
                   "optimalangles": false,
                   "albedo": null,
                   "module_model": null,
                   "inverter_model": null,
                   "inverter_paco": 6000,
                   "modules_per_string": 20,
                   "strings_per_inverter": 2
               },
               {
                   "surface_tilt": 20.0,
                   "surface_azimuth": 20.0,
                   "userhorizon": [
                       5.0,
                       15.0,
                       25.0
                   ],
                   "peakpower": 3.5,
                   "pvtechchoice": "crystSi",
                   "mountingplace": "free",
                   "loss": 14.0,
                   "trackingtype": 1,
                   "optimal_surface_tilt": false,
                   "optimalangles": false,
                   "albedo": null,
                   "module_model": null,
                   "inverter_model": null,
                   "inverter_paco": 4000,
                   "modules_per_string": 20,
                   "strings_per_inverter": 2
               }
           ],
           "provider_settings": null
       },
       "weather": {
           "provider": "WeatherImport",
           "provider_settings": null
       },
       "server": {
           "host": "0.0.0.0",
           "port": 8503,
           "verbose": false,
           "startup_eosdash": true,
           "eosdash_host": "0.0.0.0",
           "eosdash_port": 8504
       },
       "utils": {}
   }