Compare commits
3 Commits
3db3acd3c6
...
76b67b38df
Author | SHA1 | Date | |
---|---|---|---|
76b67b38df | |||
2e7f4f1fe3 | |||
ddf10fb2ae |
@ -15,11 +15,20 @@ class Archetype:
|
|||||||
"""
|
"""
|
||||||
Archetype class
|
Archetype class
|
||||||
"""
|
"""
|
||||||
def __init__(self, name, systems):
|
|
||||||
|
|
||||||
|
def __init__(self, name, systems, archetype_cluster_id=None):
|
||||||
|
self._cluster_id = archetype_cluster_id
|
||||||
self._name = name
|
self._name = name
|
||||||
self._systems = systems
|
self._systems = systems
|
||||||
|
|
||||||
|
@property
|
||||||
|
def cluster_id(self):
|
||||||
|
"""
|
||||||
|
Get id
|
||||||
|
:return: string
|
||||||
|
"""
|
||||||
|
return self._cluster_id
|
||||||
|
|
||||||
@property
|
@property
|
||||||
def name(self):
|
def name(self):
|
||||||
"""
|
"""
|
||||||
@ -43,8 +52,9 @@ class Archetype:
|
|||||||
_systems.append(_system.to_dictionary())
|
_systems.append(_system.to_dictionary())
|
||||||
content = {
|
content = {
|
||||||
'Archetype': {
|
'Archetype': {
|
||||||
|
'cluster_id': self.cluster_id,
|
||||||
'name': self.name,
|
'name': self.name,
|
||||||
'systems': _systems
|
'systems': _systems
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
}
|
||||||
return content
|
return content
|
||||||
|
@ -119,7 +119,7 @@ class ThermalStorageSystem(EnergyStorageSystem):
|
|||||||
'height [m]': self.height,
|
'height [m]': self.height,
|
||||||
'layers': _layers,
|
'layers': _layers,
|
||||||
'maximum operating temperature [Celsius]': self.maximum_operating_temperature,
|
'maximum operating temperature [Celsius]': self.maximum_operating_temperature,
|
||||||
'storage_medium': self.storage_medium.to_dictionary(),
|
'storage_medium': _medias,
|
||||||
'heating coil capacity [W]': self.heating_coil_capacity
|
'heating coil capacity [W]': self.heating_coil_capacity
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -69,10 +69,10 @@ class MontrealCustomCatalog(Catalog):
|
|||||||
storage_system = ThermalStorageSystem(equipment_id)
|
storage_system = ThermalStorageSystem(equipment_id)
|
||||||
storage_systems = [storage_system]
|
storage_systems = [storage_system]
|
||||||
if model_name == 'PV system':
|
if model_name == 'PV system':
|
||||||
system_type = 'Photovoltaic'
|
system_type = 'photovoltaic'
|
||||||
generation_system = PvGenerationSystem(equipment_id,
|
generation_system = PvGenerationSystem(equipment_id,
|
||||||
name=None,
|
name=None,
|
||||||
system_type= system_type,
|
system_type=system_type,
|
||||||
model_name=model_name,
|
model_name=model_name,
|
||||||
electricity_efficiency=electricity_efficiency,
|
electricity_efficiency=electricity_efficiency,
|
||||||
energy_storage_systems=storage_systems
|
energy_storage_systems=storage_systems
|
||||||
|
@ -30,7 +30,8 @@ class MontrealFutureSystemCatalogue(Catalog):
|
|||||||
path = str(path / 'montreal_future_systems.xml')
|
path = str(path / 'montreal_future_systems.xml')
|
||||||
with open(path, 'r', encoding='utf-8') as xml:
|
with open(path, 'r', encoding='utf-8') as xml:
|
||||||
self._archetypes = xmltodict.parse(xml.read(),
|
self._archetypes = xmltodict.parse(xml.read(),
|
||||||
force_list=['pv_generation_component', 'templateStorages', 'demand'])
|
force_list=['pv_generation_component', 'templateStorages', 'demand',
|
||||||
|
'system', 'system_id'])
|
||||||
|
|
||||||
self._storage_components = self._load_storage_components()
|
self._storage_components = self._load_storage_components()
|
||||||
self._generation_components = self._load_generation_components()
|
self._generation_components = self._load_generation_components()
|
||||||
@ -49,7 +50,7 @@ class MontrealFutureSystemCatalogue(Catalog):
|
|||||||
'non_pv_generation_component']
|
'non_pv_generation_component']
|
||||||
if non_pv_generation_components is not None:
|
if non_pv_generation_components is not None:
|
||||||
for non_pv in non_pv_generation_components:
|
for non_pv in non_pv_generation_components:
|
||||||
system_id = non_pv['system_id']
|
system_id = non_pv['generation_system_id']
|
||||||
name = non_pv['name']
|
name = non_pv['name']
|
||||||
system_type = non_pv['system_type']
|
system_type = non_pv['system_type']
|
||||||
model_name = non_pv['model_name']
|
model_name = non_pv['model_name']
|
||||||
@ -181,7 +182,7 @@ class MontrealFutureSystemCatalogue(Catalog):
|
|||||||
'pv_generation_component']
|
'pv_generation_component']
|
||||||
if pv_generation_components is not None:
|
if pv_generation_components is not None:
|
||||||
for pv in pv_generation_components:
|
for pv in pv_generation_components:
|
||||||
system_id = pv['system_id']
|
system_id = pv['generation_system_id']
|
||||||
name = pv['name']
|
name = pv['name']
|
||||||
system_type = pv['system_type']
|
system_type = pv['system_type']
|
||||||
model_name = pv['model_name']
|
model_name = pv['model_name']
|
||||||
@ -381,6 +382,7 @@ class MontrealFutureSystemCatalogue(Catalog):
|
|||||||
_system_archetypes = []
|
_system_archetypes = []
|
||||||
system_clusters = self._archetypes['EnergySystemCatalog']['system_archetypes']['system_archetype']
|
system_clusters = self._archetypes['EnergySystemCatalog']['system_archetypes']['system_archetype']
|
||||||
for system_cluster in system_clusters:
|
for system_cluster in system_clusters:
|
||||||
|
archetype_id = system_cluster['@cluster_id']
|
||||||
name = system_cluster['name']
|
name = system_cluster['name']
|
||||||
systems = system_cluster['systems']['system_id']
|
systems = system_cluster['systems']['system_id']
|
||||||
integer_system_ids = [int(item) for item in systems]
|
integer_system_ids = [int(item) for item in systems]
|
||||||
@ -388,7 +390,7 @@ class MontrealFutureSystemCatalogue(Catalog):
|
|||||||
for system_archetype in self._systems:
|
for system_archetype in self._systems:
|
||||||
if int(system_archetype.id) in integer_system_ids:
|
if int(system_archetype.id) in integer_system_ids:
|
||||||
_systems.append(system_archetype)
|
_systems.append(system_archetype)
|
||||||
_system_archetypes.append(Archetype(name=name, systems=_systems))
|
_system_archetypes.append(Archetype(archetype_cluster_id=archetype_id, name=name, systems=_systems))
|
||||||
return _system_archetypes
|
return _system_archetypes
|
||||||
|
|
||||||
def _load_materials(self):
|
def _load_materials(self):
|
||||||
|
@ -92,6 +92,7 @@ class Building(CityObject):
|
|||||||
logging.error('Building %s [%s] has an unexpected surface type %s.', self.name, self.aliases, surface.type)
|
logging.error('Building %s [%s] has an unexpected surface type %s.', self.name, self.aliases, surface.type)
|
||||||
self._domestic_hot_water_peak_load = None
|
self._domestic_hot_water_peak_load = None
|
||||||
self._fuel_consumption_breakdown = {}
|
self._fuel_consumption_breakdown = {}
|
||||||
|
self._systems_archetype_cluster_id = None
|
||||||
self._pv_generation = {}
|
self._pv_generation = {}
|
||||||
|
|
||||||
@property
|
@property
|
||||||
@ -867,53 +868,87 @@ class Building(CityObject):
|
|||||||
Get energy consumption of different sectors
|
Get energy consumption of different sectors
|
||||||
return: dict
|
return: dict
|
||||||
"""
|
"""
|
||||||
fuel_breakdown = {cte.ELECTRICITY: {cte.LIGHTING: self.lighting_electrical_demand[cte.YEAR][0],
|
fuel_breakdown = {cte.ELECTRICITY: {cte.LIGHTING: self.lighting_electrical_demand[cte.YEAR][0] if self.lighting_electrical_demand else 0,
|
||||||
cte.APPLIANCES: self.appliances_electrical_demand[cte.YEAR][0]}}
|
cte.APPLIANCES: self.appliances_electrical_demand[cte.YEAR][0] if self.appliances_electrical_demand else 0}}
|
||||||
energy_systems = self.energy_systems
|
energy_systems = self.energy_systems
|
||||||
for energy_system in energy_systems:
|
if energy_systems is not None:
|
||||||
demand_types = energy_system.demand_types
|
for energy_system in energy_systems:
|
||||||
generation_systems = energy_system.generation_systems
|
demand_types = energy_system.demand_types
|
||||||
for demand_type in demand_types:
|
generation_systems = energy_system.generation_systems
|
||||||
for generation_system in generation_systems:
|
for demand_type in demand_types:
|
||||||
if generation_system.system_type != cte.PHOTOVOLTAIC:
|
for generation_system in generation_systems:
|
||||||
if generation_system.fuel_type not in fuel_breakdown:
|
if generation_system.system_type != cte.PHOTOVOLTAIC:
|
||||||
fuel_breakdown[generation_system.fuel_type] = {}
|
if generation_system.fuel_type not in fuel_breakdown:
|
||||||
if demand_type in generation_system.energy_consumption:
|
fuel_breakdown[generation_system.fuel_type] = {}
|
||||||
fuel_breakdown[f'{generation_system.fuel_type}'][f'{demand_type}'] = (
|
if demand_type in generation_system.energy_consumption:
|
||||||
generation_system.energy_consumption)[f'{demand_type}'][cte.YEAR][0]
|
fuel_breakdown[f'{generation_system.fuel_type}'][f'{demand_type}'] = (
|
||||||
storage_systems = generation_system.energy_storage_systems
|
generation_system.energy_consumption)[f'{demand_type}'][cte.YEAR][0]
|
||||||
if storage_systems:
|
storage_systems = generation_system.energy_storage_systems
|
||||||
for storage_system in storage_systems:
|
if storage_systems:
|
||||||
if storage_system.type_energy_stored == 'thermal' and storage_system.heating_coil_energy_consumption:
|
for storage_system in storage_systems:
|
||||||
fuel_breakdown[cte.ELECTRICITY][f'{demand_type}'] += storage_system.heating_coil_energy_consumption[cte.YEAR][0]
|
if storage_system.type_energy_stored == 'thermal' and storage_system.heating_coil_energy_consumption:
|
||||||
#TODO: When simulation models of all energy system archetypes are created, this part can be removed
|
fuel_breakdown[cte.ELECTRICITY][f'{demand_type}'] += (
|
||||||
heating_fuels = []
|
storage_system.heating_coil_energy_consumption)[f'{demand_type}'][cte.YEAR][0]
|
||||||
dhw_fuels = []
|
#TODO: When simulation models of all energy system archetypes are created, this part can be removed
|
||||||
for energy_system in self.energy_systems:
|
heating_fuels = []
|
||||||
if cte.HEATING in energy_system.demand_types:
|
dhw_fuels = []
|
||||||
for generation_system in energy_system.generation_systems:
|
for energy_system in self.energy_systems:
|
||||||
heating_fuels.append(generation_system.fuel_type)
|
if cte.HEATING in energy_system.demand_types:
|
||||||
if cte.DOMESTIC_HOT_WATER in energy_system.demand_types:
|
for generation_system in energy_system.generation_systems:
|
||||||
for generation_system in energy_system.generation_systems:
|
heating_fuels.append(generation_system.fuel_type)
|
||||||
dhw_fuels.append(generation_system.fuel_type)
|
if cte.DOMESTIC_HOT_WATER in energy_system.demand_types:
|
||||||
for key in fuel_breakdown:
|
for generation_system in energy_system.generation_systems:
|
||||||
if key == cte.ELECTRICITY and cte.COOLING not in fuel_breakdown[key]:
|
dhw_fuels.append(generation_system.fuel_type)
|
||||||
for energy_system in energy_systems:
|
for key in fuel_breakdown:
|
||||||
if cte.COOLING in energy_system.demand_types and cte.COOLING not in fuel_breakdown[key]:
|
if key == cte.ELECTRICITY and cte.COOLING not in fuel_breakdown[key]:
|
||||||
for generation_system in energy_system.generation_systems:
|
|
||||||
fuel_breakdown[generation_system.fuel_type][cte.COOLING] = self.cooling_consumption[cte.YEAR][0]
|
|
||||||
for fuel in heating_fuels:
|
|
||||||
if cte.HEATING not in fuel_breakdown[fuel]:
|
|
||||||
for energy_system in energy_systems:
|
for energy_system in energy_systems:
|
||||||
if cte.HEATING in energy_system.demand_types:
|
if cte.COOLING in energy_system.demand_types and cte.COOLING not in fuel_breakdown[key]:
|
||||||
for generation_system in energy_system.generation_systems:
|
if self.cooling_consumption:
|
||||||
fuel_breakdown[generation_system.fuel_type][cte.HEATING] = self.heating_consumption[cte.YEAR][0]
|
fuel_breakdown[energy_system.generation_systems[0].fuel_type][cte.COOLING] = self.cooling_consumption[cte.YEAR][0]
|
||||||
for fuel in dhw_fuels:
|
for fuel in heating_fuels:
|
||||||
if cte.DOMESTIC_HOT_WATER not in fuel_breakdown[fuel]:
|
if cte.HEATING not in fuel_breakdown[fuel]:
|
||||||
for energy_system in energy_systems:
|
for energy_system in energy_systems:
|
||||||
if cte.DOMESTIC_HOT_WATER in energy_system.demand_types:
|
if cte.HEATING in energy_system.demand_types:
|
||||||
for generation_system in energy_system.generation_systems:
|
if self.heating_consumption:
|
||||||
fuel_breakdown[generation_system.fuel_type][cte.DOMESTIC_HOT_WATER] = self.domestic_hot_water_consumption[cte.YEAR][0]
|
fuel_breakdown[energy_system.generation_systems[0].fuel_type][cte.HEATING] = self.heating_consumption[cte.YEAR][0]
|
||||||
|
for fuel in dhw_fuels:
|
||||||
|
if cte.DOMESTIC_HOT_WATER not in fuel_breakdown[fuel]:
|
||||||
|
for energy_system in energy_systems:
|
||||||
|
if cte.DOMESTIC_HOT_WATER in energy_system.demand_types:
|
||||||
|
if self.domestic_hot_water_consumption:
|
||||||
|
fuel_breakdown[energy_system.generation_systems[0].fuel_type][cte.DOMESTIC_HOT_WATER] = self.domestic_hot_water_consumption[cte.YEAR][0]
|
||||||
self._fuel_consumption_breakdown = fuel_breakdown
|
self._fuel_consumption_breakdown = fuel_breakdown
|
||||||
return self._fuel_consumption_breakdown
|
return self._fuel_consumption_breakdown
|
||||||
|
|
||||||
|
@property
|
||||||
|
def energy_systems_archetype_cluster_id(self):
|
||||||
|
"""
|
||||||
|
Get energy systems archetype id
|
||||||
|
:return: str
|
||||||
|
"""
|
||||||
|
return self._systems_archetype_cluster_id
|
||||||
|
|
||||||
|
@energy_systems_archetype_cluster_id.setter
|
||||||
|
def energy_systems_archetype_cluster_id(self, value):
|
||||||
|
"""
|
||||||
|
Set energy systems archetype id
|
||||||
|
:param value: str
|
||||||
|
"""
|
||||||
|
self._systems_archetype_cluster_id = value
|
||||||
|
|
||||||
|
@property
|
||||||
|
def pv_generation(self):
|
||||||
|
"""
|
||||||
|
temporary attribute to get the onsite pv generation in W
|
||||||
|
:return: dict
|
||||||
|
"""
|
||||||
|
return self._pv_generation
|
||||||
|
|
||||||
|
@pv_generation.setter
|
||||||
|
def pv_generation(self, value):
|
||||||
|
"""
|
||||||
|
temporary attribute to set the onsite pv generation in W
|
||||||
|
:param value: float
|
||||||
|
"""
|
||||||
|
self._pv_generation = value
|
||||||
|
|
||||||
|
@ -157,6 +157,7 @@ class Surface:
|
|||||||
if self._inclination is None:
|
if self._inclination is None:
|
||||||
self._inclination = np.arccos(self.perimeter_polygon.normal[2])
|
self._inclination = np.arccos(self.perimeter_polygon.normal[2])
|
||||||
return self._inclination
|
return self._inclination
|
||||||
|
|
||||||
@property
|
@property
|
||||||
def type(self):
|
def type(self):
|
||||||
"""
|
"""
|
||||||
|
@ -339,7 +339,7 @@
|
|||||||
"infiltration_rate_area_for_ventilation_system_off": 0.0055,
|
"infiltration_rate_area_for_ventilation_system_off": 0.0055,
|
||||||
"constructions": {
|
"constructions": {
|
||||||
"OutdoorsWall": {
|
"OutdoorsWall": {
|
||||||
"opaque_surface_name": " C_1941_1960_FACEXT1",
|
"opaque_surface_name": "C_1941_1960_FACEXT1",
|
||||||
"transparent_surface_name": "C_1941_1960_WIN1",
|
"transparent_surface_name": "C_1941_1960_WIN1",
|
||||||
"transparent_ratio": {
|
"transparent_ratio": {
|
||||||
"north": "30",
|
"north": "30",
|
||||||
|
@ -198,7 +198,7 @@
|
|||||||
<equipments>
|
<equipments>
|
||||||
<generation_id>3</generation_id>
|
<generation_id>3</generation_id>
|
||||||
<distribution_id>8</distribution_id>
|
<distribution_id>8</distribution_id>
|
||||||
g </equipments>
|
</equipments>
|
||||||
</system>
|
</system>
|
||||||
<system id="5">
|
<system id="5">
|
||||||
<name>Single zone packaged rooftop unit with electrical resistance furnace and baseboards and fuel boiler for acs</name>
|
<name>Single zone packaged rooftop unit with electrical resistance furnace and baseboards and fuel boiler for acs</name>
|
||||||
@ -240,7 +240,7 @@ g </equipments>
|
|||||||
<demand>domestic_hot_water</demand>
|
<demand>domestic_hot_water</demand>
|
||||||
</demands>
|
</demands>
|
||||||
<equipments>
|
<equipments>
|
||||||
<generation_id>2</generation_id>
|
<generation_id>1</generation_id>
|
||||||
<distribution_id>3</distribution_id>
|
<distribution_id>3</distribution_id>
|
||||||
</equipments>
|
</equipments>
|
||||||
</system>
|
</system>
|
||||||
@ -302,7 +302,7 @@ g </equipments>
|
|||||||
</demands>
|
</demands>
|
||||||
<equipments>
|
<equipments>
|
||||||
<generation_id>5</generation_id>
|
<generation_id>5</generation_id>
|
||||||
<distribution_id>6</distribution_id>
|
<distribution_id>4</distribution_id>
|
||||||
</equipments>
|
</equipments>
|
||||||
</system>
|
</system>
|
||||||
<system id="15">
|
<system id="15">
|
||||||
|
File diff suppressed because it is too large
Load Diff
@ -253,7 +253,7 @@
|
|||||||
<pv_generation_component>
|
<pv_generation_component>
|
||||||
<system_id>7</system_id>
|
<system_id>7</system_id>
|
||||||
<name>template Photovoltaic Module</name>
|
<name>template Photovoltaic Module</name>
|
||||||
<system_type>Photovoltaic</system_type>
|
<system_type>photovoltaic</system_type>
|
||||||
<model_name/>
|
<model_name/>
|
||||||
<manufacturer/>
|
<manufacturer/>
|
||||||
<nominal_electricity_output/>
|
<nominal_electricity_output/>
|
||||||
@ -264,7 +264,7 @@
|
|||||||
<standard_test_condition_cell_temperature>25</standard_test_condition_cell_temperature>
|
<standard_test_condition_cell_temperature>25</standard_test_condition_cell_temperature>
|
||||||
<standard_test_condition_radiation>1000</standard_test_condition_radiation>
|
<standard_test_condition_radiation>1000</standard_test_condition_radiation>
|
||||||
<standard_test_condition_maximum_power>500</standard_test_condition_maximum_power>
|
<standard_test_condition_maximum_power>500</standard_test_condition_maximum_power>
|
||||||
<cell_temperature_coefficient/>
|
<cell_temperature_coefficient>0.3</cell_temperature_coefficient>
|
||||||
<width>2.0</width>
|
<width>2.0</width>
|
||||||
<height>1.0</height>
|
<height>1.0</height>
|
||||||
<distribution_systems/>
|
<distribution_systems/>
|
||||||
@ -274,7 +274,7 @@
|
|||||||
<pv_generation_component>
|
<pv_generation_component>
|
||||||
<system_id>8</system_id>
|
<system_id>8</system_id>
|
||||||
<name>Photovoltaic Module</name>
|
<name>Photovoltaic Module</name>
|
||||||
<system_type>Photovoltaic</system_type>
|
<system_type>photovoltaic</system_type>
|
||||||
<model_name>RE400CAA Pure 2</model_name>
|
<model_name>RE400CAA Pure 2</model_name>
|
||||||
<manufacturer>REC</manufacturer>
|
<manufacturer>REC</manufacturer>
|
||||||
<nominal_electricity_output>305</nominal_electricity_output>
|
<nominal_electricity_output>305</nominal_electricity_output>
|
||||||
@ -295,7 +295,7 @@
|
|||||||
<pv_generation_component>
|
<pv_generation_component>
|
||||||
<system_id>9</system_id>
|
<system_id>9</system_id>
|
||||||
<name>Photovoltaic Module</name>
|
<name>Photovoltaic Module</name>
|
||||||
<system_type>Photovoltaic</system_type>
|
<system_type>photovoltaic</system_type>
|
||||||
<model_name>RE410CAA Pure 2</model_name>
|
<model_name>RE410CAA Pure 2</model_name>
|
||||||
<manufacturer>REC</manufacturer>
|
<manufacturer>REC</manufacturer>
|
||||||
<nominal_electricity_output>312</nominal_electricity_output>
|
<nominal_electricity_output>312</nominal_electricity_output>
|
||||||
@ -316,7 +316,7 @@
|
|||||||
<pv_generation_component>
|
<pv_generation_component>
|
||||||
<system_id>10</system_id>
|
<system_id>10</system_id>
|
||||||
<name>Photovoltaic Module</name>
|
<name>Photovoltaic Module</name>
|
||||||
<system_type>Photovoltaic</system_type>
|
<system_type>photovoltaic</system_type>
|
||||||
<model_name>RE420CAA Pure 2</model_name>
|
<model_name>RE420CAA Pure 2</model_name>
|
||||||
<manufacturer>REC</manufacturer>
|
<manufacturer>REC</manufacturer>
|
||||||
<nominal_electricity_output>320</nominal_electricity_output>
|
<nominal_electricity_output>320</nominal_electricity_output>
|
||||||
@ -337,7 +337,7 @@
|
|||||||
<pv_generation_component>
|
<pv_generation_component>
|
||||||
<system_id>11</system_id>
|
<system_id>11</system_id>
|
||||||
<name>Photovoltaic Module</name>
|
<name>Photovoltaic Module</name>
|
||||||
<system_type>Photovoltaic</system_type>
|
<system_type>photovoltaic</system_type>
|
||||||
<model_name>RE430CAA Pure 2</model_name>
|
<model_name>RE430CAA Pure 2</model_name>
|
||||||
<manufacturer>REC</manufacturer>
|
<manufacturer>REC</manufacturer>
|
||||||
<nominal_electricity_output>327</nominal_electricity_output>
|
<nominal_electricity_output>327</nominal_electricity_output>
|
||||||
@ -358,7 +358,7 @@
|
|||||||
<pv_generation_component>
|
<pv_generation_component>
|
||||||
<system_id>12</system_id>
|
<system_id>12</system_id>
|
||||||
<name>Photovoltaic Module</name>
|
<name>Photovoltaic Module</name>
|
||||||
<system_type>Photovoltaic</system_type>
|
<system_type>photovoltaic</system_type>
|
||||||
<model_name>REC600AA Pro M</model_name>
|
<model_name>REC600AA Pro M</model_name>
|
||||||
<manufacturer>REC</manufacturer>
|
<manufacturer>REC</manufacturer>
|
||||||
<nominal_electricity_output>457</nominal_electricity_output>
|
<nominal_electricity_output>457</nominal_electricity_output>
|
||||||
@ -379,7 +379,7 @@
|
|||||||
<pv_generation_component>
|
<pv_generation_component>
|
||||||
<system_id>13</system_id>
|
<system_id>13</system_id>
|
||||||
<name>Photovoltaic Module</name>
|
<name>Photovoltaic Module</name>
|
||||||
<system_type>Photovoltaic</system_type>
|
<system_type>photovoltaic</system_type>
|
||||||
<model_name>REC610AA Pro M</model_name>
|
<model_name>REC610AA Pro M</model_name>
|
||||||
<manufacturer>REC</manufacturer>
|
<manufacturer>REC</manufacturer>
|
||||||
<nominal_electricity_output>464</nominal_electricity_output>
|
<nominal_electricity_output>464</nominal_electricity_output>
|
||||||
@ -400,7 +400,7 @@
|
|||||||
<pv_generation_component>
|
<pv_generation_component>
|
||||||
<system_id>14</system_id>
|
<system_id>14</system_id>
|
||||||
<name>Photovoltaic Module</name>
|
<name>Photovoltaic Module</name>
|
||||||
<system_type>Photovoltaic</system_type>
|
<system_type>photovoltaic</system_type>
|
||||||
<model_name>REC620AA Pro M</model_name>
|
<model_name>REC620AA Pro M</model_name>
|
||||||
<manufacturer>REC</manufacturer>
|
<manufacturer>REC</manufacturer>
|
||||||
<nominal_electricity_output>472</nominal_electricity_output>
|
<nominal_electricity_output>472</nominal_electricity_output>
|
||||||
@ -421,7 +421,7 @@
|
|||||||
<pv_generation_component>
|
<pv_generation_component>
|
||||||
<system_id>15</system_id>
|
<system_id>15</system_id>
|
||||||
<name>Photovoltaic Module</name>
|
<name>Photovoltaic Module</name>
|
||||||
<system_type>Photovoltaic</system_type>
|
<system_type>photovoltaic</system_type>
|
||||||
<model_name>REC630AA Pro M</model_name>
|
<model_name>REC630AA Pro M</model_name>
|
||||||
<manufacturer>REC</manufacturer>
|
<manufacturer>REC</manufacturer>
|
||||||
<nominal_electricity_output>480</nominal_electricity_output>
|
<nominal_electricity_output>480</nominal_electricity_output>
|
||||||
@ -442,7 +442,7 @@
|
|||||||
<pv_generation_component>
|
<pv_generation_component>
|
||||||
<system_id>16</system_id>
|
<system_id>16</system_id>
|
||||||
<name>Photovoltaic Module</name>
|
<name>Photovoltaic Module</name>
|
||||||
<system_type>Photovoltaic</system_type>
|
<system_type>photovoltaic</system_type>
|
||||||
<model_name>REC640AA Pro M</model_name>
|
<model_name>REC640AA Pro M</model_name>
|
||||||
<manufacturer>REC</manufacturer>
|
<manufacturer>REC</manufacturer>
|
||||||
<nominal_electricity_output>487</nominal_electricity_output>
|
<nominal_electricity_output>487</nominal_electricity_output>
|
||||||
|
@ -304,6 +304,7 @@ GRID = 'Grid'
|
|||||||
ONSITE_ELECTRICITY = 'Onsite Electricity'
|
ONSITE_ELECTRICITY = 'Onsite Electricity'
|
||||||
PHOTOVOLTAIC = 'Photovoltaic'
|
PHOTOVOLTAIC = 'Photovoltaic'
|
||||||
BOILER = 'Boiler'
|
BOILER = 'Boiler'
|
||||||
|
FURNACE = 'Furnace'
|
||||||
HEAT_PUMP = 'Heat Pump'
|
HEAT_PUMP = 'Heat Pump'
|
||||||
BASEBOARD = 'Baseboard'
|
BASEBOARD = 'Baseboard'
|
||||||
ELECTRICITY_GENERATOR = 'Electricity generator'
|
ELECTRICITY_GENERATOR = 'Electricity generator'
|
||||||
|
@ -17,6 +17,7 @@ class MontrealCustomFuelToHubFuel:
|
|||||||
self._dictionary = {
|
self._dictionary = {
|
||||||
'gas': cte.GAS,
|
'gas': cte.GAS,
|
||||||
'natural gas': cte.GAS,
|
'natural gas': cte.GAS,
|
||||||
|
'biomass': cte.BIOMASS,
|
||||||
'electricity': cte.ELECTRICITY,
|
'electricity': cte.ELECTRICITY,
|
||||||
'renewable': cte.RENEWABLE,
|
'renewable': cte.RENEWABLE,
|
||||||
'butane': cte.BUTANE,
|
'butane': cte.BUTANE,
|
||||||
|
@ -15,10 +15,10 @@ class MontrealGenerationSystemToHubEnergyGenerationSystem:
|
|||||||
def __init__(self):
|
def __init__(self):
|
||||||
self._dictionary = {
|
self._dictionary = {
|
||||||
'boiler': cte.BOILER,
|
'boiler': cte.BOILER,
|
||||||
'furnace': cte.BASEBOARD,
|
'furnace': cte.FURNACE,
|
||||||
'cooler': cte.CHILLER,
|
'cooler': cte.CHILLER,
|
||||||
'electricity generator': cte.ELECTRICITY_GENERATOR,
|
'electricity generator': cte.ELECTRICITY_GENERATOR,
|
||||||
'Photovoltaic': cte.PHOTOVOLTAIC,
|
'photovoltaic': cte.PHOTOVOLTAIC,
|
||||||
'heat pump': cte.HEAT_PUMP,
|
'heat pump': cte.HEAT_PUMP,
|
||||||
'joule': cte.JOULE,
|
'joule': cte.JOULE,
|
||||||
'split': cte.SPLIT,
|
'split': cte.SPLIT,
|
||||||
|
@ -3,6 +3,7 @@ Montreal custom energy system importer
|
|||||||
SPDX - License - Identifier: LGPL - 3.0 - or -later
|
SPDX - License - Identifier: LGPL - 3.0 - or -later
|
||||||
Copyright © 2023 Concordia CERC group
|
Copyright © 2023 Concordia CERC group
|
||||||
Project Coder Pilar Monsalvete Alvarez de Uribarri pilar.monsalvete@concordia.ca
|
Project Coder Pilar Monsalvete Alvarez de Uribarri pilar.monsalvete@concordia.ca
|
||||||
|
Project Contributor Saeed Ranjbar saeed.ranjbar@concordia.ca
|
||||||
"""
|
"""
|
||||||
|
|
||||||
import logging
|
import logging
|
||||||
@ -83,9 +84,9 @@ class MontrealCustomEnergySystemParameters:
|
|||||||
def _create_generation_systems(archetype_system):
|
def _create_generation_systems(archetype_system):
|
||||||
_generation_systems = []
|
_generation_systems = []
|
||||||
for archetype_generation_system in archetype_system.generation_systems:
|
for archetype_generation_system in archetype_system.generation_systems:
|
||||||
if archetype_generation_system.system_type == 'Photovoltaic':
|
if archetype_generation_system.system_type == 'photovoltaic':
|
||||||
_generation_system = PvGenerationSystem()
|
_generation_system = PvGenerationSystem()
|
||||||
_type = 'Photovoltaic'
|
_type = archetype_generation_system.system_type
|
||||||
_generation_system.system_type = Dictionaries().montreal_generation_system_to_hub_energy_generation_system[
|
_generation_system.system_type = Dictionaries().montreal_generation_system_to_hub_energy_generation_system[
|
||||||
_type]
|
_type]
|
||||||
_fuel_type = Dictionaries().montreal_custom_fuel_to_hub_fuel[archetype_generation_system.fuel_type]
|
_fuel_type = Dictionaries().montreal_custom_fuel_to_hub_fuel[archetype_generation_system.fuel_type]
|
||||||
@ -136,14 +137,14 @@ class MontrealCustomEnergySystemParameters:
|
|||||||
_distribution_system.distribution_consumption_variable_flow = \
|
_distribution_system.distribution_consumption_variable_flow = \
|
||||||
archetype_distribution_system.distribution_consumption_variable_flow
|
archetype_distribution_system.distribution_consumption_variable_flow
|
||||||
_distribution_system.heat_losses = archetype_distribution_system.heat_losses
|
_distribution_system.heat_losses = archetype_distribution_system.heat_losses
|
||||||
_emission_system = None
|
_generic_emission_system = None
|
||||||
if archetype_distribution_system.emission_systems is not None:
|
if archetype_distribution_system.emission_systems is not None:
|
||||||
_emission_systems = []
|
_emission_systems = []
|
||||||
for emission_system in archetype_distribution_system.emission_systems:
|
for emission_system in archetype_distribution_system.emission_systems:
|
||||||
_emission_system = EmissionSystem()
|
_generic_emission_system = EmissionSystem()
|
||||||
_emission_system.parasitic_energy_consumption = emission_system.parasitic_energy_consumption
|
_generic_emission_system.parasitic_energy_consumption = emission_system.parasitic_energy_consumption
|
||||||
_emission_systems.append(_emission_system)
|
_emission_systems.append(_generic_emission_system)
|
||||||
_distribution_system.emission_systems = _emission_systems
|
_distribution_system.emission_systems = _emission_systems
|
||||||
_distribution_systems.append(_distribution_system)
|
_distribution_systems.append(_distribution_system)
|
||||||
return _distribution_systems
|
return _distribution_systems
|
||||||
|
|
||||||
|
@ -43,6 +43,7 @@ class MontrealFutureEnergySystemParameters:
|
|||||||
archetype_name = building.energy_systems_archetype_name
|
archetype_name = building.energy_systems_archetype_name
|
||||||
try:
|
try:
|
||||||
archetype = self._search_archetypes(montreal_custom_catalog, archetype_name)
|
archetype = self._search_archetypes(montreal_custom_catalog, archetype_name)
|
||||||
|
building.energy_systems_archetype_cluster_id = archetype.cluster_id
|
||||||
except KeyError:
|
except KeyError:
|
||||||
logging.error('Building %s has unknown energy system archetype for system name %s', building.name,
|
logging.error('Building %s has unknown energy system archetype for system name %s', building.name,
|
||||||
archetype_name)
|
archetype_name)
|
||||||
@ -87,7 +88,7 @@ class MontrealFutureEnergySystemParameters:
|
|||||||
archetype_generation_systems = archetype_system.generation_systems
|
archetype_generation_systems = archetype_system.generation_systems
|
||||||
if archetype_generation_systems is not None:
|
if archetype_generation_systems is not None:
|
||||||
for archetype_generation_system in archetype_system.generation_systems:
|
for archetype_generation_system in archetype_system.generation_systems:
|
||||||
if archetype_generation_system.system_type == 'Photovoltaic':
|
if archetype_generation_system.system_type == 'photovoltaic':
|
||||||
_generation_system = PvGenerationSystem()
|
_generation_system = PvGenerationSystem()
|
||||||
_generation_system.name = archetype_generation_system.name
|
_generation_system.name = archetype_generation_system.name
|
||||||
_generation_system.model_name = archetype_generation_system.model_name
|
_generation_system.model_name = archetype_generation_system.model_name
|
||||||
@ -103,15 +104,21 @@ class MontrealFutureEnergySystemParameters:
|
|||||||
_generation_system.nominal_radiation = archetype_generation_system.nominal_radiation
|
_generation_system.nominal_radiation = archetype_generation_system.nominal_radiation
|
||||||
_generation_system.standard_test_condition_cell_temperature = archetype_generation_system.standard_test_condition_cell_temperature
|
_generation_system.standard_test_condition_cell_temperature = archetype_generation_system.standard_test_condition_cell_temperature
|
||||||
_generation_system.standard_test_condition_maximum_power = archetype_generation_system.standard_test_condition_maximum_power
|
_generation_system.standard_test_condition_maximum_power = archetype_generation_system.standard_test_condition_maximum_power
|
||||||
|
_generation_system.standard_test_condition_radiation = archetype_generation_system.standard_test_condition_radiation
|
||||||
_generation_system.cell_temperature_coefficient = archetype_generation_system.cell_temperature_coefficient
|
_generation_system.cell_temperature_coefficient = archetype_generation_system.cell_temperature_coefficient
|
||||||
_generation_system.width = archetype_generation_system.width
|
_generation_system.width = archetype_generation_system.width
|
||||||
_generation_system.height = archetype_generation_system.height
|
_generation_system.height = archetype_generation_system.height
|
||||||
_generation_system.tilt_angle = self._city.latitude
|
_generation_system.tilt_angle = self._city.latitude
|
||||||
_generic_storage_system = None
|
_generic_storage_system = None
|
||||||
if archetype_generation_system.energy_storage_systems is not None:
|
if archetype_generation_system.energy_storage_systems is not None:
|
||||||
_generic_storage_system = ElectricalStorageSystem()
|
_storage_systems = []
|
||||||
_generic_storage_system.type_energy_stored = 'electrical'
|
for storage_system in archetype_generation_system.energy_storage_systems:
|
||||||
_generation_system.energy_storage_systems = [_generic_storage_system]
|
if storage_system.type_energy_stored == 'electrical':
|
||||||
|
_generic_storage_system = ElectricalStorageSystem()
|
||||||
|
_generic_storage_system.type_energy_stored = 'electrical'
|
||||||
|
_storage_systems.append(_generic_storage_system)
|
||||||
|
_generation_system.energy_storage_systems = _storage_systems
|
||||||
|
|
||||||
else:
|
else:
|
||||||
_generation_system = NonPvGenerationSystem()
|
_generation_system = NonPvGenerationSystem()
|
||||||
_generation_system.name = archetype_generation_system.name
|
_generation_system.name = archetype_generation_system.name
|
||||||
@ -185,14 +192,14 @@ class MontrealFutureEnergySystemParameters:
|
|||||||
_distribution_system.distribution_consumption_variable_flow = \
|
_distribution_system.distribution_consumption_variable_flow = \
|
||||||
archetype_distribution_system.distribution_consumption_variable_flow
|
archetype_distribution_system.distribution_consumption_variable_flow
|
||||||
_distribution_system.heat_losses = archetype_distribution_system.heat_losses
|
_distribution_system.heat_losses = archetype_distribution_system.heat_losses
|
||||||
_emission_system = None
|
_generic_emission_system = None
|
||||||
if archetype_distribution_system.emission_systems is not None:
|
if archetype_distribution_system.emission_systems is not None:
|
||||||
_emission_systems = []
|
_emission_systems = []
|
||||||
for emission_system in archetype_distribution_system.emission_systems:
|
for emission_system in archetype_distribution_system.emission_systems:
|
||||||
_emission_system = EmissionSystem()
|
_generic_emission_system = EmissionSystem()
|
||||||
_emission_system.parasitic_energy_consumption = emission_system.parasitic_energy_consumption
|
_generic_emission_system.parasitic_energy_consumption = emission_system.parasitic_energy_consumption
|
||||||
_emission_systems.append(_emission_system)
|
_emission_systems.append(_generic_emission_system)
|
||||||
_distribution_system.emission_systems = _emission_systems
|
_distribution_system.emission_systems = _emission_systems
|
||||||
_distribution_systems.append(_distribution_system)
|
_distribution_systems.append(_distribution_system)
|
||||||
return _distribution_systems
|
return _distribution_systems
|
||||||
|
|
||||||
|
@ -87,7 +87,7 @@ class PalmaEnergySystemParameters:
|
|||||||
archetype_generation_systems = archetype_system.generation_systems
|
archetype_generation_systems = archetype_system.generation_systems
|
||||||
if archetype_generation_systems is not None:
|
if archetype_generation_systems is not None:
|
||||||
for archetype_generation_system in archetype_system.generation_systems:
|
for archetype_generation_system in archetype_system.generation_systems:
|
||||||
if archetype_generation_system.system_type == 'Photovoltaic':
|
if archetype_generation_system.system_type == 'photovoltaic':
|
||||||
_generation_system = PvGenerationSystem()
|
_generation_system = PvGenerationSystem()
|
||||||
_generation_system.name = archetype_generation_system.name
|
_generation_system.name = archetype_generation_system.name
|
||||||
_generation_system.model_name = archetype_generation_system.model_name
|
_generation_system.model_name = archetype_generation_system.model_name
|
||||||
|
@ -39,11 +39,11 @@ class TestSystemsCatalog(TestCase):
|
|||||||
|
|
||||||
catalog_categories = catalog.names()
|
catalog_categories = catalog.names()
|
||||||
archetypes = catalog.names()
|
archetypes = catalog.names()
|
||||||
self.assertEqual(15, len(archetypes['archetypes']))
|
self.assertEqual(34, len(archetypes['archetypes']))
|
||||||
systems = catalog.names('systems')
|
systems = catalog.names('systems')
|
||||||
self.assertEqual(12, len(systems['systems']))
|
self.assertEqual(39, len(systems['systems']))
|
||||||
generation_equipments = catalog.names('generation_equipments')
|
generation_equipments = catalog.names('generation_equipments')
|
||||||
self.assertEqual(27, len(generation_equipments['generation_equipments']))
|
self.assertEqual(49, len(generation_equipments['generation_equipments']))
|
||||||
with self.assertRaises(ValueError):
|
with self.assertRaises(ValueError):
|
||||||
catalog.names('unknown')
|
catalog.names('unknown')
|
||||||
|
|
||||||
@ -55,6 +55,7 @@ class TestSystemsCatalog(TestCase):
|
|||||||
with self.assertRaises(IndexError):
|
with self.assertRaises(IndexError):
|
||||||
catalog.get_entry('unknown')
|
catalog.get_entry('unknown')
|
||||||
|
|
||||||
|
|
||||||
def test_palma_catalog(self):
|
def test_palma_catalog(self):
|
||||||
catalog = EnergySystemsCatalogFactory('palma').catalog
|
catalog = EnergySystemsCatalogFactory('palma').catalog
|
||||||
catalog_categories = catalog.names()
|
catalog_categories = catalog.names()
|
||||||
|
@ -114,7 +114,8 @@ class TestSystemsFactory(TestCase):
|
|||||||
ResultFactory('insel_monthly_energy_balance', self._city, self._output_path).enrich()
|
ResultFactory('insel_monthly_energy_balance', self._city, self._output_path).enrich()
|
||||||
|
|
||||||
for building in self._city.buildings:
|
for building in self._city.buildings:
|
||||||
building.energy_systems_archetype_name = 'PV+ASHP+GasBoiler+TES'
|
building.energy_systems_archetype_name = ('Central Hydronic Air and Gas Source Heating System with Unitary Split '
|
||||||
|
'Cooling and Air Source HP DHW and Grid Tied PV')
|
||||||
EnergySystemsFactory('montreal_future', self._city).enrich()
|
EnergySystemsFactory('montreal_future', self._city).enrich()
|
||||||
# Need to assign energy systems to buildings:
|
# Need to assign energy systems to buildings:
|
||||||
for building in self._city.buildings:
|
for building in self._city.buildings:
|
||||||
@ -131,7 +132,8 @@ class TestSystemsFactory(TestCase):
|
|||||||
self.assertLess(0, building.heating_consumption[cte.YEAR][0])
|
self.assertLess(0, building.heating_consumption[cte.YEAR][0])
|
||||||
self.assertLess(0, building.cooling_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.domestic_hot_water_consumption[cte.YEAR][0])
|
||||||
self.assertLess(0, building.onsite_electrical_production[cte.YEAR][0])
|
if 'PV' in building.energy_systems_archetype_name:
|
||||||
|
self.assertLess(0, building.onsite_electrical_production[cte.YEAR][0])
|
||||||
|
|
||||||
def test_palma_system_results(self):
|
def test_palma_system_results(self):
|
||||||
"""
|
"""
|
||||||
|
Loading…
Reference in New Issue
Block a user