PV & Temperatur Prognose als Array an den Flask Server übergeben, so

kann man seine eigenen Prognose nutzen / Entkoppelung
This commit is contained in:
Bla Bla 2024-07-30 14:01:18 +02:00
parent 522e628049
commit f57c9e5c53
4 changed files with 45 additions and 22 deletions

View File

@ -102,6 +102,29 @@ def flask_gesamtlast():
#print(specific_date_prices) #print(specific_date_prices)
return jsonify(last.tolist()) return jsonify(last.tolist())
@app.route('/pvforecast', methods=['GET'])
def flask_pvprognose():
if request.method == 'GET':
url = request.args.get("url")
ac_power_measurement = request.args.get("ac_power_measurement")
date_now,date = get_start_enddate(prediction_hours,startdate=datetime.now().date())
###############
# PV Forecast
###############
PVforecast = PVForecast(prediction_hours = prediction_hours, url=url)
#print("PVPOWER",parameter['pvpowernow'])
if isfloat(ac_power_measurement):
PVforecast.update_ac_power_measurement(date_time=datetime.now(), ac_power_measurement=float(ac_power_measurement) )
#PVforecast.print_ac_power_and_measurement()
pv_forecast = PVforecast.get_pv_forecast_for_date_range(date_now,date) #get_forecast_for_date(date)
temperature_forecast = PVforecast.get_temperature_for_date_range(date_now,date)
#print(specific_date_prices)
ret = {"temperature":temperature_forecast.tolist(),"pvpower":pv_forecast.tolist()}
return jsonify(ret)
@app.route('/optimize', methods=['POST']) @app.route('/optimize', methods=['POST'])
def flask_optimize(): def flask_optimize():
@ -109,7 +132,7 @@ def flask_optimize():
parameter = request.json parameter = request.json
# Erforderliche Parameter prüfen # Erforderliche Parameter prüfen
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"] erforderliche_parameter = [ 'strompreis_euro_pro_wh', "gesamtlast",'pv_akku_cap', "einspeiseverguetung_euro_pro_wh", 'pv_forecast','temperature_forecast', 'eauto_min_soc', "eauto_cap","eauto_charge_efficiency","eauto_charge_power","eauto_soc","pv_soc","start_solution","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
@ -133,3 +156,8 @@ if __name__ == '__main__':
app.run(debug=True, host="0.0.0.0") app.run(debug=True, host="0.0.0.0")
# PV Forecast:
# object {
# pvpower: array[48]
# temperature: array[48]
# }

View File

