From 2d55b710b26f92adccdf3f3c08f0f13dacb5749c Mon Sep 17 00:00:00 2001 From: saeed-rayegan Date: Mon, 8 Jul 2024 14:01:12 -0400 Subject: [PATCH] The internal heat gain data for every building is now exported into a text file named Input_internal_heat_gain_CityLayer.txt to be read from CityBEM. --- main.py | 5 ++- scripts/CityBEM_run.py | 79 ++++++++++++++++++++++++++++++++++---- scripts/geojson_creator.py | 39 ++++++++++++++++--- 3 files changed, 110 insertions(+), 13 deletions(-) diff --git a/main.py b/main.py index 0007e32c..6c1ba2a5 100644 --- a/main.py +++ b/main.py @@ -12,7 +12,10 @@ import hub.helpers.constants as cte from hub.exports.exports_factory import ExportsFactory # Specify the GeoJSON file path -geojson_file = process_geojson(x=-73.5681295982132, y=45.49218262677643, diff=0.001) +# geojson_file = process_geojson(a=-73.5681295982132, b=45.49218262677643, c=-73.5681295982132, d=45.51218262677643, +# e=-73.5881295982132, f=45.49218262677643,g=-73.5881295982132, h=45.51218262677643) +geojson_file = process_geojson(x=-73.5681295982132, y=45.49218262677643, diff=0.0001) + file_path = (Path(__file__).parent / 'input_files' / 'output_buildings.geojson') # Specify the output path for the PDF file output_path = (Path(__file__).parent / 'out_files').resolve() diff --git a/scripts/CityBEM_run.py b/scripts/CityBEM_run.py index 360b2f2e..c2e1903c 100644 --- a/scripts/CityBEM_run.py +++ b/scripts/CityBEM_run.py @@ -36,6 +36,8 @@ def CityBEM_workflow(city): export_building_info(city, CityBEM_path,geojson_data) export_weather_data(city, CityBEM_path) export_comprehensive_building_data(city, CityBEM_path) + export_indoor_temperature_setpoint_data(city, CityBEM_path) + export_internal_heat_gain_data(city, CityBEM_path) run_CityBEM(CityBEM_path) def export_geometry(city, CityBEM_path): """ @@ -124,7 +126,7 @@ def export_comprehensive_building_data(city, CityBEM_path): :param city: City object containing necessary attributes for the workflow. :param CityBEM_path: Path where CityBEM input and output files are stored. """ - with open(CityBEM_path / 'comprehensive_building_data.txt', 'w') as textfile: + with open(CityBEM_path / 'Input_comprehensive_building_data_CityLayer.txt', 'w') as textfile: writer = csv.writer(textfile, delimiter=',') header_row="\t".join([ #building general information @@ -303,19 +305,82 @@ def export_comprehensive_building_data(city, CityBEM_path): #write the final row to the text file textfile.write(row_str + "\n") print("Individual building data is exported into a file named comprehensive_building_data.txt") +def export_indoor_temperature_setpoint_data(city, CityBEM_path): + """ + Extract and export individual building data on indoor temperature setpoints + :param city: City object containing necessary attributes for the workflow. + :param CityBEM_path: Path where CityBEM input and output files are stored. + """ + #open a text file in write mode (write mode removes the content if there is any) + with open(CityBEM_path /'Input_indoor_setpoint_temperature_CityLayer.txt', 'w') as textfile: + #iterate through each building + for building in city.buildings: + #write the building name + textfile.write("building"+building.name + '\t') + #iterate through each internal zone in the building + for internal_zone in building.internal_zones: + #iterate through each boundary in the internal zone + for boundary in internal_zone.thermal_zones_from_internal_zones: + #gather all indoor setpoint values for both cooling and heating + indoorSetpointValues = [] + indoorSetpointValues.extend(boundary.thermal_control.cooling_set_point_schedules[0].values)#cooling on working days + indoorSetpointValues.extend(boundary.thermal_control.cooling_set_point_schedules[1].values)#cooling on Saturday + indoorSetpointValues.extend(boundary.thermal_control.cooling_set_point_schedules[2].values)#cooling on Sunday/holidays + indoorSetpointValues.extend(boundary.thermal_control.heating_set_point_schedules[0].values)#heating on working days + indoorSetpointValues.extend(boundary.thermal_control.heating_set_point_schedules[1].values)#heating on Saturday + indoorSetpointValues.extend(boundary.thermal_control.heating_set_point_schedules[2].values)#heating on Sunday/holidays + + #convert values to a tab-separated strings + values_str = '\t'.join(map(str, indoorSetpointValues)) + + #write the values to the text file for this building + textfile.write(values_str + '\n') + + print("Indoor temperature setpoints for every building is successfully exported into a text file named Input_indoor_setpoint_temperature_CityLayer.txt") +def export_internal_heat_gain_data(city, CityBEM_path): + """ + Extract and export individual building data on internal heat gains (occupant, lighting, and equipment) + :param city: City object containing necessary attributes for the workflow. + :param CityBEM_path: Path where CityBEM input and output files are stored. + """ + # open a text file in write mode (write mode removes the content if there is any) + with open(CityBEM_path / 'Input_internal_heat_gain_CityLayer.txt', 'w') as textfile: + # iterate through each building + for building in city.buildings: + # write the building name + textfile.write("building" + building.name + '\t') # (1) building name + # gather all internal heat gains for every building + internalHeatGains = [] + # iterate through each internal zone in the building + for internal_zone in building.internal_zones: + # iterate through each internal usage in the internal zone + for usage in internal_zone.usages: + # iterate through internal heat gains + for internalGain in usage.internal_gains: # order: Occupancy, Lighting, and Appliances + internalHeatGains.append(internalGain.average_internal_gain) # (2) average_internal_gain + internalHeatGains.append(internalGain.convective_fraction) # (3) convective_fraction + internalHeatGains.append(internalGain.latent_fraction) # (4) latent_fraction + internalHeatGains.append(internalGain.radiative_fraction) # (5) radiative_fraction + internalHeatGains.extend(internalGain.schedules[0].values) # (6-29) Working day + internalHeatGains.extend(internalGain.schedules[1].values) # (30-54) Saturday + internalHeatGains.extend(internalGain.schedules[2].values) # (55-79)Sunday + # convert values to a tab-separated strings + values_str = '\t'.join(map(str, internalHeatGains)) + # write the values to the text file for this building + textfile.write(values_str + '\n') + print("Internal heat gains for every building is successfully exported into a text file named Input_internal_heat_gain_CityLayer.txt") def run_CityBEM(CityBEM_path): """ - Run the CityBEM executable after all inputs are processed. - - :param CityBEM_path: Path where CityBEM input and output files are stored. + Run the CityBEM executable after all inputs are processed. + :param CityBEM_path: Path where CityBEM input and output files are stored. """ try: print('CityBEM execution began:') - CityBEM_exe = CityBEM_path / 'CityBEM.exe' #path to the CityBEM executable - #check if the executable file exists + CityBEM_exe = CityBEM_path / 'CityBEM.exe' # path to the CityBEM executable + # check if the executable file exists if not CityBEM_exe.exists(): print(f"Error: {CityBEM_exe} does not exist.") - subprocess.run(str(CityBEM_exe), check=True, cwd=str(CityBEM_path)) #execute the CityBEM executable + subprocess.run(str(CityBEM_exe), check=True, cwd=str(CityBEM_path)) # execute the CityBEM executable print("CityBEM executable has finished successfully.") except Exception as ex: print(ex) diff --git a/scripts/geojson_creator.py b/scripts/geojson_creator.py index f3c28b2e..da2dae3c 100644 --- a/scripts/geojson_creator.py +++ b/scripts/geojson_creator.py @@ -4,11 +4,40 @@ from shapely import Point from pathlib import Path +# def process_geojson(a, b, c , d, e, f, g , h): +# selection_box = Polygon([[a, b], +# [c, d], +# [e, f], +# [g, h]]) +# geojson_file = Path('./data/collinear_clean 2.geojson').resolve() +# output_file = Path('./input_files/output_buildings.geojson').resolve() +# buildings_in_region = [] +# +# with open(geojson_file, 'r') as file: +# city = json.load(file) +# buildings = city['features'] +# +# for building in buildings: +# coordinates = building['geometry']['coordinates'][0] +# building_polygon = Polygon(coordinates) +# centroid = Point(building_polygon.centroid) +# +# if centroid.within(selection_box): +# buildings_in_region.append(building) +# +# output_region = {"type": "FeatureCollection", +# "features": buildings_in_region} +# +# with open(output_file, 'w') as file: +# file.write(json.dumps(output_region, indent=2)) +# +# return output_file + def process_geojson(x, y, diff): - selection_box = Polygon([[x + diff, y - diff], - [x - diff, y - diff], - [x - diff, y + diff], - [x + diff, y + diff]]) + selection_box = Polygon([[x+diff, y+diff], + [x-diff, y+diff], + [x-diff, y-diff], + [x+diff, y-diff]]) geojson_file = Path('./data/collinear_clean 2.geojson').resolve() output_file = Path('./input_files/output_buildings.geojson').resolve() buildings_in_region = [] @@ -31,4 +60,4 @@ def process_geojson(x, y, diff): with open(output_file, 'w') as file: file.write(json.dumps(output_region, indent=2)) - return output_file + return output_file \ No newline at end of file