Lastprognose entkoppelt, an den Optimierer wird jetzt nur das Array

übergeben. So sind unterschiedliche / eigenen Prognosen möglich
This commit is contained in:
Bla Bla 2024-07-30 10:51:26 +02:00
parent 5e842d5ee4
commit b5ff38fb03
4 changed files with 39 additions and 27 deletions

View File

@ -76,13 +76,40 @@ def flask_strompreis():
return jsonify(specific_date_prices.tolist()) return jsonify(specific_date_prices.tolist())
@app.route('/gesamtlast', methods=['GET'])
def flask_gesamtlast():
if request.method == 'GET':
year_energy = float(request.args.get("year_energy"))
date_now,date = get_start_enddate(prediction_hours,startdate=datetime.now().date())
###############
# Load Forecast
###############
lf = LoadForecast(filepath=r'load_profiles.npz', year_energy=year_energy)
#leistung_haushalt = lf.get_daily_stats(date)[0,...] # Datum anpassen
leistung_haushalt = lf.get_stats_for_date_range(date_now,date)[0] # Nur Erwartungswert!
gesamtlast = Gesamtlast(prediction_hours=prediction_hours)
gesamtlast.hinzufuegen("Haushalt", leistung_haushalt)
# ###############
# # WP
# ##############
# leistung_wp = wp.simulate_24h(temperature_forecast)
# gesamtlast.hinzufuegen("Heatpump", leistung_wp)
last = gesamtlast.gesamtlast_berechnen()
print(last)
#print(specific_date_prices)
return jsonify(last.tolist())
@app.route('/optimize', methods=['POST']) @app.route('/optimize', methods=['POST'])
def flask_optimize(): def flask_optimize():
if request.method == 'POST': if request.method == 'POST':
parameter = request.json parameter = request.json
# Erforderliche Parameter prüfen # Erforderliche Parameter prüfen
erforderliche_parameter = [ 'strompreis_euro_pro_wh','pv_akku_cap', 'year_energy',"einspeiseverguetung_euro_pro_wh", 'max_heizleistung', 'pv_forecast_url', 'eauto_min_soc', "eauto_cap","eauto_charge_efficiency","eauto_charge_power","eauto_soc","pv_soc","start_solution","pvpowernow","haushaltsgeraet_dauer","haushaltsgeraet_wh"] erforderliche_parameter = [ 'strompreis_euro_pro_wh', "gesamtlast",'pv_akku_cap', "einspeiseverguetung_euro_pro_wh", 'pv_forecast_url', 'eauto_min_soc', "eauto_cap","eauto_charge_efficiency","eauto_charge_power","eauto_soc","pv_soc","start_solution","pvpowernow","haushaltsgeraet_dauer","haushaltsgeraet_wh"]
for p in erforderliche_parameter: for p in erforderliche_parameter:
if p not in parameter: if p not in parameter:
return jsonify({"error": f"Fehlender Parameter: {p}"}), 400 return jsonify({"error": f"Fehlender Parameter: {p}"}), 400

View File

@ -51,7 +51,7 @@ class EnergieManagementSystem:
eauto_soc_pro_stunde = [] eauto_soc_pro_stunde = []
verluste_wh_pro_stunde = [] verluste_wh_pro_stunde = []
haushaltsgeraet_wh_pro_stunde = [] haushaltsgeraet_wh_pro_stunde = []
lastkurve_wh = self.gesamtlast.gesamtlast_berechnen() lastkurve_wh = self.gesamtlast
assert len(lastkurve_wh) == len(self.pv_prognose_wh) == len(self.strompreis_euro_pro_wh), f"Arraygrößen stimmen nicht überein: Lastkurve = {len(lastkurve_wh)}, PV-Prognose = {len(self.pv_prognose_wh)}, Strompreis = {len(self.strompreis_euro_pro_wh)}" assert len(lastkurve_wh) == len(self.pv_prognose_wh) == len(self.strompreis_euro_pro_wh), f"Arraygrößen stimmen nicht überein: Lastkurve = {len(lastkurve_wh)}, PV-Prognose = {len(self.pv_prognose_wh)}, Strompreis = {len(self.strompreis_euro_pro_wh)}"

