Files
EOS/tests/single_test_prediction.py
T

230 lines
6.8 KiB
Python
Raw Normal View History

2024-12-16 20:26:08 +01:00
#!/usr/bin/env python3
import argparse
2026-07-15 16:38:53 +02:00
import asyncio
2024-12-16 20:26:08 +01:00
import cProfile
import pstats
import sys
import time
from akkudoktoreos.core.coreabc import get_config, get_prediction
2024-12-16 20:26:08 +01:00
config_eos = get_config()
prediction_eos = get_prediction()
def config_pvforecast() -> dict:
"""Configure settings for PV forecast."""
settings = {
"general": {
"latitude": 52.52,
"longitude": 13.405,
},
2025-01-12 05:19:37 +01:00
"prediction": {
2025-01-18 14:26:34 +01:00
"hours": 48,
"historic_hours": 24,
2025-01-12 05:19:37 +01:00
},
"pvforecast": {
2025-01-18 14:26:34 +01:00
"provider": "PVForecastAkkudoktor",
2025-01-19 18:12:50 +01:00
"planes": [
{
"peakpower": 5.0,
"surface_azimuth": -10,
"surface_tilt": 7,
"userhorizon": [20, 27, 22, 20],
"inverter_paco": 10000,
},
{
"peakpower": 4.8,
"surface_azimuth": -90,
"surface_tilt": 7,
"userhorizon": [30, 30, 30, 50],
"inverter_paco": 10000,
},
{
"peakpower": 1.4,
"surface_azimuth": -40,
"surface_tilt": 60,
"userhorizon": [60, 30, 0, 30],
"inverter_paco": 2000,
},
{
"peakpower": 1.6,
"surface_azimuth": 5,
"surface_tilt": 45,
"userhorizon": [45, 25, 30, 60],
"inverter_paco": 1400,
},
],
2025-01-12 05:19:37 +01:00
},
2024-12-16 20:26:08 +01:00
}
return settings
def config_weather() -> dict:
"""Configure settings for weather forecast."""
settings = {
"general": {
"latitude": 52.52,
"longitude": 13.405,
},
2025-01-12 05:19:37 +01:00
"prediction": {
2025-01-18 14:26:34 +01:00
"hours": 48,
"historic_hours": 24,
2025-01-12 05:19:37 +01:00
},
"weather": dict(),
2024-12-16 20:26:08 +01:00
}
return settings
def config_elecprice() -> dict:
"""Configure settings for electricity price forecast."""
settings = {
"general": {
"latitude": 52.52,
"longitude": 13.405,
},
2025-01-12 05:19:37 +01:00
"prediction": {
2025-01-18 14:26:34 +01:00
"hours": 48,
"historic_hours": 24,
2025-01-12 05:19:37 +01:00
},
"elecprice": dict(),
2024-12-16 20:26:08 +01:00
}
return settings
2025-10-28 02:50:31 +01:00
def config_feedintarifffixed() -> dict:
"""Configure settings for feed in tariff forecast."""
settings = {
"general": {
"latitude": 52.52,
"longitude": 13.405,
},
"prediction": {
"hours": 48,
"historic_hours": 24,
},
"feedintariff": dict(),
}
return settings
2024-12-16 20:26:08 +01:00
def config_load() -> dict:
"""Configure settings for load forecast."""
settings = {
"general": {
"latitude": 52.52,
"longitude": 13.405,
},
2025-01-12 05:19:37 +01:00
"prediction": {
2025-01-18 14:26:34 +01:00
"hours": 48,
"historic_hours": 24,
},
2024-12-16 20:26:08 +01:00
}
return settings
def run_prediction(provider_id: str, verbose: bool = False) -> str:
"""Run the prediction.
Args:
provider_id (str): ID of prediction provider.
verbose (bool, optional): Whether to print verbose output. Defaults to False.
Returns:
dict: Prediction result as a dictionary
"""
# Initialize the oprediction
config_eos = get_config()
prediction_eos = get_prediction()
if provider_id in ("PVForecastAkkudoktor",):
settings = config_pvforecast()
2025-02-12 21:35:51 +01:00
forecast = "pvforecast"
2024-12-16 20:26:08 +01:00
elif provider_id in ("BrightSky", "ClearOutside"):
settings = config_weather()
2025-02-12 21:35:51 +01:00
forecast = "weather"
2025-01-19 18:12:50 +01:00
elif provider_id in ("ElecPriceAkkudoktor",):
2024-12-16 20:26:08 +01:00
settings = config_elecprice()
2025-02-12 21:35:51 +01:00
forecast = "elecprice"
2025-10-28 02:50:31 +01:00
elif provider_id in ("FeedInTariffFixed",):
settings = config_feedintarifffixed()
forecast = "feedintariff"
2024-12-16 20:26:08 +01:00
elif provider_id in ("LoadAkkudoktor",):
settings = config_load()
forecast = "loadforecast"
settings["load"]["LoadAkkudoktor"]["loadakkudoktor_year_energy_wh"] = 1000
2024-12-16 20:26:08 +01:00
else:
raise ValueError(f"Unknown provider '{provider_id}'.")
2025-02-12 21:35:51 +01:00
settings[forecast]["provider"] = provider_id
2024-12-16 20:26:08 +01:00
config_eos.merge_settings_from_dict(settings)
2025-02-12 21:35:51 +01:00
provider = prediction_eos.provider_by_id(provider_id)
2026-07-15 16:38:53 +02:00
asyncio.run(prediction_eos.update_data())
2024-12-16 20:26:08 +01:00
# Return result of prediction
if verbose:
2025-02-12 21:35:51 +01:00
print(f"\nProvider ID: {provider.provider_id()}")
print("----------")
print("\nSettings\n----------")
print(settings)
print("\nProvider\n----------")
print(f"elecprice.provider: {config_eos.elecprice.provider}")
2025-10-28 02:50:31 +01:00
print(f"feedintariff.provider: {config_eos.feedintariff.provider}")
2025-02-12 21:35:51 +01:00
print(f"load.provider: {config_eos.load.provider}")
print(f"pvforecast.provider: {config_eos.pvforecast.provider}")
print(f"weather.provider: {config_eos.weather.provider}")
print(f"enabled: {provider.enabled()}")
2024-12-16 20:26:08 +01:00
for key in provider.record_keys:
print(f"\n{key}\n----------")
2026-07-15 16:38:53 +02:00
print(f"Array: {asyncio.run(provider.key_to_array(key))}")
2024-12-16 20:26:08 +01:00
return provider.model_dump_json(indent=4)
def main():
"""Main function to run the optimization script with optional profiling."""
2024-12-29 18:42:49 +01:00
parser = argparse.ArgumentParser(description="Run Prediction")
2024-12-16 20:26:08 +01:00
parser.add_argument("--profile", action="store_true", help="Enable performance profiling")
parser.add_argument(
2024-12-29 18:42:49 +01:00
"--verbose", action="store_true", help="Enable verbose output during prediction"
2024-12-16 20:26:08 +01:00
)
parser.add_argument("--provider-id", type=str, default=0, help="Provider ID of prediction")
args = parser.parse_args()
if args.profile:
# Run with profiling
profiler = cProfile.Profile()
try:
result = profiler.runcall(
run_prediction, provider_id=args.provider_id, verbose=args.verbose
)
# Print profiling statistics
stats = pstats.Stats(profiler)
stats.strip_dirs().sort_stats("cumulative").print_stats(200)
# Print result
print("\nPrediction Result:")
print(result)
except Exception as e:
print(f"Error during prediction: {e}", file=sys.stderr)
sys.exit(1)
else:
# Run without profiling
try:
start_time = time.time()
result = run_prediction(provider_id=args.provider_id, verbose=args.verbose)
end_time = time.time()
elapsed_time = end_time - start_time
print(f"\nElapsed time: {elapsed_time:.4f} seconds.")
print("\nPrediction Result:")
print(result)
except Exception as e:
print(f"Error during prediction: {e}", file=sys.stderr)
sys.exit(1)
if __name__ == "__main__":
2026-07-15 16:38:53 +02:00
asyncio.run(main())