working on load profiling simulation

This commit is contained in:
Lucas Tan 2025-07-13 15:52:48 +01:00
commit e69c04cda2
7 changed files with 115 additions and 0 deletions

2
.gitignore vendored Normal file
View File

@ -0,0 +1,2 @@
venv/
*.pyc

24
LoadProfile.py Normal file
View File

@ -0,0 +1,24 @@
import numpy as np
from Utilities.Time import generate_timestrings
def get_no_of_peaks(peak_bounds):
peak_occurences = np.random.randint(peak_bounds["min"], peak_bounds["max"], 1)
return peak_occurences
def generate_peak_info(c, dt):
no_of_peaks = get_no_of_peaks(c["site_info"]["no_of_peaks"])
operating_hours = generate_timestrings(
c["site_info"]["operating hours"]["start"],
c["site_info"]["operating hours"]["end"],
dt,
)
peak_times = np.random.choice(operating_hours, no_of_peaks, replace=False)
print(f"Peak times: {peak_times}")
return peak_times
def get_load_profile(c, dt):
return generate_peak_info(c, dt)

21
Utilities/Time.py Normal file
View File

@ -0,0 +1,21 @@
import time
from datetime import datetime, timedelta
def get_current_time():
"""Returns the current time in seconds since the epoch."""
return time.time()
def generate_timestrings(start_time_str, end_time_str, dt):
"""Generates a list of timestamps from start_time to end_time, which are strings such
as 19:00."""
timestamps = []
current_time = datetime.strptime(start_time_str, "%H:%M")
end_time = datetime.strptime(end_time_str, "%H:%M")
while current_time <= end_time:
timestamps.append(current_time)
current_time += timedelta(seconds=dt)
timestrings = [dt.strftime("%H:%M") for dt in timestamps]
return timestrings

7
YAMLs/config.yml Normal file
View File

@ -0,0 +1,7 @@
sim_time:
time_step_minutes: 1
batch_process_hours: 24 # compute load profile of 24 hours at a time
duration_days: 60
paths:
site_info: YAMLs/site_info.yaml

34
YAMLs/site_info.yaml Normal file
View File

@ -0,0 +1,34 @@
# site consumption info to simulate load profile with
sites:
- name: Aetas Damansara
daily_consumption_kWh: 308
maximum_demand_kW: 145
location: 3.132000, 101.623000
- name: Alora
daily_consumption_kWh: 432
maximum_demand_kW: 203
location: 2.997419, 101.589894
- name: Alira
daily_consumption_kWh: 449
maximum_demand_kW: 211
location: 3.057000, 101.582000
- name: Amika
daily_consumption_kWh: 533
maximum_demand_kW: 251
location: 3.048500, 101.634000
- name: Lakeside Sanderling
daily_consumption_kWh: 736
maximum_demand_kW: 346
location: 3.040300, 101.610100
operating hours:
start: "07:00"
end: "19:00"
time zone: Asia/Kuala_Lumpur
no_of_peaks:
min: 30
max: 100
peak_duration:
unit: minutes
min: 0.5
max: 2

21
main.py Normal file
View File

@ -0,0 +1,21 @@
import yaml
from Utilities.Time import get_current_time
from LoadProfile import get_load_profile
# read config file
c = yaml.safe_load(open("YAMLs/config.yml"))
## simulation time setup
# get current time
c["sim_start_time"] = get_current_time()
# get time step in minutes, then convert to seconds
dt = c["sim_time"]["time_step_minutes"] * 60
# compute end time based on duration in days
duration = c["sim_time"]["duration_days"] * 24 * 60 * 60
c["sim_end_time"] = c["sim_start_time"] + duration
# load site info
c["site_info"] = yaml.safe_load(open(c["paths"]["site_info"]))
# generate load profiles
get_load_profile(c, dt)

6
requirements.txt Normal file
View File

@ -0,0 +1,6 @@
numpy==2.3.1
pandas==2.3.1
python-dateutil==2.9.0.post0
pytz==2025.2
six==1.17.0
tzdata==2025.2