View File

@ -4,6 +4,7 @@ from modules.class_load import *
from modules.class_ems import * from modules.class_ems import *
from modules.class_pv_forecast import * from modules.class_pv_forecast import *
from modules.class_akku import * from modules.class_akku import *
from modules.class_heatpump import * from modules.class_heatpump import *
from modules.class_load_container import * from modules.class_load_container import *
from modules.class_inverter import * from modules.class_inverter import *
@ -173,13 +174,9 @@ class optimization_problem:
#print("Start_date:",date_now) #print("Start_date:",date_now)
akku_size = parameter['pv_akku_cap'] # Wh akku_size = parameter['pv_akku_cap'] # Wh
year_energy = parameter['year_energy'] #2000*1000 #Wh
einspeiseverguetung_euro_pro_wh = np.full(self.prediction_hours, parameter["einspeiseverguetung_euro_pro_wh"]) #= # € / Wh 7/(1000.0*100.0) einspeiseverguetung_euro_pro_wh = np.full(self.prediction_hours, parameter["einspeiseverguetung_euro_pro_wh"]) #= # € / Wh 7/(1000.0*100.0)
max_heizleistung = parameter['max_heizleistung'] #1000 # 5 kW Heizleistung
wp = Waermepumpe(max_heizleistung,self.prediction_hours)
pv_forecast_url = parameter['pv_forecast_url'] #"https://api.akkudoktor.net/forecast?lat=50.8588&lon=7.3747&power=5000&azimuth=-10&tilt=7&powerInvertor=10000&horizont=20,27,22,20&power=4800&azimuth=-90&tilt=7&powerInvertor=10000&horizont=30,30,30,50&power=1400&azimuth=-40&tilt=60&powerInvertor=2000&horizont=60,30,0,30&power=1600&azimuth=5&tilt=45&powerInvertor=1400&horizont=45,25,30,60&past_days=5&cellCoEff=-0.36&inverterEfficiency=0.8&albedo=0.25&timezone=Europe%2FBerlin&hourly=relativehumidity_2m%2Cwindspeed_10m" pv_forecast_url = parameter['pv_forecast_url'] #"https://api.akkudoktor.net/forecast?lat=50.8588&lon=7.3747&power=5000&azimuth=-10&tilt=7&powerInvertor=10000&horizont=20,27,22,20&power=4800&azimuth=-90&tilt=7&powerInvertor=10000&horizont=30,30,30,50&power=1400&azimuth=-40&tilt=60&powerInvertor=2000&horizont=60,30,0,30&power=1600&azimuth=5&tilt=45&powerInvertor=1400&horizont=45,25,30,60&past_days=5&cellCoEff=-0.36&inverterEfficiency=0.8&albedo=0.25&timezone=Europe%2FBerlin&hourly=relativehumidity_2m%2Cwindspeed_10m"
akku = PVAkku(kapazitaet_wh=akku_size,hours=self.prediction_hours,start_soc_prozent=parameter["pv_soc"], max_ladeleistung_w=5000) akku = PVAkku(kapazitaet_wh=akku_size,hours=self.prediction_hours,start_soc_prozent=parameter["pv_soc"], max_ladeleistung_w=5000)
@ -191,7 +188,6 @@ class optimization_problem:
eauto.set_charge_per_hour(laden_moeglich) eauto.set_charge_per_hour(laden_moeglich)
min_soc_eauto = parameter['eauto_min_soc'] min_soc_eauto = parameter['eauto_min_soc']
start_params = parameter['start_solution'] start_params = parameter['start_solution']
gesamtlast = Gesamtlast(prediction_hours=self.prediction_hours)
############### ###############
# spuelmaschine # spuelmaschine
@ -204,18 +200,12 @@ class optimization_problem:
spuelmaschine = None spuelmaschine = None
###############
# Load Forecast
###############
lf = LoadForecast(filepath=r'load_profiles.npz', year_energy=year_energy)
#leistung_haushalt = lf.get_daily_stats(date)[0,...] # Datum anpassen
leistung_haushalt = lf.get_stats_for_date_range(date_now,date)[0] # Nur Erwartungswert!
gesamtlast.hinzufuegen("Haushalt", leistung_haushalt)
############### ###############
# PV Forecast # PV Forecast
@ -240,15 +230,10 @@ class optimization_problem:
print(specific_date_prices) print(specific_date_prices)
#print("https://api.akkudoktor.net/prices?start="+date_now+"&end="+date) #print("https://api.akkudoktor.net/prices?start="+date_now+"&end="+date)
###############
# WP
##############
leistung_wp = wp.simulate_24h(temperature_forecast)
gesamtlast.hinzufuegen("Heatpump", leistung_wp)
wr = Wechselrichter(5000, akku) wr = Wechselrichter(5000, akku)
ems = EnergieManagementSystem(gesamtlast = gesamtlast, pv_prognose_wh=pv_forecast, strompreis_euro_pro_wh=specific_date_prices, einspeiseverguetung_euro_pro_wh=einspeiseverguetung_euro_pro_wh, eauto=eauto, haushaltsgeraet=spuelmaschine,wechselrichter=wr) ems = EnergieManagementSystem(gesamtlast = parameter["gesamtlast"], pv_prognose_wh=pv_forecast, strompreis_euro_pro_wh=specific_date_prices, einspeiseverguetung_euro_pro_wh=einspeiseverguetung_euro_pro_wh, eauto=eauto, haushaltsgeraet=spuelmaschine,wechselrichter=wr)
o = ems.simuliere(start_hour) o = ems.simuliere(start_hour)
############### ###############
@ -281,7 +266,7 @@ class optimization_problem:
print(parameter) print(parameter)
print(best_solution) print(best_solution)
visualisiere_ergebnisse(gesamtlast, pv_forecast, specific_date_prices, o,best_solution[0::2],best_solution[1::2] , temperature_forecast, start_hour, self.prediction_hours,einspeiseverguetung_euro_pro_wh,extra_data=extra_data) visualisiere_ergebnisse(parameter["gesamtlast"], pv_forecast, specific_date_prices, o,best_solution[0::2],best_solution[1::2] , temperature_forecast, start_hour, self.prediction_hours,einspeiseverguetung_euro_pro_wh,extra_data=extra_data)
os.system("cp visualisierungsergebnisse.pdf ~/") os.system("cp visualisierungsergebnisse.pdf ~/")
# 'Eigenverbrauch_Wh_pro_Stunde': eigenverbrauch_wh_pro_stunde, # 'Eigenverbrauch_Wh_pro_Stunde': eigenverbrauch_wh_pro_stunde,

