mirror of
https://github.com/Akkudoktor-EOS/EOS.git
synced 2025-04-17 07:55:15 +00:00
* Migrate from Flask to FastAPI * FastAPI migration: - Use pydantic model classes as input parameters to the data/calculation classes. - Interface field names changed to constructor parameter names (for simplicity only during transition, should be updated in a followup PR). - Add basic interface requirements (e.g. some values > 0, etc.). * Update tests for new data format. * Python requirement down to 3.9 (TypeGuard no longer needed) * Makefile: Add helpful targets (e.g. development server with reload) * Move API doc from README to pydantic model classes (swagger) * Link to swagger.io with own openapi.yml. * Commit openapi.json and check with pytest for changes so the documentation is always up-to-date. * Streamline docker * FastAPI: Run startup action on dev server * Fix config for /strompreis, endpoint still broken however. * test_openapi: Compare against docs/.../openapi.json * Move fastapi to server/ submodule * See #187 for new repository structure.
329 lines
6.1 KiB
Python
329 lines
6.1 KiB
Python
#!/usr/bin/env python3
|
|
|
|
import time
|
|
|
|
import numpy as np
|
|
|
|
from akkudoktoreos.class_numpy_encoder import NumpyEncoder
|
|
from akkudoktoreos.class_optimize import (
|
|
OptimizationParameters,
|
|
OptimizeResponse,
|
|
optimization_problem,
|
|
)
|
|
from akkudoktoreos.config import get_working_dir, load_config
|
|
from akkudoktoreos.visualize import visualisiere_ergebnisse
|
|
|
|
start_hour = 0
|
|
|
|
# PV Forecast (in W)
|
|
pv_forecast = np.zeros(48)
|
|
pv_forecast[12] = 5000
|
|
# [
|
|
# 0,
|
|
# 0,
|
|
# 0,
|
|
# 0,
|
|
# 0,
|
|
# 0,
|
|
# 0,
|
|
# 8.05,
|
|
# 352.91,
|
|
# 728.51,
|
|
# 930.28,
|
|
# 1043.25,
|
|
# 1106.74,
|
|
# 1161.69,
|
|
# 1018.82,
|
|
# 1519.07,
|
|
# 1969.88,
|
|
# 1017.96,
|
|
# 1043.07,
|
|
# 1007.17,
|
|
# 319.67,
|
|
# 7.88,
|
|
# 0,
|
|
# 0,
|
|
# 0,
|
|
# 0,
|
|
# 0,
|
|
# 0,
|
|
# 0,
|
|
# 0,
|
|
# 0,
|
|
# 5.04,
|
|
# 335.59,
|
|
# 705.32,
|
|
# 1121.12,
|
|
# 1604.79,
|
|
# 2157.38,
|
|
# 1433.25,
|
|
# 5718.49,
|
|
# 4553.96,
|
|
# 3027.55,
|
|
# 2574.46,
|
|
# 1720.4,
|
|
# 963.4,
|
|
# 383.3,
|
|
# 0,
|
|
# 0,
|
|
# 0,
|
|
# ]
|
|
|
|
# Temperature Forecast (in degree C)
|
|
temperature_forecast = [
|
|
18.3,
|
|
17.8,
|
|
16.9,
|
|
16.2,
|
|
15.6,
|
|
15.1,
|
|
14.6,
|
|
14.2,
|
|
14.3,
|
|
14.8,
|
|
15.7,
|
|
16.7,
|
|
17.4,
|
|
18.0,
|
|
18.6,
|
|
19.2,
|
|
19.1,
|
|
18.7,
|
|
18.5,
|
|
17.7,
|
|
16.2,
|
|
14.6,
|
|
13.6,
|
|
13.0,
|
|
12.6,
|
|
12.2,
|
|
11.7,
|
|
11.6,
|
|
11.3,
|
|
11.0,
|
|
10.7,
|
|
10.2,
|
|
11.4,
|
|
14.4,
|
|
16.4,
|
|
18.3,
|
|
19.5,
|
|
20.7,
|
|
21.9,
|
|
22.7,
|
|
23.1,
|
|
23.1,
|
|
22.8,
|
|
21.8,
|
|
20.2,
|
|
19.1,
|
|
18.0,
|
|
17.4,
|
|
]
|
|
|
|
# Electricity Price (in Euro per Wh)
|
|
strompreis_euro_pro_wh = np.full(48, 0.001)
|
|
strompreis_euro_pro_wh[0:10] = 0.00001
|
|
strompreis_euro_pro_wh[11:15] = 0.00005
|
|
strompreis_euro_pro_wh[20] = 0.00001
|
|
# [
|
|
# 0.0000384,
|
|
# 0.0000318,
|
|
# 0.0000284,
|
|
# 0.0008283,
|
|
# 0.0008289,
|
|
# 0.0008334,
|
|
# 0.0008290,
|
|
# 0.0003302,
|
|
# 0.0003042,
|
|
# 0.0002430,
|
|
# 0.0002280,
|
|
# 0.0002212,
|
|
# 0.0002093,
|
|
# 0.0001879,
|
|
# 0.0001838,
|
|
# 0.0002004,
|
|
# 0.0002198,
|
|
# 0.0002270,
|
|
# 0.0002997,
|
|
# 0.0003195,
|
|
# 0.0003081,
|
|
# 0.0002969,
|
|
# 0.0002921,
|
|
# 0.0002780,
|
|
# 0.0003384,
|
|
# 0.0003318,
|
|
# 0.0003284,
|
|
# 0.0003283,
|
|
# 0.0003289,
|
|
# 0.0003334,
|
|
# 0.0003290,
|
|
# 0.0003302,
|
|
# 0.0003042,
|
|
# 0.0002430,
|
|
# 0.0002280,
|
|
# 0.0002212,
|
|
# 0.0002093,
|
|
# 0.0001879,
|
|
# 0.0001838,
|
|
# 0.0002004,
|
|
# 0.0002198,
|
|
# 0.0002270,
|
|
# 0.0002997,
|
|
# 0.0003195,
|
|
# 0.0003081,
|
|
# 0.0002969,
|
|
# 0.0002921,
|
|
# 0.0002780,
|
|
# ]
|
|
|
|
# Overall System Load (in W)
|
|
gesamtlast = [
|
|
676.71,
|
|
876.19,
|
|
527.13,
|
|
468.88,
|
|
531.38,
|
|
517.95,
|
|
483.15,
|
|
472.28,
|
|
1011.68,
|
|
995.00,
|
|
1053.07,
|
|
1063.91,
|
|
1320.56,
|
|
1132.03,
|
|
1163.67,
|
|
1176.82,
|
|
1216.22,
|
|
1103.78,
|
|
1129.12,
|
|
1178.71,
|
|
1050.98,
|
|
988.56,
|
|
912.38,
|
|
704.61,
|
|
516.37,
|
|
868.05,
|
|
694.34,
|
|
608.79,
|
|
556.31,
|
|
488.89,
|
|
506.91,
|
|
804.89,
|
|
1141.98,
|
|
1056.97,
|
|
992.46,
|
|
1155.99,
|
|
827.01,
|
|
1257.98,
|
|
1232.67,
|
|
871.26,
|
|
860.88,
|
|
1158.03,
|
|
1222.72,
|
|
1221.04,
|
|
949.99,
|
|
987.01,
|
|
733.99,
|
|
592.97,
|
|
]
|
|
|
|
# Start Solution (binary)
|
|
start_solution = None
|
|
|
|
# Define parameters for the optimization problem
|
|
parameters = OptimizationParameters(
|
|
**{
|
|
"ems": {
|
|
# Value of energy in battery (per Wh)
|
|
"preis_euro_pro_wh_akku": 0e-05,
|
|
# Feed-in tariff for exporting electricity (per Wh)
|
|
"einspeiseverguetung_euro_pro_wh": 7e-05,
|
|
# Overall load on the system
|
|
"gesamtlast": gesamtlast,
|
|
# PV generation forecast (48 hours)
|
|
"pv_prognose_wh": pv_forecast,
|
|
# Electricity price forecast (48 hours)
|
|
"strompreis_euro_pro_wh": strompreis_euro_pro_wh,
|
|
},
|
|
"pv_akku": {
|
|
# Battery capacity (in Wh)
|
|
"kapazitaet_wh": 26400,
|
|
# Initial state of charge (SOC) of PV battery (%)
|
|
"start_soc_prozent": 15,
|
|
# Minimum Soc PV Battery
|
|
"min_soc_prozent": 15,
|
|
},
|
|
"eauto": {
|
|
# Minimum SOC for electric car
|
|
"min_soc_prozent": 50,
|
|
# Electric car battery capacity (Wh)
|
|
"kapazitaet_wh": 60000,
|
|
# Charging efficiency of the electric car
|
|
"lade_effizienz": 0.95,
|
|
# Charging power of the electric car (W)
|
|
"max_ladeleistung_w": 11040,
|
|
# Current SOC of the electric car (%)
|
|
"start_soc_prozent": 5,
|
|
},
|
|
# "spuelmaschine": {
|
|
# # Household appliance consumption (Wh)
|
|
# "verbrauch_wh": 5000,
|
|
# # Duration of appliance usage (hours)
|
|
# "dauer_h": 0,
|
|
# },
|
|
# Temperature forecast (48 hours)
|
|
"temperature_forecast": temperature_forecast,
|
|
# Initial solution for the optimization
|
|
"start_solution": start_solution,
|
|
}
|
|
)
|
|
|
|
# Startzeit nehmen
|
|
start_time = time.time()
|
|
|
|
# Initialize the optimization problem using the default configuration
|
|
working_dir = get_working_dir()
|
|
config = load_config(working_dir)
|
|
opt_class = optimization_problem(config, verbose=True, fixed_seed=42)
|
|
|
|
# Perform the optimisation based on the provided parameters and start hour
|
|
ergebnis = opt_class.optimierung_ems(parameters=parameters, start_hour=start_hour)
|
|
|
|
# Endzeit nehmen
|
|
end_time = time.time()
|
|
|
|
# Berechnete Zeit ausgeben
|
|
elapsed_time = end_time - start_time
|
|
print(f"Elapsed time: {elapsed_time:.4f} seconds")
|
|
|
|
|
|
ac_charge, dc_charge, discharge = (
|
|
ergebnis["ac_charge"],
|
|
ergebnis["dc_charge"],
|
|
ergebnis["discharge_allowed"],
|
|
)
|
|
|
|
visualisiere_ergebnisse(
|
|
parameters.ems.gesamtlast,
|
|
parameters.ems.pv_prognose_wh,
|
|
parameters.ems.strompreis_euro_pro_wh,
|
|
ergebnis["result"],
|
|
ac_charge,
|
|
dc_charge,
|
|
discharge,
|
|
parameters.temperature_forecast,
|
|
start_hour,
|
|
einspeiseverguetung_euro_pro_wh=np.full(
|
|
config.eos.feed_in_tariff_eur_per_wh, parameters.ems.einspeiseverguetung_euro_pro_wh
|
|
),
|
|
config=config,
|
|
)
|
|
|
|
|
|
json_data = NumpyEncoder.dumps(ergebnis)
|
|
print(json_data)
|
|
|
|
OptimizeResponse(**ergebnis)
|