mirror of
https://github.com/Akkudoktor-EOS/EOS.git
synced 2025-06-28 08:56:54 +00:00
PV & Temperatur Prognose als Array an den Flask Server übergeben, so
kann man seine eigenen Prognose nutzen / Entkoppelung
This commit is contained in:
parent
522e628049
commit
f57c9e5c53
@ -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]
|
||||
# }
|
@ -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,
|
||||
|
@ -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)
|
||||
|
||||
|
||||
###############
|
||||
|
@ -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
|
||||
|
Loading…
x
Reference in New Issue
Block a user