diff --git a/hub/__pycache__/__init__.cpython-39.pyc b/hub/__pycache__/__init__.cpython-39.pyc
new file mode 100644
index 00000000..0b825b54
Binary files /dev/null and b/hub/__pycache__/__init__.cpython-39.pyc differ
diff --git a/hub/catalog_factories/__pycache__/__init__.cpython-39.pyc b/hub/catalog_factories/__pycache__/__init__.cpython-39.pyc
new file mode 100644
index 00000000..28c574d6
Binary files /dev/null and b/hub/catalog_factories/__pycache__/__init__.cpython-39.pyc differ
diff --git a/hub/catalog_factories/__pycache__/catalog.cpython-39.pyc b/hub/catalog_factories/__pycache__/catalog.cpython-39.pyc
new file mode 100644
index 00000000..292f03b0
Binary files /dev/null and b/hub/catalog_factories/__pycache__/catalog.cpython-39.pyc differ
diff --git a/hub/catalog_factories/__pycache__/construction_catalog_factory.cpython-39.pyc b/hub/catalog_factories/__pycache__/construction_catalog_factory.cpython-39.pyc
new file mode 100644
index 00000000..47001055
Binary files /dev/null and b/hub/catalog_factories/__pycache__/construction_catalog_factory.cpython-39.pyc differ
diff --git a/hub/catalog_factories/__pycache__/energy_systems_catalog_factory.cpython-39.pyc b/hub/catalog_factories/__pycache__/energy_systems_catalog_factory.cpython-39.pyc
new file mode 100644
index 00000000..fbf450b7
Binary files /dev/null and b/hub/catalog_factories/__pycache__/energy_systems_catalog_factory.cpython-39.pyc differ
diff --git a/hub/catalog_factories/__pycache__/usage_catalog_factory.cpython-39.pyc b/hub/catalog_factories/__pycache__/usage_catalog_factory.cpython-39.pyc
new file mode 100644
index 00000000..81c1376f
Binary files /dev/null and b/hub/catalog_factories/__pycache__/usage_catalog_factory.cpython-39.pyc differ
diff --git a/hub/catalog_factories/construction/__pycache__/__init__.cpython-39.pyc b/hub/catalog_factories/construction/__pycache__/__init__.cpython-39.pyc
new file mode 100644
index 00000000..f0315105
Binary files /dev/null and b/hub/catalog_factories/construction/__pycache__/__init__.cpython-39.pyc differ
diff --git a/hub/catalog_factories/construction/__pycache__/construction_helper.cpython-39.pyc b/hub/catalog_factories/construction/__pycache__/construction_helper.cpython-39.pyc
new file mode 100644
index 00000000..e15c98a7
Binary files /dev/null and b/hub/catalog_factories/construction/__pycache__/construction_helper.cpython-39.pyc differ
diff --git a/hub/catalog_factories/construction/__pycache__/eilat_catalog.cpython-39.pyc b/hub/catalog_factories/construction/__pycache__/eilat_catalog.cpython-39.pyc
new file mode 100644
index 00000000..cf1bd251
Binary files /dev/null and b/hub/catalog_factories/construction/__pycache__/eilat_catalog.cpython-39.pyc differ
diff --git a/hub/catalog_factories/construction/__pycache__/nrcan_catalog.cpython-39.pyc b/hub/catalog_factories/construction/__pycache__/nrcan_catalog.cpython-39.pyc
new file mode 100644
index 00000000..ec96c428
Binary files /dev/null and b/hub/catalog_factories/construction/__pycache__/nrcan_catalog.cpython-39.pyc differ
diff --git a/hub/catalog_factories/construction/__pycache__/nrel_catalog.cpython-39.pyc b/hub/catalog_factories/construction/__pycache__/nrel_catalog.cpython-39.pyc
new file mode 100644
index 00000000..ebcb3532
Binary files /dev/null and b/hub/catalog_factories/construction/__pycache__/nrel_catalog.cpython-39.pyc differ
diff --git a/hub/catalog_factories/data_models/__pycache__/__init__.cpython-39.pyc b/hub/catalog_factories/data_models/__pycache__/__init__.cpython-39.pyc
new file mode 100644
index 00000000..c3aa860b
Binary files /dev/null and b/hub/catalog_factories/data_models/__pycache__/__init__.cpython-39.pyc differ
diff --git a/hub/catalog_factories/data_models/construction/__pycache__/__init__.cpython-39.pyc b/hub/catalog_factories/data_models/construction/__pycache__/__init__.cpython-39.pyc
new file mode 100644
index 00000000..0a6d4160
Binary files /dev/null and b/hub/catalog_factories/data_models/construction/__pycache__/__init__.cpython-39.pyc differ
diff --git a/hub/catalog_factories/data_models/construction/__pycache__/archetype.cpython-39.pyc b/hub/catalog_factories/data_models/construction/__pycache__/archetype.cpython-39.pyc
new file mode 100644
index 00000000..bd4f8d5e
Binary files /dev/null and b/hub/catalog_factories/data_models/construction/__pycache__/archetype.cpython-39.pyc differ
diff --git a/hub/catalog_factories/data_models/construction/__pycache__/construction.cpython-39.pyc b/hub/catalog_factories/data_models/construction/__pycache__/construction.cpython-39.pyc
new file mode 100644
index 00000000..dc51abf3
Binary files /dev/null and b/hub/catalog_factories/data_models/construction/__pycache__/construction.cpython-39.pyc differ
diff --git a/hub/catalog_factories/data_models/construction/__pycache__/content.cpython-39.pyc b/hub/catalog_factories/data_models/construction/__pycache__/content.cpython-39.pyc
new file mode 100644
index 00000000..606b5b67
Binary files /dev/null and b/hub/catalog_factories/data_models/construction/__pycache__/content.cpython-39.pyc differ
diff --git a/hub/catalog_factories/data_models/construction/__pycache__/layer.cpython-39.pyc b/hub/catalog_factories/data_models/construction/__pycache__/layer.cpython-39.pyc
new file mode 100644
index 00000000..18e0d1f5
Binary files /dev/null and b/hub/catalog_factories/data_models/construction/__pycache__/layer.cpython-39.pyc differ
diff --git a/hub/catalog_factories/data_models/construction/__pycache__/material.cpython-39.pyc b/hub/catalog_factories/data_models/construction/__pycache__/material.cpython-39.pyc
new file mode 100644
index 00000000..93e51250
Binary files /dev/null and b/hub/catalog_factories/data_models/construction/__pycache__/material.cpython-39.pyc differ
diff --git a/hub/catalog_factories/data_models/construction/__pycache__/window.cpython-39.pyc b/hub/catalog_factories/data_models/construction/__pycache__/window.cpython-39.pyc
new file mode 100644
index 00000000..76ba2e8b
Binary files /dev/null and b/hub/catalog_factories/data_models/construction/__pycache__/window.cpython-39.pyc differ
diff --git a/hub/catalog_factories/data_models/energy_systems/__pycache__/__init__.cpython-39.pyc b/hub/catalog_factories/data_models/energy_systems/__pycache__/__init__.cpython-39.pyc
new file mode 100644
index 00000000..6a34132f
Binary files /dev/null and b/hub/catalog_factories/data_models/energy_systems/__pycache__/__init__.cpython-39.pyc differ
diff --git a/hub/catalog_factories/data_models/energy_systems/__pycache__/archetype.cpython-39.pyc b/hub/catalog_factories/data_models/energy_systems/__pycache__/archetype.cpython-39.pyc
new file mode 100644
index 00000000..1736d647
Binary files /dev/null and b/hub/catalog_factories/data_models/energy_systems/__pycache__/archetype.cpython-39.pyc differ
diff --git a/hub/catalog_factories/data_models/energy_systems/__pycache__/content.cpython-39.pyc b/hub/catalog_factories/data_models/energy_systems/__pycache__/content.cpython-39.pyc
new file mode 100644
index 00000000..b1756708
Binary files /dev/null and b/hub/catalog_factories/data_models/energy_systems/__pycache__/content.cpython-39.pyc differ
diff --git a/hub/catalog_factories/data_models/energy_systems/__pycache__/distribution_system.cpython-39.pyc b/hub/catalog_factories/data_models/energy_systems/__pycache__/distribution_system.cpython-39.pyc
new file mode 100644
index 00000000..c88c8cf7
Binary files /dev/null and b/hub/catalog_factories/data_models/energy_systems/__pycache__/distribution_system.cpython-39.pyc differ
diff --git a/hub/catalog_factories/data_models/energy_systems/__pycache__/electrical_storage_system.cpython-39.pyc b/hub/catalog_factories/data_models/energy_systems/__pycache__/electrical_storage_system.cpython-39.pyc
new file mode 100644
index 00000000..595b03c1
Binary files /dev/null and b/hub/catalog_factories/data_models/energy_systems/__pycache__/electrical_storage_system.cpython-39.pyc differ
diff --git a/hub/catalog_factories/data_models/energy_systems/__pycache__/emission_system.cpython-39.pyc b/hub/catalog_factories/data_models/energy_systems/__pycache__/emission_system.cpython-39.pyc
new file mode 100644
index 00000000..f86ffdd9
Binary files /dev/null and b/hub/catalog_factories/data_models/energy_systems/__pycache__/emission_system.cpython-39.pyc differ
diff --git a/hub/catalog_factories/data_models/energy_systems/__pycache__/energy_storage_system.cpython-39.pyc b/hub/catalog_factories/data_models/energy_systems/__pycache__/energy_storage_system.cpython-39.pyc
new file mode 100644
index 00000000..aa6aba54
Binary files /dev/null and b/hub/catalog_factories/data_models/energy_systems/__pycache__/energy_storage_system.cpython-39.pyc differ
diff --git a/hub/catalog_factories/data_models/energy_systems/__pycache__/generation_system.cpython-39.pyc b/hub/catalog_factories/data_models/energy_systems/__pycache__/generation_system.cpython-39.pyc
new file mode 100644
index 00000000..868a79fa
Binary files /dev/null and b/hub/catalog_factories/data_models/energy_systems/__pycache__/generation_system.cpython-39.pyc differ
diff --git a/hub/catalog_factories/data_models/energy_systems/__pycache__/non_pv_generation_system.cpython-39.pyc b/hub/catalog_factories/data_models/energy_systems/__pycache__/non_pv_generation_system.cpython-39.pyc
new file mode 100644
index 00000000..711df024
Binary files /dev/null and b/hub/catalog_factories/data_models/energy_systems/__pycache__/non_pv_generation_system.cpython-39.pyc differ
diff --git a/hub/catalog_factories/data_models/energy_systems/__pycache__/performance_curves.cpython-39.pyc b/hub/catalog_factories/data_models/energy_systems/__pycache__/performance_curves.cpython-39.pyc
new file mode 100644
index 00000000..8262bcad
Binary files /dev/null and b/hub/catalog_factories/data_models/energy_systems/__pycache__/performance_curves.cpython-39.pyc differ
diff --git a/hub/catalog_factories/data_models/energy_systems/__pycache__/pv_generation_system.cpython-39.pyc b/hub/catalog_factories/data_models/energy_systems/__pycache__/pv_generation_system.cpython-39.pyc
new file mode 100644
index 00000000..fdc491e2
Binary files /dev/null and b/hub/catalog_factories/data_models/energy_systems/__pycache__/pv_generation_system.cpython-39.pyc differ
diff --git a/hub/catalog_factories/data_models/energy_systems/__pycache__/system.cpython-39.pyc b/hub/catalog_factories/data_models/energy_systems/__pycache__/system.cpython-39.pyc
new file mode 100644
index 00000000..b1ace3ba
Binary files /dev/null and b/hub/catalog_factories/data_models/energy_systems/__pycache__/system.cpython-39.pyc differ
diff --git a/hub/catalog_factories/data_models/energy_systems/__pycache__/thermal_storage_system.cpython-39.pyc b/hub/catalog_factories/data_models/energy_systems/__pycache__/thermal_storage_system.cpython-39.pyc
new file mode 100644
index 00000000..33d8811a
Binary files /dev/null and b/hub/catalog_factories/data_models/energy_systems/__pycache__/thermal_storage_system.cpython-39.pyc differ
diff --git a/hub/catalog_factories/data_models/energy_systems/electrical_storage_system.py b/hub/catalog_factories/data_models/energy_systems/electrical_storage_system.py
index 72e22c0e..3d17fba5 100644
--- a/hub/catalog_factories/data_models/energy_systems/electrical_storage_system.py
+++ b/hub/catalog_factories/data_models/energy_systems/electrical_storage_system.py
@@ -14,12 +14,12 @@ class ElectricalStorageSystem(EnergyStorageSystem):
Energy Storage System Class
"""
- def __init__(self, storage_id, model_name=None, manufacturer=None, storage_type=None,
+ def __init__(self, storage_id, type_energy_stored=None, model_name=None, manufacturer=None, storage_type=None,
nominal_capacity=None, losses_ratio=None, rated_output_power=None, nominal_efficiency=None,
battery_voltage=None, depth_of_discharge=None, self_discharge_rate=None):
super().__init__(storage_id, model_name, manufacturer, nominal_capacity, losses_ratio)
- self._type_energy_stored = 'electrical'
+ self._type_energy_stored = type_energy_stored
self._storage_type = storage_type
self._rated_output_power = rated_output_power
self._nominal_efficiency = nominal_efficiency
diff --git a/hub/catalog_factories/data_models/energy_systems/non_pv_generation_system.py b/hub/catalog_factories/data_models/energy_systems/non_pv_generation_system.py
index a33490d4..5b203d01 100644
--- a/hub/catalog_factories/data_models/energy_systems/non_pv_generation_system.py
+++ b/hub/catalog_factories/data_models/energy_systems/non_pv_generation_system.py
@@ -25,7 +25,7 @@ class NonPvGenerationSystem(GenerationSystem):
maximum_cooling_supply_temperature=None, minimum_cooling_supply_temperature=None, heat_output_curve=None,
heat_fuel_consumption_curve=None, heat_efficiency_curve=None, cooling_output_curve=None,
cooling_fuel_consumption_curve=None, cooling_efficiency_curve=None,
- distribution_systems=None, energy_storage_systems=None):
+ distribution_systems=None, energy_storage_systems=None, dual_supply_capability=False):
super().__init__(system_id=system_id, name=name, model_name=model_name, manufacturer=manufacturer, fuel_type=fuel_type,
distribution_systems=distribution_systems, energy_storage_systems=energy_storage_systems)
self._system_type = system_type
@@ -53,6 +53,7 @@ class NonPvGenerationSystem(GenerationSystem):
self._cooling_output_curve = cooling_output_curve
self._cooling_fuel_consumption_curve = cooling_fuel_consumption_curve
self._cooling_efficiency_curve = cooling_efficiency_curve
+ self._dual_supply_capability = dual_supply_capability
@property
def system_type(self):
@@ -254,6 +255,14 @@ class NonPvGenerationSystem(GenerationSystem):
"""
return self._cooling_efficiency_curve
+ @property
+ def dual_supply_capability(self):
+ """
+ Get dual supply capability
+ :return: bool
+ """
+ return self._dual_supply_capability
+
def to_dictionary(self):
"""Class content to dictionary"""
_distribution_systems = [_distribution_system.to_dictionary() for _distribution_system in
@@ -294,7 +303,8 @@ class NonPvGenerationSystem(GenerationSystem):
'cooling fuel consumption curve': self.cooling_fuel_consumption_curve,
'cooling efficiency curve': self.cooling_efficiency_curve,
'distribution systems connected': _distribution_systems,
- 'storage systems connected': _energy_storage_systems
+ 'storage systems connected': _energy_storage_systems,
+ 'dual supply capability': self.dual_supply_capability
}
}
return content
diff --git a/hub/catalog_factories/data_models/energy_systems/pv_generation_system.py b/hub/catalog_factories/data_models/energy_systems/pv_generation_system.py
index 232d5402..87228afa 100644
--- a/hub/catalog_factories/data_models/energy_systems/pv_generation_system.py
+++ b/hub/catalog_factories/data_models/energy_systems/pv_generation_system.py
@@ -14,7 +14,7 @@ class PvGenerationSystem(GenerationSystem):
Electricity Generation system class
"""
- def __init__(self, system_id, name, model_name=None, manufacturer=None, electricity_efficiency=None,
+ def __init__(self, system_id, name, system_type, model_name=None, manufacturer=None, electricity_efficiency=None,
nominal_electricity_output=None, nominal_ambient_temperature=None, nominal_cell_temperature=None,
nominal_radiation=None, standard_test_condition_cell_temperature=None,
standard_test_condition_maximum_power=None, cell_temperature_coefficient=None, width=None, height=None,
@@ -22,7 +22,7 @@ class PvGenerationSystem(GenerationSystem):
super().__init__(system_id=system_id, name=name, model_name=model_name,
manufacturer=manufacturer, fuel_type='renewable', distribution_systems=distribution_systems,
energy_storage_systems=energy_storage_systems)
- self._system_type = 'PV system'
+ self._system_type = system_type
self._electricity_efficiency = electricity_efficiency
self._nominal_electricity_output = nominal_electricity_output
self._nominal_ambient_temperature = nominal_ambient_temperature
diff --git a/hub/catalog_factories/data_models/energy_systems/thermal_storage_system.py b/hub/catalog_factories/data_models/energy_systems/thermal_storage_system.py
index 6c5382d7..d3cdf255 100644
--- a/hub/catalog_factories/data_models/energy_systems/thermal_storage_system.py
+++ b/hub/catalog_factories/data_models/energy_systems/thermal_storage_system.py
@@ -15,12 +15,12 @@ class ThermalStorageSystem(EnergyStorageSystem):
Energy Storage System Class
"""
- def __init__(self, storage_id, model_name=None, manufacturer=None, storage_type=None,
+ def __init__(self, storage_id, type_energy_stored=None, model_name=None, manufacturer=None, storage_type=None,
nominal_capacity=None, losses_ratio=None, volume=None, height=None, layers=None,
maximum_operating_temperature=None, storage_medium=None):
super().__init__(storage_id, model_name, manufacturer, nominal_capacity, losses_ratio)
- self._type_energy_stored = 'thermal'
+ self._type_energy_stored = type_energy_stored
self._storage_type = storage_type
self._volume = volume
self._height = height
diff --git a/hub/catalog_factories/data_models/usages/__pycache__/__init__.cpython-39.pyc b/hub/catalog_factories/data_models/usages/__pycache__/__init__.cpython-39.pyc
new file mode 100644
index 00000000..27f39124
Binary files /dev/null and b/hub/catalog_factories/data_models/usages/__pycache__/__init__.cpython-39.pyc differ
diff --git a/hub/catalog_factories/data_models/usages/__pycache__/appliances.cpython-39.pyc b/hub/catalog_factories/data_models/usages/__pycache__/appliances.cpython-39.pyc
new file mode 100644
index 00000000..3533a4e2
Binary files /dev/null and b/hub/catalog_factories/data_models/usages/__pycache__/appliances.cpython-39.pyc differ
diff --git a/hub/catalog_factories/data_models/usages/__pycache__/content.cpython-39.pyc b/hub/catalog_factories/data_models/usages/__pycache__/content.cpython-39.pyc
new file mode 100644
index 00000000..ba4240e9
Binary files /dev/null and b/hub/catalog_factories/data_models/usages/__pycache__/content.cpython-39.pyc differ
diff --git a/hub/catalog_factories/data_models/usages/__pycache__/domestic_hot_water.cpython-39.pyc b/hub/catalog_factories/data_models/usages/__pycache__/domestic_hot_water.cpython-39.pyc
new file mode 100644
index 00000000..23ad2e0b
Binary files /dev/null and b/hub/catalog_factories/data_models/usages/__pycache__/domestic_hot_water.cpython-39.pyc differ
diff --git a/hub/catalog_factories/data_models/usages/__pycache__/lighting.cpython-39.pyc b/hub/catalog_factories/data_models/usages/__pycache__/lighting.cpython-39.pyc
new file mode 100644
index 00000000..ca7753f5
Binary files /dev/null and b/hub/catalog_factories/data_models/usages/__pycache__/lighting.cpython-39.pyc differ
diff --git a/hub/catalog_factories/data_models/usages/__pycache__/occupancy.cpython-39.pyc b/hub/catalog_factories/data_models/usages/__pycache__/occupancy.cpython-39.pyc
new file mode 100644
index 00000000..a76d5561
Binary files /dev/null and b/hub/catalog_factories/data_models/usages/__pycache__/occupancy.cpython-39.pyc differ
diff --git a/hub/catalog_factories/data_models/usages/__pycache__/schedule.cpython-39.pyc b/hub/catalog_factories/data_models/usages/__pycache__/schedule.cpython-39.pyc
new file mode 100644
index 00000000..1792d014
Binary files /dev/null and b/hub/catalog_factories/data_models/usages/__pycache__/schedule.cpython-39.pyc differ
diff --git a/hub/catalog_factories/data_models/usages/__pycache__/thermal_control.cpython-39.pyc b/hub/catalog_factories/data_models/usages/__pycache__/thermal_control.cpython-39.pyc
new file mode 100644
index 00000000..8298ec64
Binary files /dev/null and b/hub/catalog_factories/data_models/usages/__pycache__/thermal_control.cpython-39.pyc differ
diff --git a/hub/catalog_factories/data_models/usages/__pycache__/usage.cpython-39.pyc b/hub/catalog_factories/data_models/usages/__pycache__/usage.cpython-39.pyc
new file mode 100644
index 00000000..f87b079c
Binary files /dev/null and b/hub/catalog_factories/data_models/usages/__pycache__/usage.cpython-39.pyc differ
diff --git a/hub/catalog_factories/energy_systems/__pycache__/__init__.cpython-39.pyc b/hub/catalog_factories/energy_systems/__pycache__/__init__.cpython-39.pyc
new file mode 100644
index 00000000..097dc9b8
Binary files /dev/null and b/hub/catalog_factories/energy_systems/__pycache__/__init__.cpython-39.pyc differ
diff --git a/hub/catalog_factories/energy_systems/__pycache__/montreal_custom_catalog.cpython-39.pyc b/hub/catalog_factories/energy_systems/__pycache__/montreal_custom_catalog.cpython-39.pyc
new file mode 100644
index 00000000..29d54354
Binary files /dev/null and b/hub/catalog_factories/energy_systems/__pycache__/montreal_custom_catalog.cpython-39.pyc differ
diff --git a/hub/catalog_factories/energy_systems/__pycache__/montreal_future_system_catalogue.cpython-39.pyc b/hub/catalog_factories/energy_systems/__pycache__/montreal_future_system_catalogue.cpython-39.pyc
new file mode 100644
index 00000000..e4231be7
Binary files /dev/null and b/hub/catalog_factories/energy_systems/__pycache__/montreal_future_system_catalogue.cpython-39.pyc differ
diff --git a/hub/catalog_factories/energy_systems/__pycache__/north_america_energy_system_catalog.cpython-39.pyc b/hub/catalog_factories/energy_systems/__pycache__/north_america_energy_system_catalog.cpython-39.pyc
new file mode 100644
index 00000000..34804384
Binary files /dev/null and b/hub/catalog_factories/energy_systems/__pycache__/north_america_energy_system_catalog.cpython-39.pyc differ
diff --git a/hub/catalog_factories/energy_systems/montreal_custom_catalog.py b/hub/catalog_factories/energy_systems/montreal_custom_catalog.py
index 0c0abb88..1c6bdba5 100644
--- a/hub/catalog_factories/energy_systems/montreal_custom_catalog.py
+++ b/hub/catalog_factories/energy_systems/montreal_custom_catalog.py
@@ -84,8 +84,9 @@ class MontrealCustomCatalog(Catalog):
heat_efficiency=heating_efficiency,
cooling_efficiency=cooling_efficiency,
electricity_efficiency=electricity_efficiency,
- energy_storage_systems=storage_systems
- )
+ energy_storage_systems=storage_systems,
+ dual_supply_capability=False
+ )
_equipments.append(generation_system)
return _equipments
diff --git a/hub/catalog_factories/energy_systems/montreal_future_system_catalogue.py b/hub/catalog_factories/energy_systems/montreal_future_system_catalogue.py
new file mode 100644
index 00000000..d2eb35c3
--- /dev/null
+++ b/hub/catalog_factories/energy_systems/montreal_future_system_catalogue.py
@@ -0,0 +1,539 @@
+"""
+Montreal future energy system catalog
+SPDX - License - Identifier: LGPL - 3.0 - or -later
+Copyright © 2022 Concordia CERC group
+Project Coder Saeed Ranjbar saeed.ranjbar@concordia.ca
+"""
+
+import xmltodict
+from pathlib import Path
+from hub.catalog_factories.catalog import Catalog
+from hub.catalog_factories.data_models.energy_systems.distribution_system import DistributionSystem
+from hub.catalog_factories.data_models.energy_systems.emission_system import EmissionSystem
+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.non_pv_generation_system import NonPvGenerationSystem
+from hub.catalog_factories.data_models.energy_systems.pv_generation_system import PvGenerationSystem
+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
+from hub.catalog_factories.data_models.construction.layer import Layer
+
+
+class MontrealFutureSystemCatalogue(Catalog):
+ """
+ North america energy system catalog class
+ """
+
+ def __init__(self, path):
+ path = str(path / 'montreal_future_systems.xml')
+ with open(path, 'r', encoding='utf-8') as xml:
+ self._archetypes = xmltodict.parse(xml.read(),
+ force_list=['pv_generation_component', 'templateStorages', 'demand'])
+
+ self._storage_components = self._load_storage_components()
+ self._generation_components = self._load_generation_components()
+ self._energy_emission_components = self._load_emission_equipments()
+ self._distribution_components = self._load_distribution_equipments()
+ self._systems = self._load_systems()
+ self._system_archetypes = self._load_archetypes()
+ self._content = Content(self._system_archetypes,
+ self._systems,
+ generations=self._generation_components,
+ distributions=self._distribution_components)
+
+ def _load_generation_components(self):
+ generation_components = []
+ non_pv_generation_components = self._archetypes['EnergySystemCatalog']['energy_generation_components'][
+ 'non_pv_generation_component']
+ if non_pv_generation_components is not None:
+ for non_pv in non_pv_generation_components:
+ system_id = non_pv['system_id']
+ name = non_pv['name']
+ system_type = non_pv['system_type']
+ model_name = non_pv['model_name']
+ manufacturer = non_pv['manufacturer']
+ fuel_type = non_pv['fuel_type']
+ distribution_systems = non_pv['distribution_systems']
+ energy_storage_systems = None
+ if non_pv['energy_storage_systems'] is not None:
+ storage_component = non_pv['energy_storage_systems']['storage_id']
+ storage_systems = self._search_storage_equipment(self._load_storage_components(), storage_component)
+ energy_storage_systems = storage_systems
+ nominal_heat_output = non_pv['nominal_heat_output']
+ maximum_heat_output = non_pv['maximum_heat_output']
+ minimum_heat_output = non_pv['minimum_heat_output']
+ source_medium = non_pv['source_medium']
+ supply_medium = non_pv['supply_medium']
+ heat_efficiency = non_pv['heat_efficiency']
+ nominal_cooling_output = non_pv['nominal_cooling_output']
+ maximum_cooling_output = non_pv['maximum_cooling_output']
+ minimum_cooling_output = non_pv['minimum_cooling_output']
+ cooling_efficiency = non_pv['cooling_efficiency']
+ electricity_efficiency = non_pv['electricity_efficiency']
+ source_temperature = non_pv['source_temperature']
+ source_mass_flow = non_pv['source_mass_flow']
+ nominal_electricity_output = non_pv['nominal_electricity_output']
+ maximum_heat_supply_temperature = non_pv['maximum_heat_supply_temperature']
+ minimum_heat_supply_temperature = non_pv['minimum_heat_supply_temperature']
+ maximum_cooling_supply_temperature = non_pv['maximum_cooling_supply_temperature']
+ minimum_cooling_supply_temperature = non_pv['minimum_cooling_supply_temperature']
+ heat_output_curve = None
+ heat_fuel_consumption_curve = None
+ heat_efficiency_curve = None
+ cooling_output_curve = None
+ cooling_fuel_consumption_curve = None
+ cooling_efficiency_curve = None
+ if non_pv['heat_output_curve'] is not None:
+ curve_type = non_pv['heat_output_curve']['curve_type']
+ dependant_variable = non_pv['heat_output_curve']['dependant_variable']
+ parameters = non_pv['heat_output_curve']['parameters']
+ coefficients = list(non_pv['heat_output_curve']['coefficients'].values())
+ heat_output_curve = PerformanceCurves(curve_type, dependant_variable, parameters, coefficients)
+ if non_pv['heat_fuel_consumption_curve'] is not None:
+ curve_type = non_pv['heat_fuel_consumption_curve']['curve_type']
+ dependant_variable = non_pv['heat_fuel_consumption_curve']['dependant_variable']
+ parameters = non_pv['heat_fuel_consumption_curve']['parameters']
+ coefficients = list(non_pv['heat_fuel_consumption_curve']['coefficients'].values())
+ heat_fuel_consumption_curve = PerformanceCurves(curve_type, dependant_variable, parameters, coefficients)
+ if non_pv['heat_efficiency_curve'] is not None:
+ curve_type = non_pv['heat_efficiency_curve']['curve_type']
+ dependant_variable = non_pv['heat_efficiency_curve']['dependant_variable']
+ parameters = non_pv['heat_efficiency_curve']['parameters']
+ coefficients = list(non_pv['heat_efficiency_curve']['coefficients'].values())
+ heat_efficiency_curve = PerformanceCurves(curve_type, dependant_variable, parameters, coefficients)
+ if non_pv['cooling_output_curve'] is not None:
+ curve_type = non_pv['cooling_output_curve']['curve_type']
+ dependant_variable = non_pv['cooling_output_curve']['dependant_variable']
+ parameters = non_pv['cooling_output_curve']['parameters']
+ coefficients = list(non_pv['cooling_output_curve']['coefficients'].values())
+ cooling_output_curve = PerformanceCurves(curve_type, dependant_variable, parameters, coefficients)
+ if non_pv['cooling_fuel_consumption_curve'] is not None:
+ curve_type = non_pv['cooling_fuel_consumption_curve']['curve_type']
+ dependant_variable = non_pv['cooling_fuel_consumption_curve']['dependant_variable']
+ parameters = non_pv['cooling_fuel_consumption_curve']['parameters']
+ coefficients = list(non_pv['cooling_fuel_consumption_curve']['coefficients'].values())
+ cooling_fuel_consumption_curve = PerformanceCurves(curve_type, dependant_variable, parameters, coefficients)
+ if non_pv['cooling_efficiency_curve'] is not None:
+ curve_type = non_pv['cooling_efficiency_curve']['curve_type']
+ dependant_variable = non_pv['cooling_efficiency_curve']['dependant_variable']
+ parameters = non_pv['cooling_efficiency_curve']['parameters']
+ coefficients = list(non_pv['cooling_efficiency_curve']['coefficients'].values())
+ cooling_efficiency_curve = PerformanceCurves(curve_type, dependant_variable, parameters, coefficients)
+ dual_supply_capability = None
+ if non_pv['dual_supply_capability'] is not None:
+ if non_pv['dual_supply_capability'] == 'True':
+ dual_supply_capability = True
+ else:
+ dual_supply_capability = False
+
+ non_pv_component = NonPvGenerationSystem(system_id=system_id,
+ name=name,
+ system_type=system_type,
+ model_name=model_name,
+ manufacturer=manufacturer,
+ fuel_type=fuel_type,
+ nominal_heat_output=nominal_heat_output,
+ maximum_heat_output=maximum_heat_output,
+ minimum_heat_output=minimum_heat_output,
+ source_medium=source_medium,
+ supply_medium=supply_medium,
+ heat_efficiency=heat_efficiency,
+ nominal_cooling_output=nominal_cooling_output,
+ maximum_cooling_output=maximum_cooling_output,
+ minimum_cooling_output=minimum_cooling_output,
+ cooling_efficiency=cooling_efficiency,
+ electricity_efficiency=electricity_efficiency,
+ source_temperature=source_temperature,
+ source_mass_flow=source_mass_flow,
+ nominal_electricity_output=nominal_electricity_output,
+ maximum_heat_supply_temperature=maximum_heat_supply_temperature,
+ minimum_heat_supply_temperature=minimum_heat_supply_temperature,
+ maximum_cooling_supply_temperature=maximum_cooling_supply_temperature,
+ minimum_cooling_supply_temperature=minimum_cooling_supply_temperature,
+ heat_output_curve=heat_output_curve,
+ heat_fuel_consumption_curve=heat_fuel_consumption_curve,
+ heat_efficiency_curve=heat_efficiency_curve,
+ cooling_output_curve=cooling_output_curve,
+ cooling_fuel_consumption_curve=cooling_fuel_consumption_curve,
+ cooling_efficiency_curve=cooling_efficiency_curve,
+ distribution_systems=distribution_systems,
+ energy_storage_systems=energy_storage_systems,
+ dual_supply_capability=dual_supply_capability)
+ generation_components.append(non_pv_component)
+ pv_generation_components = self._archetypes['EnergySystemCatalog']['energy_generation_components'][
+ 'pv_generation_component']
+ if pv_generation_components is not None:
+ for pv in pv_generation_components:
+ system_id = pv['system_id']
+ name = pv['name']
+ system_type = pv['system_type']
+ model_name = pv['model_name']
+ manufacturer = pv['manufacturer']
+ electricity_efficiency = pv['electricity_efficiency']
+ nominal_electricity_output = pv['nominal_electricity_output']
+ nominal_ambient_temperature = pv['nominal_ambient_temperature']
+ nominal_cell_temperature = pv['nominal_cell_temperature']
+ nominal_radiation = pv['nominal_radiation']
+ standard_test_condition_cell_temperature = pv['standard_test_condition_cell_temperature']
+ standard_test_condition_maximum_power = pv['standard_test_condition_maximum_power']
+ cell_temperature_coefficient = pv['cell_temperature_coefficient']
+ width = pv['width']
+ height = pv['height']
+ distribution_systems = pv['distribution_systems']
+ energy_storage_systems = None
+ if pv['energy_storage_systems'] is not None:
+ storage_component = pv['energy_storage_systems']['storage_id']
+ storage_systems = self._search_storage_equipment(self._load_storage_components(), storage_component)
+ energy_storage_systems = storage_systems
+
+ pv_component = PvGenerationSystem(system_id=system_id,
+ name=name,
+ system_type=system_type,
+ model_name=model_name,
+ manufacturer=manufacturer,
+ electricity_efficiency=electricity_efficiency,
+ nominal_electricity_output=nominal_electricity_output,
+ nominal_ambient_temperature=nominal_ambient_temperature,
+ nominal_cell_temperature=nominal_cell_temperature,
+ nominal_radiation=nominal_radiation,
+ standard_test_condition_cell_temperature=
+ standard_test_condition_cell_temperature,
+ standard_test_condition_maximum_power=standard_test_condition_maximum_power,
+ cell_temperature_coefficient=cell_temperature_coefficient,
+ width=width,
+ height=height,
+ distribution_systems=distribution_systems,
+ energy_storage_systems=energy_storage_systems)
+ generation_components.append(pv_component)
+
+ return generation_components
+
+ def _load_distribution_equipments(self):
+ _equipments = []
+ distribution_systems = self._archetypes['EnergySystemCatalog']['distribution_systems']['distribution_system']
+ if distribution_systems is not None:
+ for distribution_system in distribution_systems:
+ system_id = None
+ model_name = None
+ system_type = None
+ supply_temperature = None
+ distribution_consumption_fix_flow = None
+ distribution_consumption_variable_flow = None
+ heat_losses = None
+ generation_systems = None
+ energy_storage_systems = None
+ emission_systems = None
+ distribution_equipment = DistributionSystem(system_id=system_id,
+ model_name=model_name,
+ system_type=system_type,
+ supply_temperature=supply_temperature,
+ distribution_consumption_fix_flow=distribution_consumption_fix_flow,
+ distribution_consumption_variable_flow=
+ distribution_consumption_variable_flow,
+ heat_losses=heat_losses,
+ generation_systems=generation_systems,
+ energy_storage_systems=energy_storage_systems,
+ emission_systems=emission_systems
+ )
+ _equipments.append(distribution_equipment)
+ return _equipments
+
+ def _load_emission_equipments(self):
+ _equipments = []
+ dissipation_systems = self._archetypes['EnergySystemCatalog']['dissipation_systems']['dissipation_system']
+ if dissipation_systems is not None:
+ for dissipation_system in dissipation_systems:
+ system_id = None
+ model_name = None
+ system_type = None
+ parasitic_energy_consumption = None
+ emission_system = EmissionSystem(system_id=system_id,
+ model_name=model_name,
+ system_type=system_type,
+ parasitic_energy_consumption=parasitic_energy_consumption)
+ _equipments.append(emission_system)
+ return _equipments
+
+ def _load_storage_components(self):
+ storage_components = []
+ thermal_storages = self._archetypes['EnergySystemCatalog']['energy_storage_components']['thermalStorages']
+ template_storages = self._archetypes['EnergySystemCatalog']['energy_storage_components']['templateStorages']
+ for tes in thermal_storages:
+ storage_id = tes['storage_id']
+ type_energy_stored = tes['type_energy_stored']
+ model_name = tes['model_name']
+ manufacturer = tes['manufacturer']
+ storage_type = tes['storage_type']
+ volume = tes['physical_characteristics']['volume']
+ height = tes['physical_characteristics']['height']
+ maximum_operating_temperature = tes['maximum_operating_temperature']
+ materials = self._load_materials()
+ 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['physical_characteristics']['tankThickness']) / 100 # from cm to m
+ tank_layer = Layer(None, 'tank', tank_material, thickness)
+ media = self._load_media()
+ media_id = tes['storage_medium']['medium_id']
+ medium = self._search_media(media, media_id)
+ layers = [insulation_layer, tank_layer]
+ nominal_capacity = tes['nominal_capacity']
+ losses_ratio = tes['losses_ratio']
+ storage_component = ThermalStorageSystem(storage_id=storage_id,
+ model_name=model_name,
+ type_energy_stored=type_energy_stored,
+ manufacturer=manufacturer,
+ storage_type=storage_type,
+ nominal_capacity=nominal_capacity,
+ losses_ratio=losses_ratio,
+ volume=volume,
+ height=height,
+ layers=layers,
+ maximum_operating_temperature=maximum_operating_temperature,
+ storage_medium=medium)
+ storage_components.append(storage_component)
+
+ for template in template_storages:
+ storage_id = template['storage_id']
+ storage_type = template['storage_type']
+ type_energy_stored = template['type_energy_stored']
+ maximum_operating_temperature = template['maximum_operating_temperature']
+ height = template['physical_characteristics']['height']
+ materials = self._load_materials()
+ 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['physical_characteristics']['tankThickness']) / 100 # from cm to m
+ tank_layer = Layer(None, 'tank', tank_material, thickness)
+ layers = [insulation_layer, tank_layer]
+ media = self._load_media()
+ media_id = template['storage_medium']['medium_id']
+ medium = self._search_media(media, media_id)
+ model_name = template['model_name']
+ manufacturer = template['manufacturer']
+ nominal_capacity = template['nominal_capacity']
+ losses_ratio = template['losses_ratio']
+ volume = template['physical_characteristics']['volume']
+ storage_component = ThermalStorageSystem(storage_id=storage_id,
+ model_name=model_name,
+ type_energy_stored=type_energy_stored,
+ manufacturer=manufacturer,
+ storage_type=storage_type,
+ nominal_capacity=nominal_capacity,
+ losses_ratio=losses_ratio,
+ volume=volume,
+ height=height,
+ layers=layers,
+ maximum_operating_temperature=maximum_operating_temperature,
+ storage_medium=medium)
+ storage_components.append(storage_component)
+ return storage_components
+
+ def _load_systems(self):
+ base_path = Path(Path(__file__).parent.parent.parent / 'data/energy_systems')
+ _catalog_systems = []
+ systems = self._archetypes['EnergySystemCatalog']['systems']['system']
+ for system in systems:
+ system_id = system['id']
+ name = system['name']
+ demands = system['demands']['demand']
+ generation_components = system['components']['generation_id']
+ generation_systems = self._search_generation_equipment(self._load_generation_components(), generation_components)
+ configuration_schema = Path(base_path / system['schema'])
+ energy_system = System(system_id=system_id,
+ name=name,
+ demand_types=demands,
+ generation_systems=generation_systems,
+ distribution_systems=None,
+ configuration_schema=configuration_schema)
+ _catalog_systems.append(energy_system)
+ return _catalog_systems
+
+ def _load_archetypes(self):
+ _system_archetypes = []
+ system_clusters = self._archetypes['EnergySystemCatalog']['system_archetypes']['system_archetype']
+ for system_cluster in system_clusters:
+ name = system_cluster['name']
+ systems = system_cluster['systems']['system_id']
+ integer_system_ids = [int(item) for item in systems]
+ _systems = []
+ for system_archetype in self._systems:
+ if int(system_archetype.id) in integer_system_ids:
+ _systems.append(system_archetype)
+ _system_archetypes.append(Archetype(name=name, systems=_systems))
+ return _system_archetypes
+
+ def _load_materials(self):
+ materials = []
+ _materials = self._archetypes['EnergySystemCatalog']['materials']['material']
+ for _material in _materials:
+ material_id = _material['material_id']
+ name = _material['name']
+ conductivity = _material['conductivity']
+ solar_absorptance = _material['solar_absorptance']
+ thermal_absorptance = _material['thermal_absorptance']
+ density = _material['density']
+ specific_heat = _material['specific_heat']
+ no_mass = _material['no_mass']
+ visible_absorptance = _material['visible_absorptance']
+ thermal_resistance = _material['thermal_resistance']
+
+ material = Material(material_id,
+ name,
+ solar_absorptance=solar_absorptance,
+ thermal_absorptance=thermal_absorptance,
+ density=density,
+ conductivity=conductivity,
+ thermal_resistance=thermal_resistance,
+ visible_absorptance=visible_absorptance,
+ no_mass=no_mass,
+ specific_heat=specific_heat)
+ materials.append(material)
+ return materials
+
+ @staticmethod
+ def _search_material(materials, material_id):
+ _material = None
+ for material in materials:
+ if int(material.id) == int(material_id):
+ _material = material
+ break
+ if _material is None:
+ raise ValueError(f'Material with the id = [{material_id}] not found in catalog ')
+ return _material
+
+ def _load_media(self):
+ media = []
+ _media = [self._archetypes['EnergySystemCatalog']['media']['medium']]
+ for _medium in _media:
+ medium_id = _medium['medium_id']
+ density = _medium['density']
+ name = _medium['name']
+ conductivity = _medium['conductivity']
+ solar_absorptance = _medium['solar_absorptance']
+ thermal_absorptance = _medium['thermal_absorptance']
+ specific_heat = _medium['specific_heat']
+ no_mass = _medium['no_mass']
+ visible_absorptance = _medium['visible_absorptance']
+ thermal_resistance = _medium['thermal_resistance']
+ medium = Material(material_id=medium_id,
+ name=name,
+ solar_absorptance=solar_absorptance,
+ thermal_absorptance=thermal_absorptance,
+ visible_absorptance=visible_absorptance,
+ no_mass=no_mass,
+ thermal_resistance=thermal_resistance,
+ conductivity=conductivity,
+ density=density,
+ specific_heat=specific_heat)
+ media.append(medium)
+ return media
+
+ @staticmethod
+ def _search_media(media, medium_id):
+ _medium = None
+ for medium in media:
+ if int(medium.id) == int(medium_id):
+ _medium = medium
+ break
+ if _medium is None:
+ raise ValueError(f'media with the id = [{medium_id}] not found in catalog ')
+ return _medium
+
+ @staticmethod
+ def _search_generation_equipment(generation_systems, generation_id):
+ _generation_systems = []
+
+ if isinstance(generation_id, list):
+ integer_ids = [int(item) for item in generation_id]
+ for generation in generation_systems:
+ if int(generation.id) in integer_ids:
+ _generation_systems.append(generation)
+ else:
+ integer_id = int(generation_id)
+ for generation in generation_systems:
+ if int(generation.id) == integer_id:
+ _generation_systems.append(generation)
+
+ if len(_generation_systems) == 0:
+ _generation_systems = None
+ raise ValueError(f'The system with the following id is not found in catalog [{generation_id}]')
+ return _generation_systems
+
+ @staticmethod
+ def _search_storage_equipment(storage_systems, storage_id):
+ _storage_systems = []
+ for storage in storage_systems:
+ if storage.id in storage_id:
+ _storage_systems.append(storage)
+ if len(_storage_systems) == 0:
+ _storage_systems = None
+ raise ValueError(f'The system with the following id is not found in catalog [{storage_id}]')
+ return _storage_systems
+
+ def names(self, category=None):
+ """
+ Get the catalog elements names
+ :parm: optional category filter
+ """
+ if category is None:
+ _names = {'archetypes': [], 'systems': [], 'generation_equipments': [], 'storage_equipments': []}
+ for archetype in self._content.archetypes:
+ _names['archetypes'].append(archetype.name)
+ for system in self._content.systems:
+ _names['systems'].append(system.name)
+ for equipment in self._content.generation_equipments:
+ _names['generation_equipments'].append(equipment.name)
+ else:
+ _names = {category: []}
+ if category.lower() == 'archetypes':
+ for archetype in self._content.archetypes:
+ _names[category].append(archetype.name)
+ elif category.lower() == 'systems':
+ for system in self._content.systems:
+ _names[category].append(system.name)
+ elif category.lower() == 'generation_equipments':
+ for system in self._content.generation_equipments:
+ _names[category].append(system.name)
+ else:
+ raise ValueError(f'Unknown category [{category}]')
+ return _names
+
+ def entries(self, category=None):
+ """
+ Get the catalog elements
+ :parm: optional category filter
+ """
+ if category is None:
+ return self._content
+ if category.lower() == 'archetypes':
+ return self._content.archetypes
+ if category.lower() == 'systems':
+ return self._content.systems
+ if category.lower() == 'generation_equipments':
+ return self._content.generation_equipments
+ raise ValueError(f'Unknown category [{category}]')
+
+ def get_entry(self, name):
+ """
+ Get one catalog element by names
+ :parm: entry name
+ """
+ for entry in self._content.archetypes:
+ if entry.name.lower() == name.lower():
+ return entry
+ for entry in self._content.systems:
+ if entry.name.lower() == name.lower():
+ return entry
+ for entry in self._content.generation_equipments:
+ if entry.name.lower() == name.lower():
+ return entry
+ raise IndexError(f"{name} doesn't exists in the catalog")
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 6ba78dfb..fed83211 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
@@ -56,6 +56,9 @@ class NorthAmericaEnergySystemCatalog(Catalog):
boiler_maximum_heat_output = float(boiler['@maximumHeatOutput'])
boiler_minimum_heat_output = float(boiler['@minimumHeatOutput'])
boiler_heat_efficiency = float(boiler['@nominalEfficiency'])
+ dual_supply = False
+ if '@dual_supply' in boiler.keys() and boiler['@dual_supply'] == 'True':
+ dual_supply = True
boiler_component = NonPvGenerationSystem(boiler_id,
name=name,
system_type=system_type,
@@ -65,7 +68,8 @@ class NorthAmericaEnergySystemCatalog(Catalog):
nominal_heat_output=boiler_nominal_thermal_output,
maximum_heat_output=boiler_maximum_heat_output,
minimum_heat_output=boiler_minimum_heat_output,
- heat_efficiency=boiler_heat_efficiency)
+ heat_efficiency=boiler_heat_efficiency,
+ dual_supply_capability=dual_supply)
generation_components.append(boiler_component)
for heat_pump in heat_pumps:
heat_pump_id = heat_pump['@generation_id']
@@ -89,6 +93,9 @@ class NorthAmericaEnergySystemCatalog(Catalog):
parameters = heat_pump['performance_curve']['parameters']
coefficients = list(heat_pump['performance_curve']['coefficients'].values())
cop_curve = PerformanceCurves(cop_curve_type, dependant_variable, parameters, coefficients)
+ dual_supply = False
+ if '@dual_supply' in heat_pump.keys() and heat_pump['@dual_supply'] == 'True':
+ dual_supply = True
heat_pump_component = NonPvGenerationSystem(heat_pump_id,
name=name,
@@ -106,7 +113,8 @@ class NorthAmericaEnergySystemCatalog(Catalog):
minimum_heat_supply_temperature=heat_pump_minimum_heat_supply_temperature,
maximum_cooling_supply_temperature=heat_pump_maximum_cooling_supply_temperature,
minimum_cooling_supply_temperature=heat_pump_minimum_cooling_supply_temperature,
- heat_efficiency_curve=cop_curve)
+ heat_efficiency_curve=cop_curve,
+ dual_supply_capability=dual_supply)
generation_components.append(heat_pump_component)
for pv in photovoltaics:
pv_id = pv['@generation_id']
@@ -143,6 +151,8 @@ class NorthAmericaEnergySystemCatalog(Catalog):
for template in templates:
system_id = template['@generation_id']
system_name = template['@name']
+ if '@dual_supply' in template.keys() and template['@dual_supply'] == 'True':
+ dual_supply = True
if 'storage_id' in template.keys():
storage_component = template['storage_id']
storage_systems = self._search_storage_equipment(self._load_storage_components(), storage_component)
@@ -158,7 +168,8 @@ class NorthAmericaEnergySystemCatalog(Catalog):
system_type=system_type,
fuel_type=fuel_type,
heat_efficiency=heat_efficiency,
- energy_storage_systems=energy_storage_system)
+ energy_storage_systems=energy_storage_system,
+ dual_supply_capability=dual_supply)
generation_components.append(boiler_template)
elif "Heat Pump" in system_name:
system_type = 'heat pump'
@@ -173,7 +184,8 @@ class NorthAmericaEnergySystemCatalog(Catalog):
supply_medium=supply_medium,
fuel_type=fuel_type,
heat_efficiency=heat_efficiency,
- energy_storage_systems=energy_storage_system)
+ energy_storage_systems=energy_storage_system,
+ dual_supply_capability=dual_supply)
generation_components.append(heat_pump_template)
else:
electricity_efficiency = float(template['@nominalEfficiency'])
diff --git a/hub/catalog_factories/energy_systems_catalog_factory.py b/hub/catalog_factories/energy_systems_catalog_factory.py
index 6e102bc3..3e368f91 100644
--- a/hub/catalog_factories/energy_systems_catalog_factory.py
+++ b/hub/catalog_factories/energy_systems_catalog_factory.py
@@ -10,6 +10,7 @@ from typing import TypeVar
from hub.catalog_factories.energy_systems.montreal_custom_catalog import MontrealCustomCatalog
from hub.catalog_factories.energy_systems.north_america_energy_system_catalog import NorthAmericaEnergySystemCatalog
+from hub.catalog_factories.energy_systems.montreal_future_system_catalogue import MontrealFutureSystemCatalogue
from hub.helpers.utils import validate_import_export_type
Catalog = TypeVar('Catalog')
@@ -40,6 +41,13 @@ class EnergySystemsCatalogFactory:
"""
return NorthAmericaEnergySystemCatalog(self._path)
+ @property
+ def _montreal_future(self):
+ """
+ Retrieve North American catalog
+ """
+ return MontrealFutureSystemCatalogue(self._path)
+
@property
def catalog(self) -> Catalog:
"""
diff --git a/hub/catalog_factories/usage/__pycache__/__init__.cpython-39.pyc b/hub/catalog_factories/usage/__pycache__/__init__.cpython-39.pyc
new file mode 100644
index 00000000..d126df0a
Binary files /dev/null and b/hub/catalog_factories/usage/__pycache__/__init__.cpython-39.pyc differ
diff --git a/hub/catalog_factories/usage/__pycache__/comnet_catalog.cpython-39.pyc b/hub/catalog_factories/usage/__pycache__/comnet_catalog.cpython-39.pyc
new file mode 100644
index 00000000..0be06d77
Binary files /dev/null and b/hub/catalog_factories/usage/__pycache__/comnet_catalog.cpython-39.pyc differ
diff --git a/hub/catalog_factories/usage/__pycache__/eilat_catalog.cpython-39.pyc b/hub/catalog_factories/usage/__pycache__/eilat_catalog.cpython-39.pyc
new file mode 100644
index 00000000..6f94f311
Binary files /dev/null and b/hub/catalog_factories/usage/__pycache__/eilat_catalog.cpython-39.pyc differ
diff --git a/hub/catalog_factories/usage/__pycache__/nrcan_catalog.cpython-39.pyc b/hub/catalog_factories/usage/__pycache__/nrcan_catalog.cpython-39.pyc
new file mode 100644
index 00000000..f31ba86c
Binary files /dev/null and b/hub/catalog_factories/usage/__pycache__/nrcan_catalog.cpython-39.pyc differ
diff --git a/hub/catalog_factories/usage/__pycache__/usage_helper.cpython-39.pyc b/hub/catalog_factories/usage/__pycache__/usage_helper.cpython-39.pyc
new file mode 100644
index 00000000..bd22447d
Binary files /dev/null and b/hub/catalog_factories/usage/__pycache__/usage_helper.cpython-39.pyc differ
diff --git a/hub/city_model_structure/__pycache__/__init__.cpython-39.pyc b/hub/city_model_structure/__pycache__/__init__.cpython-39.pyc
new file mode 100644
index 00000000..856016a4
Binary files /dev/null and b/hub/city_model_structure/__pycache__/__init__.cpython-39.pyc differ
diff --git a/hub/city_model_structure/__pycache__/building.cpython-39.pyc b/hub/city_model_structure/__pycache__/building.cpython-39.pyc
new file mode 100644
index 00000000..31b53a55
Binary files /dev/null and b/hub/city_model_structure/__pycache__/building.cpython-39.pyc differ
diff --git a/hub/city_model_structure/__pycache__/buildings_cluster.cpython-39.pyc b/hub/city_model_structure/__pycache__/buildings_cluster.cpython-39.pyc
new file mode 100644
index 00000000..9b668d1f
Binary files /dev/null and b/hub/city_model_structure/__pycache__/buildings_cluster.cpython-39.pyc differ
diff --git a/hub/city_model_structure/__pycache__/city.cpython-39.pyc b/hub/city_model_structure/__pycache__/city.cpython-39.pyc
new file mode 100644
index 00000000..8cbed17f
Binary files /dev/null and b/hub/city_model_structure/__pycache__/city.cpython-39.pyc differ
diff --git a/hub/city_model_structure/__pycache__/city_object.cpython-39.pyc b/hub/city_model_structure/__pycache__/city_object.cpython-39.pyc
new file mode 100644
index 00000000..450328cb
Binary files /dev/null and b/hub/city_model_structure/__pycache__/city_object.cpython-39.pyc differ
diff --git a/hub/city_model_structure/__pycache__/city_objects_cluster.cpython-39.pyc b/hub/city_model_structure/__pycache__/city_objects_cluster.cpython-39.pyc
new file mode 100644
index 00000000..354819eb
Binary files /dev/null and b/hub/city_model_structure/__pycache__/city_objects_cluster.cpython-39.pyc differ
diff --git a/hub/city_model_structure/__pycache__/level_of_detail.cpython-39.pyc b/hub/city_model_structure/__pycache__/level_of_detail.cpython-39.pyc
new file mode 100644
index 00000000..23d48333
Binary files /dev/null and b/hub/city_model_structure/__pycache__/level_of_detail.cpython-39.pyc differ
diff --git a/hub/city_model_structure/__pycache__/parts_consisting_building.cpython-39.pyc b/hub/city_model_structure/__pycache__/parts_consisting_building.cpython-39.pyc
new file mode 100644
index 00000000..b45092d4
Binary files /dev/null and b/hub/city_model_structure/__pycache__/parts_consisting_building.cpython-39.pyc differ
diff --git a/hub/city_model_structure/attributes/__pycache__/__init__.cpython-39.pyc b/hub/city_model_structure/attributes/__pycache__/__init__.cpython-39.pyc
new file mode 100644
index 00000000..62ba0e20
Binary files /dev/null and b/hub/city_model_structure/attributes/__pycache__/__init__.cpython-39.pyc differ
diff --git a/hub/city_model_structure/attributes/__pycache__/plane.cpython-39.pyc b/hub/city_model_structure/attributes/__pycache__/plane.cpython-39.pyc
new file mode 100644
index 00000000..411aab13
Binary files /dev/null and b/hub/city_model_structure/attributes/__pycache__/plane.cpython-39.pyc differ
diff --git a/hub/city_model_structure/attributes/__pycache__/point.cpython-39.pyc b/hub/city_model_structure/attributes/__pycache__/point.cpython-39.pyc
new file mode 100644
index 00000000..03999762
Binary files /dev/null and b/hub/city_model_structure/attributes/__pycache__/point.cpython-39.pyc differ
diff --git a/hub/city_model_structure/attributes/__pycache__/polygon.cpython-39.pyc b/hub/city_model_structure/attributes/__pycache__/polygon.cpython-39.pyc
new file mode 100644
index 00000000..0a6154fd
Binary files /dev/null and b/hub/city_model_structure/attributes/__pycache__/polygon.cpython-39.pyc differ
diff --git a/hub/city_model_structure/attributes/__pycache__/polyhedron.cpython-39.pyc b/hub/city_model_structure/attributes/__pycache__/polyhedron.cpython-39.pyc
new file mode 100644
index 00000000..66217ead
Binary files /dev/null and b/hub/city_model_structure/attributes/__pycache__/polyhedron.cpython-39.pyc differ
diff --git a/hub/city_model_structure/attributes/__pycache__/schedule.cpython-39.pyc b/hub/city_model_structure/attributes/__pycache__/schedule.cpython-39.pyc
new file mode 100644
index 00000000..0e438712
Binary files /dev/null and b/hub/city_model_structure/attributes/__pycache__/schedule.cpython-39.pyc differ
diff --git a/hub/city_model_structure/building.py b/hub/city_model_structure/building.py
index c3da0573..5474e5dc 100644
--- a/hub/city_model_structure/building.py
+++ b/hub/city_model_structure/building.py
@@ -762,13 +762,16 @@ class Building(CityObject):
if demand_type.lower() == consumption_type.lower():
if consumption_type in (cte.HEATING, cte.DOMESTIC_HOT_WATER):
for generation_system in generation_systems:
- coefficient_of_performance = generation_system.heat_efficiency
+ if generation_system.heat_efficiency is not None:
+ coefficient_of_performance = float(generation_system.heat_efficiency)
elif consumption_type == cte.COOLING:
for generation_system in generation_systems:
- coefficient_of_performance = generation_system.cooling_efficiency
+ if generation_system.cooling_efficiency is not None:
+ coefficient_of_performance = float(generation_system.cooling_efficiency)
elif consumption_type == cte.ELECTRICITY:
for generation_system in generation_systems:
- coefficient_of_performance = generation_system.electricity_efficiency
+ if generation_system.electricity_efficiency is not None:
+ coefficient_of_performance = float(generation_system.electricity_efficiency)
if coefficient_of_performance == 0:
values = [0]*len(demand)
final_energy_consumed = values
@@ -799,18 +802,22 @@ class Building(CityObject):
if self.energy_systems is None:
return self._onsite_electrical_production
for energy_system in self.energy_systems:
- if energy_system.generation_systems[0].system_type == cte.PHOTOVOLTAIC:
- _efficiency = energy_system.generation_systems[0].electricity_efficiency
- self._onsite_electrical_production = {}
- for _key in self.roofs[0].global_irradiance.keys():
- _results = [0 for _ in range(0, len(self.roofs[0].global_irradiance[_key]))]
- for surface in self.roofs:
- if _key in orientation_losses_factor:
- _results = [x + y * _efficiency * surface.perimeter_area
- * surface.solar_collectors_area_reduction_factor * z
- for x, y, z in zip(_results, surface.global_irradiance[_key],
- orientation_losses_factor[_key]['south'])]
- self._onsite_electrical_production[_key] = _results
+ for generation_system in energy_system.generation_systems:
+ if generation_system.system_type == cte.PHOTOVOLTAIC:
+ if generation_system.electricity_efficiency is not None:
+ _efficiency = float(generation_system.electricity_efficiency)
+ else:
+ _efficiency = 0
+ self._onsite_electrical_production = {}
+ for _key in self.roofs[0].global_irradiance.keys():
+ _results = [0 for _ in range(0, len(self.roofs[0].global_irradiance[_key]))]
+ for surface in self.roofs:
+ if _key in orientation_losses_factor:
+ _results = [x + y * _efficiency * surface.perimeter_area
+ * surface.solar_collectors_area_reduction_factor * z
+ for x, y, z in zip(_results, surface.global_irradiance[_key],
+ orientation_losses_factor[_key]['south'])]
+ self._onsite_electrical_production[_key] = _results
return self._onsite_electrical_production
@property
diff --git a/hub/city_model_structure/building_demand/__pycache__/__init__.cpython-39.pyc b/hub/city_model_structure/building_demand/__pycache__/__init__.cpython-39.pyc
new file mode 100644
index 00000000..a86a713d
Binary files /dev/null and b/hub/city_model_structure/building_demand/__pycache__/__init__.cpython-39.pyc differ
diff --git a/hub/city_model_structure/building_demand/__pycache__/appliances.cpython-39.pyc b/hub/city_model_structure/building_demand/__pycache__/appliances.cpython-39.pyc
new file mode 100644
index 00000000..021d6c35
Binary files /dev/null and b/hub/city_model_structure/building_demand/__pycache__/appliances.cpython-39.pyc differ
diff --git a/hub/city_model_structure/building_demand/__pycache__/construction.cpython-39.pyc b/hub/city_model_structure/building_demand/__pycache__/construction.cpython-39.pyc
new file mode 100644
index 00000000..e0aac978
Binary files /dev/null and b/hub/city_model_structure/building_demand/__pycache__/construction.cpython-39.pyc differ
diff --git a/hub/city_model_structure/building_demand/__pycache__/domestic_hot_water.cpython-39.pyc b/hub/city_model_structure/building_demand/__pycache__/domestic_hot_water.cpython-39.pyc
new file mode 100644
index 00000000..705591d9
Binary files /dev/null and b/hub/city_model_structure/building_demand/__pycache__/domestic_hot_water.cpython-39.pyc differ
diff --git a/hub/city_model_structure/building_demand/__pycache__/household.cpython-39.pyc b/hub/city_model_structure/building_demand/__pycache__/household.cpython-39.pyc
new file mode 100644
index 00000000..37e5502a
Binary files /dev/null and b/hub/city_model_structure/building_demand/__pycache__/household.cpython-39.pyc differ
diff --git a/hub/city_model_structure/building_demand/__pycache__/internal_gain.cpython-39.pyc b/hub/city_model_structure/building_demand/__pycache__/internal_gain.cpython-39.pyc
new file mode 100644
index 00000000..3554d5b1
Binary files /dev/null and b/hub/city_model_structure/building_demand/__pycache__/internal_gain.cpython-39.pyc differ
diff --git a/hub/city_model_structure/building_demand/__pycache__/internal_zone.cpython-39.pyc b/hub/city_model_structure/building_demand/__pycache__/internal_zone.cpython-39.pyc
new file mode 100644
index 00000000..fb878f5e
Binary files /dev/null and b/hub/city_model_structure/building_demand/__pycache__/internal_zone.cpython-39.pyc differ
diff --git a/hub/city_model_structure/building_demand/__pycache__/layer.cpython-39.pyc b/hub/city_model_structure/building_demand/__pycache__/layer.cpython-39.pyc
new file mode 100644
index 00000000..fcb9d3af
Binary files /dev/null and b/hub/city_model_structure/building_demand/__pycache__/layer.cpython-39.pyc differ
diff --git a/hub/city_model_structure/building_demand/__pycache__/lighting.cpython-39.pyc b/hub/city_model_structure/building_demand/__pycache__/lighting.cpython-39.pyc
new file mode 100644
index 00000000..12d9e8da
Binary files /dev/null and b/hub/city_model_structure/building_demand/__pycache__/lighting.cpython-39.pyc differ
diff --git a/hub/city_model_structure/building_demand/__pycache__/occupancy.cpython-39.pyc b/hub/city_model_structure/building_demand/__pycache__/occupancy.cpython-39.pyc
new file mode 100644
index 00000000..cc66673c
Binary files /dev/null and b/hub/city_model_structure/building_demand/__pycache__/occupancy.cpython-39.pyc differ
diff --git a/hub/city_model_structure/building_demand/__pycache__/surface.cpython-39.pyc b/hub/city_model_structure/building_demand/__pycache__/surface.cpython-39.pyc
new file mode 100644
index 00000000..3b6aaf92
Binary files /dev/null and b/hub/city_model_structure/building_demand/__pycache__/surface.cpython-39.pyc differ
diff --git a/hub/city_model_structure/building_demand/__pycache__/thermal_archetype.cpython-39.pyc b/hub/city_model_structure/building_demand/__pycache__/thermal_archetype.cpython-39.pyc
new file mode 100644
index 00000000..732d6d01
Binary files /dev/null and b/hub/city_model_structure/building_demand/__pycache__/thermal_archetype.cpython-39.pyc differ
diff --git a/hub/city_model_structure/building_demand/__pycache__/thermal_boundary.cpython-39.pyc b/hub/city_model_structure/building_demand/__pycache__/thermal_boundary.cpython-39.pyc
new file mode 100644
index 00000000..3781423a
Binary files /dev/null and b/hub/city_model_structure/building_demand/__pycache__/thermal_boundary.cpython-39.pyc differ
diff --git a/hub/city_model_structure/building_demand/__pycache__/thermal_control.cpython-39.pyc b/hub/city_model_structure/building_demand/__pycache__/thermal_control.cpython-39.pyc
new file mode 100644
index 00000000..652a2e8e
Binary files /dev/null and b/hub/city_model_structure/building_demand/__pycache__/thermal_control.cpython-39.pyc differ
diff --git a/hub/city_model_structure/building_demand/__pycache__/thermal_opening.cpython-39.pyc b/hub/city_model_structure/building_demand/__pycache__/thermal_opening.cpython-39.pyc
new file mode 100644
index 00000000..d4b13886
Binary files /dev/null and b/hub/city_model_structure/building_demand/__pycache__/thermal_opening.cpython-39.pyc differ
diff --git a/hub/city_model_structure/building_demand/__pycache__/thermal_zone.cpython-39.pyc b/hub/city_model_structure/building_demand/__pycache__/thermal_zone.cpython-39.pyc
new file mode 100644
index 00000000..817e3a1e
Binary files /dev/null and b/hub/city_model_structure/building_demand/__pycache__/thermal_zone.cpython-39.pyc differ
diff --git a/hub/city_model_structure/building_demand/__pycache__/usage.cpython-39.pyc b/hub/city_model_structure/building_demand/__pycache__/usage.cpython-39.pyc
new file mode 100644
index 00000000..ce6984eb
Binary files /dev/null and b/hub/city_model_structure/building_demand/__pycache__/usage.cpython-39.pyc differ
diff --git a/hub/city_model_structure/energy_systems/__pycache__/__init__.cpython-39.pyc b/hub/city_model_structure/energy_systems/__pycache__/__init__.cpython-39.pyc
new file mode 100644
index 00000000..cfe9fd54
Binary files /dev/null and b/hub/city_model_structure/energy_systems/__pycache__/__init__.cpython-39.pyc differ
diff --git a/hub/city_model_structure/energy_systems/__pycache__/control_system.cpython-39.pyc b/hub/city_model_structure/energy_systems/__pycache__/control_system.cpython-39.pyc
new file mode 100644
index 00000000..9d08df8d
Binary files /dev/null and b/hub/city_model_structure/energy_systems/__pycache__/control_system.cpython-39.pyc differ
diff --git a/hub/city_model_structure/energy_systems/__pycache__/distribution_system.cpython-39.pyc b/hub/city_model_structure/energy_systems/__pycache__/distribution_system.cpython-39.pyc
new file mode 100644
index 00000000..54356ab7
Binary files /dev/null and b/hub/city_model_structure/energy_systems/__pycache__/distribution_system.cpython-39.pyc differ
diff --git a/hub/city_model_structure/energy_systems/__pycache__/electrical_storage_system.cpython-39.pyc b/hub/city_model_structure/energy_systems/__pycache__/electrical_storage_system.cpython-39.pyc
new file mode 100644
index 00000000..3792492e
Binary files /dev/null and b/hub/city_model_structure/energy_systems/__pycache__/electrical_storage_system.cpython-39.pyc differ
diff --git a/hub/city_model_structure/energy_systems/__pycache__/emission_system.cpython-39.pyc b/hub/city_model_structure/energy_systems/__pycache__/emission_system.cpython-39.pyc
new file mode 100644
index 00000000..77b78e11
Binary files /dev/null and b/hub/city_model_structure/energy_systems/__pycache__/emission_system.cpython-39.pyc differ
diff --git a/hub/city_model_structure/energy_systems/__pycache__/energy_storage_system.cpython-39.pyc b/hub/city_model_structure/energy_systems/__pycache__/energy_storage_system.cpython-39.pyc
new file mode 100644
index 00000000..2abd5948
Binary files /dev/null and b/hub/city_model_structure/energy_systems/__pycache__/energy_storage_system.cpython-39.pyc differ
diff --git a/hub/city_model_structure/energy_systems/__pycache__/energy_system.cpython-39.pyc b/hub/city_model_structure/energy_systems/__pycache__/energy_system.cpython-39.pyc
new file mode 100644
index 00000000..259e97f4
Binary files /dev/null and b/hub/city_model_structure/energy_systems/__pycache__/energy_system.cpython-39.pyc differ
diff --git a/hub/city_model_structure/energy_systems/__pycache__/generation_system.cpython-39.pyc b/hub/city_model_structure/energy_systems/__pycache__/generation_system.cpython-39.pyc
new file mode 100644
index 00000000..a96f6789
Binary files /dev/null and b/hub/city_model_structure/energy_systems/__pycache__/generation_system.cpython-39.pyc differ
diff --git a/hub/city_model_structure/energy_systems/__pycache__/generic_distribution_system.cpython-39.pyc b/hub/city_model_structure/energy_systems/__pycache__/generic_distribution_system.cpython-39.pyc
new file mode 100644
index 00000000..4dd5b6b2
Binary files /dev/null and b/hub/city_model_structure/energy_systems/__pycache__/generic_distribution_system.cpython-39.pyc differ
diff --git a/hub/city_model_structure/energy_systems/__pycache__/generic_emission_system.cpython-39.pyc b/hub/city_model_structure/energy_systems/__pycache__/generic_emission_system.cpython-39.pyc
new file mode 100644
index 00000000..985830ab
Binary files /dev/null and b/hub/city_model_structure/energy_systems/__pycache__/generic_emission_system.cpython-39.pyc differ
diff --git a/hub/city_model_structure/energy_systems/__pycache__/generic_energy_system.cpython-39.pyc b/hub/city_model_structure/energy_systems/__pycache__/generic_energy_system.cpython-39.pyc
new file mode 100644
index 00000000..279d7c78
Binary files /dev/null and b/hub/city_model_structure/energy_systems/__pycache__/generic_energy_system.cpython-39.pyc differ
diff --git a/hub/city_model_structure/energy_systems/__pycache__/generic_generation_system.cpython-39.pyc b/hub/city_model_structure/energy_systems/__pycache__/generic_generation_system.cpython-39.pyc
new file mode 100644
index 00000000..e2321150
Binary files /dev/null and b/hub/city_model_structure/energy_systems/__pycache__/generic_generation_system.cpython-39.pyc differ
diff --git a/hub/city_model_structure/energy_systems/__pycache__/generic_storage_system.cpython-39.pyc b/hub/city_model_structure/energy_systems/__pycache__/generic_storage_system.cpython-39.pyc
new file mode 100644
index 00000000..57fc0ebc
Binary files /dev/null and b/hub/city_model_structure/energy_systems/__pycache__/generic_storage_system.cpython-39.pyc differ
diff --git a/hub/city_model_structure/energy_systems/__pycache__/non_pv_generation_system.cpython-39.pyc b/hub/city_model_structure/energy_systems/__pycache__/non_pv_generation_system.cpython-39.pyc
new file mode 100644
index 00000000..32f7c26b
Binary files /dev/null and b/hub/city_model_structure/energy_systems/__pycache__/non_pv_generation_system.cpython-39.pyc differ
diff --git a/hub/city_model_structure/energy_systems/__pycache__/performance_curve.cpython-39.pyc b/hub/city_model_structure/energy_systems/__pycache__/performance_curve.cpython-39.pyc
new file mode 100644
index 00000000..e33db28d
Binary files /dev/null and b/hub/city_model_structure/energy_systems/__pycache__/performance_curve.cpython-39.pyc differ
diff --git a/hub/city_model_structure/energy_systems/__pycache__/pv_generation_system.cpython-39.pyc b/hub/city_model_structure/energy_systems/__pycache__/pv_generation_system.cpython-39.pyc
new file mode 100644
index 00000000..47de2346
Binary files /dev/null and b/hub/city_model_structure/energy_systems/__pycache__/pv_generation_system.cpython-39.pyc differ
diff --git a/hub/city_model_structure/energy_systems/__pycache__/thermal_storage_system.cpython-39.pyc b/hub/city_model_structure/energy_systems/__pycache__/thermal_storage_system.cpython-39.pyc
new file mode 100644
index 00000000..ae8aa5c0
Binary files /dev/null and b/hub/city_model_structure/energy_systems/__pycache__/thermal_storage_system.cpython-39.pyc differ
diff --git a/hub/city_model_structure/energy_systems/non_pv_generation_system.py b/hub/city_model_structure/energy_systems/non_pv_generation_system.py
index 3dc044e5..fea1d7b2 100644
--- a/hub/city_model_structure/energy_systems/non_pv_generation_system.py
+++ b/hub/city_model_structure/energy_systems/non_pv_generation_system.py
@@ -42,6 +42,7 @@ class NonPvGenerationSystem(GenerationSystem):
self._cooling_output_curve = None
self._cooling_fuel_consumption_curve = None
self._cooling_efficiency_curve = None
+ self._dual_supply_capability = None
@property
def nominal_heat_output(self):
@@ -427,4 +428,22 @@ class NonPvGenerationSystem(GenerationSystem):
"""
self._cooling_efficiency_curve = value
+ @property
+ def dual_supply_capability(self):
+ """
+ Get the capability of the generation component for simultaneous heat and cold production
+
+ :return: bool
+ """
+ return self._dual_supply_capability
+
+ @dual_supply_capability.setter
+ def dual_supply_capability(self, value):
+ """
+ Set the capability of the generation component for simultaneous heat and cold production
+
+ :return: bool
+ """
+ self._dual_supply_capability = value
+
diff --git a/hub/city_model_structure/greenery/__pycache__/__init__.cpython-39.pyc b/hub/city_model_structure/greenery/__pycache__/__init__.cpython-39.pyc
new file mode 100644
index 00000000..fa613ace
Binary files /dev/null and b/hub/city_model_structure/greenery/__pycache__/__init__.cpython-39.pyc differ
diff --git a/hub/city_model_structure/greenery/__pycache__/plant.cpython-39.pyc b/hub/city_model_structure/greenery/__pycache__/plant.cpython-39.pyc
new file mode 100644
index 00000000..b17dfa1c
Binary files /dev/null and b/hub/city_model_structure/greenery/__pycache__/plant.cpython-39.pyc differ
diff --git a/hub/city_model_structure/greenery/__pycache__/soil.cpython-39.pyc b/hub/city_model_structure/greenery/__pycache__/soil.cpython-39.pyc
new file mode 100644
index 00000000..d5ed8ada
Binary files /dev/null and b/hub/city_model_structure/greenery/__pycache__/soil.cpython-39.pyc differ
diff --git a/hub/city_model_structure/greenery/__pycache__/vegetation.cpython-39.pyc b/hub/city_model_structure/greenery/__pycache__/vegetation.cpython-39.pyc
new file mode 100644
index 00000000..82f4a9e8
Binary files /dev/null and b/hub/city_model_structure/greenery/__pycache__/vegetation.cpython-39.pyc differ
diff --git a/hub/city_model_structure/iot/__pycache__/__init__.cpython-39.pyc b/hub/city_model_structure/iot/__pycache__/__init__.cpython-39.pyc
new file mode 100644
index 00000000..148740e4
Binary files /dev/null and b/hub/city_model_structure/iot/__pycache__/__init__.cpython-39.pyc differ
diff --git a/hub/city_model_structure/iot/__pycache__/sensor.cpython-39.pyc b/hub/city_model_structure/iot/__pycache__/sensor.cpython-39.pyc
new file mode 100644
index 00000000..97f0a1ff
Binary files /dev/null and b/hub/city_model_structure/iot/__pycache__/sensor.cpython-39.pyc differ
diff --git a/hub/city_model_structure/iot/__pycache__/sensor_measure.cpython-39.pyc b/hub/city_model_structure/iot/__pycache__/sensor_measure.cpython-39.pyc
new file mode 100644
index 00000000..2f3a44b2
Binary files /dev/null and b/hub/city_model_structure/iot/__pycache__/sensor_measure.cpython-39.pyc differ
diff --git a/hub/city_model_structure/iot/__pycache__/sensor_type.cpython-39.pyc b/hub/city_model_structure/iot/__pycache__/sensor_type.cpython-39.pyc
new file mode 100644
index 00000000..c37da53a
Binary files /dev/null and b/hub/city_model_structure/iot/__pycache__/sensor_type.cpython-39.pyc differ
diff --git a/hub/city_model_structure/iot/__pycache__/station.cpython-39.pyc b/hub/city_model_structure/iot/__pycache__/station.cpython-39.pyc
new file mode 100644
index 00000000..7458aa74
Binary files /dev/null and b/hub/city_model_structure/iot/__pycache__/station.cpython-39.pyc differ
diff --git a/hub/data/energy_systems/montreal_future_systems.xml b/hub/data/energy_systems/montreal_future_systems.xml
new file mode 100644
index 00000000..769f87bd
--- /dev/null
+++ b/hub/data/energy_systems/montreal_future_systems.xml
@@ -0,0 +1,1311 @@
+
+
+ ./schemas/
+
+
+ 1
+ Water
+
+
+
+
+
+ 981.0
+ 4180.0
+ 0.6
+
+
+
+
+ 1
+ Natural-Gas Boiler
+ boiler
+ ALP080B
+ Alpine
+ 21.0
+ 4.7
+ 23.5
+ 0.95
+ True
+ natural gas
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 2
+ Natural-Gas boiler
+ boiler
+ ALP105B
+ Alpine
+ 28.0
+ 6.15
+ 30.8
+ 0.95
+ True
+ natural gas
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 3
+ Natural-Gas boiler
+ boiler
+ ALP150B
+ Alpine
+ 40.0
+ 8.8
+ 44
+ 0.95
+ True
+ natural gas
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 4
+ Natural-Gas boiler
+ boiler
+ ALP210B
+ Alpine
+ 57.0
+ 12.3
+ 61.5
+ 0.95
+ True
+ natural gas
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 5
+ Natural-Gas boiler
+ boiler
+ ALTAC-136
+ Alta
+ 33.0
+ 4.0
+ 35.2
+ 0.95
+ True
+ natural gas
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 6
+ Natural-Gas boiler
+ boiler
+ ALTA-120
+ Alta
+ 33.0
+ 4.0
+ 35.2
+ 0.95
+ False
+ natural gas
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 7
+ Natural-Gas boiler
+ boiler
+ ASPN-085
+ Aspen
+ 23.15
+ 2.5
+ 25.0
+ 0.96
+
+ natural gas
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 8
+ Natural-Gas boiler
+ boiler
+ ASPN-110
+ Aspen
+ 30.19
+ 3.2
+ 32.0
+ 0.96
+
+ natural gas
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 9
+ Natural-Gas boiler
+ boiler
+ ASPNC-155
+ Aspen
+ 42.5
+ 4.5
+ 45.0
+ 0.95
+ True
+ natural gas
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 10
+ Natural-Gas boiler
+ boiler
+ K2WTC-135B
+ K2
+ 32.8
+ 3.5
+ 35.0
+ 0.95
+ True
+ natural gas
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 11
+ Natural-Gas boiler
+ boiler
+ K2WTC-180B
+ K2
+ 49.5
+ 5.3
+ 53.0
+ 0.95
+ True
+ natural gas
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 12
+ Photovoltaic Module
+ Photovoltaic
+ 445MS
+ Canadian Solar
+
+
+
+
+
+
+
+
+ 2.01
+ 1.048
+
+
+
+
+ 13
+ Air-to-Water heat pump
+ heat pump
+ CMAA 012
+ TRANE
+ 51.7
+ 0
+ 51.7
+ 3.32
+
+ Electricity
+ Air
+ water
+
+
+
+
+
+
+
+
+ 55.0
+ 6.0
+ 30.0
+ 11.0
+
+
+
+ second degree multivariable function
+ COP
+ source_temperature
+ supply_temperature
+
+
+
+
+
+
+
+ False
+
+
+ 14
+ Air-to-Water heat pump
+ heat pump
+ CMAA 70
+ TRANE
+ 279.3
+ 0
+ 279.3
+ 3.07
+
+ Electricity
+ Air
+ water
+
+
+
+
+
+
+
+
+ 55.0
+ 6.0
+ 30.0
+ 11.0
+
+
+
+ second degree multivariable function
+ COP
+ source_temperature
+ supply_temperature
+
+
+
+
+
+
+
+ False
+
+
+ 15
+ Air-to-Water heat pump
+ heat pump
+ CMAA 140
+ TRANE
+ 557
+ 0
+ 557
+ 3.46
+
+ Electricity
+ Air
+ water
+
+
+
+
+
+
+
+
+ 55.0
+ 6.0
+ 30.0
+ 11.0
+
+
+
+ second degree multivariable function
+ COP
+ source_temperature
+ supply_temperature
+
+
+
+
+
+
+
+ False
+
+
+ 16
+ template Natural-Gas boiler
+ boiler
+
+
+
+
+
+ 0.90
+
+ natural gas
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 6
+
+
+
+
+ 17
+ template Electric boiler
+ boiler
+
+
+
+
+
+ 0.95
+
+ electricity
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 6
+
+
+
+
+ 18
+ template Air-to-Water heat pump
+ heat pump
+
+
+
+
+
+ 3
+
+ electricity
+ Air
+ water
+
+
+
+ 4.5
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 6
+
+ True
+
+
+ 19
+ template Groundwater-to-Water heat pump
+ heat pump
+
+
+
+
+
+ 3.5
+
+ electricity
+ Ground
+ water
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 6
+
+ True
+
+
+ 20
+ template Water-to-Water heat pump
+ heat pump
+
+
+
+
+
+ 3.5
+
+ electricity
+ Water
+ water
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 6
+
+ True
+
+
+ 21
+ template Natural-Gas boiler
+ boiler
+
+
+
+
+
+ 0.90
+
+ natural gas
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 22
+ template Electric boiler
+ boiler
+
+
+
+
+
+ 0.95
+
+ electricity
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 23
+ template Air-to-Water heat pump
+ heat pump
+
+
+
+
+
+ 3
+
+ electricity
+ Air
+ water
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ True
+
+
+ 24
+ template Groundwater-to-Water heat pump
+ heat pump
+
+
+
+
+
+ 3.5
+
+ electricity
+ Ground
+ water
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ True
+
+
+ 25
+ template Water-to-Water heat pump
+ heat pump
+
+
+
+
+
+ 3.5
+
+ electricity
+ Water
+ water
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ True
+
+
+ 26
+ template Photovoltaic Module
+ Photovoltaic
+
+
+
+ 0.2
+
+
+
+
+
+
+ 1.0
+ 1.0
+
+
+
+
+
+
+ 1
+ Hot Water Storage Tank
+ thermal
+ HF 200
+ reflex
+ 95.0
+
+ 1
+ 90.0
+
+
+ 2
+ 0
+ 1.5
+ Steel
+ 0.5
+
+
+ 1
+
+ sensible
+
+
+
+
+ 2
+ Hot Water Storage Tank
+ thermal
+ HF 300
+ reflex
+ 95.0
+
+ 1
+ 90.0
+
+
+ 2
+ 0
+ 1.5
+ Steel
+ 0.6
+
+
+ 1
+
+ sensible
+
+
+
+
+ 3
+ Hot Water Storage Tank
+ thermal
+ HF 500
+ reflex
+ 95.0
+
+ 1
+ 90.0
+
+
+ 2
+ 0
+ 1.5
+ Steel
+ 0.5
+
+
+ 1
+
+ sensible
+
+
+
+
+ 4
+ Hot Water Storage Tank
+ thermal
+ HF 200
+ reflex
+ 95.0
+
+ 1
+ 90.0
+
+ 2
+ 0
+ 1.5
+ Steel
+ 0.5
+
+
+ 1
+
+ sensible
+
+
+
+
+ 5
+ Hot Water Storage Tank
+ thermal
+ HF 200
+ reflex
+ 95.0
+
+ 1
+ 90.0
+
+
+ 2
+ 0
+ 1.5
+ Steel
+ 0.5
+
+
+ 1
+
+ sensible
+
+
+
+
+ 6
+ template Hot Water Storage Tank
+ thermal
+ HF 200
+
+ 95.0
+
+ 1
+ 90.0
+
+
+ 2
+ 0
+ 1.5
+ Steel
+
+
+
+ 1
+
+ sensible
+
+
+
+
+
+
+ 1
+ Polyurethane
+
+
+
+
+
+
+
+ 0.028
+
+
+ 2
+ Steel
+
+
+
+
+
+
+
+ 18
+
+
+
+
+
+
+
+
+
+
+ 1
+ 4 pipe storage equipped air source heat pump and gas boiler
+ schemas/ASHP+TES+GasBoiler.jpg
+
+ heating
+ cooling
+ domestic_hot_water
+
+
+ 21
+ 18
+
+
+
+ 2
+ 4 pipe storage equipped air source heat pump and electrical boiler
+ schemas/ASHP+TES+GasBoiler.jpg
+
+ heating
+ cooling
+ domestic_hot_water
+
+
+ 22
+ 18
+
+
+
+ 3
+ 4 pipe storage equipped ground source heat pump and gas boiler
+ schemas/GSHP+TES+GasBoiler.jpg
+
+ heating
+ cooling
+ domestic_hot_water
+
+
+ 21
+ 19
+
+
+
+ 4
+ 4 pipe storage equipped ground source heat pump and electrical boiler
+ schemas/GSHP+TES+ElectricBoiler.jpg
+
+ heating
+ cooling
+ domestic_hot_water
+
+
+ 22
+ 19
+
+
+
+ 5
+ 4 pipe storage equipped ground source heat pump and gas boiler
+ schemas/WSHP+TES+GasBoiler.jpg
+
+ heating
+ cooling
+ domestic_hot_water
+
+
+ 21
+ 20
+
+
+
+ 6
+ 4 pipe storage equipped ground source heat pump and electrical boiler
+ schemas/WSHP+TES+ElectricBoiler.jpg
+
+ heating
+ cooling
+ domestic_hot_water
+
+
+ 22
+ 20
+
+
+
+ 7
+ Photovoltaic System
+ schemas/PV.jpg
+
+ electricity
+
+
+ 26
+
+
+
+
+
+ PV+ASHP+GasBoiler+TES
+
+ 7
+ 1
+
+
+
+ PV+ASHP+ElectricBoiler+TES
+
+ 7
+ 2
+
+
+
+ PV+GSHP+GasBoiler+TES
+
+ 7
+ 3
+
+
+
+ PV+GSHP+ElectricBoiler+TES
+
+ 7
+ 4
+
+
+
+ PV+WSHP+GasBoiler+TES
+
+ 7
+ 5
+
+
+
+ PV+WSHP+ElectricBoiler+TES
+
+ 7
+ 6
+
+
+
+ ASHP+GasBoiler+TES
+
+ 1
+
+
+
+ ASHP+ElectricBoiler+TES
+
+ 2
+
+
+
+ GSHP+GasBoiler+TES
+
+ 3
+
+
+
+ GSHP+ElectricBoiler+TES
+
+ 4
+
+
+
+ WSHP+GasBoiler+TES
+
+ 5
+
+
+
+ WSHP+ElectricBoiler+TES
+
+ 6
+
+
+
+
+
diff --git a/hub/data/energy_systems/north_america_systems.xml b/hub/data/energy_systems/north_america_systems.xml
index f7c9eb3a..ca090cda 100644
--- a/hub/data/energy_systems/north_america_systems.xml
+++ b/hub/data/energy_systems/north_america_systems.xml
@@ -6,7 +6,7 @@
-
+
@@ -17,7 +17,7 @@
-
+
COP
source_temperature
@@ -25,7 +25,7 @@
-
+
COP
source_temperature
@@ -33,7 +33,7 @@
-
+
COP
source_temperature
@@ -47,20 +47,20 @@
6
-
+
6
-
+
6
-
+
6
-
-
-
+
+
+
diff --git a/hub/exports/__pycache__/__init__.cpython-39.pyc b/hub/exports/__pycache__/__init__.cpython-39.pyc
new file mode 100644
index 00000000..9dc178b1
Binary files /dev/null and b/hub/exports/__pycache__/__init__.cpython-39.pyc differ
diff --git a/hub/exports/__pycache__/energy_building_exports_factory.cpython-39.pyc b/hub/exports/__pycache__/energy_building_exports_factory.cpython-39.pyc
new file mode 100644
index 00000000..2c14b747
Binary files /dev/null and b/hub/exports/__pycache__/energy_building_exports_factory.cpython-39.pyc differ
diff --git a/hub/exports/__pycache__/exports_factory.cpython-39.pyc b/hub/exports/__pycache__/exports_factory.cpython-39.pyc
new file mode 100644
index 00000000..863f4f38
Binary files /dev/null and b/hub/exports/__pycache__/exports_factory.cpython-39.pyc differ
diff --git a/hub/exports/building_energy/__pycache__/__init__.cpython-39.pyc b/hub/exports/building_energy/__pycache__/__init__.cpython-39.pyc
new file mode 100644
index 00000000..d3110686
Binary files /dev/null and b/hub/exports/building_energy/__pycache__/__init__.cpython-39.pyc differ
diff --git a/hub/exports/building_energy/__pycache__/energy_ade.cpython-39.pyc b/hub/exports/building_energy/__pycache__/energy_ade.cpython-39.pyc
new file mode 100644
index 00000000..a2191884
Binary files /dev/null and b/hub/exports/building_energy/__pycache__/energy_ade.cpython-39.pyc differ
diff --git a/hub/exports/building_energy/__pycache__/idf.cpython-39.pyc b/hub/exports/building_energy/__pycache__/idf.cpython-39.pyc
new file mode 100644
index 00000000..6286a2fd
Binary files /dev/null and b/hub/exports/building_energy/__pycache__/idf.cpython-39.pyc differ
diff --git a/hub/exports/building_energy/insel/__pycache__/__init__.cpython-39.pyc b/hub/exports/building_energy/insel/__pycache__/__init__.cpython-39.pyc
new file mode 100644
index 00000000..e57d6fa2
Binary files /dev/null and b/hub/exports/building_energy/insel/__pycache__/__init__.cpython-39.pyc differ
diff --git a/hub/exports/building_energy/insel/__pycache__/insel_monthly_energy_balance.cpython-39.pyc b/hub/exports/building_energy/insel/__pycache__/insel_monthly_energy_balance.cpython-39.pyc
new file mode 100644
index 00000000..bbaf23f0
Binary files /dev/null and b/hub/exports/building_energy/insel/__pycache__/insel_monthly_energy_balance.cpython-39.pyc differ
diff --git a/hub/exports/formats/__pycache__/__init__.cpython-39.pyc b/hub/exports/formats/__pycache__/__init__.cpython-39.pyc
new file mode 100644
index 00000000..df68a86e
Binary files /dev/null and b/hub/exports/formats/__pycache__/__init__.cpython-39.pyc differ
diff --git a/hub/exports/formats/__pycache__/obj.cpython-39.pyc b/hub/exports/formats/__pycache__/obj.cpython-39.pyc
new file mode 100644
index 00000000..4967b77d
Binary files /dev/null and b/hub/exports/formats/__pycache__/obj.cpython-39.pyc differ
diff --git a/hub/exports/formats/__pycache__/simplified_radiosity_algorithm.cpython-39.pyc b/hub/exports/formats/__pycache__/simplified_radiosity_algorithm.cpython-39.pyc
new file mode 100644
index 00000000..a64ed721
Binary files /dev/null and b/hub/exports/formats/__pycache__/simplified_radiosity_algorithm.cpython-39.pyc differ
diff --git a/hub/exports/formats/__pycache__/stl.cpython-39.pyc b/hub/exports/formats/__pycache__/stl.cpython-39.pyc
new file mode 100644
index 00000000..a6f0e629
Binary files /dev/null and b/hub/exports/formats/__pycache__/stl.cpython-39.pyc differ
diff --git a/hub/exports/formats/__pycache__/triangular.cpython-39.pyc b/hub/exports/formats/__pycache__/triangular.cpython-39.pyc
new file mode 100644
index 00000000..8d058814
Binary files /dev/null and b/hub/exports/formats/__pycache__/triangular.cpython-39.pyc differ
diff --git a/hub/helpers/__pycache__/__init__.cpython-39.pyc b/hub/helpers/__pycache__/__init__.cpython-39.pyc
new file mode 100644
index 00000000..be58587f
Binary files /dev/null and b/hub/helpers/__pycache__/__init__.cpython-39.pyc differ
diff --git a/hub/helpers/__pycache__/configuration_helper.cpython-39.pyc b/hub/helpers/__pycache__/configuration_helper.cpython-39.pyc
new file mode 100644
index 00000000..7ac8cd8d
Binary files /dev/null and b/hub/helpers/__pycache__/configuration_helper.cpython-39.pyc differ
diff --git a/hub/helpers/__pycache__/constants.cpython-39.pyc b/hub/helpers/__pycache__/constants.cpython-39.pyc
new file mode 100644
index 00000000..bdf6694a
Binary files /dev/null and b/hub/helpers/__pycache__/constants.cpython-39.pyc differ
diff --git a/hub/helpers/__pycache__/dictionaries.cpython-39.pyc b/hub/helpers/__pycache__/dictionaries.cpython-39.pyc
new file mode 100644
index 00000000..dffe6758
Binary files /dev/null and b/hub/helpers/__pycache__/dictionaries.cpython-39.pyc differ
diff --git a/hub/helpers/__pycache__/geometry_helper.cpython-39.pyc b/hub/helpers/__pycache__/geometry_helper.cpython-39.pyc
new file mode 100644
index 00000000..8d1f1201
Binary files /dev/null and b/hub/helpers/__pycache__/geometry_helper.cpython-39.pyc differ
diff --git a/hub/helpers/__pycache__/location.cpython-39.pyc b/hub/helpers/__pycache__/location.cpython-39.pyc
new file mode 100644
index 00000000..ac83e948
Binary files /dev/null and b/hub/helpers/__pycache__/location.cpython-39.pyc differ
diff --git a/hub/helpers/__pycache__/monthly_values.cpython-39.pyc b/hub/helpers/__pycache__/monthly_values.cpython-39.pyc
new file mode 100644
index 00000000..68fa09dc
Binary files /dev/null and b/hub/helpers/__pycache__/monthly_values.cpython-39.pyc differ
diff --git a/hub/helpers/__pycache__/peak_loads.cpython-39.pyc b/hub/helpers/__pycache__/peak_loads.cpython-39.pyc
new file mode 100644
index 00000000..a0dd94fa
Binary files /dev/null and b/hub/helpers/__pycache__/peak_loads.cpython-39.pyc differ
diff --git a/hub/helpers/__pycache__/utils.cpython-39.pyc b/hub/helpers/__pycache__/utils.cpython-39.pyc
new file mode 100644
index 00000000..e79f6b0e
Binary files /dev/null and b/hub/helpers/__pycache__/utils.cpython-39.pyc differ
diff --git a/hub/helpers/data/__pycache__/__init__.cpython-39.pyc b/hub/helpers/data/__pycache__/__init__.cpython-39.pyc
new file mode 100644
index 00000000..6431e0ad
Binary files /dev/null and b/hub/helpers/data/__pycache__/__init__.cpython-39.pyc differ
diff --git a/hub/helpers/data/__pycache__/alkis_function_to_hub_function.cpython-39.pyc b/hub/helpers/data/__pycache__/alkis_function_to_hub_function.cpython-39.pyc
new file mode 100644
index 00000000..b13e5e55
Binary files /dev/null and b/hub/helpers/data/__pycache__/alkis_function_to_hub_function.cpython-39.pyc differ
diff --git a/hub/helpers/data/__pycache__/eilat_function_to_hub_function.cpython-39.pyc b/hub/helpers/data/__pycache__/eilat_function_to_hub_function.cpython-39.pyc
new file mode 100644
index 00000000..c4cd43f1
Binary files /dev/null and b/hub/helpers/data/__pycache__/eilat_function_to_hub_function.cpython-39.pyc differ
diff --git a/hub/helpers/data/__pycache__/hft_function_to_hub_function.cpython-39.pyc b/hub/helpers/data/__pycache__/hft_function_to_hub_function.cpython-39.pyc
new file mode 100644
index 00000000..6d72189e
Binary files /dev/null and b/hub/helpers/data/__pycache__/hft_function_to_hub_function.cpython-39.pyc differ
diff --git a/hub/helpers/data/__pycache__/hub_function_to_eilat_construction_function.cpython-39.pyc b/hub/helpers/data/__pycache__/hub_function_to_eilat_construction_function.cpython-39.pyc
new file mode 100644
index 00000000..5d567ef7
Binary files /dev/null and b/hub/helpers/data/__pycache__/hub_function_to_eilat_construction_function.cpython-39.pyc differ
diff --git a/hub/helpers/data/__pycache__/hub_function_to_montreal_custom_costs_function.cpython-39.pyc b/hub/helpers/data/__pycache__/hub_function_to_montreal_custom_costs_function.cpython-39.pyc
new file mode 100644
index 00000000..67a97836
Binary files /dev/null and b/hub/helpers/data/__pycache__/hub_function_to_montreal_custom_costs_function.cpython-39.pyc differ
diff --git a/hub/helpers/data/__pycache__/hub_function_to_nrcan_construction_function.cpython-39.pyc b/hub/helpers/data/__pycache__/hub_function_to_nrcan_construction_function.cpython-39.pyc
new file mode 100644
index 00000000..b7a2fbfa
Binary files /dev/null and b/hub/helpers/data/__pycache__/hub_function_to_nrcan_construction_function.cpython-39.pyc differ
diff --git a/hub/helpers/data/__pycache__/hub_function_to_nrel_construction_function.cpython-39.pyc b/hub/helpers/data/__pycache__/hub_function_to_nrel_construction_function.cpython-39.pyc
new file mode 100644
index 00000000..2f78d517
Binary files /dev/null and b/hub/helpers/data/__pycache__/hub_function_to_nrel_construction_function.cpython-39.pyc differ
diff --git a/hub/helpers/data/__pycache__/hub_usage_to_comnet_usage.cpython-39.pyc b/hub/helpers/data/__pycache__/hub_usage_to_comnet_usage.cpython-39.pyc
new file mode 100644
index 00000000..4a67fa4e
Binary files /dev/null and b/hub/helpers/data/__pycache__/hub_usage_to_comnet_usage.cpython-39.pyc differ
diff --git a/hub/helpers/data/__pycache__/hub_usage_to_eilat_usage.cpython-39.pyc b/hub/helpers/data/__pycache__/hub_usage_to_eilat_usage.cpython-39.pyc
new file mode 100644
index 00000000..750e7d87
Binary files /dev/null and b/hub/helpers/data/__pycache__/hub_usage_to_eilat_usage.cpython-39.pyc differ
diff --git a/hub/helpers/data/__pycache__/hub_usage_to_hft_usage.cpython-39.pyc b/hub/helpers/data/__pycache__/hub_usage_to_hft_usage.cpython-39.pyc
new file mode 100644
index 00000000..eaf1214c
Binary files /dev/null and b/hub/helpers/data/__pycache__/hub_usage_to_hft_usage.cpython-39.pyc differ
diff --git a/hub/helpers/data/__pycache__/hub_usage_to_nrcan_usage.cpython-39.pyc b/hub/helpers/data/__pycache__/hub_usage_to_nrcan_usage.cpython-39.pyc
new file mode 100644
index 00000000..2c88afaf
Binary files /dev/null and b/hub/helpers/data/__pycache__/hub_usage_to_nrcan_usage.cpython-39.pyc differ
diff --git a/hub/helpers/data/__pycache__/montreal_custom_fuel_to_hub_fuel.cpython-39.pyc b/hub/helpers/data/__pycache__/montreal_custom_fuel_to_hub_fuel.cpython-39.pyc
new file mode 100644
index 00000000..6887ebdb
Binary files /dev/null and b/hub/helpers/data/__pycache__/montreal_custom_fuel_to_hub_fuel.cpython-39.pyc differ
diff --git a/hub/helpers/data/__pycache__/montreal_demand_type_to_hub_energy_demand_type.cpython-39.pyc b/hub/helpers/data/__pycache__/montreal_demand_type_to_hub_energy_demand_type.cpython-39.pyc
new file mode 100644
index 00000000..4b36172a
Binary files /dev/null and b/hub/helpers/data/__pycache__/montreal_demand_type_to_hub_energy_demand_type.cpython-39.pyc differ
diff --git a/hub/helpers/data/__pycache__/montreal_function_to_hub_function.cpython-39.pyc b/hub/helpers/data/__pycache__/montreal_function_to_hub_function.cpython-39.pyc
new file mode 100644
index 00000000..1b306466
Binary files /dev/null and b/hub/helpers/data/__pycache__/montreal_function_to_hub_function.cpython-39.pyc differ
diff --git a/hub/helpers/data/__pycache__/montreal_generation_system_to_hub_energy_generation_system.cpython-39.pyc b/hub/helpers/data/__pycache__/montreal_generation_system_to_hub_energy_generation_system.cpython-39.pyc
new file mode 100644
index 00000000..de2ff300
Binary files /dev/null and b/hub/helpers/data/__pycache__/montreal_generation_system_to_hub_energy_generation_system.cpython-39.pyc differ
diff --git a/hub/helpers/data/__pycache__/montreal_system_to_hub_energy_generation_system.cpython-39.pyc b/hub/helpers/data/__pycache__/montreal_system_to_hub_energy_generation_system.cpython-39.pyc
new file mode 100644
index 00000000..b3f4e009
Binary files /dev/null and b/hub/helpers/data/__pycache__/montreal_system_to_hub_energy_generation_system.cpython-39.pyc differ
diff --git a/hub/helpers/data/__pycache__/north_america_custom_fuel_to_hub_fuel.cpython-39.pyc b/hub/helpers/data/__pycache__/north_america_custom_fuel_to_hub_fuel.cpython-39.pyc
new file mode 100644
index 00000000..bc03122b
Binary files /dev/null and b/hub/helpers/data/__pycache__/north_america_custom_fuel_to_hub_fuel.cpython-39.pyc differ
diff --git a/hub/helpers/data/__pycache__/north_america_demand_type_to_hub_energy_demand_type.cpython-39.pyc b/hub/helpers/data/__pycache__/north_america_demand_type_to_hub_energy_demand_type.cpython-39.pyc
new file mode 100644
index 00000000..0a15aabb
Binary files /dev/null and b/hub/helpers/data/__pycache__/north_america_demand_type_to_hub_energy_demand_type.cpython-39.pyc differ
diff --git a/hub/helpers/data/__pycache__/north_america_storage_system_to_hub_storage.cpython-39.pyc b/hub/helpers/data/__pycache__/north_america_storage_system_to_hub_storage.cpython-39.pyc
new file mode 100644
index 00000000..b50b0108
Binary files /dev/null and b/hub/helpers/data/__pycache__/north_america_storage_system_to_hub_storage.cpython-39.pyc differ
diff --git a/hub/helpers/data/__pycache__/north_america_system_to_hub_energy_generation_system.cpython-39.pyc b/hub/helpers/data/__pycache__/north_america_system_to_hub_energy_generation_system.cpython-39.pyc
new file mode 100644
index 00000000..3079abd1
Binary files /dev/null and b/hub/helpers/data/__pycache__/north_america_system_to_hub_energy_generation_system.cpython-39.pyc differ
diff --git a/hub/helpers/data/__pycache__/pluto_function_to_hub_function.cpython-39.pyc b/hub/helpers/data/__pycache__/pluto_function_to_hub_function.cpython-39.pyc
new file mode 100644
index 00000000..77acccdb
Binary files /dev/null and b/hub/helpers/data/__pycache__/pluto_function_to_hub_function.cpython-39.pyc differ
diff --git a/hub/helpers/peak_calculation/__pycache__/__init__.cpython-39.pyc b/hub/helpers/peak_calculation/__pycache__/__init__.cpython-39.pyc
new file mode 100644
index 00000000..ffa7a13c
Binary files /dev/null and b/hub/helpers/peak_calculation/__pycache__/__init__.cpython-39.pyc differ
diff --git a/hub/helpers/peak_calculation/__pycache__/loads_calculation.cpython-39.pyc b/hub/helpers/peak_calculation/__pycache__/loads_calculation.cpython-39.pyc
new file mode 100644
index 00000000..30f0c075
Binary files /dev/null and b/hub/helpers/peak_calculation/__pycache__/loads_calculation.cpython-39.pyc differ
diff --git a/hub/imports/__pycache__/__init__.cpython-39.pyc b/hub/imports/__pycache__/__init__.cpython-39.pyc
new file mode 100644
index 00000000..e85b3ff7
Binary files /dev/null and b/hub/imports/__pycache__/__init__.cpython-39.pyc differ
diff --git a/hub/imports/__pycache__/construction_factory.cpython-39.pyc b/hub/imports/__pycache__/construction_factory.cpython-39.pyc
new file mode 100644
index 00000000..a45a82db
Binary files /dev/null and b/hub/imports/__pycache__/construction_factory.cpython-39.pyc differ
diff --git a/hub/imports/__pycache__/energy_systems_factory.cpython-39.pyc b/hub/imports/__pycache__/energy_systems_factory.cpython-39.pyc
new file mode 100644
index 00000000..b050cce2
Binary files /dev/null and b/hub/imports/__pycache__/energy_systems_factory.cpython-39.pyc differ
diff --git a/hub/imports/__pycache__/geometry_factory.cpython-39.pyc b/hub/imports/__pycache__/geometry_factory.cpython-39.pyc
new file mode 100644
index 00000000..df4111b6
Binary files /dev/null and b/hub/imports/__pycache__/geometry_factory.cpython-39.pyc differ
diff --git a/hub/imports/__pycache__/results_factory.cpython-39.pyc b/hub/imports/__pycache__/results_factory.cpython-39.pyc
new file mode 100644
index 00000000..ca7a3735
Binary files /dev/null and b/hub/imports/__pycache__/results_factory.cpython-39.pyc differ
diff --git a/hub/imports/__pycache__/usage_factory.cpython-39.pyc b/hub/imports/__pycache__/usage_factory.cpython-39.pyc
new file mode 100644
index 00000000..8bc421bb
Binary files /dev/null and b/hub/imports/__pycache__/usage_factory.cpython-39.pyc differ
diff --git a/hub/imports/__pycache__/weather_factory.cpython-39.pyc b/hub/imports/__pycache__/weather_factory.cpython-39.pyc
new file mode 100644
index 00000000..c0ac64d9
Binary files /dev/null and b/hub/imports/__pycache__/weather_factory.cpython-39.pyc differ
diff --git a/hub/imports/construction/__pycache__/__init__.cpython-39.pyc b/hub/imports/construction/__pycache__/__init__.cpython-39.pyc
new file mode 100644
index 00000000..ee9dec90
Binary files /dev/null and b/hub/imports/construction/__pycache__/__init__.cpython-39.pyc differ
diff --git a/hub/imports/construction/__pycache__/eilat_physics_parameters.cpython-39.pyc b/hub/imports/construction/__pycache__/eilat_physics_parameters.cpython-39.pyc
new file mode 100644
index 00000000..bb658e26
Binary files /dev/null and b/hub/imports/construction/__pycache__/eilat_physics_parameters.cpython-39.pyc differ
diff --git a/hub/imports/construction/__pycache__/nrcan_physics_parameters.cpython-39.pyc b/hub/imports/construction/__pycache__/nrcan_physics_parameters.cpython-39.pyc
new file mode 100644
index 00000000..4f79b767
Binary files /dev/null and b/hub/imports/construction/__pycache__/nrcan_physics_parameters.cpython-39.pyc differ
diff --git a/hub/imports/construction/__pycache__/nrel_physics_parameters.cpython-39.pyc b/hub/imports/construction/__pycache__/nrel_physics_parameters.cpython-39.pyc
new file mode 100644
index 00000000..69de5f7e
Binary files /dev/null and b/hub/imports/construction/__pycache__/nrel_physics_parameters.cpython-39.pyc differ
diff --git a/hub/imports/construction/helpers/__pycache__/__init__.cpython-39.pyc b/hub/imports/construction/helpers/__pycache__/__init__.cpython-39.pyc
new file mode 100644
index 00000000..f7620b48
Binary files /dev/null and b/hub/imports/construction/helpers/__pycache__/__init__.cpython-39.pyc differ
diff --git a/hub/imports/construction/helpers/__pycache__/construction_helper.cpython-39.pyc b/hub/imports/construction/helpers/__pycache__/construction_helper.cpython-39.pyc
new file mode 100644
index 00000000..5f409f6c
Binary files /dev/null and b/hub/imports/construction/helpers/__pycache__/construction_helper.cpython-39.pyc differ
diff --git a/hub/imports/energy_systems/__pycache__/__init__.cpython-39.pyc b/hub/imports/energy_systems/__pycache__/__init__.cpython-39.pyc
new file mode 100644
index 00000000..3f5dca61
Binary files /dev/null and b/hub/imports/energy_systems/__pycache__/__init__.cpython-39.pyc differ
diff --git a/hub/imports/energy_systems/__pycache__/montreal_custom_energy_system_parameters.cpython-39.pyc b/hub/imports/energy_systems/__pycache__/montreal_custom_energy_system_parameters.cpython-39.pyc
new file mode 100644
index 00000000..b0a194d0
Binary files /dev/null and b/hub/imports/energy_systems/__pycache__/montreal_custom_energy_system_parameters.cpython-39.pyc differ
diff --git a/hub/imports/energy_systems/__pycache__/montreal_future_energy_systems_parameters.cpython-39.pyc b/hub/imports/energy_systems/__pycache__/montreal_future_energy_systems_parameters.cpython-39.pyc
new file mode 100644
index 00000000..d3cc174c
Binary files /dev/null and b/hub/imports/energy_systems/__pycache__/montreal_future_energy_systems_parameters.cpython-39.pyc differ
diff --git a/hub/imports/energy_systems/__pycache__/north_america_custom_energy_system_parameters.cpython-39.pyc b/hub/imports/energy_systems/__pycache__/north_america_custom_energy_system_parameters.cpython-39.pyc
new file mode 100644
index 00000000..2467f58f
Binary files /dev/null and b/hub/imports/energy_systems/__pycache__/north_america_custom_energy_system_parameters.cpython-39.pyc differ
diff --git a/hub/imports/energy_systems/montreal_future_energy_systems_parameters.py b/hub/imports/energy_systems/montreal_future_energy_systems_parameters.py
new file mode 100644
index 00000000..8b585108
--- /dev/null
+++ b/hub/imports/energy_systems/montreal_future_energy_systems_parameters.py
@@ -0,0 +1,161 @@
+"""
+Montreal future system importer
+SPDX - License - Identifier: LGPL - 3.0 - or -later
+Copyright © 2023 Concordia CERC group
+Project Coder Saeed Ranjbar saeed.ranjbar@concordia.ca
+
+"""
+
+import logging
+import copy
+
+from hub.catalog_factories.energy_systems_catalog_factory import EnergySystemsCatalogFactory
+from hub.city_model_structure.energy_systems.energy_system import EnergySystem
+from hub.city_model_structure.energy_systems.distribution_system import DistributionSystem
+from hub.city_model_structure.energy_systems.non_pv_generation_system import NonPvGenerationSystem
+from hub.city_model_structure.energy_systems.pv_generation_system import PvGenerationSystem
+from hub.city_model_structure.energy_systems.electrical_storage_system import ElectricalStorageSystem
+from hub.city_model_structure.energy_systems.thermal_storage_system import ThermalStorageSystem
+from hub.city_model_structure.energy_systems.emission_system import EmissionSystem
+from hub.helpers.dictionaries import Dictionaries
+
+
+class MontrealFutureEnergySystemParameters:
+ """
+ MontrealCustomEnergySystemParameters class
+ """
+
+ def __init__(self, city):
+ self._city = city
+
+ def enrich_buildings(self):
+ """
+ Returns the city with the system parameters assigned to the buildings
+ :return:
+ """
+ city = self._city
+ montreal_custom_catalog = EnergySystemsCatalogFactory('montreal_future').catalog
+ if city.generic_energy_systems is None:
+ _generic_energy_systems = {}
+ else:
+ _generic_energy_systems = city.generic_energy_systems
+ for building in city.buildings:
+ archetype_name = building.energy_systems_archetype_name
+ try:
+ archetype = self._search_archetypes(montreal_custom_catalog, archetype_name)
+ except KeyError:
+ logging.error('Building %s has unknown energy system archetype for system name %s', building.name,
+ archetype_name)
+ continue
+
+ if archetype.name not in _generic_energy_systems:
+ _generic_energy_systems = self._create_generic_systems_list(archetype, _generic_energy_systems)
+
+ city.generic_energy_systems = _generic_energy_systems
+
+ self._assign_energy_systems_to_buildings(city)
+
+ @staticmethod
+ def _search_archetypes(catalog, name):
+ archetypes = catalog.entries('archetypes')
+ for building_archetype in archetypes:
+ if str(name) == str(building_archetype.name):
+ return building_archetype
+ raise KeyError('archetype not found')
+
+ def _create_generic_systems_list(self, archetype, _generic_energy_systems):
+ building_systems = []
+ for archetype_system in archetype.systems:
+ energy_system = EnergySystem()
+ _hub_demand_types = []
+ for demand_type in archetype_system.demand_types:
+ _hub_demand_types.append(Dictionaries().montreal_demand_type_to_hub_energy_demand_type[demand_type])
+ energy_system.name = archetype_system.name
+ energy_system.demand_types = _hub_demand_types
+ energy_system.configuration_schema = archetype_system.configuration_schema
+ energy_system.generation_systems = self._create_generation_systems(archetype_system)
+ if energy_system.distribution_systems is not None:
+ energy_system.distribution_systems = self._create_distribution_systems(archetype_system)
+ building_systems.append(energy_system)
+
+ _generic_energy_systems[archetype.name] = building_systems
+
+ return _generic_energy_systems
+
+ @staticmethod
+ def _create_generation_systems(archetype_system):
+ _generation_systems = []
+ archetype_generation_systems = archetype_system.generation_systems
+ if archetype_generation_systems is not None:
+ for archetype_generation_system in archetype_system.generation_systems:
+ if archetype_generation_system.system_type == 'Photovoltaic':
+ _generation_system = PvGenerationSystem()
+ _type = 'PV system'
+ _generation_system.system_type = Dictionaries().montreal_generation_system_to_hub_energy_generation_system[_type]
+ _fuel_type = Dictionaries().montreal_custom_fuel_to_hub_fuel[archetype_generation_system.fuel_type]
+ _generation_system.fuel_type = _fuel_type
+ _generation_system.electricity_efficiency = archetype_generation_system.electricity_efficiency
+ _generic_storage_system = None
+ if archetype_generation_system.energy_storage_systems is not None:
+ _generic_storage_system = ElectricalStorageSystem()
+ _generic_storage_system.type_energy_stored = 'electrical'
+ _generation_system.energy_storage_systems = [_generic_storage_system]
+ else:
+ _generation_system = NonPvGenerationSystem()
+ _type = archetype_generation_system.system_type
+ _generation_system.system_type = Dictionaries().montreal_generation_system_to_hub_energy_generation_system[_type]
+ _fuel_type = Dictionaries().north_america_custom_fuel_to_hub_fuel[archetype_generation_system.fuel_type]
+ _generation_system.fuel_type = _fuel_type
+ _generation_system.source_types = archetype_generation_system.source_medium
+ _generation_system.heat_efficiency = archetype_generation_system.heat_efficiency
+ _generation_system.cooling_efficiency = archetype_generation_system.cooling_efficiency
+ _generation_system.electricity_efficiency = archetype_generation_system.electricity_efficiency
+ _generic_storage_system = None
+ if archetype_generation_system.energy_storage_systems is not None:
+ _storage_systems = []
+ for storage_system in archetype_generation_system.energy_storage_systems:
+ if storage_system.type_energy_stored == 'electrical':
+ _generic_storage_system = ElectricalStorageSystem()
+ _generic_storage_system.type_energy_stored = 'electrical'
+ else:
+ _generic_storage_system = ThermalStorageSystem()
+ _generic_storage_system.type_energy_stored = 'thermal'
+ _storage_systems.append(_generic_storage_system)
+ _generation_system.energy_storage_systems = [_storage_systems]
+ if archetype_generation_system.dual_supply_capability:
+ _generation_system.dual_supply_capability = True
+ _generation_systems.append(_generation_system)
+ return _generation_systems
+
+ @staticmethod
+ def _create_distribution_systems(archetype_system):
+ _distribution_systems = []
+ archetype_distribution_systems = archetype_system.distribution_systems
+ if archetype_distribution_systems is not None:
+ for archetype_distribution_system in archetype_system.distribution_systems:
+ _distribution_system = DistributionSystem()
+ _distribution_system.type = archetype_distribution_system.type
+ _distribution_system.distribution_consumption_fix_flow = \
+ archetype_distribution_system.distribution_consumption_fix_flow
+ _distribution_system.distribution_consumption_variable_flow = \
+ archetype_distribution_system.distribution_consumption_variable_flow
+ _distribution_system.heat_losses = archetype_distribution_system.heat_losses
+ _emission_system = None
+ if archetype_distribution_system.emission_systems is not None:
+ _emission_system = EmissionSystem()
+ _distribution_system.emission_systems = [_emission_system]
+ _distribution_systems.append(_distribution_system)
+ return _distribution_systems
+
+ @staticmethod
+ def _assign_energy_systems_to_buildings(city):
+ for building in city.buildings:
+ _building_energy_systems = []
+ energy_systems_cluster_name = building.energy_systems_archetype_name
+ if str(energy_systems_cluster_name) == 'nan':
+ break
+ _generic_building_energy_systems = city.generic_energy_systems[energy_systems_cluster_name]
+ for _generic_building_energy_system in _generic_building_energy_systems:
+ _building_energy_systems.append(copy.deepcopy(_generic_building_energy_system))
+
+ building.energy_systems = _building_energy_systems
diff --git a/hub/imports/energy_systems/north_america_custom_energy_system_parameters.py b/hub/imports/energy_systems/north_america_custom_energy_system_parameters.py
index dd3160ad..52297d26 100644
--- a/hub/imports/energy_systems/north_america_custom_energy_system_parameters.py
+++ b/hub/imports/energy_systems/north_america_custom_energy_system_parameters.py
@@ -123,7 +123,9 @@ class NorthAmericaCustomEnergySystemParameters:
_generic_storage_system.layers = storage_system.layers
_generic_storage_system.maximum_operating_temperature = storage_system.maximum_operating_temperature
_storage_systems.append(_generic_storage_system)
- _generation_system.energy_storage_systems = _storage_systems
+ _generation_system.energy_storage_systems = [_storage_systems]
+ if archetype_generation_system.dual_supply_capability:
+ _generation_system.dual_supply_capability = True
_generation_systems.append(_generation_system)
return _generation_systems
diff --git a/hub/imports/energy_systems_factory.py b/hub/imports/energy_systems_factory.py
index 3c4bccef..5a9344b8 100644
--- a/hub/imports/energy_systems_factory.py
+++ b/hub/imports/energy_systems_factory.py
@@ -10,7 +10,7 @@ from pathlib import Path
from hub.helpers.utils import validate_import_export_type
from hub.imports.energy_systems.montreal_custom_energy_system_parameters import MontrealCustomEnergySystemParameters
from hub.imports.energy_systems.north_america_custom_energy_system_parameters import NorthAmericaCustomEnergySystemParameters
-
+from hub.imports.energy_systems.montreal_future_energy_systems_parameters import MontrealFutureEnergySystemParameters
class EnergySystemsFactory:
"""
@@ -43,6 +43,15 @@ class EnergySystemsFactory:
for building in self._city.buildings:
building.level_of_detail.energy_systems = 2
+ def _montreal_future(self):
+ """
+ Enrich the city by using north america custom energy systems catalog information
+ """
+ MontrealFutureEnergySystemParameters(self._city).enrich_buildings()
+ self._city.level_of_detail.energy_systems = 2
+ for building in self._city.buildings:
+ building.level_of_detail.energy_systems = 2
+
def enrich(self):
"""
Enrich the city given to the class using the class given handler
diff --git a/hub/imports/geometry/__pycache__/__init__.cpython-39.pyc b/hub/imports/geometry/__pycache__/__init__.cpython-39.pyc
new file mode 100644
index 00000000..d0a2111d
Binary files /dev/null and b/hub/imports/geometry/__pycache__/__init__.cpython-39.pyc differ
diff --git a/hub/imports/geometry/__pycache__/citygml.cpython-39.pyc b/hub/imports/geometry/__pycache__/citygml.cpython-39.pyc
new file mode 100644
index 00000000..027b10be
Binary files /dev/null and b/hub/imports/geometry/__pycache__/citygml.cpython-39.pyc differ
diff --git a/hub/imports/geometry/__pycache__/geojson.cpython-39.pyc b/hub/imports/geometry/__pycache__/geojson.cpython-39.pyc
new file mode 100644
index 00000000..8010f6fa
Binary files /dev/null and b/hub/imports/geometry/__pycache__/geojson.cpython-39.pyc differ
diff --git a/hub/imports/geometry/__pycache__/obj.cpython-39.pyc b/hub/imports/geometry/__pycache__/obj.cpython-39.pyc
new file mode 100644
index 00000000..39ef871a
Binary files /dev/null and b/hub/imports/geometry/__pycache__/obj.cpython-39.pyc differ
diff --git a/hub/imports/geometry/citygml_classes/__pycache__/__init__.cpython-39.pyc b/hub/imports/geometry/citygml_classes/__pycache__/__init__.cpython-39.pyc
new file mode 100644
index 00000000..e0369454
Binary files /dev/null and b/hub/imports/geometry/citygml_classes/__pycache__/__init__.cpython-39.pyc differ
diff --git a/hub/imports/geometry/citygml_classes/__pycache__/citygml_base.cpython-39.pyc b/hub/imports/geometry/citygml_classes/__pycache__/citygml_base.cpython-39.pyc
new file mode 100644
index 00000000..2d0cf012
Binary files /dev/null and b/hub/imports/geometry/citygml_classes/__pycache__/citygml_base.cpython-39.pyc differ
diff --git a/hub/imports/geometry/citygml_classes/__pycache__/citygml_lod1.cpython-39.pyc b/hub/imports/geometry/citygml_classes/__pycache__/citygml_lod1.cpython-39.pyc
new file mode 100644
index 00000000..3236c7a9
Binary files /dev/null and b/hub/imports/geometry/citygml_classes/__pycache__/citygml_lod1.cpython-39.pyc differ
diff --git a/hub/imports/geometry/citygml_classes/__pycache__/citygml_lod2.cpython-39.pyc b/hub/imports/geometry/citygml_classes/__pycache__/citygml_lod2.cpython-39.pyc
new file mode 100644
index 00000000..1d503b9c
Binary files /dev/null and b/hub/imports/geometry/citygml_classes/__pycache__/citygml_lod2.cpython-39.pyc differ
diff --git a/hub/imports/geometry/helpers/__pycache__/__init__.cpython-39.pyc b/hub/imports/geometry/helpers/__pycache__/__init__.cpython-39.pyc
new file mode 100644
index 00000000..8db72b36
Binary files /dev/null and b/hub/imports/geometry/helpers/__pycache__/__init__.cpython-39.pyc differ
diff --git a/hub/imports/geometry/helpers/__pycache__/geometry_helper.cpython-39.pyc b/hub/imports/geometry/helpers/__pycache__/geometry_helper.cpython-39.pyc
new file mode 100644
index 00000000..f377d717
Binary files /dev/null and b/hub/imports/geometry/helpers/__pycache__/geometry_helper.cpython-39.pyc differ
diff --git a/hub/imports/results/__pycache__/__init__.cpython-39.pyc b/hub/imports/results/__pycache__/__init__.cpython-39.pyc
new file mode 100644
index 00000000..b836a723
Binary files /dev/null and b/hub/imports/results/__pycache__/__init__.cpython-39.pyc differ
diff --git a/hub/imports/results/__pycache__/energy_plus.cpython-39.pyc b/hub/imports/results/__pycache__/energy_plus.cpython-39.pyc
new file mode 100644
index 00000000..a6322ff3
Binary files /dev/null and b/hub/imports/results/__pycache__/energy_plus.cpython-39.pyc differ
diff --git a/hub/imports/results/__pycache__/energy_plus_single_building.cpython-39.pyc b/hub/imports/results/__pycache__/energy_plus_single_building.cpython-39.pyc
new file mode 100644
index 00000000..afb0019d
Binary files /dev/null and b/hub/imports/results/__pycache__/energy_plus_single_building.cpython-39.pyc differ
diff --git a/hub/imports/results/__pycache__/energy_plus_workflow.cpython-39.pyc b/hub/imports/results/__pycache__/energy_plus_workflow.cpython-39.pyc
new file mode 100644
index 00000000..ded3637a
Binary files /dev/null and b/hub/imports/results/__pycache__/energy_plus_workflow.cpython-39.pyc differ
diff --git a/hub/imports/results/__pycache__/ep_multiple_buildings.cpython-39.pyc b/hub/imports/results/__pycache__/ep_multiple_buildings.cpython-39.pyc
new file mode 100644
index 00000000..f39e2667
Binary files /dev/null and b/hub/imports/results/__pycache__/ep_multiple_buildings.cpython-39.pyc differ
diff --git a/hub/imports/results/__pycache__/insel_monthly_energry_balance.cpython-39.pyc b/hub/imports/results/__pycache__/insel_monthly_energry_balance.cpython-39.pyc
new file mode 100644
index 00000000..790ad3be
Binary files /dev/null and b/hub/imports/results/__pycache__/insel_monthly_energry_balance.cpython-39.pyc differ
diff --git a/hub/imports/results/__pycache__/simplified_radiosity_algorithm.cpython-39.pyc b/hub/imports/results/__pycache__/simplified_radiosity_algorithm.cpython-39.pyc
new file mode 100644
index 00000000..85680212
Binary files /dev/null and b/hub/imports/results/__pycache__/simplified_radiosity_algorithm.cpython-39.pyc differ
diff --git a/hub/imports/usage/__pycache__/__init__.cpython-39.pyc b/hub/imports/usage/__pycache__/__init__.cpython-39.pyc
new file mode 100644
index 00000000..14616582
Binary files /dev/null and b/hub/imports/usage/__pycache__/__init__.cpython-39.pyc differ
diff --git a/hub/imports/usage/__pycache__/comnet_usage_parameters.cpython-39.pyc b/hub/imports/usage/__pycache__/comnet_usage_parameters.cpython-39.pyc
new file mode 100644
index 00000000..ca7436f3
Binary files /dev/null and b/hub/imports/usage/__pycache__/comnet_usage_parameters.cpython-39.pyc differ
diff --git a/hub/imports/usage/__pycache__/eilat_usage_parameters.cpython-39.pyc b/hub/imports/usage/__pycache__/eilat_usage_parameters.cpython-39.pyc
new file mode 100644
index 00000000..94b8ee6c
Binary files /dev/null and b/hub/imports/usage/__pycache__/eilat_usage_parameters.cpython-39.pyc differ
diff --git a/hub/imports/usage/__pycache__/nrcan_usage_parameters.cpython-39.pyc b/hub/imports/usage/__pycache__/nrcan_usage_parameters.cpython-39.pyc
new file mode 100644
index 00000000..efa05c03
Binary files /dev/null and b/hub/imports/usage/__pycache__/nrcan_usage_parameters.cpython-39.pyc differ
diff --git a/hub/imports/weather/__pycache__/__init__.cpython-39.pyc b/hub/imports/weather/__pycache__/__init__.cpython-39.pyc
new file mode 100644
index 00000000..21a79cd8
Binary files /dev/null and b/hub/imports/weather/__pycache__/__init__.cpython-39.pyc differ
diff --git a/hub/imports/weather/__pycache__/epw_weather_parameters.cpython-39.pyc b/hub/imports/weather/__pycache__/epw_weather_parameters.cpython-39.pyc
new file mode 100644
index 00000000..dbbb01ba
Binary files /dev/null and b/hub/imports/weather/__pycache__/epw_weather_parameters.cpython-39.pyc differ
diff --git a/hub/imports/weather/helpers/__pycache__/__init__.cpython-39.pyc b/hub/imports/weather/helpers/__pycache__/__init__.cpython-39.pyc
new file mode 100644
index 00000000..2aea3372
Binary files /dev/null and b/hub/imports/weather/helpers/__pycache__/__init__.cpython-39.pyc differ
diff --git a/hub/imports/weather/helpers/__pycache__/weather.cpython-39.pyc b/hub/imports/weather/helpers/__pycache__/weather.cpython-39.pyc
new file mode 100644
index 00000000..989715d0
Binary files /dev/null and b/hub/imports/weather/helpers/__pycache__/weather.cpython-39.pyc differ
diff --git a/tests/__pycache__/test_results_import.cpython-39.pyc b/tests/__pycache__/test_results_import.cpython-39.pyc
new file mode 100644
index 00000000..72ee752b
Binary files /dev/null and b/tests/__pycache__/test_results_import.cpython-39.pyc differ
diff --git a/tests/__pycache__/test_systems_catalog.cpython-39.pyc b/tests/__pycache__/test_systems_catalog.cpython-39.pyc
new file mode 100644
index 00000000..26324a1a
Binary files /dev/null and b/tests/__pycache__/test_systems_catalog.cpython-39.pyc differ
diff --git a/tests/__pycache__/test_systems_factory.cpython-39.pyc b/tests/__pycache__/test_systems_factory.cpython-39.pyc
new file mode 100644
index 00000000..455598d5
Binary files /dev/null and b/tests/__pycache__/test_systems_factory.cpython-39.pyc differ
diff --git a/tests/test_systems_catalog.py b/tests/test_systems_catalog.py
index ae8adb97..9d44500a 100644
--- a/tests/test_systems_catalog.py
+++ b/tests/test_systems_catalog.py
@@ -56,3 +56,25 @@ class TestSystemsCatalog(TestCase):
with self.assertRaises(IndexError):
catalog.get_entry('unknown')
print(catalog.entries())
+
+ def test_montreal_future_catalog(self):
+ catalog = EnergySystemsCatalogFactory('montreal_future').catalog
+
+ catalog_categories = catalog.names()
+ archetypes = catalog.names('archetypes')
+ self.assertEqual(12, len(archetypes['archetypes']))
+ systems = catalog.names('systems')
+ self.assertEqual(7, len(systems['systems']))
+ generation_equipments = catalog.names('generation_equipments')
+ self.assertEqual(26, len(generation_equipments['generation_equipments']))
+ with self.assertRaises(ValueError):
+ catalog.names('unknown')
+
+ # retrieving all the entries should not raise any exceptions
+ for category in catalog_categories:
+ for value in catalog_categories[category]:
+ catalog.get_entry(value)
+
+ with self.assertRaises(IndexError):
+ catalog.get_entry('unknown')
+ print(catalog.entries())
diff --git a/tests/test_systems_factory.py b/tests/test_systems_factory.py
index 2f471945..867a80fc 100644
--- a/tests/test_systems_factory.py
+++ b/tests/test_systems_factory.py
@@ -141,4 +141,43 @@ class TestSystemsFactory(TestCase):
self.assertLess(0, building.heating_consumption[cte.YEAR][0])
self.assertEqual(0, building.cooling_consumption[cte.YEAR][0])
self.assertLess(0, building.domestic_hot_water_consumption[cte.YEAR][0])
- self.assertLess(0, building.onsite_electrical_production[cte.YEAR][0])
\ No newline at end of file
+ self.assertLess(0, building.onsite_electrical_production[cte.YEAR][0])
+ print('test')
+
+ def test_montreal_future_system_results(self):
+ """
+ Enrich the city with the construction information and verify it
+ """
+ ConstructionFactory('nrcan', self._city).enrich()
+ UsageFactory('nrcan', self._city).enrich()
+ WeatherFactory('epw', self._city).enrich()
+ ExportsFactory('sra', self._city, self._output_path).export()
+ sra_path = (self._output_path / f'{self._city.name}_sra.xml').resolve()
+ subprocess.run(['sra', str(sra_path)])
+ ResultFactory('sra', self._city, self._output_path).enrich()
+ EnergyBuildingsExportsFactory('insel_monthly_energy_balance', self._city, self._output_path).export()
+ for building in self._city.buildings:
+ insel_path = (self._output_path / f'{building.name}.insel')
+ subprocess.run(['insel', str(insel_path)])
+ ResultFactory('insel_monthly_energy_balance', self._city, self._output_path).enrich()
+
+ for building in self._city.buildings:
+ building.energy_systems_archetype_name = 'PV+ASHP+GasBoiler+TES'
+ EnergySystemsFactory('montreal_future', self._city).enrich()
+ # Need to assign energy systems to buildings:
+ for building in self._city.buildings:
+ _building_energy_systems = []
+ for energy_system in building.energy_systems:
+ if cte.HEATING in energy_system.demand_types:
+ _generation_system = cast(NonPvGenerationSystem, energy_system.generation_systems[0])
+ _generation_system.heat_power = building.heating_peak_load[cte.YEAR][0]
+ if cte.COOLING in energy_system.demand_types:
+ _generation_system = cast(NonPvGenerationSystem, energy_system.generation_systems[0])
+ _generation_system.cooling_power = building.cooling_peak_load[cte.YEAR][0]
+
+ for building in self._city.buildings:
+ self.assertLess(0, building.heating_consumption[cte.YEAR][0])
+ self.assertLess(0, building.cooling_consumption[cte.YEAR][0])
+ self.assertLess(0, building.domestic_hot_water_consumption[cte.YEAR][0])
+ self.assertLess(0, building.onsite_electrical_production[cte.YEAR][0])
+ print('test')
\ No newline at end of file