Sommerzeit Probleme (bei Zeitumstellung gibt es eine Stunde weniger)

Für die PVForecast kann jetzt ein aktuelle Messwert der PV Leistung
eingegeben werden!
This commit is contained in:
Bla Bla
2024-03-31 13:00:01 +02:00
parent 203860cfbf
commit e6c04183cf
6 changed files with 161 additions and 50 deletions

View File

@@ -4,16 +4,19 @@ from datetime import datetime
from pprint import pprint
import json, sys, os
import requests, hashlib
from dateutil import parser, tz
class ForecastData:
def __init__(self, date_time, dc_power, ac_power, windspeed_10m, temperature):
def __init__(self, date_time, dc_power, ac_power, windspeed_10m=None, temperature=None,ac_power_measurement=None):
self.date_time = date_time
self.dc_power = dc_power
self.ac_power = ac_power
self.windspeed_10m = windspeed_10m
self.temperature = temperature
self.ac_power_measurement = None
# Getter für die ForecastData-Attribute
def get_date_time(self):
return self.date_time
@@ -21,8 +24,14 @@ class ForecastData:
def get_dc_power(self):
return self.dc_power
def ac_power_measurement(self):
return self.ac_power_measurement
def get_ac_power(self):
return self.ac_power
if self.ac_power_measurement != None:
return self.ac_power_measurement
else:
return self.ac_power
def get_windspeed_10m(self):
return self.windspeed_10m
@@ -36,6 +45,7 @@ class PVForecast:
self.forecast_data = []
self.cache_dir = cache_dir
self.prediction_hours = prediction_hours
self.current_measurement = None
if not os.path.exists(self.cache_dir):
os.makedirs(self.cache_dir)
@@ -48,6 +58,32 @@ class PVForecast:
if len(self.forecast_data) < self.prediction_hours:
raise ValueError(f"Die Vorhersage muss mindestens {self.prediction_hours} Stunden umfassen, aber es wurden nur {len(self.forecast_data)} Stunden vorhergesagt.")
def update_ac_power_measurement(self, date_time=None, ac_power_measurement=None):
"""Aktualisiert einen DC-Leistungsmesswert oder fügt ihn hinzu."""
found = False
target_timezone = tz.gettz('Europe/Berlin')
input_date_hour = date_time.astimezone(target_timezone).replace(minute=0, second=0, microsecond=0)
for forecast in self.forecast_data:
forecast_date_hour = datetime.strptime(forecast.date_time, "%Y-%m-%dT%H:%M:%S.%f%z").astimezone(target_timezone).replace(minute=0, second=0, microsecond=0)
#print(forecast_date_hour," ",input_date_hour)
if forecast_date_hour == input_date_hour:
forecast.ac_power_measurement = ac_power_measurement
found = True
break
# if not found:
# # Erstelle ein neues ForecastData-Objekt, falls kein entsprechender Zeitstempel gefunden wurde
# # Hier kannst du entscheiden, wie die anderen Werte gesetzt werden sollen, falls keine Vorhersage existiert
# new_forecast = ForecastData(date_time, dc_power=None, ac_power=None, dc_power_measurement=dc_power_measurement)
# self.forecast_data.append(new_forecast)
# # Liste sortieren, um sie chronologisch zu ordnen
# self.forecast_data.sort(key=lambda x: datetime.strptime(x.date_time, "%Y-%m-%dT%H:%M:%S.%f%z").replace(minute=0, second=0, microsecond=0))
def process_data(self, data):
@@ -71,16 +107,6 @@ class PVForecast:
self.forecast_data.append(forecast)
# values = data.get('values', [])[0]
# for value in values:
# forecast = ForecastData(
# date_time=value.get('datetime'),
# dc_power=value.get('dcPower'),
# ac_power=value.get('power'),
# windspeed_10m=value.get('windspeed_10m'),
# temperature=value.get('temperature')
# )
# self.forecast_data.append(forecast)
def load_data_from_file(self, filepath):
with open(filepath, 'r') as file:
@@ -127,14 +153,14 @@ class PVForecast:
return self.forecast_data
def get_forecast_for_date(self, input_date_str):
input_date = datetime.strptime(input_date_str, "%Y-%m-%d")
daily_forecast_obj = [data for data in self.forecast_data if datetime.strptime(data.get_date_time(), "%Y-%m-%dT%H:%M:%S.%f%z").date() == input_date.date()]
daily_forecast = []
for d in daily_forecast_obj:
daily_forecast.append(d.get_ac_power())
# def get_forecast_for_date(self, input_date_str):
# input_date = datetime.strptime(input_date_str, "%Y-%m-%d")
# daily_forecast_obj = [data for data in self.forecast_data if datetime.strptime(data.get_date_time(), "%Y-%m-%dT%H:%M:%S.%f%z").date() == input_date.date()]
# daily_forecast = []
# for d in daily_forecast_obj:
# daily_forecast.append(d.get_ac_power())
return np.array(daily_forecast)
# return np.array(daily_forecast)
def get_temperature_forecast_for_date(self, input_date_str):
input_date = datetime.strptime(input_date_str, "%Y-%m-%d")
@@ -175,12 +201,19 @@ class PVForecast:
return np.array(temperature_forecast)[:self.prediction_hours]
def print_ac_power_and_measurement(self):
"""Druckt die DC-Leistung und das Messwert für jede Stunde."""
for forecast in self.forecast_data:
date_time = forecast.date_time
print(f"Zeit: {date_time}, DC: {forecast.dc_power}, AC: {forecast.ac_power}, Messwert: {forecast.ac_power_measurement} AC GET: {forecast.get_ac_power()}")
# Beispiel für die Verwendung der Klasse
if __name__ == '__main__':
forecast = PVForecast(r'..\test_data\pvprognose.json')
for data in forecast.get_forecast_data():
print(data.get_date_time(), data.get_dc_power(), data.get_ac_power(), data.get_windspeed_10m(), data.get_temperature())
date_now = datetime.now()
forecast = PVForecast(prediction_hours = 24, url="https://api.akkudoktor.net/forecast?lat=52.52&lon=13.405&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")
forecast.update_ac_power_measurement(date_time=datetime.now(), ac_power_measurement=1000)
forecast.print_ac_power_and_measurement()