@ -42,7 +42,7 @@ class EnergieManagementSystem:
def simuliere(self, start_stunde): def simuliere(self, start_stunde):
eigenverbrauch_wh_pro_stunde = [] last_wh_pro_stunde = []
netzeinspeisung_wh_pro_stunde = [] netzeinspeisung_wh_pro_stunde = []
netzbezug_wh_pro_stunde = [] netzbezug_wh_pro_stunde = []
kosten_euro_pro_stunde = [] kosten_euro_pro_stunde = []
@ -95,7 +95,7 @@ class EnergieManagementSystem:
stündliche_kosten_euro = netzbezug * strompreis stündliche_kosten_euro = netzbezug * strompreis
netzbezug_wh_pro_stunde.append(netzbezug) netzbezug_wh_pro_stunde.append(netzbezug)
verluste_wh_pro_stunde[-1] += verluste verluste_wh_pro_stunde[-1] += verluste
eigenverbrauch_wh_pro_stunde.append(eigenverbrauch) last_wh_pro_stunde.append(eigenverbrauch)
@ -111,7 +111,7 @@ class EnergieManagementSystem:
gesamtkosten_euro = sum(kosten_euro_pro_stunde) - sum(einnahmen_euro_pro_stunde) gesamtkosten_euro = sum(kosten_euro_pro_stunde) - sum(einnahmen_euro_pro_stunde)
expected_length = ende - start_stunde expected_length = ende - start_stunde
array_names = ['Eigenverbrauch_Wh_pro_Stunde', 'Netzeinspeisung_Wh_pro_Stunde', 'Netzbezug_Wh_pro_Stunde', 'Kosten_Euro_pro_Stunde', 'akku_soc_pro_stunde', 'Einnahmen_Euro_pro_Stunde','E-Auto_SoC_pro_Stunde', "Verluste_Pro_Stunde"] array_names = ['Eigenverbrauch_Wh_pro_Stunde', 'Netzeinspeisung_Wh_pro_Stunde', 'Netzbezug_Wh_pro_Stunde', 'Kosten_Euro_pro_Stunde', 'akku_soc_pro_stunde', 'Einnahmen_Euro_pro_Stunde','E-Auto_SoC_pro_Stunde', "Verluste_Pro_Stunde"]
all_arrays = [eigenverbrauch_wh_pro_stunde, netzeinspeisung_wh_pro_stunde, netzbezug_wh_pro_stunde, kosten_euro_pro_stunde, akku_soc_pro_stunde, einnahmen_euro_pro_stunde,eauto_soc_pro_stunde,verluste_wh_pro_stunde] all_arrays = [last_wh_pro_stunde, netzeinspeisung_wh_pro_stunde, netzbezug_wh_pro_stunde, kosten_euro_pro_stunde, akku_soc_pro_stunde, einnahmen_euro_pro_stunde,eauto_soc_pro_stunde,verluste_wh_pro_stunde]
inconsistent_arrays = [name for name, arr in zip(array_names, all_arrays) if len(arr) != expected_length] inconsistent_arrays = [name for name, arr in zip(array_names, all_arrays) if len(arr) != expected_length]
#print(inconsistent_arrays) #print(inconsistent_arrays)
@ -120,7 +120,7 @@ class EnergieManagementSystem:
raise ValueError(f"Inkonsistente Längen bei den Arrays: {', '.join(inconsistent_arrays)}. Erwartete Länge: {expected_length}, gefunden: {[len(all_arrays[array_names.index(name)]) for name in inconsistent_arrays]}") raise ValueError(f"Inkonsistente Längen bei den Arrays: {', '.join(inconsistent_arrays)}. Erwartete Länge: {expected_length}, gefunden: {[len(all_arrays[array_names.index(name)]) for name in inconsistent_arrays]}")
out = { out = {
'Eigenverbrauch_Wh_pro_Stunde': eigenverbrauch_wh_pro_stunde, 'Last_Wh_pro_Stunde': last_wh_pro_stunde,
'Netzeinspeisung_Wh_pro_Stunde': netzeinspeisung_wh_pro_stunde, 'Netzeinspeisung_Wh_pro_Stunde': netzeinspeisung_wh_pro_stunde,
'Netzbezug_Wh_pro_Stunde': netzbezug_wh_pro_stunde, 'Netzbezug_Wh_pro_Stunde': netzbezug_wh_pro_stunde,
'Kosten_Euro_pro_Stunde': kosten_euro_pro_stunde, 'Kosten_Euro_pro_Stunde': kosten_euro_pro_stunde,

View File

@ -177,8 +177,6 @@ class optimization_problem:
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)
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)
discharge_array = np.full(self.prediction_hours,1) #np.array([1, 0, 1, 0, 1, 1, 1, 1, 1, 0, 1, 1, 0, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 0, 0, 0, 1, 1, 1, 1, 0, 1, 1, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 1, 0]) # discharge_array = np.full(self.prediction_hours,1) #np.array([1, 0, 1, 0, 1, 1, 1, 1, 1, 0, 1, 1, 0, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 0, 0, 0, 1, 1, 1, 1, 0, 1, 1, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 1, 0]) #
laden_moeglich = np.full(self.prediction_hours,1) # np.array([0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 1, 1, 0, 1, 1, 1, 0, 0, 0, 0, 1, 1, 1, 1, 0, 1, 1, 0, 0]) laden_moeglich = np.full(self.prediction_hours,1) # np.array([0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 1, 1, 0, 1, 1, 1, 0, 0, 0, 0, 1, 1, 1, 1, 0, 1, 1, 0, 0])
@ -211,16 +209,13 @@ class optimization_problem:
# PV Forecast # PV Forecast
############### ###############
#PVforecast = PVForecast(filepath=os.path.join(r'test_data', r'pvprognose.json')) #PVforecast = PVForecast(filepath=os.path.join(r'test_data', r'pvprognose.json'))
PVforecast = PVForecast(prediction_hours = self.prediction_hours, url=pv_forecast_url) # PVforecast = PVForecast(prediction_hours = self.prediction_hours, url=pv_forecast_url)
#print("PVPOWER",parameter['pvpowernow']) # #print("PVPOWER",parameter['pvpowernow'])
if isfloat(parameter['pvpowernow']): # if isfloat(parameter['pvpowernow']):
PVforecast.update_ac_power_measurement(date_time=datetime.now(), ac_power_measurement=float(parameter['pvpowernow'])) # PVforecast.update_ac_power_measurement(date_time=datetime.now(), ac_power_measurement=float(parameter['pvpowernow']))
#PVforecast.print_ac_power_and_measurement() # #PVforecast.print_ac_power_and_measurement()
pv_forecast = PVforecast.get_pv_forecast_for_date_range(date_now,date) #get_forecast_for_date(date) pv_forecast = parameter['pv_forecast'] #PVforecast.get_pv_forecast_for_date_range(date_now,date) #get_forecast_for_date(date)
temperature_forecast = parameter['temperature_forecast'] #PVforecast.get_temperature_for_date_range(date_now,date)
temperature_forecast = PVforecast.get_temperature_for_date_range(date_now,date)
############### ###############

