working on load profiling simulation
This commit is contained in:
		
						commit
						e69c04cda2
					
				
							
								
								
									
										2
									
								
								.gitignore
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										2
									
								
								.gitignore
									
									
									
									
										vendored
									
									
										Normal file
									
								
							| @ -0,0 +1,2 @@ | |||||||
|  | venv/ | ||||||
|  | *.pyc | ||||||
							
								
								
									
										24
									
								
								LoadProfile.py
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										24
									
								
								LoadProfile.py
									
									
									
									
									
										Normal 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
									
								
							
							
						
						
									
										21
									
								
								Utilities/Time.py
									
									
									
									
									
										Normal 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
									
								
							
							
						
						
									
										7
									
								
								YAMLs/config.yml
									
									
									
									
									
										Normal 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
									
								
							
							
						
						
									
										34
									
								
								YAMLs/site_info.yaml
									
									
									
									
									
										Normal 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
									
								
							
							
						
						
									
										21
									
								
								main.py
									
									
									
									
									
										Normal 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
									
								
							
							
						
						
									
										6
									
								
								requirements.txt
									
									
									
									
									
										Normal 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 | ||||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user