From c38d163d2331828be183dd5906daa9e52fbe0c20 Mon Sep 17 00:00:00 2001 From: guille Date: Thu, 19 May 2022 12:02:13 -0400 Subject: [PATCH] completed parser for the data sources --- catalog_factories/data_models/usages/usage.py | 14 +++- catalog_factories/usage/comnet_catalog.py | 78 ++++++++++++++----- helpers/constants.py | 7 ++ 3 files changed, 78 insertions(+), 21 deletions(-) diff --git a/catalog_factories/data_models/usages/usage.py b/catalog_factories/data_models/usages/usage.py index 5bc5a86e..e83178b8 100644 --- a/catalog_factories/data_models/usages/usage.py +++ b/catalog_factories/data_models/usages/usage.py @@ -4,10 +4,9 @@ SPDX - License - Identifier: LGPL - 3.0 - or -later Copyright © 2022 Concordia CERC group Project Coder Guille Gutierrez guillermo.gutierrezmorote@concordia.ca """ -from typing import Union, List +from typing import Union from catalog_factories.data_models.usages.appliances import Appliances -from catalog_factories.data_models.usages.internal_gain import InternalGain from catalog_factories.data_models.usages.lighting import Lighting from catalog_factories.data_models.usages.ocupancy import Occupancy from catalog_factories.data_models.usages.thermal_control import ThermalControl @@ -18,6 +17,7 @@ class Usage: hours_day, days_year, mechanical_air_change, + ventilation_rate, occupancy, lighting, appliances, @@ -26,6 +26,7 @@ class Usage: self._hours_day = hours_day self._days_year = days_year self._mechanical_air_change = mechanical_air_change + self._ventilation_rate = ventilation_rate # classes self._occupancy = occupancy self._lighting = lighting @@ -64,6 +65,14 @@ class Usage: """ return self._mechanical_air_change + @property + def ventilation_rate(self) -> Union[None, float]: + """ + Get usage zone ventilation rate in m3/m2s + :return: None or float + """ + return self._ventilation_rate + @property def occupancy(self) -> Union[None, Occupancy]: """ @@ -103,4 +112,3 @@ class Usage: :return: None or ThermalControl """ return self._thermal_control - diff --git a/catalog_factories/usage/comnet_catalog.py b/catalog_factories/usage/comnet_catalog.py index 0a6756e8..724f56a3 100644 --- a/catalog_factories/usage/comnet_catalog.py +++ b/catalog_factories/usage/comnet_catalog.py @@ -11,6 +11,7 @@ import pandas as pd import helpers.constants as cte from catalog_factories.catalog import Catalog from catalog_factories.data_models.usages.appliances import Appliances +from catalog_factories.data_models.usages.content import Content from catalog_factories.data_models.usages.lighting import Lighting from catalog_factories.data_models.usages.ocupancy import Occupancy from catalog_factories.data_models.usages.schedule import Schedule @@ -26,6 +27,7 @@ class ComnetCatalog(Catalog): self._comnet_schedules_path = str(path / 'comnet_schedules_archetypes.xlsx') self._archetypes = self._read_archetype_file() self._schedules = self._read_schedules_file() + sensible_convective = ch().comnet_occupancy_sensible_convective sensible_radiative = ch().comnet_occupancy_sensible_radiant lighting_convective = ch().comnet_lighting_convective @@ -34,6 +36,8 @@ class ComnetCatalog(Catalog): appliances_convective = ch().comnet_plugs_convective appliances_radiative = ch().comnet_plugs_radiant appliances_latent = ch().comnet_plugs_latent + + usages = [] for schedule_key in self._archetypes['schedules_key']: comnet_usage = schedule_key schedule_name = self._archetypes['schedules_key'][schedule_key] @@ -41,11 +45,15 @@ class ComnetCatalog(Catalog): occupancy_archetype = self._archetypes['occupancy'][comnet_usage] lighting_archetype = self._archetypes['lighting'][comnet_usage] appliances_archetype = self._archetypes['plug loads'][comnet_usage] + mechanical_air_change = None # comnet provides ventilation rate only + ventilation_rate = self._archetypes['ventilation rate'][comnet_usage] + # convert cfm/ft2 to m3/m2.s + ventilation_rate = ventilation_rate / (cte.METERS_TO_FEET * cte.MINUTES_TO_SECONDS) # get occupancy - occupancy_density = occupancy_archetype[0] - sensible_heat_gain = occupancy_archetype[1] - latent_heat_gain = occupancy_archetype[1] + occupancy_density = occupancy_archetype[0] / pow(cte.METERS_TO_FEET,2) + sensible_heat_gain = occupancy_archetype[1] * cte.BTU_H_TO_WATTS + latent_heat_gain = occupancy_archetype[1] * cte.BTU_H_TO_WATTS if occupancy_density != 0: occupancy_density = 1 / occupancy_density sensible_convective_internal_gain = occupancy_density * sensible_heat_gain * sensible_convective @@ -58,7 +66,7 @@ class ComnetCatalog(Catalog): self._schedules[schedule_name]['Occupancy']) # get lighting - density = lighting_archetype[4] + density = lighting_archetype[4] / pow(cte.METERS_TO_FEET,2) lighting = Lighting(density, lighting_convective, lighting_radiative, @@ -67,6 +75,10 @@ class ComnetCatalog(Catalog): # get appliances density = appliances_archetype[0] + if density == 'n.a.': + density = 0 + # convert W/ft2 to W/m2 + density = float(density) / pow(cte.METERS_TO_FEET,2) appliances = Appliances(density, appliances_convective, appliances_radiative, @@ -74,21 +86,45 @@ class ComnetCatalog(Catalog): self._schedules[schedule_name]['Receptacle']) # get thermal control - max_heating_setpoint = -1 - min_heating_setpoint = 50 - for schedule in self._schedules[schedule_name]['HtgSetPt']: - if max(schedule) > max_heating_setpoint: - max_heating_setpoint = max(schedule) - if min(schedule) < min_heating_setpoint: - min_heating_setpoint = min(schedule) - min_cooling_setpoint = 50 - for schedule in self._schedules[schedule_name]['ClgSetPt']: - if max(schedule) > min_cooling_setpoint: - min_cooling_setpoint = max(schedule) - thermal_control = ThermalControl(max_heating_setpoint, min_heating_setpoint, ) - usage = Usage(comnet_usage, hours_day, 365, None, occupancy, lighting, appliances, thermal_control) + max_heating_setpoint = cte.MIN_FLOAT + min_heating_setpoint = cte.MAX_FLOAT - # usage = Usage(usage_type) + for schedule in self._schedules[schedule_name]['HtgSetPt']: + if schedule.values is None: + max_heating_setpoint = None + min_heating_setpoint = None + break + if max(schedule.values) > max_heating_setpoint: + max_heating_setpoint = max(schedule.values) + if min(schedule.values) < min_heating_setpoint: + min_heating_setpoint = min(schedule.values) + + min_cooling_setpoint = cte.MAX_FLOAT + for schedule in self._schedules[schedule_name]['ClgSetPt']: + if schedule.values is None: + min_cooling_setpoint = None + break + if min(schedule.values) < min_cooling_setpoint: + min_cooling_setpoint = min(schedule.values) + thermal_control = ThermalControl(max_heating_setpoint, + min_heating_setpoint, + min_cooling_setpoint, + self._schedules[schedule_name]['HVAC Avail'], + self._schedules[schedule_name]['HtgSetPt'], + self._schedules[schedule_name]['ClgSetPt'] + ) + + usages.append(Usage(comnet_usage, + hours_day, + 365, + mechanical_air_change, + ventilation_rate, + occupancy, + lighting, + appliances, + thermal_control)) + + self._content = Content(usages) def _read_schedules_file(self) -> Dict: dictionary = {} @@ -118,6 +154,12 @@ class ComnetCatalog(Catalog): _schedule_values[day] = _extracted_data.iloc[start:end, 3:26].to_numpy().tolist()[0] _schedule = [] for day in _schedule_values: + if schedule_data_type == 'temperature': + # to celsius + if 'n.a.' in _schedule_values[day]: + _schedule_values[day] = None + else: + _schedule_values[day] = [(float(value)-32)*5/9 for value in _schedule_values[day]] _schedule.append(Schedule(schedule_name, _schedule_values[day], schedule_data_type, cte.HOUR, cte.DAY, [day])) _schedules[schedule_name] = _schedule dictionary[usage_name] = _schedules diff --git a/helpers/constants.py b/helpers/constants.py index 4976edd1..40c2c547 100644 --- a/helpers/constants.py +++ b/helpers/constants.py @@ -6,10 +6,13 @@ Project Coder Pilar Monsalvete Alvarez de Uribarri pilar.monsalvete@concordia.ca """ # universal constants +import sys + KELVIN = 273.15 # converters HOUR_TO_MINUTES = 60 +MINUTES_TO_SECONDS = 60 METERS_TO_FEET = 3.28084 BTU_H_TO_WATTS = 0.29307107 KILO_WATTS_HOUR_TO_JULES = 3600000 @@ -125,3 +128,7 @@ HEATING_AND_VENTILATION = 'Heating and ventilation' COOLING_AND_VENTILATION = 'Cooling and ventilation' HEATING_AND_COLLING = 'Heating and cooling' FULL_HVAC = 'Heating and cooling and ventilation' + +# Floats +MAX_FLOAT = float('inf') +MIN_FLOAT = float('-inf')