From f57c9e5c53079af0e766e7c7737f01a78cedfc08 Mon Sep 17 00:00:00 2001 From: Bla Bla Date: Tue, 30 Jul 2024 14:01:18 +0200 Subject: [PATCH] =?UTF-8?q?PV=20&=20Temperatur=20Prognose=20als=20Array=20?= =?UTF-8?q?an=20den=20Flask=20Server=20=C3=BCbergeben,=20so=20kann=20man?= =?UTF-8?q?=20seine=20eigenen=20Prognose=20nutzen=20/=20Entkoppelung?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- flask_server.py | 30 +++++++++++++++++++++++++++++- modules/class_ems.py | 8 ++++---- modules/class_optimize.py | 19 +++++++------------ modules/visualize.py | 10 +++++----- 4 files changed, 45 insertions(+), 22 deletions(-) diff --git a/flask_server.py b/flask_server.py index 7fb981d..d1242e5 100644 --- a/flask_server.py +++ b/flask_server.py @@ -102,6 +102,29 @@ def flask_gesamtlast(): #print(specific_date_prices) 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']) def flask_optimize(): @@ -109,7 +132,7 @@ def flask_optimize(): parameter = request.json # 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: if p not in parameter: return jsonify({"error": f"Fehlender Parameter: {p}"}), 400 @@ -133,3 +156,8 @@ if __name__ == '__main__': app.run(debug=True, host="0.0.0.0") +# PV Forecast: +# object { +# pvpower: array[48] +# temperature: array[48] +# } \ No newline at end of file diff --git a/modules/class_ems.py b/modules/class_ems.py index 1917b63..7a50bc2 100644 --- a/modules/class_ems.py +++ b/modules/class_ems.py @@ -42,7 +42,7 @@ class EnergieManagementSystem: def simuliere(self, start_stunde): - eigenverbrauch_wh_pro_stunde = [] + last_wh_pro_stunde = [] netzeinspeisung_wh_pro_stunde = [] netzbezug_wh_pro_stunde = [] kosten_euro_pro_stunde = [] @@ -95,7 +95,7 @@ class EnergieManagementSystem: stündliche_kosten_euro = netzbezug * strompreis netzbezug_wh_pro_stunde.append(netzbezug) 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) 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"] - 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] #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]}") 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, 'Netzbezug_Wh_pro_Stunde': netzbezug_wh_pro_stunde, 'Kosten_Euro_pro_Stunde': kosten_euro_pro_stunde, diff --git a/modules/class_optimize.py b/modules/class_optimize.py index eb37bf4..fa46558 100644 --- a/modules/class_optimize.py +++ b/modules/class_optimize.py @@ -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) - 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) 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]) @@ -211,16 +209,13 @@ class optimization_problem: # PV Forecast ############### #PVforecast = PVForecast(filepath=os.path.join(r'test_data', r'pvprognose.json')) - PVforecast = PVForecast(prediction_hours = self.prediction_hours, url=pv_forecast_url) - #print("PVPOWER",parameter['pvpowernow']) - if isfloat(parameter['pvpowernow']): - PVforecast.update_ac_power_measurement(date_time=datetime.now(), ac_power_measurement=float(parameter['pvpowernow'])) - #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) + # PVforecast = PVForecast(prediction_hours = self.prediction_hours, url=pv_forecast_url) + # #print("PVPOWER",parameter['pvpowernow']) + # if isfloat(parameter['pvpowernow']): + # PVforecast.update_ac_power_measurement(date_time=datetime.now(), ac_power_measurement=float(parameter['pvpowernow'])) + # #PVforecast.print_ac_power_and_measurement() + 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) ############### diff --git a/modules/visualize.py b/modules/visualize.py index e32d777..0dbebfd 100644 --- a/modules/visualize.py +++ b/modules/visualize.py @@ -92,12 +92,12 @@ def visualisiere_ergebnisse(gesamtlast, pv_forecast, strompreise, ergebnisse, d else: stunden = np.arange(start_hour, prediction_hours) - print(ist_dst_wechsel(datetime.now())," ",datetime.now()) - print(start_hour," ",prediction_hours," ",stunden) - print(ergebnisse['Eigenverbrauch_Wh_pro_Stunde']) + # print(ist_dst_wechsel(datetime.now())," ",datetime.now()) + # print(start_hour," ",prediction_hours," ",stunden) + # print(ergebnisse['Eigenverbrauch_Wh_pro_Stunde']) # Eigenverbrauch, Netzeinspeisung und Netzbezug 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['Netzeinspeisung_Wh_pro_Stunde'], label='Netzeinspeisung (Wh)', marker='x') 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: 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.set_xlim(0, prediction_hours) pdf.savefig() # Speichert den aktuellen Figure-State im PDF plt.close() # Schließt die aktuelle Figure, um Speicher freizugeben