View File

@ -22,13 +22,13 @@ def visualisiere_ergebnisse(gesamtlast, pv_forecast, strompreise, ergebnisse, d
plt.subplot(3, 3, 1) plt.subplot(3, 3, 1)
stunden = np.arange(0, prediction_hours) stunden = np.arange(0, prediction_hours)
gesamtlast_array = np.array(gesamtlast)
# Einzellasten plotten # Einzellasten plotten
for name, last_array in gesamtlast.lasten.items(): #for name, last_array in gesamtlast.lasten.items():
plt.plot(stunden, last_array, label=f'{name} (Wh)', marker='o') plt.plot(stunden, gesamtlast_array, label=f'Last (Wh)', marker='o')
# Gesamtlast berechnen und plotten # Gesamtlast berechnen und plotten
gesamtlast_array = gesamtlast.gesamtlast_berechnen() gesamtlast_array = np.array(gesamtlast)
plt.plot(stunden, gesamtlast_array, label='Gesamtlast (Wh)', marker='o', linewidth=2, linestyle='--') plt.plot(stunden, gesamtlast_array, label='Gesamtlast (Wh)', marker='o', linewidth=2, linestyle='--')
plt.xlabel('Stunde') plt.xlabel('Stunde')
plt.ylabel('Last (Wh)') plt.ylabel('Last (Wh)')