2024-12-11 16:25:53 -05:00
from pathlib import Path
import pandas as pd
from building_modelling . ep_run_enrich import energy_plus_workflow
from hub . helpers . dictionaries import Dictionaries
from hub . imports . construction_factory import ConstructionFactory
from hub . imports . energy_systems_factory import EnergySystemsFactory
from hub . imports . geometry_factory import GeometryFactory
from hub . imports . usage_factory import UsageFactory
from hub . imports . weather_factory import WeatherFactory
from energy_system_modelling_package import random_assignation
from energy_system_modelling_package . energy_system_modelling_factories . pv_assessment . electricity_demand_calculator import HourlyElectricityDemand
import hub . helpers . constants as cte
import json
base_path = Path ( __file__ ) . parent . resolve ( )
input_files_path = base_path / ' input_files '
input_files_path . mkdir ( parents = True , exist_ok = True )
output_files_path = base_path / ' out_files '
output_files_path . mkdir ( exist_ok = True , parents = True )
energy_plus_output_path = output_files_path / ' energy_plus_outputs '
energy_plus_output_path . mkdir ( parents = True , exist_ok = True )
geojson_path = input_files_path / ' selected_buildings.geojson '
city = GeometryFactory ( file_type = ' geojson ' ,
path = geojson_path ,
aliases_field = [ ' address ' ] ,
height_field = ' height ' ,
year_of_construction_field = ' year_of_construction ' ,
function_field = ' function ' ,
function_to_hub = Dictionaries ( ) . montreal_function_to_hub_function ) . city
for building in city . buildings :
if Dictionaries ( ) . hub_function_to_nrcan_construction_function [ building . function ] == ' n/a ' :
building . function = cte . WAREHOUSE
ConstructionFactory ( ' nrcan ' , city ) . enrich ( )
UsageFactory ( ' nrcan ' , city ) . enrich ( )
WeatherFactory ( ' epw ' , city ) . enrich ( )
residential_buildings = [ ]
non_residential_buildings = [ ]
for building in city . buildings :
if building . function == cte . RESIDENTIAL :
residential_buildings . append ( building )
else :
non_residential_buildings . append ( building )
# random_assignation.call_random(residential_buildings, random_assignation.residential_systems_percentage)
# random_assignation.call_random(non_residential_buildings, random_assignation.non_residential_systems_percentage)
# EnergySystemsFactory('montreal_future', city).enrich()
base_results = pd . read_csv ( output_files_path / ' results_summary.csv ' )
energy_system_archetypes = base_results [ ' energy_system_archetype_name ' ] . to_list ( )
for ( i , building ) in enumerate ( city . buildings ) :
building . energy_systems_archetype_name = energy_system_archetypes [ i ]
EnergySystemsFactory ( ' montreal_future ' , city ) . enrich ( )
energy_plus_workflow ( city , energy_plus_output_path )
# hourly_simulation_results = {}
# hourly_elec_consumption = pd.DataFrame()
# hourly_lighting_appliance_consumption = pd.DataFrame()
# for building in city.buildings:
# hourly_electricity_consumption = HourlyElectricityDemand(building).calculate()
# heating_electricity_consumption = building.heating_consumption[
# cte.HOUR] if 'electricity' in building.energy_systems_archetype_name else [0] * len(
# building.heating_demand[cte.HOUR])
# dhw_electricity_consumption = building.domestic_hot_water_consumption[
# cte.HOUR] if 'electricity' in building.energy_systems_archetype_name else [0] * len(
# building.domestic_hot_water_heat_demand[cte.HOUR])
# if building.cooling_consumption[cte.YEAR][0] == 0:
# cooling_electricity_consumption = [building.cooling_demand[cte.HOUR][i] / (2 * 3.23) for i in
# range(len(building.cooling_consumption[cte.HOUR]))]
# hourly_electricity_consumption = [hourly_electricity_consumption[i] + cooling_electricity_consumption[i] for i in range(len(hourly_electricity_consumption))]
# else:
# cooling_electricity_consumption = building.cooling_consumption[cte.HOUR]
# lighting = building.lighting_electrical_demand[cte.HOUR]
# appliance = building.appliances_electrical_demand[cte.HOUR]
#
# results = pd.DataFrame()
# results['heating_electricity_consumption_kWh'] = [x / (cte.WATTS_HOUR_TO_JULES * 1000) for x in
# heating_electricity_consumption]
# results['cooling_electricity_consumption_kWh'] = [x / (cte.WATTS_HOUR_TO_JULES * 1000) for x in
# cooling_electricity_consumption]
# results['dhw_electricity_consumption_kWh'] = [x / (cte.WATTS_HOUR_TO_JULES * 1000) for x in
# dhw_electricity_consumption]
# results['lighting_kWh'] = [x / (cte.WATTS_HOUR_TO_JULES * 1000) for x in lighting]
#
# results['appliance_kWh'] = [x / (cte.WATTS_HOUR_TO_JULES * 1000) for x in appliance]
# results['lighting_appliance_total_kWh'] = [(lighting[i] + appliance[i]) / (cte.WATTS_HOUR_TO_JULES * 1000)
# for i in range(len(lighting))]
# results['total_electricity_consumption_kWh'] = [x / (cte.WATTS_HOUR_TO_JULES * 1000) for x in hourly_electricity_consumption]
# results.to_csv(output_files_path / 'paper_results' / 'individual_building_simulation_results' / f'{building.name}.csv')
# hourly_elec_consumption[f'{building.name}'] = [x / (cte.WATTS_HOUR_TO_JULES * 1000) for x in hourly_electricity_consumption]
# hourly_lighting_appliance_consumption[f'{building.name}'] = [(lighting[i] + appliance[i]) / (cte.WATTS_HOUR_TO_JULES * 1000)
# for i in range(len(lighting))]
#
# hourly_elec_consumption.to_csv(output_files_path / 'paper_results' / 'total_hourly_electricity_consumption.csv')
# hourly_lighting_appliance_consumption.to_csv(output_files_path / 'paper_results' / 'total_lighting_appliance.csv')
building_names = [ building . name for building in city . buildings ]
building_addresses = [ building . aliases [ 0 ] for building in city . buildings ]
building_heights = [ building . max_height for building in city . buildings ]
buildings_total_floor_areas = [ building . thermal_zones_from_internal_zones [ 0 ] . total_floor_area
for building in city . buildings ]
buildings_roof_areas = [ building . roofs [ 0 ] . perimeter_area for building in city . buildings ]
building_energy_system_archetype_names = [ building . energy_systems_archetype_name for building in city . buildings ]
building_yearly_heating_electricity_consumptions = [ ]
building_yearly_dhw_electricity_consumptions = [ ]
for building in city . buildings :
if ' electricity ' in building . energy_systems_archetype_name :
building_yearly_heating_electricity_consumptions . append ( building . heating_consumption [ cte . YEAR ] [ 0 ] /
( cte . WATTS_HOUR_TO_JULES * 1000 ) )
building_yearly_dhw_electricity_consumptions . append ( building . domestic_hot_water_consumption [ cte . YEAR ] [ 0 ] /
( cte . WATTS_HOUR_TO_JULES * 1000 ) )
else :
building_yearly_heating_electricity_consumptions . append ( 0 )
building_yearly_dhw_electricity_consumptions . append ( 0 )
building_yearly_cooling_consumptions = [ ]
for building in city . buildings :
if building . cooling_consumption [ cte . YEAR ] [ 0 ] == 0 :
building_yearly_cooling_consumptions . append ( building . cooling_demand [ cte . YEAR ] [ 0 ] / ( 2 * 3.23 * cte . WATTS_HOUR_TO_JULES * 1000 ) )
else :
building_yearly_cooling_consumptions . append ( building . cooling_consumption [ cte . YEAR ] [ 0 ] / ( cte . WATTS_HOUR_TO_JULES * 1000 ) )
building_yearly_lighting_demands = [ building . lighting_electrical_demand [ cte . YEAR ] [ 0 ] / ( cte . WATTS_HOUR_TO_JULES * 1000 )
for building in city . buildings ]
building_yearly_appliance_demands = [ building . appliances_electrical_demand [ cte . YEAR ] [ 0 ] / ( cte . WATTS_HOUR_TO_JULES * 1000 )
for building in city . buildings ]
summary = pd . DataFrame ( )
summary [ ' building_name ' ] = building_names
summary [ ' building_address ' ] = building_addresses
summary [ ' building_height_m ' ] = building_heights
summary [ ' total_floor_area_m2 ' ] = buildings_total_floor_areas
summary [ ' roof_area_m2 ' ] = buildings_roof_areas
summary [ ' energy_system_archetype_name ' ] = building_energy_system_archetype_names
summary [ ' yearly_heating_electricity_consumption_kWh ' ] = building_yearly_heating_electricity_consumptions
summary [ ' yearly_cooling_electricity_consumption_kWh ' ] = building_yearly_cooling_consumptions
summary [ ' yearly_dhw_electricity_consumption_kWh ' ] = building_yearly_dhw_electricity_consumptions
summary [ ' yearly_lighting_consumption_kWh ' ] = building_yearly_lighting_demands
summary [ ' yearly_appliance_consumption_kWh ' ] = building_yearly_appliance_demands
summary . to_csv ( output_files_path / ' yearly_results.csv ' , index = False )