From bc2ef9fb59a4136c2fb68cac2be93869295a9801 Mon Sep 17 00:00:00 2001 From: Lucas Tan Date: Sun, 13 Jul 2025 16:26:48 +0100 Subject: [PATCH] trying to get peak simulation to work --- LoadProfile.py | 31 ++++++++++++++++++++++++++----- Utilities/Time.py | 33 +++++++++++++++++++++++++++++++++ YAMLs/site_info.yaml | 4 ++-- main.py | 5 ++++- 4 files changed, 65 insertions(+), 8 deletions(-) diff --git a/LoadProfile.py b/LoadProfile.py index 75bfdb6..8476637 100644 --- a/LoadProfile.py +++ b/LoadProfile.py @@ -1,5 +1,5 @@ import numpy as np -from Utilities.Time import generate_timestrings +from Utilities.Time import generate_timestrings, index_peak_times def get_no_of_peaks(peak_bounds): @@ -15,10 +15,31 @@ def generate_peak_info(c, dt): dt, ) peak_times = np.random.choice(operating_hours, no_of_peaks, replace=False) + peak_durations = np.random.randint( + c["site_info"]["peak_duration"]["min"], + c["site_info"]["peak_duration"]["max"], + no_of_peaks, + ) - print(f"Peak times: {peak_times}") - return peak_times + return peak_times, peak_durations -def get_load_profile(c, dt): - return generate_peak_info(c, dt) +def get_load_profile(c, dt, batch_start_time, batch_process_duration): + # Generate load profile for each site + + # c is the configuration dictionary + # dt is the time step in seconds + # batch_start_time is the start time for the batch process in seconds since the epoch + # batch_process_duration is the duration of the batch process in seconds + + # start with indexing all the peak occurences + # generate timeseries from start to end time + start_time = batch_start_time + end_time = start_time + batch_process_duration + timestamps = np.arange(start_time, end_time, dt) + + # Generate peak times and durations + peak_times, peak_durations = generate_peak_info(c, dt) + + # Generate peak times and durations + peak_indices = index_peak_times(timestamps, peak_times, peak_durations) diff --git a/Utilities/Time.py b/Utilities/Time.py index 40e54ba..751de52 100644 --- a/Utilities/Time.py +++ b/Utilities/Time.py @@ -1,5 +1,7 @@ import time from datetime import datetime, timedelta +import numpy as np +import matplotlib.pyplot as pl def get_current_time(): @@ -19,3 +21,34 @@ def generate_timestrings(start_time_str, end_time_str, dt): current_time += timedelta(seconds=dt) timestrings = [dt.strftime("%H:%M") for dt in timestamps] return timestrings + + +def index_peak_times(timestamps, peak_times, peak_durations): + """Converts peak times from HH:MM format to seconds since epoch.""" + # start_time is the start time of the batch process in seconds since the epoch + # peak_times is a list of strings in HH:MM format + dt = timestamps[1] - timestamps[0] # time step in seconds + peak_indices = np.zeros(len(timestamps), dtype=int) + start_datetime = datetime.fromtimestamp(timestamps[0]) + processed_times = [] + peak_occurence_no = 1 + for time_str, duration in zip(peak_times, peak_durations): + # convert HH:MM to a datetime object + time_obj = datetime.strptime(time_str, "%H:%M") + full_datetime = start_datetime.replace( + hour=time_obj.hour, minute=time_obj.minute, second=0, microsecond=0 + ) + peak_start = int(full_datetime.timestamp()) + peak_end = peak_start + duration * 60 # duration in minutes to seconds + peak_timestamps = np.arange(peak_start, peak_end, dt, dtype=int) + + common, indices_ts, _ = np.intersect1d( + timestamps, peak_timestamps, return_indices=True + ) + peak_indices[indices_ts] = peak_occurence_no + peak_occurence_no += 1 + + pl.plot(peak_indices, label="Peak Indices") + pl.show() + + return processed_times diff --git a/YAMLs/site_info.yaml b/YAMLs/site_info.yaml index 0fbb761..7eca9fc 100644 --- a/YAMLs/site_info.yaml +++ b/YAMLs/site_info.yaml @@ -30,5 +30,5 @@ no_of_peaks: max: 100 peak_duration: unit: minutes - min: 0.5 - max: 2 + min: 1 + max: 4 diff --git a/main.py b/main.py index 813b764..f546732 100644 --- a/main.py +++ b/main.py @@ -14,8 +14,11 @@ dt = c["sim_time"]["time_step_minutes"] * 60 duration = c["sim_time"]["duration_days"] * 24 * 60 * 60 c["sim_end_time"] = c["sim_start_time"] + duration +# batch process hours in seconds +c["sim_time"]["batch_process_seconds"] = c["sim_time"]["batch_process_hours"] * 60 * 60 + # load site info c["site_info"] = yaml.safe_load(open(c["paths"]["site_info"])) # generate load profiles -get_load_profile(c, dt) +get_load_profile(c, dt, c["sim_start_time"], c["sim_time"]["batch_process_seconds"])