View File

@ -92,12 +92,12 @@ def visualisiere_ergebnisse(gesamtlast, pv_forecast, strompreise, ergebnisse, d
else: else:
stunden = np.arange(start_hour, prediction_hours) stunden = np.arange(start_hour, prediction_hours)
print(ist_dst_wechsel(datetime.now())," ",datetime.now()) # print(ist_dst_wechsel(datetime.now())," ",datetime.now())
print(start_hour," ",prediction_hours," ",stunden) # print(start_hour," ",prediction_hours," ",stunden)
print(ergebnisse['Eigenverbrauch_Wh_pro_Stunde']) # print(ergebnisse['Eigenverbrauch_Wh_pro_Stunde'])
# Eigenverbrauch, Netzeinspeisung und Netzbezug # Eigenverbrauch, Netzeinspeisung und Netzbezug
plt.subplot(3, 2, 1) plt.subplot(3, 2, 1)
plt.plot(stunden, ergebnisse['Eigenverbrauch_Wh_pro_Stunde'], label='Eigenverbrauch (Wh)', marker='o') plt.plot(stunden, ergebnisse['Last_Wh_pro_Stunde'], label='Last (Wh)', marker='o')
plt.plot(stunden, ergebnisse['Haushaltsgeraet_wh_pro_stunde'], label='Haushaltsgerät (Wh)', marker='o') plt.plot(stunden, ergebnisse['Haushaltsgeraet_wh_pro_stunde'], label='Haushaltsgerät (Wh)', marker='o')
plt.plot(stunden, ergebnisse['Netzeinspeisung_Wh_pro_Stunde'], label='Netzeinspeisung (Wh)', marker='x') plt.plot(stunden, ergebnisse['Netzeinspeisung_Wh_pro_Stunde'], label='Netzeinspeisung (Wh)', marker='x')
plt.plot(stunden, ergebnisse['Netzbezug_Wh_pro_Stunde'], label='Netzbezug (Wh)', marker='^') plt.plot(stunden, ergebnisse['Netzbezug_Wh_pro_Stunde'], label='Netzbezug (Wh)', marker='^')
@ -124,7 +124,7 @@ def visualisiere_ergebnisse(gesamtlast, pv_forecast, strompreise, ergebnisse, d
#if value == 1: #if value == 1:
ax1.axvspan(hour, hour+1, color='green',ymax=value, alpha=0.3, label='Lademöglichkeit' if hour == 0 else "") ax1.axvspan(hour, hour+1, color='green',ymax=value, alpha=0.3, label='Lademöglichkeit' if hour == 0 else "")
ax1.legend(loc='upper left') ax1.legend(loc='upper left')
ax1.set_xlim(0, prediction_hours)
pdf.savefig() # Speichert den aktuellen Figure-State im PDF pdf.savefig() # Speichert den aktuellen Figure-State im PDF
plt.close() # Schließt die aktuelle Figure, um Speicher freizugeben plt.close() # Schließt die aktuelle Figure, um Speicher freizugeben