From 4082a206380403f7ce7099dff0a4559928d090eb Mon Sep 17 00:00:00 2001 From: p_monsalvete Date: Thu, 23 Mar 2023 16:55:09 -0400 Subject: [PATCH] updated usages in dictionary to reduce not recognized archetypes --- hub/helpers/data/hub_usage_to_nrcan_usage.py | 28 ++++----- hub/unittests/test_usage_factory.py | 66 +++++++++++++++++++- 2 files changed, 77 insertions(+), 17 deletions(-) diff --git a/hub/helpers/data/hub_usage_to_nrcan_usage.py b/hub/helpers/data/hub_usage_to_nrcan_usage.py index bdaa0d41..94eaa68f 100644 --- a/hub/helpers/data/hub_usage_to_nrcan_usage.py +++ b/hub/helpers/data/hub_usage_to_nrcan_usage.py @@ -36,21 +36,21 @@ class HubUsageToNrcanUsage: cte.LABORATORY_AND_RESEARCH_CENTER: 'School/university', cte.STAND_ALONE_RETAIL: 'Retail area', cte.HOSPITAL: 'Hospital', - cte.OUT_PATIENT_HEALTH_CARE: 'Health-care clinic', - cte.HEALTH_CARE: 'Health-care clinic', - cte.RETIREMENT_HOME_OR_ORPHANAGE: 'Health-care clinic', + cte.OUT_PATIENT_HEALTH_CARE: 'Health care clinic', + cte.HEALTH_CARE: 'Health care clinic', + cte.RETIREMENT_HOME_OR_ORPHANAGE: 'Health care clinic', cte.COMMERCIAL: 'Retail area', cte.STRIP_MALL: 'Retail area', cte.SUPERMARKET: 'Retail area', cte.RETAIL_SHOP_WITHOUT_REFRIGERATED_FOOD: 'Retail area', cte.RETAIL_SHOP_WITH_REFRIGERATED_FOOD: 'Retail area', - cte.RESTAURANT: 'Dining - bar/lounge', - cte.QUICK_SERVICE_RESTAURANT: 'Dining - cafeteria', - cte.FULL_SERVICE_RESTAURANT: 'Dining - bar/lounge', - cte.HOTEL: 'Hotel', - cte.HOTEL_MEDIUM_CLASS: 'Motel', - cte.SMALL_HOTEL: 'Motel', - cte.LARGE_HOTEL: 'Hotel', + cte.RESTAURANT: 'Dining - bar lounge/leisure', + cte.QUICK_SERVICE_RESTAURANT: 'Dining - cafeteria/fast food', + cte.FULL_SERVICE_RESTAURANT: 'Dining - bar lounge/leisure', + cte.HOTEL: 'Hotel/Motel', + cte.HOTEL_MEDIUM_CLASS: 'Hotel/Motel', + cte.SMALL_HOTEL: 'Hotel/Motel', + cte.LARGE_HOTEL: 'Hotel/Motel', cte.DORMITORY: 'Dormitory', cte.EVENT_LOCATION: 'Convention centre', cte.CONVENTION_CENTER: 'Convention centre', @@ -59,17 +59,17 @@ class HubUsageToNrcanUsage: cte.INDUSTRY: 'Manufacturing facility', cte.WORKSHOP: 'Workshop', cte.WAREHOUSE: 'Warehouse', - cte.WAREHOUSE_REFRIGERATED: 'Warehouse - refrigerated', + cte.WAREHOUSE_REFRIGERATED: 'Warehouse', cte.SPORTS_LOCATION: 'Exercise centre', cte.SPORTS_ARENA: 'Sports arena', cte.GYMNASIUM: 'Gymnasium', cte.MOTION_PICTURE_THEATRE: 'Motion picture theatre', cte.MUSEUM: 'Museum', cte.PERFORMING_ARTS_THEATRE: 'Performing arts theatre', - cte.TRANSPORTATION: 'Transportation', + cte.TRANSPORTATION: 'Transportation facility', cte.AUTOMOTIVE_FACILITY: 'Automotive facility', - cte.PARKING_GARAGE: 'Parking garage', - cte.RELIGIOUS: 'Religious', + cte.PARKING_GARAGE: 'Storage garage', + cte.RELIGIOUS: 'Religious building', cte.NON_HEATED: 'n/a' } diff --git a/hub/unittests/test_usage_factory.py b/hub/unittests/test_usage_factory.py index 6ff43b60..2f86776a 100644 --- a/hub/unittests/test_usage_factory.py +++ b/hub/unittests/test_usage_factory.py @@ -51,8 +51,11 @@ class TestUsageFactory(TestCase): self.assertIsNotNone(building.walls, 'building walls is none') self.assertIsNotNone(building.roofs, 'building roofs is none') for internal_zone in building.internal_zones: - self.assertTrue(len(internal_zone.usages) > 0, 'usage zones are not defined') - self.assertIsNone(internal_zone.thermal_zones, 'thermal zones are defined') + if internal_zone.usages is None: + print('non heated') + else: + self.assertTrue(len(internal_zone.usages) > 0, 'usage zones are not defined') + self.assertIsNone(internal_zone.thermal_zones, 'thermal zones are defined') self.assertIsNone(building.basement_heated, 'building basement_heated is not none') self.assertIsNone(building.attic_heated, 'building attic_heated is not none') self.assertIsNone(building.terrains, 'building terrains is not none') @@ -66,7 +69,6 @@ class TestUsageFactory(TestCase): self.assertIsNotNone(building.roof_type, 'building roof type is none') self.assertIsNotNone(building.floor_area, 'building floor_area is none') self.assertIsNone(building.households, 'building households is not none') - self.assertTrue(building.is_conditioned, 'building is not conditioned') def _check_usage(self, usage): self.assertIsNotNone(usage.name, 'usage is none') @@ -128,3 +130,61 @@ class TestUsageFactory(TestCase): self.assertIsNotNone(usage.domestic_hot_water.service_temperature, 'domestic hot water service temperature is none') self.assertIsNotNone(usage.domestic_hot_water.schedules, 'domestic hot water schedules is none') + + def test_import_nrcan(self): + """ + Enrich the city with the usage information from nrcan and verify it + """ + file = 'selected_building.geojson' + file_path = (self._example_path / file).resolve() + city = GeometryFactory('geojson', + path=file_path, + height_field='building_height', + year_of_construction_field='ANNEE_CONS', + function_field='CODE_UTILI', + function_to_hub=Dictionaries().montreal_function_to_hub_function).city + + UsageFactory('nrcan', city).enrich() + self._check_buildings(city) + for building in city.buildings: + for internal_zone in building.internal_zones: + if internal_zone.usages is None: + print('non heated') + else: + self.assertIsNot(len(internal_zone.usages), 0, 'no building usage defined') + for usage in internal_zone.usages: + self._check_usage(usage) + self.assertIsNotNone(usage.mechanical_air_change, 'mechanical air change is none') + self.assertIsNotNone(usage.thermal_control.heating_set_point_schedules, + 'control heating set point schedule is none') + self.assertIsNotNone(usage.thermal_control.cooling_set_point_schedules, + 'control cooling set point schedule is none') + self.assertIsNotNone(usage.occupancy, 'occupancy is none') + occupancy = usage.occupancy + self.assertIsNotNone(occupancy.occupancy_density, 'occupancy density is none') + self.assertIsNotNone(occupancy.latent_internal_gain, 'occupancy latent internal gain is none') + self.assertIsNotNone(occupancy.sensible_convective_internal_gain, + 'occupancy sensible convective internal gain is none') + self.assertIsNotNone(occupancy.sensible_radiative_internal_gain, + 'occupancy sensible radiant internal gain is none') + self.assertIsNotNone(occupancy.occupancy_schedules, 'occupancy schedule is none') + self.assertIsNotNone(usage.lighting, 'lighting is none') + lighting = usage.lighting + self.assertIsNotNone(lighting.density, 'lighting density is none') + self.assertIsNotNone(lighting.latent_fraction, 'lighting latent fraction is none') + self.assertIsNotNone(lighting.convective_fraction, 'lighting convective fraction is none') + self.assertIsNotNone(lighting.radiative_fraction, 'lighting radiant fraction is none') + self.assertIsNotNone(lighting.schedules, 'lighting schedule is none') + self.assertIsNotNone(usage.appliances, 'appliances is none') + appliances = usage.appliances + self.assertIsNotNone(appliances.density, 'appliances density is none') + self.assertIsNotNone(appliances.latent_fraction, 'appliances latent fraction is none') + self.assertIsNotNone(appliances.convective_fraction, 'appliances convective fraction is none') + self.assertIsNotNone(appliances.radiative_fraction, 'appliances radiant fraction is none') + self.assertIsNotNone(appliances.schedules, 'appliances schedule is none') + self.assertIsNotNone(usage.thermal_control.hvac_availability_schedules, + 'control hvac availability is none') + self.assertIsNotNone(usage.domestic_hot_water.peak_flow, 'domestic hot water peak flow is none') + self.assertIsNotNone(usage.domestic_hot_water.service_temperature, + 'domestic hot water service temperature is none') + self.assertIsNotNone(usage.domestic_hot_water.schedules, 'domestic hot water schedules is none')