mirror of
https://github.com/Akkudoktor-EOS/EOS.git
synced 2025-04-19 08:55:15 +00:00
Initialer Commit
This commit is contained in:
parent
e1d5b9ee13
commit
4daa63d775
BIN
desktop.ini
Normal file
BIN
desktop.ini
Normal file
Binary file not shown.
63
modules/class_pv_forecast.py
Normal file
63
modules/class_pv_forecast.py
Normal file
@ -0,0 +1,63 @@
|
|||||||
|
from flask import Flask, jsonify, request
|
||||||
|
import numpy as np
|
||||||
|
from datetime import datetime
|
||||||
|
from pprint import pprint
|
||||||
|
import json, sys
|
||||||
|
|
||||||
|
class PVForecast:
|
||||||
|
class ForecastData:
|
||||||
|
def __init__(self, date_time, dc_power, ac_power, windspeed_10m, temperature):
|
||||||
|
self.date_time = date_time
|
||||||
|
self.dc_power = dc_power
|
||||||
|
self.ac_power = ac_power
|
||||||
|
self.windspeed_10m = windspeed_10m
|
||||||
|
self.temperature = temperature
|
||||||
|
|
||||||
|
# Getter für die ForecastData-Attribute
|
||||||
|
def get_date_time(self):
|
||||||
|
return self.date_time
|
||||||
|
|
||||||
|
def get_dc_power(self):
|
||||||
|
return self.dc_power
|
||||||
|
|
||||||
|
def get_ac_power(self):
|
||||||
|
return self.ac_power
|
||||||
|
|
||||||
|
def get_windspeed_10m(self):
|
||||||
|
return self.windspeed_10m
|
||||||
|
|
||||||
|
def get_temperature(self):
|
||||||
|
return self.temperature
|
||||||
|
|
||||||
|
def __init__(self, filepath):
|
||||||
|
self.filepath = filepath
|
||||||
|
self.meta = {}
|
||||||
|
self.forecast_data = []
|
||||||
|
self.load_data()
|
||||||
|
|
||||||
|
def load_data(self):
|
||||||
|
with open(self.filepath, 'r') as file:
|
||||||
|
data = json.load(file)
|
||||||
|
self.meta = data.get('meta', {})
|
||||||
|
values = data.get('values', [])[0]
|
||||||
|
for value in values:
|
||||||
|
# Erstelle eine ForecastData-Instanz für jeden Wert in der Liste
|
||||||
|
forecast = self.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 get_forecast_data(self):
|
||||||
|
return self.forecast_data
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
# 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())
|
80
modules/class_strompreis.py
Normal file
80
modules/class_strompreis.py
Normal file
@ -0,0 +1,80 @@
|
|||||||
|
import json
|
||||||
|
from datetime import datetime, timedelta, timezone
|
||||||
|
|
||||||
|
class HourlyElectricityPriceForecast:
|
||||||
|
class PriceData:
|
||||||
|
def __init__(self, total, energy, tax, starts_at, currency, level):
|
||||||
|
self.total = total
|
||||||
|
self.energy = energy
|
||||||
|
self.tax = tax
|
||||||
|
self.starts_at = datetime.strptime(starts_at, '%Y-%m-%dT%H:%M:%S.%f%z')
|
||||||
|
|
||||||
|
self.currency = currency
|
||||||
|
self.level = level
|
||||||
|
|
||||||
|
# Getter-Methoden
|
||||||
|
def get_total(self):
|
||||||
|
return self.total
|
||||||
|
|
||||||
|
def get_energy(self):
|
||||||
|
return self.energy
|
||||||
|
|
||||||
|
def get_tax(self):
|
||||||
|
return self.tax
|
||||||
|
|
||||||
|
def get_starts_at(self):
|
||||||
|
return self.starts_at
|
||||||
|
|
||||||
|
def get_currency(self):
|
||||||
|
return self.currency
|
||||||
|
|
||||||
|
def get_level(self):
|
||||||
|
return self.level
|
||||||
|
|
||||||
|
def __init__(self, filepath):
|
||||||
|
self.filepath = filepath
|
||||||
|
self.price_data = []
|
||||||
|
self.load_data()
|
||||||
|
|
||||||
|
def get_prices_for_date(self, query_date):
|
||||||
|
query_date = datetime.strptime(query_date, '%Y-%m-%d').date()
|
||||||
|
prices_for_date = [price for price in self.price_data if price.starts_at.date() == query_date]
|
||||||
|
return prices_for_date
|
||||||
|
|
||||||
|
def get_price_for_datetime(self, query_datetime):
|
||||||
|
query_datetime = datetime.strptime(query_datetime, '%Y-%m-%d %H').replace(minute=0, second=0, microsecond=0)
|
||||||
|
query_datetime = query_datetime.replace(tzinfo=timezone(timedelta(hours=1)))
|
||||||
|
|
||||||
|
for price in self.price_data:
|
||||||
|
#print(price.starts_at.replace(minute=0, second=0, microsecond=0) , " ", query_datetime, " == ",price.starts_at.replace(minute=0, second=0, microsecond=0) == query_datetime)
|
||||||
|
if price.starts_at.replace(minute=0, second=0, microsecond=0) == query_datetime:
|
||||||
|
return price
|
||||||
|
return None
|
||||||
|
|
||||||
|
|
||||||
|
def load_data(self):
|
||||||
|
with open(self.filepath, 'r') as file:
|
||||||
|
data = json.load(file)
|
||||||
|
for item in data['payload']:
|
||||||
|
self.price_data.append(self.PriceData(
|
||||||
|
total=item['total'],
|
||||||
|
energy=item['energy'],
|
||||||
|
tax=item['tax'],
|
||||||
|
starts_at=item['startsAt'],
|
||||||
|
currency=item['currency'],
|
||||||
|
level=item['level']
|
||||||
|
))
|
||||||
|
|
||||||
|
def get_price_data(self):
|
||||||
|
return self.price_data
|
||||||
|
|
||||||
|
# Beispiel für die Verwendung der Klasse
|
||||||
|
if __name__ == '__main__':
|
||||||
|
filepath = r'..\test_data\strompreis.json' # Pfad zur JSON-Datei anpassen
|
||||||
|
price_forecast = HourlyElectricityPriceForecast(filepath)
|
||||||
|
specific_date_prices = price_forecast.get_prices_for_date('2024-02-16') # Datum anpassen
|
||||||
|
|
||||||
|
specific_date_prices = price_forecast.get_price_for_datetime('2024-02-16 12')
|
||||||
|
print(specific_date_prices)
|
||||||
|
#for price in price_forecast.get_price_data():
|
||||||
|
# print(price.get_starts_at(), price.get_total(), price.get_currency())
|
@ -1,54 +0,0 @@
|
|||||||
from flask import Flask, jsonify, request
|
|
||||||
import numpy as np
|
|
||||||
from datetime import datetime
|
|
||||||
|
|
||||||
app = Flask(__name__)
|
|
||||||
|
|
||||||
# Lade die .npz-Datei beim Start der Anwendung
|
|
||||||
data = np.load('load_profiles.npz')
|
|
||||||
load_profiles_exp = data["yearly_profiles"] #.flatten().tolist()
|
|
||||||
load_profiles_std = data["yearly_profiles_std"] #.flatten().tolist()
|
|
||||||
|
|
||||||
print(load_profiles_exp)
|
|
||||||
print(load_profiles_exp.shape)
|
|
||||||
#load_profiles_exp = load_profiles_exp*1000.0
|
|
||||||
print(load_profiles_exp)
|
|
||||||
print(load_profiles_exp.sum())
|
|
||||||
|
|
||||||
@app.route('/getdata', methods=['GET'])
|
|
||||||
def get_data():
|
|
||||||
# Hole das Datum aus den Query-Parametern
|
|
||||||
date_str = request.args.get('date')
|
|
||||||
year_energy = request.args.get('year_energy')
|
|
||||||
|
|
||||||
try:
|
|
||||||
# Konvertiere das Datum in ein datetime-Objekt
|
|
||||||
date_obj = datetime.strptime(date_str, '%Y-%m-%d')
|
|
||||||
|
|
||||||
year_energy = float(year_energy)
|
|
||||||
|
|
||||||
load_profiles_exp_l = load_profiles_exp*year_energy
|
|
||||||
load_profiles_std_l = load_profiles_std*year_energy
|
|
||||||
|
|
||||||
# Berechne den Tag des Jahres
|
|
||||||
day_of_year = date_obj.timetuple().tm_yday
|
|
||||||
|
|
||||||
# Konvertiere den Tag des Jahres in einen String, falls die Schlüssel als Strings gespeichert sind
|
|
||||||
day_key = int(day_of_year)
|
|
||||||
#print(day_key)
|
|
||||||
# Überprüfe, ob der Tag im Jahr in den Daten vorhanden ist
|
|
||||||
if day_key < len(load_profiles_exp):
|
|
||||||
# Konvertiere das Array in eine Liste für die JSON-Antwort
|
|
||||||
|
|
||||||
array_list = ((load_profiles_exp_l[day_key]).tolist(),(load_profiles_std_l)[day_key].tolist())
|
|
||||||
|
|
||||||
return jsonify({date_str: array_list})
|
|
||||||
else:
|
|
||||||
return jsonify({"error": "Datum nicht gefunden"}), 404
|
|
||||||
except ValueError:
|
|
||||||
# Wenn das Datum nicht im richtigen Format ist oder ungültig ist
|
|
||||||
return jsonify({"error": "Ungültiges Datum"}), 400
|
|
||||||
|
|
||||||
if __name__ == '__main__':
|
|
||||||
app.run(debug=True)
|
|
||||||
|
|
11662
test_data/pvprognose.json
Normal file
11662
test_data/pvprognose.json
Normal file
File diff suppressed because it is too large
Load Diff
198
test_data/strompreis.json
Normal file
198
test_data/strompreis.json
Normal file
@ -0,0 +1,198 @@
|
|||||||
|
{
|
||||||
|
"_msgid": "71f585194de8122e",
|
||||||
|
"payload": [
|
||||||
|
{
|
||||||
|
"total": 0.253,
|
||||||
|
"energy": 0.0518,
|
||||||
|
"tax": 0.2012,
|
||||||
|
"startsAt": "2024-02-16T00:00:00.000+01:00",
|
||||||
|
"currency": "EUR",
|
||||||
|
"level": "NORMAL"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"total": 0.2521,
|
||||||
|
"energy": 0.0511,
|
||||||
|
"tax": 0.201,
|
||||||
|
"startsAt": "2024-02-16T01:00:00.000+01:00",
|
||||||
|
"currency": "EUR",
|
||||||
|
"level": "NORMAL"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"total": 0.2508,
|
||||||
|
"energy": 0.0499,
|
||||||
|
"tax": 0.2009,
|
||||||
|
"startsAt": "2024-02-16T02:00:00.000+01:00",
|
||||||
|
"currency": "EUR",
|
||||||
|
"level": "NORMAL"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"total": 0.2494,
|
||||||
|
"energy": 0.0488,
|
||||||
|
"tax": 0.2006,
|
||||||
|
"startsAt": "2024-02-16T03:00:00.000+01:00",
|
||||||
|
"currency": "EUR",
|
||||||
|
"level": "NORMAL"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"total": 0.2525,
|
||||||
|
"energy": 0.0514,
|
||||||
|
"tax": 0.2011,
|
||||||
|
"startsAt": "2024-02-16T04:00:00.000+01:00",
|
||||||
|
"currency": "EUR",
|
||||||
|
"level": "NORMAL"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"total": 0.2551,
|
||||||
|
"energy": 0.0535,
|
||||||
|
"tax": 0.2016,
|
||||||
|
"startsAt": "2024-02-16T05:00:00.000+01:00",
|
||||||
|
"currency": "EUR",
|
||||||
|
"level": "NORMAL"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"total": 0.2618,
|
||||||
|
"energy": 0.0592,
|
||||||
|
"tax": 0.2026,
|
||||||
|
"startsAt": "2024-02-16T06:00:00.000+01:00",
|
||||||
|
"currency": "EUR",
|
||||||
|
"level": "NORMAL"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"total": 0.2739,
|
||||||
|
"energy": 0.0694,
|
||||||
|
"tax": 0.2045,
|
||||||
|
"startsAt": "2024-02-16T07:00:00.000+01:00",
|
||||||
|
"currency": "EUR",
|
||||||
|
"level": "NORMAL"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"total": 0.2753,
|
||||||
|
"energy": 0.0705,
|
||||||
|
"tax": 0.2048,
|
||||||
|
"startsAt": "2024-02-16T08:00:00.000+01:00",
|
||||||
|
"currency": "EUR",
|
||||||
|
"level": "NORMAL"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"total": 0.2685,
|
||||||
|
"energy": 0.0648,
|
||||||
|
"tax": 0.2037,
|
||||||
|
"startsAt": "2024-02-16T09:00:00.000+01:00",
|
||||||
|
"currency": "EUR",
|
||||||
|
"level": "NORMAL"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"total": 0.2561,
|
||||||
|
"energy": 0.0544,
|
||||||
|
"tax": 0.2017,
|
||||||
|
"startsAt": "2024-02-16T10:00:00.000+01:00",
|
||||||
|
"currency": "EUR",
|
||||||
|
"level": "NORMAL"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"total": 0.2544,
|
||||||
|
"energy": 0.053,
|
||||||
|
"tax": 0.2014,
|
||||||
|
"startsAt": "2024-02-16T11:00:00.000+01:00",
|
||||||
|
"currency": "EUR",
|
||||||
|
"level": "NORMAL"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"total": 0.2536,
|
||||||
|
"energy": 0.0523,
|
||||||
|
"tax": 0.2013,
|
||||||
|
"startsAt": "2024-02-16T12:00:00.000+01:00",
|
||||||
|
"currency": "EUR",
|
||||||
|
"level": "NORMAL"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"total": 0.2536,
|
||||||
|
"energy": 0.0523,
|
||||||
|
"tax": 0.2013,
|
||||||
|
"startsAt": "2024-02-16T13:00:00.000+01:00",
|
||||||
|
"currency": "EUR",
|
||||||
|
"level": "NORMAL"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"total": 0.2554,
|
||||||
|
"energy": 0.0538,
|
||||||
|
"tax": 0.2016,
|
||||||
|
"startsAt": "2024-02-16T14:00:00.000+01:00",
|
||||||
|
"currency": "EUR",
|
||||||
|
"level": "NORMAL"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"total": 0.2658,
|
||||||
|
"energy": 0.0626,
|
||||||
|
"tax": 0.2032,
|
||||||
|
"startsAt": "2024-02-16T15:00:00.000+01:00",
|
||||||
|
"currency": "EUR",
|
||||||
|
"level": "NORMAL"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"total": 0.2747,
|
||||||
|
"energy": 0.07,
|
||||||
|
"tax": 0.2047,
|
||||||
|
"startsAt": "2024-02-16T16:00:00.000+01:00",
|
||||||
|
"currency": "EUR",
|
||||||
|
"level": "NORMAL"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"total": 0.2777,
|
||||||
|
"energy": 0.0726,
|
||||||
|
"tax": 0.2051,
|
||||||
|
"startsAt": "2024-02-16T17:00:00.000+01:00",
|
||||||
|
"currency": "EUR",
|
||||||
|
"level": "NORMAL"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"total": 0.2835,
|
||||||
|
"energy": 0.0774,
|
||||||
|
"tax": 0.2061,
|
||||||
|
"startsAt": "2024-02-16T18:00:00.000+01:00",
|
||||||
|
"currency": "EUR",
|
||||||
|
"level": "NORMAL"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"total": 0.2827,
|
||||||
|
"energy": 0.0768,
|
||||||
|
"tax": 0.2059,
|
||||||
|
"startsAt": "2024-02-16T19:00:00.000+01:00",
|
||||||
|
"currency": "EUR",
|
||||||
|
"level": "NORMAL"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"total": 0.2776,
|
||||||
|
"energy": 0.0725,
|
||||||
|
"tax": 0.2051,
|
||||||
|
"startsAt": "2024-02-16T20:00:00.000+01:00",
|
||||||
|
"currency": "EUR",
|
||||||
|
"level": "NORMAL"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"total": 0.2739,
|
||||||
|
"energy": 0.0694,
|
||||||
|
"tax": 0.2045,
|
||||||
|
"startsAt": "2024-02-16T21:00:00.000+01:00",
|
||||||
|
"currency": "EUR",
|
||||||
|
"level": "NORMAL"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"total": 0.2723,
|
||||||
|
"energy": 0.068,
|
||||||
|
"tax": 0.2043,
|
||||||
|
"startsAt": "2024-02-16T22:00:00.000+01:00",
|
||||||
|
"currency": "EUR",
|
||||||
|
"level": "NORMAL"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"total": 0.2628,
|
||||||
|
"energy": 0.06,
|
||||||
|
"tax": 0.2028,
|
||||||
|
"startsAt": "2024-02-16T23:00:00.000+01:00",
|
||||||
|
"currency": "EUR",
|
||||||
|
"level": "NORMAL"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"topic": ""
|
||||||
|
}
|
Loading…
x
Reference in New Issue
Block a user