diff --git a/single_test_optimization.py b/single_test_optimization.py index 1da0033..d45aa75 100644 --- a/single_test_optimization.py +++ b/single_test_optimization.py @@ -4,13 +4,13 @@ import time import numpy as np -from akkudoktoreos.class_numpy_encoder import NumpyEncoder -from akkudoktoreos.class_optimize import ( +from akkudoktoreos.config import get_working_dir, load_config +from akkudoktoreos.optimization.genetic import ( OptimizationParameters, OptimizeResponse, optimization_problem, ) -from akkudoktoreos.config import get_working_dir, load_config +from akkudoktoreos.utils import NumpyEncoder from akkudoktoreos.visualize import visualisiere_ergebnisse start_hour = 0 diff --git a/src/akkudoktoreos/class_numpy_encoder.py b/src/akkudoktoreos/class_numpy_encoder.py deleted file mode 100644 index e2f77b7..0000000 --- a/src/akkudoktoreos/class_numpy_encoder.py +++ /dev/null @@ -1,24 +0,0 @@ -import json - -import numpy as np - - -class NumpyEncoder(json.JSONEncoder): - def default(self, obj): - if isinstance(obj, np.ndarray): - return obj.tolist() # Convert NumPy arrays to lists - if isinstance(obj, np.generic): - return obj.item() # Convert NumPy scalars to native Python types - return super(NumpyEncoder, self).default(obj) - - @staticmethod - def dumps(data): - """Static method to serialize a Python object into a JSON string using NumpyEncoder. - - Args: - data: The Python object to serialize. - - Returns: - str: A JSON string representation of the object. - """ - return json.dumps(data, cls=NumpyEncoder) diff --git a/src/akkudoktoreos/devices/__init__.py b/src/akkudoktoreos/devices/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/src/akkudoktoreos/class_akku.py b/src/akkudoktoreos/devices/battery.py similarity index 100% rename from src/akkudoktoreos/class_akku.py rename to src/akkudoktoreos/devices/battery.py diff --git a/src/akkudoktoreos/class_haushaltsgeraet.py b/src/akkudoktoreos/devices/generic.py similarity index 100% rename from src/akkudoktoreos/class_haushaltsgeraet.py rename to src/akkudoktoreos/devices/generic.py diff --git a/src/akkudoktoreos/heatpump.py b/src/akkudoktoreos/devices/heatpump.py similarity index 100% rename from src/akkudoktoreos/heatpump.py rename to src/akkudoktoreos/devices/heatpump.py diff --git a/src/akkudoktoreos/class_inverter.py b/src/akkudoktoreos/devices/inverter.py similarity index 98% rename from src/akkudoktoreos/class_inverter.py rename to src/akkudoktoreos/devices/inverter.py index 3b89314..68fbc68 100644 --- a/src/akkudoktoreos/class_inverter.py +++ b/src/akkudoktoreos/devices/inverter.py @@ -1,6 +1,6 @@ from pydantic import BaseModel, Field -from akkudoktoreos.class_akku import PVAkku +from akkudoktoreos.devices.battery import PVAkku class WechselrichterParameters(BaseModel): diff --git a/src/akkudoktoreos/optimization/__init__.py b/src/akkudoktoreos/optimization/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/src/akkudoktoreos/class_optimize.py b/src/akkudoktoreos/optimization/genetic.py similarity index 98% rename from src/akkudoktoreos/class_optimize.py rename to src/akkudoktoreos/optimization/genetic.py index 0ec9f4e..9f65924 100644 --- a/src/akkudoktoreos/class_optimize.py +++ b/src/akkudoktoreos/optimization/genetic.py @@ -6,17 +6,14 @@ from deap import algorithms, base, creator, tools from pydantic import BaseModel, Field, field_validator, model_validator from typing_extensions import Self -from akkudoktoreos.class_akku import EAutoParameters, PVAkku, PVAkkuParameters -from akkudoktoreos.class_ems import ( +from akkudoktoreos.config import AppConfig +from akkudoktoreos.devices.battery import EAutoParameters, PVAkku, PVAkkuParameters +from akkudoktoreos.devices.generic import Haushaltsgeraet, HaushaltsgeraetParameters +from akkudoktoreos.devices.inverter import Wechselrichter, WechselrichterParameters +from akkudoktoreos.prediction.ems import ( EnergieManagementSystem, EnergieManagementSystemParameters, ) -from akkudoktoreos.class_haushaltsgeraet import ( - Haushaltsgeraet, - HaushaltsgeraetParameters, -) -from akkudoktoreos.class_inverter import Wechselrichter, WechselrichterParameters -from akkudoktoreos.config import AppConfig from akkudoktoreos.visualize import visualisiere_ergebnisse diff --git a/src/akkudoktoreos/prediction/__init__.py b/src/akkudoktoreos/prediction/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/src/akkudoktoreos/class_ems.py b/src/akkudoktoreos/prediction/ems.py similarity index 98% rename from src/akkudoktoreos/class_ems.py rename to src/akkudoktoreos/prediction/ems.py index e52204f..f155e03 100644 --- a/src/akkudoktoreos/class_ems.py +++ b/src/akkudoktoreos/prediction/ems.py @@ -5,10 +5,10 @@ import numpy as np from pydantic import BaseModel, Field, model_validator from typing_extensions import Self -from akkudoktoreos.class_akku import PVAkku -from akkudoktoreos.class_haushaltsgeraet import Haushaltsgeraet -from akkudoktoreos.class_inverter import Wechselrichter from akkudoktoreos.config import EOSConfig +from akkudoktoreos.devices.battery import PVAkku +from akkudoktoreos.devices.generic import Haushaltsgeraet +from akkudoktoreos.devices.inverter import Wechselrichter class EnergieManagementSystemParameters(BaseModel): diff --git a/src/akkudoktoreos/class_load_container.py b/src/akkudoktoreos/prediction/load_container.py similarity index 100% rename from src/akkudoktoreos/class_load_container.py rename to src/akkudoktoreos/prediction/load_container.py diff --git a/src/akkudoktoreos/class_load_corrector.py b/src/akkudoktoreos/prediction/load_corrector.py similarity index 100% rename from src/akkudoktoreos/class_load_corrector.py rename to src/akkudoktoreos/prediction/load_corrector.py diff --git a/src/akkudoktoreos/class_load.py b/src/akkudoktoreos/prediction/load_forecast.py similarity index 100% rename from src/akkudoktoreos/class_load.py rename to src/akkudoktoreos/prediction/load_forecast.py diff --git a/src/akkudoktoreos/class_strompreis.py b/src/akkudoktoreos/prediction/price_forecast.py similarity index 100% rename from src/akkudoktoreos/class_strompreis.py rename to src/akkudoktoreos/prediction/price_forecast.py diff --git a/src/akkudoktoreos/class_pv_forecast.py b/src/akkudoktoreos/prediction/pv_forecast.py similarity index 99% rename from src/akkudoktoreos/class_pv_forecast.py rename to src/akkudoktoreos/prediction/pv_forecast.py index b8b8a86..07f925d 100644 --- a/src/akkudoktoreos/class_pv_forecast.py +++ b/src/akkudoktoreos/prediction/pv_forecast.py @@ -43,9 +43,9 @@ import pandas as pd import requests from pydantic import BaseModel, ValidationError -from akkudoktoreos.cachefilestore import cache_in_file -from akkudoktoreos.datetimeutil import to_datetime -from akkudoktoreos.logutil import get_logger +from akkudoktoreos.utils.cachefilestore import cache_in_file +from akkudoktoreos.utils.datetimeutil import to_datetime +from akkudoktoreos.utils.logutil import get_logger logger = get_logger(__name__, logging_level="DEBUG") diff --git a/src/akkudoktoreos/server/fastapi_server.py b/src/akkudoktoreos/server/fastapi_server.py index 510adc1..6f72499 100755 --- a/src/akkudoktoreos/server/fastapi_server.py +++ b/src/akkudoktoreos/server/fastapi_server.py @@ -16,22 +16,22 @@ import pandas as pd from fastapi import FastAPI, Query from fastapi.responses import FileResponse, RedirectResponse -from akkudoktoreos.class_load import LoadForecast -from akkudoktoreos.class_load_container import Gesamtlast -from akkudoktoreos.class_load_corrector import LoadPredictionAdjuster -from akkudoktoreos.class_optimize import ( - OptimizationParameters, - OptimizeResponse, - optimization_problem, -) -from akkudoktoreos.class_pv_forecast import ForecastResponse, PVForecast -from akkudoktoreos.class_strompreis import HourlyElectricityPriceForecast from akkudoktoreos.config import ( SetupIncomplete, get_start_enddate, get_working_dir, load_config, ) +from akkudoktoreos.optimization.genetic import ( + OptimizationParameters, + OptimizeResponse, + optimization_problem, +) +from akkudoktoreos.prediction.load_container import Gesamtlast +from akkudoktoreos.prediction.load_corrector import LoadPredictionAdjuster +from akkudoktoreos.prediction.load_forecast import LoadForecast +from akkudoktoreos.prediction.price_forecast import HourlyElectricityPriceForecast +from akkudoktoreos.prediction.pv_forecast import ForecastResponse, PVForecast app = FastAPI( title="Akkudoktor-EOS", diff --git a/src/akkudoktoreos/utils/__init__.py b/src/akkudoktoreos/utils/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/src/akkudoktoreos/cachefilestore.py b/src/akkudoktoreos/utils/cachefilestore.py similarity index 99% rename from src/akkudoktoreos/cachefilestore.py rename to src/akkudoktoreos/utils/cachefilestore.py index 5b5ab5a..d780291 100644 --- a/src/akkudoktoreos/cachefilestore.py +++ b/src/akkudoktoreos/utils/cachefilestore.py @@ -34,8 +34,8 @@ import threading from datetime import date, datetime, time, timedelta from typing import List, Optional, Union -from akkudoktoreos.datetimeutil import to_datetime, to_timedelta -from akkudoktoreos.logutil import get_logger +from akkudoktoreos.utils.datetimeutil import to_datetime, to_timedelta +from akkudoktoreos.utils.logutil import get_logger logger = get_logger(__file__) diff --git a/src/akkudoktoreos/datetimeutil.py b/src/akkudoktoreos/utils/datetimeutil.py similarity index 100% rename from src/akkudoktoreos/datetimeutil.py rename to src/akkudoktoreos/utils/datetimeutil.py diff --git a/src/akkudoktoreos/logutil.py b/src/akkudoktoreos/utils/logutil.py similarity index 100% rename from src/akkudoktoreos/logutil.py rename to src/akkudoktoreos/utils/logutil.py diff --git a/src/akkudoktoreos/class_sommerzeit.py b/src/akkudoktoreos/utils/utils.py similarity index 54% rename from src/akkudoktoreos/class_sommerzeit.py rename to src/akkudoktoreos/utils/utils.py index 2693362..a0c7bf7 100644 --- a/src/akkudoktoreos/class_sommerzeit.py +++ b/src/akkudoktoreos/utils/utils.py @@ -1,6 +1,9 @@ import datetime +import json import zoneinfo +import numpy as np + # currently unused def ist_dst_wechsel(tag: datetime.datetime, timezone="Europe/Berlin") -> bool: @@ -16,6 +19,27 @@ def ist_dst_wechsel(tag: datetime.datetime, timezone="Europe/Berlin") -> bool: return dst_change +class NumpyEncoder(json.JSONEncoder): + def default(self, obj): + if isinstance(obj, np.ndarray): + return obj.tolist() # Convert NumPy arrays to lists + if isinstance(obj, np.generic): + return obj.item() # Convert NumPy scalars to native Python types + return super(NumpyEncoder, self).default(obj) + + @staticmethod + def dumps(data): + """Static method to serialize a Python object into a JSON string using NumpyEncoder. + + Args: + data: The Python object to serialize. + + Returns: + str: A JSON string representation of the object. + """ + return json.dumps(data, cls=NumpyEncoder) + + # # Example usage # start_date = datetime.datetime(2024, 3, 31) # Date of the DST change # if ist_dst_wechsel(start_date): diff --git a/tests/test_cachefilestore.py b/tests/test_cachefilestore.py index 55670ca..7c92954 100644 --- a/tests/test_cachefilestore.py +++ b/tests/test_cachefilestore.py @@ -7,8 +7,8 @@ from time import sleep import pytest -from akkudoktoreos.cachefilestore import CacheFileStore, cache_in_file -from akkudoktoreos.datetimeutil import to_datetime +from akkudoktoreos.utils.cachefilestore import CacheFileStore, cache_in_file +from akkudoktoreos.utils.datetimeutil import to_datetime # ----------------------------- # CacheFileStore diff --git a/tests/test_class_akku.py b/tests/test_class_akku.py index dca5e30..b9144d1 100644 --- a/tests/test_class_akku.py +++ b/tests/test_class_akku.py @@ -1,6 +1,6 @@ import unittest -from akkudoktoreos.class_akku import PVAkku, PVAkkuParameters +from akkudoktoreos.devices.battery import PVAkku, PVAkkuParameters class TestPVAkku(unittest.TestCase): diff --git a/tests/test_class_ems.py b/tests/test_class_ems.py index 8132110..42b88ed 100644 --- a/tests/test_class_ems.py +++ b/tests/test_class_ems.py @@ -1,17 +1,14 @@ import numpy as np import pytest -from akkudoktoreos.class_akku import EAutoParameters, PVAkku, PVAkkuParameters -from akkudoktoreos.class_ems import ( +from akkudoktoreos.config import AppConfig +from akkudoktoreos.devices.battery import EAutoParameters, PVAkku, PVAkkuParameters +from akkudoktoreos.devices.generic import Haushaltsgeraet, HaushaltsgeraetParameters +from akkudoktoreos.devices.inverter import Wechselrichter, WechselrichterParameters +from akkudoktoreos.prediction.ems import ( EnergieManagementSystem, EnergieManagementSystemParameters, ) -from akkudoktoreos.class_haushaltsgeraet import ( - Haushaltsgeraet, - HaushaltsgeraetParameters, -) -from akkudoktoreos.class_inverter import Wechselrichter, WechselrichterParameters -from akkudoktoreos.config import AppConfig prediction_hours = 48 optimization_hours = 24 diff --git a/tests/test_class_ems_2.py b/tests/test_class_ems_2.py index e5338e0..09bf664 100644 --- a/tests/test_class_ems_2.py +++ b/tests/test_class_ems_2.py @@ -1,17 +1,14 @@ import numpy as np import pytest -from akkudoktoreos.class_akku import EAutoParameters, PVAkku, PVAkkuParameters -from akkudoktoreos.class_ems import ( +from akkudoktoreos.config import AppConfig +from akkudoktoreos.devices.battery import EAutoParameters, PVAkku, PVAkkuParameters +from akkudoktoreos.devices.generic import Haushaltsgeraet, HaushaltsgeraetParameters +from akkudoktoreos.devices.inverter import Wechselrichter, WechselrichterParameters +from akkudoktoreos.prediction.ems import ( EnergieManagementSystem, EnergieManagementSystemParameters, ) -from akkudoktoreos.class_haushaltsgeraet import ( - Haushaltsgeraet, - HaushaltsgeraetParameters, -) -from akkudoktoreos.class_inverter import Wechselrichter, WechselrichterParameters -from akkudoktoreos.config import AppConfig prediction_hours = 48 optimization_hours = 24 diff --git a/tests/test_class_optimize.py b/tests/test_class_optimize.py index 7f32589..c3a3c52 100644 --- a/tests/test_class_optimize.py +++ b/tests/test_class_optimize.py @@ -5,12 +5,12 @@ from unittest.mock import patch import pytest -from akkudoktoreos.class_optimize import ( +from akkudoktoreos.config import AppConfig +from akkudoktoreos.optimization.genetic import ( OptimizationParameters, OptimizeResponse, optimization_problem, ) -from akkudoktoreos.config import AppConfig DIR_TESTDATA = Path(__file__).parent / "testdata" @@ -37,7 +37,7 @@ def compare_dict(actual: dict[str, Any], expected: dict[str, Any]): ("optimize_input_2.json", "optimize_result_2_full.json", 400), ], ) -@patch("akkudoktoreos.class_optimize.visualisiere_ergebnisse") +@patch("akkudoktoreos.optimization.genetic.visualisiere_ergebnisse") def test_optimize( visualisiere_ergebnisse_patch, fn_in: str, @@ -65,7 +65,7 @@ def test_optimize( # Call the optimization function ergebnis = opt_class.optimierung_ems(parameters=input_data, start_hour=start_hour, ngen=ngen) # with open(f"new_{fn_out}", "w") as f_out: - # from akkudoktoreos.class_numpy_encoder import NumpyEncoder + # from akkudoktoreos.utils import NumpyEncoder # json_data_str = NumpyEncoder.dumps(ergebnis) # json.dump(json.loads(json_data_str), f_out, indent=4) diff --git a/tests/test_datetimeutil.py b/tests/test_datetimeutil.py index d5d099a..c061570 100644 --- a/tests/test_datetimeutil.py +++ b/tests/test_datetimeutil.py @@ -5,7 +5,7 @@ from zoneinfo import ZoneInfo import pytest -from akkudoktoreos.datetimeutil import to_datetime, to_timedelta, to_timezone +from akkudoktoreos.utils.datetimeutil import to_datetime, to_timedelta, to_timezone # ----------------------------- # to_datetime diff --git a/tests/test_heatpump.py b/tests/test_heatpump.py index b3385d5..5dcf48c 100644 --- a/tests/test_heatpump.py +++ b/tests/test_heatpump.py @@ -1,6 +1,6 @@ import pytest -from akkudoktoreos.heatpump import Heatpump +from akkudoktoreos.devices.heatpump import Heatpump @pytest.fixture(scope="function") diff --git a/tests/test_logutil.py b/tests/test_logutil.py index 9573b37..4e789f2 100644 --- a/tests/test_logutil.py +++ b/tests/test_logutil.py @@ -6,7 +6,7 @@ from logging.handlers import RotatingFileHandler import pytest -from akkudoktoreos.logutil import get_logger +from akkudoktoreos.utils.logutil import get_logger # ----------------------------- # get_logger diff --git a/tests/test_pv_forecast.py b/tests/test_pv_forecast.py index cb2fdac..e2907c0 100644 --- a/tests/test_pv_forecast.py +++ b/tests/test_pv_forecast.py @@ -1,7 +1,7 @@ """Test Module for PV Power Forecasting Module. This test module is designed to verify the functionality of the `PVForecast` class -and its methods in the `class_pv_forecast` module. The tests include validation for +and its methods in the `prediction.pv_forecast` module. The tests include validation for forecast data processing, updating AC power measurements, retrieving forecast data, and caching behavior. @@ -19,7 +19,7 @@ Test Cases: - test_cache_loading: Tests loading forecast data from a cached file to ensure caching works as expected. Usage: - This test module uses `pytest` and requires the `akkudoktoreos.class_pv_forecast.py` module to be present. + This test module uses `pytest` and requires the `akkudoktoreos.prediction.pv_forecast.py` module to be present. Run the tests using the command: `pytest test_pv_forecast.py`. """ @@ -31,8 +31,8 @@ from pathlib import Path import pytest -from akkudoktoreos.class_pv_forecast import PVForecast, validate_pv_forecast_data -from akkudoktoreos.datetimeutil import to_datetime +from akkudoktoreos.prediction.pv_forecast import PVForecast, validate_pv_forecast_data +from akkudoktoreos.utils.datetimeutil import to_datetime DIR_TESTDATA = Path(__file__).absolute().parent.joinpath("testdata")