diff --git a/hub/catalog_factories/data_models/energy_systems/archetype.py b/hub/catalog_factories/data_models/energy_systems/archetype.py index b490ebb9..7f43c5dc 100644 --- a/hub/catalog_factories/data_models/energy_systems/archetype.py +++ b/hub/catalog_factories/data_models/energy_systems/archetype.py @@ -56,3 +56,5 @@ class Archetype: } } return content + + diff --git a/hub/catalog_factories/data_models/energy_systems/content.py b/hub/catalog_factories/data_models/energy_systems/content.py index d3fd9068..f6a03ea0 100644 --- a/hub/catalog_factories/data_models/energy_systems/content.py +++ b/hub/catalog_factories/data_models/energy_systems/content.py @@ -69,11 +69,4 @@ class Content: return content - def __str__(self): - """Print content""" - _archetypes = [] - for _archetype in self.archetypes: - _archetypes.append(_archetype.to_dictionary()) - content = {'Archetypes': _archetypes} - return str(content) diff --git a/hub/catalog_factories/data_models/energy_systems/performance_curves.py b/hub/catalog_factories/data_models/energy_systems/performance_curves.py index b713fd44..65cc0878 100644 --- a/hub/catalog_factories/data_models/energy_systems/performance_curves.py +++ b/hub/catalog_factories/data_models/energy_systems/performance_curves.py @@ -14,8 +14,9 @@ class PerformanceCurves: Parameter function class """ - def __init__(self, curve_type, parameters, coefficients): + def __init__(self, curve_type, dependant_variable, parameters, coefficients): self._curve_type = curve_type + self._dependant_variable = dependant_variable self._parameters = parameters self._coefficients = coefficients @@ -35,11 +36,12 @@ class PerformanceCurves: return self._curve_type @property - def function(self): + def dependant_variable(self): """ - y (e.g. COP in COP = a*source temperature**2... ) + y (e.g. COP in COP = a*source temperature**2 + b*source temperature + c*source temperature*supply temperature + + d*supply temperature + e*supply temperature**2 + f) """ - return self._function + return self._dependant_variable @property def parameters(self): @@ -62,7 +64,8 @@ class PerformanceCurves: """Class content to dictionary""" content = {'Parameter Function': { 'curve type': self.curve_type, - 'parameters': self.parameters, + 'dependant variable': self.dependant_variable, + 'parameter(s)': self.parameters, 'coefficients': self.coefficients, } } diff --git a/hub/catalog_factories/data_models/energy_systems/system.py b/hub/catalog_factories/data_models/energy_systems/system.py index 0d4667d3..9dd0ab83 100644 --- a/hub/catalog_factories/data_models/energy_systems/system.py +++ b/hub/catalog_factories/data_models/energy_systems/system.py @@ -36,7 +36,7 @@ class System: self._emission_system = emission_system self._generation_systems = generation_systems self._energy_storage_systems = energy_storage_systems - self._configuration = configuration + # self._configuration = configuration @property def lod(self): @@ -79,7 +79,7 @@ class System: return self._generation_systems @property - def distribution_system(self) -> Union[None, DistributionSystem]: + def distribution_system(self) -> Union[None, List[DistributionSystem]]: """ Get distribution system :return: DistributionSystem @@ -87,7 +87,7 @@ class System: return self._distribution_system @property - def emission_system(self) -> Union[None, EmissionSystem]: + def emission_system(self) -> Union[None, List[EmissionSystem]]: """ Get emission system :return: EmissionSystem @@ -107,12 +107,10 @@ class System: _generation_systems = [] for _generation in self.generation_systems: _generation_systems.append(_generation.to_dictionary()) - _distribution_system = None - if self.distribution_system is not None: - _distribution_system = self.distribution_system.to_dictionary() - _emission_system = None - if self.emission_system is not None: - _emission_system = self.emission_system.to_dictionary() + _distribution_system = [_distribution.to_dictionary() for _distribution in + self.distribution_system] if self.distribution_system is not None else None + _emission_system = [_emission.to_dictionary() for _emission in + self.emission_system] if self.emission_system is not None else None _storage_system = [_storage.to_dictionary() for _storage in self.energy_storage_system] if self.energy_storage_system is not None else None @@ -120,10 +118,10 @@ class System: 'name': self.name, 'level of detail': self.lod, 'demand types': self.demand_types, - 'Generation system(s)': _generation_systems, - 'distribution system': _distribution_system, - 'emission system': _emission_system, - 'energy storage system': _storage_system, + 'generation system(s)': _generation_systems, + 'distribution system(s)': _distribution_system, + 'emission system(s)': _emission_system, + 'energy storage system(s)': _storage_system, } } return content diff --git a/hub/catalog_factories/energy_systems/north_america_energy_system_catalog.py b/hub/catalog_factories/energy_systems/north_america_energy_system_catalog.py index 933ddc62..a1e4798e 100644 --- a/hub/catalog_factories/energy_systems/north_america_energy_system_catalog.py +++ b/hub/catalog_factories/energy_systems/north_america_energy_system_catalog.py @@ -6,14 +6,13 @@ Project Coder Saeed Ranjbar saeed.ranjbar@concordia.ca Code contributors: Pilar Monsalvete Alvarez de Uribarri pilar.monsalvete@concordia.ca """ - import xmltodict from hub.catalog_factories.catalog import Catalog from hub.catalog_factories.data_models.energy_systems.system import System from hub.catalog_factories.data_models.energy_systems.content import Content from hub.catalog_factories.data_models.energy_systems.generation_system import GenerationSystem from hub.catalog_factories.data_models.energy_systems.pv_generation_system import PvGenerationSystem -from hub.catalog_factories.data_models.energy_systems.energy_storage_system import EnergyStorageSystem +from hub.catalog_factories.data_models.energy_systems.thermal_storage_system import ThermalStorageSystem from hub.catalog_factories.data_models.energy_systems.performance_curves import PerformanceCurves from hub.catalog_factories.data_models.energy_systems.archetype import Archetype from hub.catalog_factories.data_models.construction.material import Material @@ -40,7 +39,6 @@ class NorthAmericaEnergySystemCatalog(Catalog): None, self._storage_components) print(self._content) - def _load_generation_components(self): generation_components = [] boilers = self._archetypes['EnergySystemCatalog']['energy_generation_components']['boilers'] @@ -55,7 +53,8 @@ class NorthAmericaEnergySystemCatalog(Catalog): system_type = 'boiler' boiler_fuel_type = boiler['@fuel'] boiler_nominal_thermal_output = float(boiler['@installedThermalPower']) - boiler_maximum_heat_output = float(boiler['@modulationRange']) + boiler_maximum_heat_output = float(boiler['@maximumHeatOutput']) + boiler_minimum_heat_output = float(boiler['@minimumHeatOutput']) boiler_heat_efficiency = float(boiler['@nominalEfficiency']) boiler_component = GenerationSystem(boiler_id, @@ -65,8 +64,8 @@ class NorthAmericaEnergySystemCatalog(Catalog): system_type, boiler_fuel_type, boiler_nominal_thermal_output, - None, - None, + boiler_maximum_heat_output, + boiler_minimum_heat_output, None, None, boiler_heat_efficiency, @@ -99,18 +98,20 @@ class NorthAmericaEnergySystemCatalog(Catalog): system_type = 'heat pump' heat_pump_fuel_type = heat_pump['@fuel'] heat_pump_nominal_thermal_output = float(heat_pump['@installedThermalPower']) - heat_pump_modulation_range = float(heat_pump['@modulationRange']) - heat_pump_source_type = heat_pump['@heatSource'] + heat_pump_maximum_heat_output = float(heat_pump['@maximumHeatOutput']) + heat_pump_minimum_heat_output = float(heat_pump['@minimumHeatOutput']) + heat_pump_source_medium = heat_pump['@heatSource'] heat_pump_supply_medium = heat_pump['@supply_medium'] heat_pump_nominal_cop = float(heat_pump['@nominalCOP']) - heat_pump_maximum_heating_temperature = float(heat_pump['@maxHeatingSupTemperature']) - heat_pump_minimum_heating_temperature = float(heat_pump['@minHeatingSupTemperature']) - heat_pump_maximum_cooling_temperature = float(heat_pump['@maxCoolingSupTemperature']) - heat_pump_minimum_cooling_temperature = float(heat_pump['@minCoolingSupTemperature']) + heat_pump_maximum_heat_supply_temperature = float(heat_pump['@maxHeatingSupTemperature']) + heat_pump_minimum_heat_supply_temperature = float(heat_pump['@minHeatingSupTemperature']) + heat_pump_maximum_cooling_supply_temperature = float(heat_pump['@maxCoolingSupTemperature']) + heat_pump_minimum_cooling_supply_temperature = float(heat_pump['@minCoolingSupTemperature']) cop_curve_type = heat_pump['performance_curve']['@curve_type'] + dependant_variable = heat_pump['performance_curve']['dependant_variable'] parameters = heat_pump['performance_curve']['parameters'] coefficients = list(heat_pump['performance_curve']['coefficients'].values()) - cop_curve = PerformanceCurves(cop_curve_type, parameters, coefficients) + cop_curve = PerformanceCurves(cop_curve_type, dependant_variable, parameters, coefficients) heat_pump_component = GenerationSystem(heat_pump_id, heat_pump_name, @@ -119,9 +120,9 @@ class NorthAmericaEnergySystemCatalog(Catalog): system_type, heat_pump_fuel_type, heat_pump_nominal_thermal_output, - None, - None, - heat_pump_source_type, + heat_pump_maximum_heat_output, + heat_pump_minimum_heat_output, + heat_pump_source_medium, heat_pump_supply_medium, heat_pump_nominal_cop, None, @@ -132,10 +133,10 @@ class NorthAmericaEnergySystemCatalog(Catalog): None, None, None, - heat_pump_maximum_heating_temperature, - heat_pump_minimum_heating_temperature, - heat_pump_maximum_cooling_temperature, - heat_pump_minimum_cooling_temperature, + heat_pump_maximum_heat_supply_temperature, + heat_pump_minimum_heat_supply_temperature, + heat_pump_maximum_cooling_supply_temperature, + heat_pump_minimum_cooling_supply_temperature, None, None, cop_curve, @@ -288,65 +289,58 @@ class NorthAmericaEnergySystemCatalog(Catalog): name = tes['@name'] model_name = tes['@modelName'] manufacturer = tes['@manufacturer'] - volume = tes['@volume'] - height = tes['@height'] + storage_type = 'sensible' + volume = tes['physical_characteristics']['@volume'] + height = tes['physical_characteristics']['@height'] maximum_operating_temperature = tes['@maxTemp'] materials = self._load_materials() - insulation_material_name = tes['@insulationMaterial'] - insulation_material = self._search_material(materials, insulation_material_name) - material_name = tes['@tankMaterial'] - tank_material = self._search_material(materials, material_name) - thickness = float(tes['@insulationThickness']) / 100 # from cm to m + insulation_material_id = tes['insulation']['@material_id'] + insulation_material = self._search_material(materials, insulation_material_id) + material_id = tes['physical_characteristics']['@material_id'] + tank_material = self._search_material(materials, material_id) + thickness = float(tes['insulation']['@insulationThickness']) / 100 # from cm to m insulation_layer = Layer(None, 'insulation', insulation_material, thickness) - thickness = float(tes['@tankThickness']) / 100 # from cm to m - tank_layer = Layer(None, 'insulation', tank_material, thickness) - # the convention is from outside to inside + thickness = float(tes['physical_characteristics']['@tankThickness']) / 100 # from cm to m + tank_layer = Layer(None, 'tank', tank_material, thickness) +# the convention is from outside to inside layers = [insulation_layer, tank_layer] - storage_component = EnergyStorageSystem(storage_id, - name, - model_name, - manufacturer, - 'thermal', - volume, - None, - None, - None, - None, - None, - height, - layers, - maximum_operating_temperature) + storage_component = ThermalStorageSystem(storage_id, + name, + model_name, + manufacturer, + storage_type, + volume, + height, + layers, + maximum_operating_temperature) storage_components.append(storage_component) for template in template_storages: storage_id = template['@storage_id'] name = template['@name'] + storage_type = 'sensible' maximum_temperature = template['@maxTemp'] + height = template['physical_characteristics']['@height'] materials = self._load_materials() - insulation_material_name = template['@insulationMaterial'] - insulation_material = self._search_material(materials, insulation_material_name) - material_name = template['@tankMaterial'] - tank_material = self._search_material(materials, material_name) - thickness = float(template['@insulationThickness']) / 100 # from cm to m + insulation_material_id = template['insulation']['@material_id'] + insulation_material = self._search_material(materials, insulation_material_id) + material_id = template['physical_characteristics']['@material_id'] + tank_material = self._search_material(materials, material_id) + thickness = float(template['insulation']['@insulationThickness']) / 100 # from cm to m insulation_layer = Layer(None, 'insulation', insulation_material, thickness) - thickness = float(template['@tankThickness']) / 100 # from cm to m - tank_layer = Layer(None, 'insulation', tank_material, thickness) - # the convention is from outside to inside + thickness = float(template['physical_characteristics']['@tankThickness']) / 100 # from cm to m + tank_layer = Layer(None, 'tank', tank_material, thickness) +# the convention is from outside to inside layers = [insulation_layer, tank_layer] - storage_component = EnergyStorageSystem(storage_id, - name, - None, - None, - 'thermal', - None, - None, - None, - None, - None, - None, - None, - layers, - maximum_temperature) + storage_component = ThermalStorageSystem(storage_id, + name, + None, + None, + storage_type, + None, + height, + layers, + maximum_temperature) storage_components.append(storage_component) return storage_components @@ -393,9 +387,10 @@ class NorthAmericaEnergySystemCatalog(Catalog): materials = [] _materials = self._archetypes['EnergySystemCatalog']['materials']['material'] for _material in _materials: + material_id = _material['@material_id'] name = _material['@name'] thermal_conductivity = _material['@thermalConductivity'] - material = Material(None, + material = Material(material_id, name, None, None, @@ -409,15 +404,15 @@ class NorthAmericaEnergySystemCatalog(Catalog): return materials @staticmethod - def _search_material(materials, material_name): + def _search_material(materials, material_id): _material = None for material in materials: - if material.name == material_name: + if int(material.id) == int(material_id): _material = material return _material if _material is None: - raise ValueError(f'Material not found in catalog [{material_name}]') + raise ValueError(f'Material with the id = [{material_id}] not found in catalog ') @staticmethod def _search_generation_equipment(generation_systems, generation_id): diff --git a/hub/data/energy_systems/north_america_systems.xml b/hub/data/energy_systems/north_america_systems.xml index 6fe12090..285f9de7 100644 --- a/hub/data/energy_systems/north_america_systems.xml +++ b/hub/data/energy_systems/north_america_systems.xml @@ -5,37 +5,37 @@ - - - - - - - - - - - + + + + + + + + + + + - + - COP + COP source_temperature supply_temperature - + - COP + COP source_temperature supply_temperature - + - COP + COP source_temperature supply_temperature @@ -55,13 +55,36 @@ - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/tests/test_systems_catalog.py b/tests/test_systems_catalog.py index 8747acb4..a0720708 100644 --- a/tests/test_systems_catalog.py +++ b/tests/test_systems_catalog.py @@ -38,5 +38,7 @@ class TestSystemsCatalog(TestCase): def test_north_america_systems_catalog(self): catalog = EnergySystemsCatalogFactory('north_america').catalog - def test_montreal_catalog(self): - catalog = EnergySystemsCatalogFactory('montreal_custom').catalog + + + # def test_montreal_catalog(self): + # catalog = EnergySystemsCatalogFactory('montreal_custom').catalog