2024-03-03 10:46:46 +01:00
|
|
|
import json
|
|
|
|
from datetime import datetime, timedelta, timezone
|
|
|
|
import numpy as np
|
|
|
|
from pprint import pprint
|
|
|
|
|
|
|
|
class EAuto:
|
|
|
|
def __init__(self, soc=None, capacity = None, power_charge = None, load_allowed = None):
|
|
|
|
self.soc = soc
|
2024-03-03 18:32:47 +01:00
|
|
|
self.init_soc = soc
|
2024-03-03 10:46:46 +01:00
|
|
|
self.akku_kapazitaet = capacity
|
|
|
|
self.ladegeschwindigkeit = power_charge
|
|
|
|
self.laden_moeglich = None
|
|
|
|
self.stuendlicher_soc = []
|
|
|
|
self.stuendliche_last = [] # Hinzugefügt für die Speicherung der stündlichen Last
|
|
|
|
self.laden_moeglich = load_allowed
|
|
|
|
self.berechne_ladevorgang()
|
|
|
|
|
2024-03-03 18:32:47 +01:00
|
|
|
def reset(self):
|
|
|
|
self.soc = self.init_soc
|
|
|
|
self.stuendlicher_soc = []
|
|
|
|
|
2024-03-03 10:46:46 +01:00
|
|
|
def set_laden_moeglich(self, laden_moeglich):
|
|
|
|
self.laden_moeglich = laden_moeglich
|
2024-03-03 18:32:47 +01:00
|
|
|
self.stuendlicher_soc = [] # Beginnt mit dem aktuellen SoC
|
2024-03-03 10:46:46 +01:00
|
|
|
self.stuendliche_last = [] # Zurücksetzen der stündlichen Last
|
|
|
|
|
|
|
|
def berechne_ladevorgang(self):
|
|
|
|
if self.laden_moeglich is None:
|
|
|
|
print("Lademöglichkeit wurde nicht gesetzt.")
|
|
|
|
return
|
|
|
|
|
|
|
|
for moeglich in self.laden_moeglich:
|
2024-03-04 12:37:47 +01:00
|
|
|
if moeglich > 0.0 and self.soc < 100:
|
|
|
|
# Berechnung der geladenen Energie basierend auf dem Anteil der Lademöglichkeit
|
|
|
|
geladene_energie = min(self.ladegeschwindigkeit * moeglich, (100 - self.soc) / 100 * self.akku_kapazitaet)
|
2024-03-03 10:46:46 +01:00
|
|
|
self.soc += geladene_energie / self.akku_kapazitaet * 100
|
|
|
|
self.soc = min(100, self.soc)
|
|
|
|
self.stuendliche_last.append(geladene_energie)
|
|
|
|
else:
|
|
|
|
self.stuendliche_last.append(0) # Keine Ladung in dieser Stunde
|
|
|
|
self.stuendlicher_soc.append(self.soc)
|
|
|
|
|
|
|
|
# Umwandlung der stündlichen Last in ein NumPy-Array
|
|
|
|
self.stuendliche_last = np.array(self.stuendliche_last)
|
|
|
|
|
2024-03-04 12:37:47 +01:00
|
|
|
# def berechne_ladevorgang(self):
|
|
|
|
# if self.laden_moeglich is None:
|
|
|
|
# print("Lademöglichkeit wurde nicht gesetzt.")
|
|
|
|
# return
|
|
|
|
|
|
|
|
# for moeglich in self.laden_moeglich:
|
|
|
|
# if moeglich > 1 and self.soc < 100:
|
|
|
|
# geladene_energie = min(self.ladegeschwindigkeit, (100 - self.soc) / 100 * self.akku_kapazitaet)
|
|
|
|
# self.soc += geladene_energie / self.akku_kapazitaet * 100
|
|
|
|
# self.soc = min(100, self.soc)
|
|
|
|
# self.stuendliche_last.append(geladene_energie)
|
|
|
|
# else:
|
|
|
|
# self.stuendliche_last.append(0) # Keine Ladung in dieser Stunde
|
|
|
|
# self.stuendlicher_soc.append(self.soc)
|
|
|
|
|
|
|
|
# # Umwandlung der stündlichen Last in ein NumPy-Array
|
|
|
|
# self.stuendliche_last = np.array(self.stuendliche_last)
|
|
|
|
|
2024-03-03 10:46:46 +01:00
|
|
|
def get_stuendliche_last(self):
|
|
|
|
"""Gibt das NumPy-Array mit der stündlichen Last zurück."""
|
|
|
|
return self.stuendliche_last
|
|
|
|
|
|
|
|
def get_stuendlicher_soc(self):
|
|
|
|
"""Gibt den stündlichen SoC als Liste zurück."""
|
|
|
|
return self.stuendlicher_soc
|
|
|
|
|
|
|
|
|
|
|
|
# class EAuto:
|
|
|
|
# def __init__(self, soc, akku_kapazitaet, ladegeschwindigkeit):
|
|
|
|
# self.soc = soc
|
|
|
|
# self.akku_kapazitaet = akku_kapazitaet
|
|
|
|
# self.ladegeschwindigkeit = ladegeschwindigkeit
|
|
|
|
# self.laden_moeglich = None
|
|
|
|
# # Initialisieren des Arrays für den stündlichen SoC
|
|
|
|
# self.stuendlicher_soc = []
|
|
|
|
|
|
|
|
# def set_laden_moeglich(self, laden_moeglich):
|
|
|
|
# """
|
|
|
|
# Setzt das Array, das angibt, wann das Laden möglich ist.
|
|
|
|
# :param laden_moeglich: Ein Array von 0 und 1, das die Lademöglichkeit angibt
|
|
|
|
# """
|
|
|
|
# self.laden_moeglich = laden_moeglich
|
|
|
|
# # Zurücksetzen des stündlichen SoC Arrays bei jeder neuen Lademöglichkeit
|
|
|
|
# self.stuendlicher_soc = [self.soc] # Start-SoC hinzufügen
|
|
|
|
|
|
|
|
# def berechne_ladevorgang(self):
|
|
|
|
# """
|
|
|
|
# Berechnet den Ladevorgang basierend auf der Ladegeschwindigkeit und der Lademöglichkeit.
|
|
|
|
# Aktualisiert den SoC entsprechend und speichert den stündlichen SoC.
|
|
|
|
# """
|
|
|
|
# if self.laden_moeglich is None:
|
|
|
|
# print("Lademöglichkeit wurde nicht gesetzt.")
|
|
|
|
# return
|
|
|
|
|
|
|
|
# for i, moeglich in enumerate(self.laden_moeglich):
|
|
|
|
# if moeglich == 1:
|
|
|
|
# # Berechnen, wie viel Energie in einer Stunde geladen werden kann
|
|
|
|
# geladene_energie = min(self.ladegeschwindigkeit, (100 - self.soc) / 100 * self.akku_kapazitaet)
|
|
|
|
# # Aktualisieren des SoC
|
|
|
|
# self.soc += geladene_energie / self.akku_kapazitaet * 100
|
|
|
|
# # Sicherstellen, dass der SoC nicht über 100% geht
|
|
|
|
# self.soc = min(100, self.soc)
|
|
|
|
# print(f"Stunde {i}: Geladen {geladene_energie} kWh, neuer SoC: {self.soc}%")
|
|
|
|
# else:
|
|
|
|
# # Wenn nicht geladen wird, bleibt der SoC gleich
|
|
|
|
# print(f"Stunde {i}: Nicht geladen, SoC bleibt bei {self.soc}%")
|
|
|
|
# self.stuendlicher_soc.append(self.soc) # Aktuellen SoC zum Array hinzufügen
|
|
|
|
# if self.soc >= 100:
|
|
|
|
# print("Akku vollständig geladen.")
|
|
|
|
# break
|
|
|
|
|
|
|
|
# def berechne_benoetigte_energie(self):
|
|
|
|
# """
|
|
|
|
# Berechnet die Gesamtenergie, die benötigt wird, um den Akku vollständig zu laden.
|
|
|
|
# """
|
|
|
|
# return (100 - self.soc) / 100 * self.akku_kapazitaet
|
|
|
|
|
|
|
|
# def get_stuendlicher_soc(self):
|
|
|
|
# """
|
|
|
|
# Gibt den stündlichen Ladezustand (SoC) als Array zurück.
|
|
|
|
# """
|
|
|
|
# return self.stuendlicher_soc
|
|
|
|
|
|
|
|
|
|
|
|
if __name__ == "__main__":
|
|
|
|
# Initialisierung des Elektroauto-Ladens
|
|
|
|
mein_eauto = EAuto(soc=50, akku_kapazitaet=60, ladegeschwindigkeit=11)
|
|
|
|
|
|
|
|
# Festlegen, wann das Laden möglich ist (1 = Laden erlaubt, 0 = Laden nicht erlaubt)
|
|
|
|
# Beispiel: Laden ist nur während der Nachtstunden und frühen Morgenstunden erlaubt
|
|
|
|
laden_moeglich = [0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1]
|
|
|
|
mein_eauto.set_laden_moeglich(laden_moeglich)
|
|
|
|
|
|
|
|
# Durchführen des Ladevorgangs
|
|
|
|
mein_eauto.berechne_ladevorgang()
|
|
|
|
|
|
|
|
# Abrufen und Ausgeben des stündlichen Ladezustands
|
|
|
|
stuendlicher_soc = mein_eauto.get_stuendlicher_soc()
|
|
|
|
print("\nStündlicher SoC während des Ladevorgangs:")
|
|
|
|
for stunde, soc in enumerate(stuendlicher_soc):
|
|
|
|
print(f"Stunde {stunde}: SoC = {soc}%")
|