mirror of
https://github.com/Akkudoktor-EOS/EOS.git
synced 2025-08-25 15:01:14 +00:00
class_ems: AC / DC Charging
class_optimize: Timing Bugs fixed class_numpy_encoder: JSON Encoder with Numpy support visualize: AC / DC / Discharge test_class_ems_2: New Test for AC / DC charging decision
This commit is contained in:
@@ -5,6 +5,7 @@ from akkudoktoreos.class_akku import PVAkku
|
||||
from akkudoktoreos.class_ems import EnergieManagementSystem
|
||||
from akkudoktoreos.class_haushaltsgeraet import Haushaltsgeraet
|
||||
from akkudoktoreos.class_inverter import Wechselrichter # Example import
|
||||
from akkudoktoreos.visualize import *
|
||||
|
||||
prediction_hours = 48
|
||||
optimization_hours = 24
|
||||
@@ -32,7 +33,7 @@ def create_ems_instance():
|
||||
|
||||
# Example initialization of electric car battery
|
||||
eauto = PVAkku(kapazitaet_wh=26400, start_soc_prozent=10, hours=48, min_soc_prozent=10)
|
||||
|
||||
eauto.set_charge_per_hour(np.full(48,1))
|
||||
# Parameters based on previous example data
|
||||
pv_prognose_wh = [
|
||||
0,
|
||||
@@ -199,6 +200,9 @@ def create_ems_instance():
|
||||
haushaltsgeraet=home_appliance,
|
||||
wechselrichter=wechselrichter,
|
||||
)
|
||||
|
||||
|
||||
|
||||
return ems
|
||||
|
||||
|
||||
@@ -212,6 +216,21 @@ def test_simulation(create_ems_instance):
|
||||
|
||||
result = ems.simuliere(start_stunde=start_hour)
|
||||
|
||||
visualisiere_ergebnisse(
|
||||
ems.gesamtlast,
|
||||
ems.pv_prognose_wh,
|
||||
ems.strompreis_euro_pro_wh,
|
||||
result,
|
||||
ems.akku.discharge_array+ems.akku.charge_array,
|
||||
None,
|
||||
ems.pv_prognose_wh,
|
||||
start_hour,
|
||||
48,
|
||||
np.full(48, 0.0),
|
||||
filename="visualization_results.pdf",
|
||||
extra_data=None,
|
||||
)
|
||||
|
||||
# Assertions to validate results
|
||||
assert result is not None, "Result should not be None"
|
||||
assert isinstance(result, dict), "Result should be a dictionary"
|
||||
|
224
tests/test_class_ems_2.py
Normal file
224
tests/test_class_ems_2.py
Normal file
@@ -0,0 +1,224 @@
|
||||
import numpy as np
|
||||
import pytest
|
||||
from akkudoktoreos.visualize import *
|
||||
|
||||
from akkudoktoreos.class_akku import PVAkku
|
||||
from akkudoktoreos.class_ems import EnergieManagementSystem
|
||||
from akkudoktoreos.class_haushaltsgeraet import Haushaltsgeraet
|
||||
from akkudoktoreos.class_inverter import Wechselrichter # Example import
|
||||
|
||||
prediction_hours = 48
|
||||
optimization_hours = 24
|
||||
start_hour = 0
|
||||
|
||||
|
||||
# Example initialization of necessary components
|
||||
@pytest.fixture
|
||||
def create_ems_instance():
|
||||
"""
|
||||
Fixture to create an EnergieManagementSystem instance with given test parameters.
|
||||
"""
|
||||
# Initialize the battery and the inverter
|
||||
akku = PVAkku(kapazitaet_wh=5000, start_soc_prozent=80, hours=48, min_soc_prozent=10)
|
||||
akku.reset()
|
||||
wechselrichter = Wechselrichter(10000, akku)
|
||||
|
||||
# Household device (currently not used, set to None)
|
||||
home_appliance = Haushaltsgeraet(
|
||||
hours=prediction_hours,
|
||||
verbrauch_wh=2000,
|
||||
dauer_h=2,
|
||||
)
|
||||
home_appliance.set_startzeitpunkt(2)
|
||||
|
||||
# Example initialization of electric car battery
|
||||
eauto = PVAkku(kapazitaet_wh=26400, start_soc_prozent=100, hours=48, min_soc_prozent=100)
|
||||
|
||||
# Parameters based on previous example data
|
||||
pv_prognose_wh = np.full(prediction_hours, 0)
|
||||
pv_prognose_wh[10] = 5000.0
|
||||
pv_prognose_wh[11] = 5000.0
|
||||
|
||||
|
||||
strompreis_euro_pro_wh = np.full(48, 0.001)
|
||||
strompreis_euro_pro_wh [0:10] = 0.00001
|
||||
strompreis_euro_pro_wh [11:15] = 0.00005
|
||||
strompreis_euro_pro_wh [20] = 0.00001
|
||||
|
||||
einspeiseverguetung_euro_pro_wh = [0.00007] * len(strompreis_euro_pro_wh)
|
||||
|
||||
gesamtlast = [
|
||||
676.71,
|
||||
876.19,
|
||||
527.13,
|
||||
468.88,
|
||||
531.38,
|
||||
517.95,
|
||||
483.15,
|
||||
472.28,
|
||||
1011.68,
|
||||
995.00,
|
||||
1053.07,
|
||||
1063.91,
|
||||
1320.56,
|
||||
1132.03,
|
||||
1163.67,
|
||||
1176.82,
|
||||
1216.22,
|
||||
1103.78,
|
||||
1129.12,
|
||||
1178.71,
|
||||
1050.98,
|
||||
988.56,
|
||||
912.38,
|
||||
704.61,
|
||||
516.37,
|
||||
868.05,
|
||||
694.34,
|
||||
608.79,
|
||||
556.31,
|
||||
488.89,
|
||||
506.91,
|
||||
804.89,
|
||||
1141.98,
|
||||
1056.97,
|
||||
992.46,
|
||||
1155.99,
|
||||
827.01,
|
||||
1257.98,
|
||||
1232.67,
|
||||
871.26,
|
||||
860.88,
|
||||
1158.03,
|
||||
1222.72,
|
||||
1221.04,
|
||||
949.99,
|
||||
987.01,
|
||||
733.99,
|
||||
592.97,
|
||||
]
|
||||
|
||||
# Initialize the energy management system with the respective parameters
|
||||
ems = EnergieManagementSystem(
|
||||
pv_prognose_wh=pv_prognose_wh,
|
||||
strompreis_euro_pro_wh=strompreis_euro_pro_wh,
|
||||
einspeiseverguetung_euro_pro_wh=einspeiseverguetung_euro_pro_wh,
|
||||
eauto=eauto,
|
||||
gesamtlast=gesamtlast,
|
||||
haushaltsgeraet=home_appliance,
|
||||
wechselrichter=wechselrichter,
|
||||
)
|
||||
|
||||
|
||||
ac= np.full(prediction_hours,0)
|
||||
ac[20] = 1
|
||||
ems.set_akku_ac_charge_hours(ac)
|
||||
dc= np.full(prediction_hours,0)
|
||||
dc[11] = 1
|
||||
ems.set_akku_dc_charge_hours(dc)
|
||||
|
||||
return ems
|
||||
|
||||
|
||||
def test_simulation(create_ems_instance):
|
||||
"""
|
||||
Test the EnergieManagementSystem simulation method.
|
||||
"""
|
||||
ems = create_ems_instance
|
||||
|
||||
# Simulate starting from hour 0 (this value can be adjusted)
|
||||
result = ems.simuliere(start_stunde=start_hour)
|
||||
|
||||
# --- Pls do not remove! ---
|
||||
# visualisiere_ergebnisse(
|
||||
# ems.gesamtlast,
|
||||
# ems.pv_prognose_wh,
|
||||
# ems.strompreis_euro_pro_wh,
|
||||
# result,
|
||||
# ems.akku.discharge_array+ems.akku.charge_array,
|
||||
# None,
|
||||
# ems.pv_prognose_wh,
|
||||
# start_hour,
|
||||
# 48,
|
||||
# np.full(48, 0.0),
|
||||
# filename="visualization_results.pdf",
|
||||
# extra_data=None,
|
||||
# )
|
||||
|
||||
# Assertions to validate results
|
||||
assert result is not None, "Result should not be None"
|
||||
assert isinstance(result, dict), "Result should be a dictionary"
|
||||
assert "Last_Wh_pro_Stunde" in result, "Result should contain 'Last_Wh_pro_Stunde'"
|
||||
|
||||
"""
|
||||
Check the result of the simulation based on expected values.
|
||||
"""
|
||||
# Example result returned from the simulation (used for assertions)
|
||||
assert result is not None, "Result should not be None."
|
||||
|
||||
# Check that the result is a dictionary
|
||||
assert isinstance(result, dict), "Result should be a dictionary."
|
||||
|
||||
# Verify that the expected keys are present in the result
|
||||
expected_keys = [
|
||||
"Last_Wh_pro_Stunde",
|
||||
"Netzeinspeisung_Wh_pro_Stunde",
|
||||
"Netzbezug_Wh_pro_Stunde",
|
||||
"Kosten_Euro_pro_Stunde",
|
||||
"akku_soc_pro_stunde",
|
||||
"Einnahmen_Euro_pro_Stunde",
|
||||
"Gesamtbilanz_Euro",
|
||||
"E-Auto_SoC_pro_Stunde",
|
||||
"Gesamteinnahmen_Euro",
|
||||
"Gesamtkosten_Euro",
|
||||
"Verluste_Pro_Stunde",
|
||||
"Gesamt_Verluste",
|
||||
"Haushaltsgeraet_wh_pro_stunde",
|
||||
]
|
||||
|
||||
for key in expected_keys:
|
||||
assert key in result, f"The key '{key}' should be present in the result."
|
||||
|
||||
# Check the length of the main arrays
|
||||
assert (
|
||||
len(result["Last_Wh_pro_Stunde"]) == 48
|
||||
), "The length of 'Last_Wh_pro_Stunde' should be 48."
|
||||
assert (
|
||||
len(result["Netzeinspeisung_Wh_pro_Stunde"]) == 48
|
||||
), "The length of 'Netzeinspeisung_Wh_pro_Stunde' should be 48."
|
||||
assert (
|
||||
len(result["Netzbezug_Wh_pro_Stunde"]) == 48
|
||||
), "The length of 'Netzbezug_Wh_pro_Stunde' should be 48."
|
||||
assert (
|
||||
len(result["Kosten_Euro_pro_Stunde"]) == 48
|
||||
), "The length of 'Kosten_Euro_pro_Stunde' should be 48."
|
||||
assert (
|
||||
len(result["akku_soc_pro_stunde"]) == 48
|
||||
), "The length of 'akku_soc_pro_stunde' should be 48."
|
||||
|
||||
# Verfify DC and AC Charge Bins
|
||||
assert (
|
||||
abs(result["akku_soc_pro_stunde"][10] - 10.0) < 1e-5
|
||||
), "'akku_soc_pro_stunde[10]' should be 10."
|
||||
assert (
|
||||
abs(result["akku_soc_pro_stunde"][11] -79.275184) < 1e-5
|
||||
), "'akku_soc_pro_stunde[11]' should be 79.275184."
|
||||
|
||||
assert (
|
||||
abs(result["Netzeinspeisung_Wh_pro_Stunde"][10] - 3946.93) < 1e-3
|
||||
), "'Netzeinspeisung_Wh_pro_Stunde[11]' should be 4000."
|
||||
|
||||
assert (
|
||||
abs(result["Netzeinspeisung_Wh_pro_Stunde"][11] - 0.0) < 1e-3
|
||||
), "'Netzeinspeisung_Wh_pro_Stunde[11]' should be 0.0."
|
||||
|
||||
assert (
|
||||
abs(result["akku_soc_pro_stunde"][20] - 98
|
||||
) < 1e-5
|
||||
), "'akku_soc_pro_stunde[11]' should be 98."
|
||||
assert (
|
||||
abs(result["Last_Wh_pro_Stunde"][20] - 5450.98) < 1e-3
|
||||
), "'Netzeinspeisung_Wh_pro_Stunde[11]' should be 0.0."
|
||||
|
||||
|
||||
print("All tests passed successfully.")
|
Reference in New Issue
Block a user