mirror of
https://github.com/Akkudoktor-EOS/EOS.git
synced 2025-06-28 17:06: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)
|
#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]
|
||||||
|
# }
|
@ -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,
|
||||||
|
@ -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)
|
|
||||||
|
|
||||||
|
|
||||||
###############
|
###############
|
||||||
|
@ -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
|
||||||
|
Loading…
x
Reference in New Issue
Block a user