Compare commits

..

2 Commits

19 changed files with 1200 additions and 477 deletions

View File

@ -6,12 +6,15 @@ Project Coder Pilar Monsalvete Alvarez de Uribarri pilar.monsalvete@concordia.ca
Code contributors: Saeed Ranjbar saeed.ranjbar@concordia.ca Code contributors: Saeed Ranjbar saeed.ranjbar@concordia.ca
""" """
from typing import Union, List from typing import Union, List, TypeVar
from hub.catalog_factories.data_models.energy_systems.generation_system import GenerationSystem #from hub.catalog_factories.data_models.energy_systems.generation_system import GenerationSystem
from hub.catalog_factories.data_models.energy_systems.energy_storage_system import EnergyStorageSystem from hub.catalog_factories.data_models.energy_systems.energy_storage_system import EnergyStorageSystem
from hub.catalog_factories.data_models.energy_systems.emission_system import EmissionSystem from hub.catalog_factories.data_models.energy_systems.emission_system import EmissionSystem
GenerationSystem = TypeVar('GenerationSystem')
class DistributionSystem: class DistributionSystem:
""" """
Distribution system class Distribution system class

View File

@ -42,7 +42,7 @@ class EnergyStorageSystem(ABC):
def model_name(self): def model_name(self):
""" """
Get system model Get system model
:return: float :return: string
""" """
return self._model_name return self._model_name

View File

@ -6,12 +6,12 @@ Project Coder Pilar Monsalvete Alvarez de Uribarri pilar.monsalvete@concordia.ca
Code contributors: Saeed Ranjbar saeed.ranjbar@concordia.ca Code contributors: Saeed Ranjbar saeed.ranjbar@concordia.ca
""" """
from __future__ import annotations
from abc import ABC from abc import ABC
from typing import List, Union, TypeVar from typing import List, Union
from hub.catalog_factories.data_models.energy_systems.energy_storage_system import EnergyStorageSystem from hub.catalog_factories.data_models.energy_systems.energy_storage_system import EnergyStorageSystem
from hub.catalog_factories.data_models.energy_systems.distribution_system import DistributionSystem
DistributionSystem = TypeVar('DistributionSystem')
class GenerationSystem(ABC): class GenerationSystem(ABC):

View File

@ -17,7 +17,7 @@ class NonPvGenerationSystem(GenerationSystem):
""" """
def __init__(self, system_id, system_type, model_name=None, manufacturer=None, fuel_type=None, def __init__(self, system_id, system_type, model_name=None, manufacturer=None, fuel_type=None,
nominal_thermal_output=None, maximum_heat_output=None, minimum_heat_output=None, source_medium=None, nominal_heat_output=None, maximum_heat_output=None, minimum_heat_output=None, source_medium=None,
supply_medium=None, heat_efficiency=None, nominal_cooling_output=None, maximum_cooling_output=None, supply_medium=None, heat_efficiency=None, nominal_cooling_output=None, maximum_cooling_output=None,
minimum_cooling_output=None, cooling_efficiency=None, electricity_efficiency=None, minimum_cooling_output=None, cooling_efficiency=None, electricity_efficiency=None,
source_temperature=None, source_mass_flow=None, nominal_electricity_output=None, source_temperature=None, source_mass_flow=None, nominal_electricity_output=None,
@ -29,7 +29,7 @@ class NonPvGenerationSystem(GenerationSystem):
super().__init__(system_id=system_id, model_name=model_name, manufacturer=manufacturer, fuel_type=fuel_type, super().__init__(system_id=system_id, model_name=model_name, manufacturer=manufacturer, fuel_type=fuel_type,
distribution_systems=distribution_systems, energy_storage_systems=energy_storage_systems) distribution_systems=distribution_systems, energy_storage_systems=energy_storage_systems)
self._system_type = system_type self._system_type = system_type
self._nominal_thermal_output = nominal_thermal_output self._nominal_heat_output = nominal_heat_output
self._maximum_heat_output = maximum_heat_output self._maximum_heat_output = maximum_heat_output
self._minimum_heat_output = minimum_heat_output self._minimum_heat_output = minimum_heat_output
self._heat_efficiency = heat_efficiency self._heat_efficiency = heat_efficiency
@ -63,12 +63,12 @@ class NonPvGenerationSystem(GenerationSystem):
return self._system_type return self._system_type
@property @property
def nominal_thermal_output(self): def nominal_heat_output(self):
""" """
Get nominal_thermal_output of heat generation devices in kW Get nominal heat output of heat generation devices in W
:return: float :return: float
""" """
return self._nominal_thermal_output return self._nominal_heat_output
@property @property
def maximum_heat_output(self): def maximum_heat_output(self):
@ -90,7 +90,7 @@ class NonPvGenerationSystem(GenerationSystem):
def source_medium(self): def source_medium(self):
""" """
Get source_type from [air, water, ground, district_heating, grid, on_site_electricity] Get source_type from [air, water, ground, district_heating, grid, on_site_electricity]
:return: [string] :return: string
""" """
return self._source_medium return self._source_medium
@ -113,7 +113,7 @@ class NonPvGenerationSystem(GenerationSystem):
@property @property
def nominal_cooling_output(self): def nominal_cooling_output(self):
""" """
Get nominal_thermal_output of heat generation devices in kW Get nominal cooling output of heat generation devices in W
:return: float :return: float
""" """
return self._nominal_cooling_output return self._nominal_cooling_output
@ -169,7 +169,7 @@ class NonPvGenerationSystem(GenerationSystem):
@property @property
def nominal_electricity_output(self): def nominal_electricity_output(self):
""" """
Get nominal_power_output of electricity generation devices or inverters in kW Get nominal_power_output of electricity generation devices or inverters in W
:return: float :return: float
""" """
return self._nominal_electricity_output return self._nominal_electricity_output
@ -269,7 +269,7 @@ class NonPvGenerationSystem(GenerationSystem):
'manufacturer': self.manufacturer, 'manufacturer': self.manufacturer,
'type': self.system_type, 'type': self.system_type,
'fuel type': self.fuel_type, 'fuel type': self.fuel_type,
'nominal thermal output [W]': self.nominal_thermal_output, 'nominal heat output [W]': self.nominal_heat_output,
'maximum heat output [W]': self.maximum_heat_output, 'maximum heat output [W]': self.maximum_heat_output,
'minimum heat output [W]': self.minimum_heat_output, 'minimum heat output [W]': self.minimum_heat_output,
'source medium': self.source_medium, 'source medium': self.source_medium,

View File

@ -45,7 +45,7 @@ class PvGenerationSystem(GenerationSystem):
@property @property
def nominal_electricity_output(self): def nominal_electricity_output(self):
""" """
Get nominal_power_output of electricity generation devices or inverters in kW Get nominal_power_output of electricity generation devices or inverters in W
:return: float :return: float
""" """
return self._nominal_electricity_output return self._nominal_electricity_output
@ -93,7 +93,7 @@ class PvGenerationSystem(GenerationSystem):
@property @property
def standard_test_condition_maximum_power(self): def standard_test_condition_maximum_power(self):
""" """
Get standard test condition maximum power of PV panels in kW Get standard test condition maximum power of PV panels in W
:return: float :return: float
""" """
return self._standard_test_condition_maximum_power return self._standard_test_condition_maximum_power
@ -137,12 +137,12 @@ class PvGenerationSystem(GenerationSystem):
'type': self.system_type, 'type': self.system_type,
'fuel type': self.fuel_type, 'fuel type': self.fuel_type,
'electricity efficiency': self.electricity_efficiency, 'electricity efficiency': self.electricity_efficiency,
'nominal power output [kW]': self.nominal_electricity_output, 'nominal power output [W]': self.nominal_electricity_output,
'nominal ambient temperature [Celsius]': self.nominal_ambient_temperature, 'nominal ambient temperature [Celsius]': self.nominal_ambient_temperature,
'nominal cell temperature [Celsius]': self.nominal_cell_temperature, 'nominal cell temperature [Celsius]': self.nominal_cell_temperature,
'nominal radiation [W/m2]': self.nominal_radiation, 'nominal radiation [W/m2]': self.nominal_radiation,
'standard test condition cell temperature [Celsius]': self.standard_test_condition_cell_temperature, 'standard test condition cell temperature [Celsius]': self.standard_test_condition_cell_temperature,
'standard test condition maximum power [kW]': self.standard_test_condition_maximum_power, 'standard test condition maximum power [W]': self.standard_test_condition_maximum_power,
'cell temperature coefficient': self.cell_temperature_coefficient, 'cell temperature coefficient': self.cell_temperature_coefficient,
'width': self.width, 'width': self.width,
'height': self.height, 'height': self.height,

View File

@ -28,8 +28,8 @@ class System:
self._system_id = system_id self._system_id = system_id
self._name = name self._name = name
self._demand_types = demand_types self._demand_types = demand_types
self._distribution_systems = distribution_systems
self._generation_systems = generation_systems self._generation_systems = generation_systems
self._distribution_systems = distribution_systems
self._configuration_schema = configuration_schema self._configuration_schema = configuration_schema
@property @property

View File

@ -31,8 +31,8 @@ class MontrealCustomCatalog(Catalog):
'demand', 'system_id')) 'demand', 'system_id'))
self._catalog_generation_equipments = self._load_generation_equipments() self._catalog_generation_equipments = self._load_generation_equipments()
self._catalog_distribution_equipments = self._load_distribution_equipments()
self._catalog_emission_equipments = self._load_emission_equipments() self._catalog_emission_equipments = self._load_emission_equipments()
self._catalog_distribution_equipments = self._load_distribution_equipments()
self._catalog_systems = self._load_systems() self._catalog_systems = self._load_systems()
self._catalog_archetypes = self._load_archetypes() self._catalog_archetypes = self._load_archetypes()
# store the full catalog data model in self._content # store the full catalog data model in self._content
@ -59,10 +59,20 @@ class MontrealCustomCatalog(Catalog):
electricity_efficiency = None electricity_efficiency = None
if 'electrical_efficiency' in equipment: if 'electrical_efficiency' in equipment:
electricity_efficiency = float(equipment['electrical_efficiency']) electricity_efficiency = float(equipment['electrical_efficiency'])
storage_systems = None
storage = literal_eval(equipment['storage'].capitalize())
if storage:
if equipment_type == 'electricity generator':
storage_system = ElectricalStorageSystem(equipment_id)
else:
storage_system = ThermalStorageSystem(equipment_id)
storage_systems = [storage_system]
if model_name == 'PV system': if model_name == 'PV system':
generation_system = PvGenerationSystem(equipment_id, generation_system = PvGenerationSystem(equipment_id,
model_name=model_name, model_name=model_name,
electricity_efficiency=electricity_efficiency, electricity_efficiency=electricity_efficiency,
energy_storage_systems=storage_systems
) )
else: else:
generation_system = NonPvGenerationSystem(equipment_id, generation_system = NonPvGenerationSystem(equipment_id,
@ -72,14 +82,8 @@ class MontrealCustomCatalog(Catalog):
heat_efficiency=heating_efficiency, heat_efficiency=heating_efficiency,
cooling_efficiency=cooling_efficiency, cooling_efficiency=cooling_efficiency,
electricity_efficiency=electricity_efficiency, electricity_efficiency=electricity_efficiency,
) energy_storage_systems=storage_systems
storage = literal_eval(equipment['storage'].capitalize()) )
if storage:
if equipment_type == 'electricity generator':
storage_system = ElectricalStorageSystem(equipment_id)
else:
storage_system = ThermalStorageSystem(equipment_id)
generation_system.energy_storage_systems = [storage_system]
_equipments.append(generation_system) _equipments.append(generation_system)
return _equipments return _equipments
@ -102,12 +106,19 @@ class MontrealCustomCatalog(Catalog):
distribution_consumption_variable_flow = float( distribution_consumption_variable_flow = float(
equipment['distribution_consumption_variable_flow']['#text']) / 100 equipment['distribution_consumption_variable_flow']['#text']) / 100
emission_equipment = equipment['dissipation_id']
_emission_equipments = None
for equipment_archetype in self._catalog_emission_equipments:
if int(equipment_archetype.id) == int(emission_equipment):
_emission_equipments = [equipment_archetype]
distribution_system = DistributionSystem(equipment_id, distribution_system = DistributionSystem(equipment_id,
model_name=model_name, model_name=model_name,
system_type=equipment_type, system_type=equipment_type,
distribution_consumption_fix_flow=distribution_consumption_fix_flow, distribution_consumption_fix_flow=distribution_consumption_fix_flow,
distribution_consumption_variable_flow=distribution_consumption_variable_flow, distribution_consumption_variable_flow=distribution_consumption_variable_flow,
heat_losses=distribution_heat_losses) heat_losses=distribution_heat_losses,
emission_systems=_emission_equipments)
_equipments.append(distribution_system) _equipments.append(distribution_system)
return _equipments return _equipments
@ -148,18 +159,6 @@ class MontrealCustomCatalog(Catalog):
for equipment_archetype in self._catalog_distribution_equipments: for equipment_archetype in self._catalog_distribution_equipments:
if int(equipment_archetype.id) == int(distribution_equipment): if int(equipment_archetype.id) == int(distribution_equipment):
_distribution_equipments = [equipment_archetype] _distribution_equipments = [equipment_archetype]
emission_equipment = system['equipments']['dissipation_id']
_emission_equipments = None
for equipment_archetype in self._catalog_emission_equipments:
if int(equipment_archetype.id) == int(emission_equipment):
_emission_equipments = [equipment_archetype]
_catalog_systems.append(System(system_id, _catalog_systems.append(System(system_id,
demands, demands,

View File

@ -57,7 +57,7 @@ class NorthAmericaEnergySystemCatalog(Catalog):
model_name=boiler_model_name, model_name=boiler_model_name,
manufacturer=boiler_manufacturer, manufacturer=boiler_manufacturer,
fuel_type=boiler_fuel_type, fuel_type=boiler_fuel_type,
nominal_thermal_output=boiler_nominal_thermal_output, nominal_heat_output=boiler_nominal_thermal_output,
maximum_heat_output=boiler_maximum_heat_output, maximum_heat_output=boiler_maximum_heat_output,
minimum_heat_output=boiler_minimum_heat_output, minimum_heat_output=boiler_minimum_heat_output,
heat_efficiency=boiler_heat_efficiency) heat_efficiency=boiler_heat_efficiency)
@ -89,7 +89,7 @@ class NorthAmericaEnergySystemCatalog(Catalog):
model_name=heat_pump_model_name, model_name=heat_pump_model_name,
manufacturer=heat_pump_manufacturer, manufacturer=heat_pump_manufacturer,
fuel_type=heat_pump_fuel_type, fuel_type=heat_pump_fuel_type,
nominal_thermal_output=heat_pump_nominal_thermal_output, nominal_heat_output=heat_pump_nominal_thermal_output,
maximum_heat_output=heat_pump_maximum_heat_output, maximum_heat_output=heat_pump_maximum_heat_output,
minimum_heat_output=heat_pump_minimum_heat_output, minimum_heat_output=heat_pump_minimum_heat_output,
source_medium=heat_pump_source_medium, source_medium=heat_pump_source_medium,

View File

@ -5,17 +5,43 @@ 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
""" """
from typing import Union, List
from hub.city_model_structure.energy_systems.generic_generation_system import GenericGenerationSystem
from hub.city_model_structure.energy_systems.generic_emission_system import GenericEmissionSystem
from hub.city_model_structure.energy_systems.generic_storage_system import GenericStorageSystem
class GenericDistributionSystem: class GenericDistributionSystem:
""" """
GenericDistributionSystem class GenericDistributionSystem class
""" """
def __init__(self): def __init__(self):
self._model_name = None
self._type = None self._type = None
self._supply_temperature = None self._supply_temperature = None
self._distribution_consumption_fix_flow = None self._distribution_consumption_fix_flow = None
self._distribution_consumption_variable_flow = None self._distribution_consumption_variable_flow = None
self._heat_losses = None self._heat_losses = None
self._generic_generation_systems = None
self._generic_storage_systems = None
self._generic_emission_systems = None
@property
def model_name(self):
"""
Get model name
:return: string
"""
return self._model_name
@model_name.setter
def model_name(self, value):
"""
Set model name
:param value: string
"""
self._model_name = value
@property @property
def type(self): def type(self):
@ -98,3 +124,51 @@ class GenericDistributionSystem:
:param value: float :param value: float
""" """
self._heat_losses = value self._heat_losses = value
@property
def generic_generation_systems(self) -> Union[None, List[GenericGenerationSystem]]:
"""
Get generation systems connected to the distribution system
:return: [generic_generation_systems]
"""
return self._generic_generation_systems
@generic_generation_systems.setter
def generic_generation_systems(self, value):
"""
Set generation systems connected to the distribution system
:param value: [generic_generation_systems]
"""
self._generic_generation_systems = value
@property
def generic_storage_systems(self) -> Union[None, List[GenericStorageSystem]]:
"""
Get energy storage systems connected to this distribution system
:return: [GenericStorageSystem]
"""
return self._generic_storage_systems
@generic_storage_systems.setter
def generic_storage_systems(self, value):
"""
Set energy storage systems connected to this distribution system
:param value: [GenericStorageSystem]
"""
self._generic_storage_systems = value
@property
def generic_emission_systems(self) -> Union[None, List[GenericEmissionSystem]]:
"""
Get energy emission systems connected to this distribution system
:return: [GenericEmissionSystem]
"""
return self._generic_emission_systems
@generic_emission_systems.setter
def generic_emission_systems(self, value):
"""
Set energy emission systems connected to this distribution system
:param value: [GenericEmissionSystem]
"""
self._generic_emission_systems = value

View File

@ -0,0 +1,104 @@
"""
Generic electrical storage system
SPDX - License - Identifier: LGPL - 3.0 - or -later
Copyright © 2023 Concordia CERC group
Project Coder Pilar Monsalvete Alvarez de Uribarri pilar.monsalvete@concordia.ca
Code contributors: Saeed Ranjbar saeed.ranjbar@concordia.ca
"""
from hub.city_model_structure.energy_systems.generic_storage_system import GenericStorageSystem
class GenericElectricalStorageSystem(GenericStorageSystem):
""""
Generic Electrical Storage System Class
"""
def __init__(self):
super().__init__()
self._rated_output_power = None
self._nominal_efficiency = None
self._battery_voltage = None
self._depth_of_discharge = None
self._self_discharge_rate = None
@property
def rated_output_power(self):
"""
Get the rated output power of storage system in Watts
:return: float
"""
return self._rated_output_power
@rated_output_power.setter
def rated_output_power(self, value):
"""
Set the rated output power of storage system in Watts
:param value: float
"""
self._rated_output_power = value
@property
def nominal_efficiency(self):
"""
Get the nominal efficiency of the storage system
:return: float
"""
return self._nominal_efficiency
@nominal_efficiency.setter
def nominal_efficiency(self, value):
"""
Set the nominal efficiency of the storage system
:param value: float
"""
self._nominal_efficiency = value
@property
def battery_voltage(self):
"""
Get the battery voltage in Volts
:return: float
"""
return self._battery_voltage
@battery_voltage.setter
def battery_voltage(self, value):
"""
Set the battery voltage in Volts
:param value: float
"""
self._battery_voltage = value
@property
def depth_of_discharge(self):
"""
Get the depth of discharge as a percentage
:return: float
"""
return self._depth_of_discharge
@depth_of_discharge.setter
def depth_of_discharge(self, value):
"""
Set the depth of discharge as a percentage
:param value: float
"""
self._depth_of_discharge = value
@property
def self_discharge_rate(self):
"""
Get the self discharge rate of battery as a percentage
:return: float
"""
return self._self_discharge_rate
@self_discharge_rate.setter
def self_discharge_rate(self, value):
"""
Set the self discharge rate of battery as a percentage
:param value: float
"""
self._self_discharge_rate = value

View File

@ -11,8 +11,42 @@ class GenericEmissionSystem:
GenericEmissionSystem class GenericEmissionSystem class
""" """
def __init__(self): def __init__(self):
self._model_name = None
self._type = None
self._parasitic_energy_consumption = None self._parasitic_energy_consumption = None
@property
def model_name(self):
"""
Get model name
:return: string
"""
return self._model_name
@model_name.setter
def model_name(self, value):
"""
Set model name
:param value: string
"""
self._model_name = value
@property
def type(self):
"""
Get type
:return: string
"""
return self._type
@type.setter
def type(self, value):
"""
Set type
:param value: string
"""
self._type = value
@property @property
def parasitic_energy_consumption(self): def parasitic_energy_consumption(self):
""" """

View File

@ -6,41 +6,22 @@ Project Coder Pilar Monsalvete Alvarez de Uribarri pilar.monsalvete@concordia.ca
""" """
from typing import Union, List from typing import Union, List
from pathlib import Path
from hub.city_model_structure.energy_systems.generic_distribution_system import GenericDistributionSystem from hub.city_model_structure.energy_systems.generic_distribution_system import GenericDistributionSystem
from hub.city_model_structure.energy_systems.generic_emission_system import GenericEmissionSystem
from hub.city_model_structure.energy_systems.generic_generation_system import GenericGenerationSystem from hub.city_model_structure.energy_systems.generic_generation_system import GenericGenerationSystem
from hub.city_model_structure.energy_systems.generic_storage_system import GenericStorageSystem
class GenericEnergySystem: class GenericEnergySystem:
""" """
GenericEnergySystem class GenericEnergySystem class
""" """
def __init__(self): def __init__(self):
self._name = None
self._demand_types = None self._demand_types = None
self._generation_system = None self._name = None
self._distribution_system = None self._generation_systems = None
self._emission_system = None self._distribution_systems = None
self._connected_city_objects = None self._configuration_schema = None
self._energy_storage_system = None
@property
def name(self):
"""
Get energy system name
:return: str
"""
return self._name
@name.setter
def name(self, value):
"""
Set energy system name
:param value:
"""
self._name = value
@property @property
def demand_types(self): def demand_types(self):
@ -58,66 +39,66 @@ class GenericEnergySystem:
""" """
self._demand_types = value self._demand_types = value
@property
def name(self):
"""
Get energy system name
:return: str
"""
return self._name
@name.setter
def name(self, value):
"""
Set energy system name
:param value:
"""
self._name = value
@property @property
def generation_systems(self) -> List[GenericGenerationSystem]: def generation_systems(self) -> List[GenericGenerationSystem]:
""" """
Get generation system Get generation systems
:return: GenerationSystem :return: [GenerationSystem]
""" """
return self._generation_system return self._generation_systems
@generation_systems.setter @generation_systems.setter
def generation_systems(self, value): def generation_systems(self, value):
""" """
Set generation system Set generation systems
:return: GenerationSystem :return: [GenerationSystem]
""" """
self._generation_system = value self._generation_systems = value
@property @property
def distribution_systems(self) -> Union[None, List[GenericDistributionSystem]]: def distribution_systems(self) -> Union[None, List[GenericDistributionSystem]]:
""" """
Get distribution system Get distribution systems
:return: DistributionSystem :return: [DistributionSystem]
""" """
return self._distribution_system return self._distribution_systems
@distribution_systems.setter @distribution_systems.setter
def distribution_systems(self, value): def distribution_systems(self, value):
""" """
Set distribution system Set distribution systems
:param value: DistributionSystem :param value: [DistributionSystem]
""" """
self._distribution_system = value self._distribution_systems = value
@property @property
def emission_systems(self) -> Union[None, List[GenericEmissionSystem]]: def configuration_schema(self) -> Path:
""" """
Get emission system Get the schema of the system configuration
:return: EmissionSystem :return: Path
""" """
return self._emission_system return self._configuration_schema
@emission_systems.setter @configuration_schema.setter
def emission_systems(self, value): def configuration_schema(self, value):
""" """
Set emission system Set the schema of the system configuration
:param value: EmissionSystem :param value: Path
""" """
self._emission_system = value self._configuration_schema = value
@property
def energy_storage_systems(self) -> Union[None, List[GenericStorageSystem]]:
"""
Get storage system
:return: EnergyStorageSystem
"""
return self._energy_storage_system
@energy_storage_systems.setter
def energy_storage_systems(self, value):
"""
Set storage system
:return: EnergyStorageSystem
"""
self._energy_storage_system = value

View File

@ -1,58 +1,78 @@
""" """
Energy System catalog heat generation system Generic energy generation system (abstract class)
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 Saeed Ranjbar saeed.ranjbar@concordia.ca Project Coder Pilar Monsalvete Alvarez de Uribarri pilar.monsalvete@concordia.ca
Code contributors: Pilar Monsalvete Alvarez de Uribarri pilar.monsalvete@concordia.ca Code contributors: Saeed Ranjbar saeed.ranjbar@concordia.ca
""" """
from __future__ import annotations from __future__ import annotations
from typing import Union from abc import ABC
from hub.city_model_structure.energy_systems.performance_curve import PerformanceCurves from typing import Union, List
from hub.city_model_structure.energy_systems.generic_distribution_system import GenericDistributionSystem
from hub.city_model_structure.energy_systems.generic_storage_system import GenericStorageSystem
class GenericGenerationSystem: class GenericGenerationSystem(ABC):
""" """
GenericGenerationSystem class GenericGenerationSystem class
""" """
def __init__(self): def __init__(self):
self._type = None self._system_type = None
self._model_name = None
self._manufacturer = None
self._fuel_type = None self._fuel_type = None
self._source_types = None self._generic_distribution_systems = None
self._heat_efficiency = None self._generic_storage_systems = None
self._cooling_efficiency = None
self._electricity_efficiency = None
self._source_temperature = None
self._source_mass_flow = None
self._storage = None
self._auxiliary_equipment = None
self._supply_medium = None
self._maximum_heat_supply_temperature = None
self._minimum_heat_supply_temperature = None
self._maximum_cooling_supply_temperature = None
self._minimum_cooling_supply_temperature = None
self._heat_output_curve = None
self._heat_fuel_consumption_curve = None
self._heat_efficiency_curve = None
self._cooling_output_curve = None
self._cooling_fuel_consumption_curve = None
self._cooling_efficiency_curve = None
@property @property
def type(self): def system_type(self):
""" """
Get system type Get type
:return: string :return: string
""" """
return self._type return self._system_type
@type.setter @system_type.setter
def type(self, value): def system_type(self, value):
""" """
Set system type Set type
:param value: string :param value: string
""" """
self._type = value self._system_type = value
@property
def model_name(self):
"""
Get model name
:return: string
"""
return self._model_name
@model_name.setter
def model_name(self, value):
"""
Set model name
:param value: string
"""
self._model_name = value
@property
def manufacturer(self):
"""
Get manufacturer's name
:return: string
"""
return self._manufacturer
@manufacturer.setter
def manufacturer(self, value):
"""
Set manufacturer's name
:param value: string
"""
self._manufacturer = value
@property @property
def fuel_type(self): def fuel_type(self):
@ -71,305 +91,33 @@ class GenericGenerationSystem:
self._fuel_type = value self._fuel_type = value
@property @property
def source_types(self): def generic_distribution_systems(self) -> Union[None, List[GenericDistributionSystem]]:
""" """
Get source_type from [Air, Water, Geothermal, District Heating, Grid, Onsite Electricity] Get distributions systems connected to this generation system
:return: [string] :return: [GenericDistributionSystem]
""" """
return self._source_types return self._generic_distribution_systems
@source_types.setter @generic_distribution_systems.setter
def source_types(self, value): def generic_distribution_systems(self, value):
""" """
Set source_type from [Air, Water, Geothermal, District Heating, Grid, Onsite Electricity] Set distributions systems connected to this generation system
:param value: [string] :param value: [GenericDistributionSystem]
""" """
self._source_types = value self._generic_distribution_systems = value
@property @property
def heat_efficiency(self): def generic_storage_systems(self) -> Union[None, List[GenericStorageSystem]]:
""" """
Get heat_efficiency Get energy storage systems connected to this generation system
:return: float :return: [GenericStorageSystem]
""" """
return self._heat_efficiency return self._generic_storage_systems
@heat_efficiency.setter @generic_storage_systems.setter
def heat_efficiency(self, value): def generic_storage_systems(self, value):
""" """
Set heat_efficiency Set energy storage systems connected to this generation system
:param value: float :param value: [GenericStorageSystem]
""" """
self._heat_efficiency = value self._generic_storage_systems = value
@property
def cooling_efficiency(self):
"""
Get cooling_efficiency
:return: float
"""
return self._cooling_efficiency
@cooling_efficiency.setter
def cooling_efficiency(self, value):
"""
Set cooling_efficiency
:param value: float
"""
self._cooling_efficiency = value
@property
def electricity_efficiency(self):
"""
Get electricity_efficiency
:return: float
"""
return self._electricity_efficiency
@electricity_efficiency.setter
def electricity_efficiency(self, value):
"""
Set electricity_efficiency
:param value: float
"""
self._electricity_efficiency = value
@property
def source_temperature(self):
"""
Get source_temperature in degree Celsius
:return: float
"""
return self._source_temperature
@source_temperature.setter
def source_temperature(self, value):
"""
Set source_temperature in degree Celsius
:param value: float
"""
self._source_temperature = value
@property
def source_mass_flow(self):
"""
Get source_mass_flow in kg/s
:return: float
"""
return self._source_mass_flow
@source_mass_flow.setter
def source_mass_flow(self, value):
"""
Set source_mass_flow in kg/s
:param value: float
"""
self._source_mass_flow = value
@property
def storage(self):
"""
Get boolean storage exists
:return: bool
"""
return self._storage
@storage.setter
def storage(self, value):
"""
Set boolean storage exists
:return: bool
"""
self._storage = value
@property
def auxiliary_equipment(self) -> Union[None, GenericGenerationSystem]:
"""
Get auxiliary_equipment
:return: GenerationSystem
"""
return self._auxiliary_equipment
@auxiliary_equipment.setter
def auxiliary_equipment(self, value):
"""
Set auxiliary_equipment
:return: GenerationSystem
"""
self._auxiliary_equipment = value
@property
def supply_medium(self):
"""
Get the supply medium from ['air', 'water']
:return: string
"""
return self._supply_medium
@supply_medium.setter
def supply_medium(self, value):
"""
Set the supply medium from ['air', 'water']
:param value: string
"""
self._supply_medium = value
@property
def maximum_heat_supply_temperature(self):
"""
Get maximum heating supply temperature in degree Celsius
:return: float
"""
return self._maximum_heat_supply_temperature
@maximum_heat_supply_temperature.setter
def maximum_heat_supply_temperature(self, value):
"""
Set maximum heating supply temperature in degree Celsius
:param value: float
"""
self._maximum_heat_supply_temperature = value
@property
def minimum_heat_supply_temperature(self):
"""
Get minimum heating supply temperature in degree Celsius
:return: float
"""
return self._minimum_heat_supply_temperature
@minimum_heat_supply_temperature.setter
def minimum_heat_supply_temperature(self, value):
"""
Set minimum heating supply temperature in degree Celsius
:param value: float
"""
self._minimum_heat_supply_temperature = value
@property
def maximum_cooling_supply_temperature(self):
"""
Get maximum cooling supply temperature in degree Celsius
:return: float
"""
return self._maximum_cooling_supply_temperature
@maximum_cooling_supply_temperature.setter
def maximum_cooling_supply_temperature(self, value):
"""
Set maximum cooling supply temperature in degree Celsius
:param value: float
"""
self._maximum_cooling_supply_temperature = value
@property
def minimum_cooling_supply_temperature(self):
"""
Get minimum cooling supply temperature in degree Celsius
:return: float
"""
return self._minimum_cooling_supply_temperature
@minimum_cooling_supply_temperature.setter
def minimum_cooling_supply_temperature(self, value):
"""
Set minimum cooling supply temperature in degree Celsius
:param value: float
"""
self._minimum_cooling_supply_temperature = value
@property
def heat_output_curve(self) -> Union[None, PerformanceCurves]:
"""
Get the heat output curve of the heat generation device
:return: PerformanceCurve
"""
return self._heat_output_curve
@heat_output_curve.setter
def heat_output_curve(self, value):
"""
Set the heat output curve of the heat generation device
:return: PerformanceCurve
"""
self._heat_output_curve = value
@property
def heat_fuel_consumption_curve(self) -> Union[None, PerformanceCurves]:
"""
Get the heating fuel consumption curve of the heat generation device
:return: PerformanceCurve
"""
return self._heat_fuel_consumption_curve
@heat_fuel_consumption_curve.setter
def heat_fuel_consumption_curve(self, value):
"""
Set the heating fuel consumption curve of the heat generation device
:return: PerformanceCurve
"""
self._heat_fuel_consumption_curve = value
@property
def heat_efficiency_curve(self) -> Union[None, PerformanceCurves]:
"""
Get the heating efficiency curve of the heat generation device
:return: PerformanceCurve
"""
return self._heat_efficiency_curve
@heat_efficiency_curve.setter
def heat_efficiency_curve(self, value):
"""
Set the heating efficiency curve of the heat generation device
:return: PerformanceCurve
"""
self._heat_efficiency_curve = value
@property
def cooling_output_curve(self) -> Union[None, PerformanceCurves]:
"""
Get the cooling output curve of the heat generation device
:return: PerformanceCurve
"""
return self._cooling_output_curve
@cooling_output_curve.setter
def cooling_output_curve(self, value):
"""
Set the cooling output curve of the heat generation device
:return: PerformanceCurve
"""
self._cooling_output_curve = value
@property
def cooling_fuel_consumption_curve(self) -> Union[None, PerformanceCurves]:
"""
Get the heating fuel consumption curve of the heat generation device
:return: PerformanceCurve
"""
return self._cooling_fuel_consumption_curve
@cooling_fuel_consumption_curve.setter
def cooling_fuel_consumption_curve(self, value):
"""
Set the heating fuel consumption curve of the heat generation device
:return: PerformanceCurve
"""
self._cooling_fuel_consumption_curve = value
@property
def cooling_efficiency_curve(self) -> Union[None, PerformanceCurves]:
"""
Get the heating efficiency curve of the heat generation device
:return: PerformanceCurve
"""
return self._cooling_efficiency_curve
@cooling_efficiency_curve.setter
def cooling_efficiency_curve(self, value):
"""
Set the heating efficiency curve of the heat generation device
:return: PerformanceCurve
"""
self._cooling_efficiency_curve = value

View File

@ -0,0 +1,428 @@
"""
Generic non PV energy generation system
SPDX - License - Identifier: LGPL - 3.0 - or -later
Copyright © 2023 Concordia CERC group
Project Coder Pilar Monsalvete Alvarez de Uribarri pilar.monsalvete@concordia.ca
Code contributors: Saeed Ranjbar saeed.ranjbar@concordia.ca
"""
from typing import Union
from hub.city_model_structure.energy_systems.generic_generation_system import GenericGenerationSystem
from hub.city_model_structure.energy_systems.performance_curve import PerformanceCurves
class GenericNonPvGenerationSystem(GenericGenerationSystem):
"""
GenericNonPvGenerationSystem class
"""
def __init__(self):
super().__init__()
self._nominal_heat_output = None
self._maximum_heat_output = None
self._minimum_heat_output = None
self._heat_efficiency = None
self._nominal_cooling_output = None
self._maximum_cooling_output = None
self._minimum_cooling_output = None
self._cooling_efficiency = None
self._electricity_efficiency = None
self._nominal_electricity_output = None
self._source_medium = None
self._source_temperature = None
self._source_mass_flow = None
self._supply_medium = None
self._maximum_heat_supply_temperature = None
self._minimum_heat_supply_temperature = None
self._maximum_cooling_supply_temperature = None
self._minimum_cooling_supply_temperature = None
self._heat_output_curve = None
self._heat_fuel_consumption_curve = None
self._heat_efficiency_curve = None
self._cooling_output_curve = None
self._cooling_fuel_consumption_curve = None
self._cooling_efficiency_curve = None
@property
def nominal_heat_output(self):
"""
Get nominal heat output of heat generation devices in W
:return: float
"""
return self._nominal_heat_output
@nominal_heat_output.setter
def nominal_heat_output(self, value):
"""
Set nominal heat output of heat generation devices in W
:param value: float
"""
self._nominal_heat_output = value
@property
def maximum_heat_output(self):
"""
Get maximum heat output of heat generation devices in W
:return: float
"""
return self._maximum_heat_output
@maximum_heat_output.setter
def maximum_heat_output(self, value):
"""
Set maximum heat output of heat generation devices in W
:param value: float
"""
self._maximum_heat_output = value
@property
def minimum_heat_output(self):
"""
Get minimum heat output of heat generation devices in W
:return: float
"""
return self._minimum_heat_output
@minimum_heat_output.setter
def minimum_heat_output(self, value):
"""
Set minimum heat output of heat generation devices in W
:param value: float
"""
self._minimum_heat_output = value
@property
def source_medium(self):
"""
Get source_type from [air, water, ground, district_heating, grid, on_site_electricity]
:return: string
"""
return self._source_medium
@source_medium.setter
def source_medium(self, value):
"""
Set source medium from [Air, Water, Geothermal, District Heating, Grid, Onsite Electricity]
:param value: [string]
"""
self._source_medium = value
@property
def supply_medium(self):
"""
Get the supply medium from ['air', 'water']
:return: string
"""
return self._supply_medium
@supply_medium.setter
def supply_medium(self, value):
"""
Set the supply medium from ['air', 'water']
:param value: string
"""
self._supply_medium = value
@property
def heat_efficiency(self):
"""
Get heat_efficiency
:return: float
"""
return self._heat_efficiency
@heat_efficiency.setter
def heat_efficiency(self, value):
"""
Set heat_efficiency
:param value: float
"""
self._heat_efficiency = value
@property
def nominal_cooling_output(self):
"""
Get nominal cooling output of heat generation devices in W
:return: float
"""
return self._nominal_cooling_output
@nominal_cooling_output.setter
def nominal_cooling_output(self, value):
"""
Set nominal cooling output of heat generation devices in W
:param value: float
"""
self._nominal_cooling_output = value
@property
def maximum_cooling_output(self):
"""
Get maximum heat output of heat generation devices in W
:return: float
"""
return self._maximum_cooling_output
@maximum_cooling_output.setter
def maximum_cooling_output(self, value):
"""
Set maximum heat output of heat generation devices in W
:param value: float
"""
self._maximum_cooling_output = value
@property
def minimum_cooling_output(self):
"""
Get minimum heat output of heat generation devices in W
:return: float
"""
return self._minimum_cooling_output
@minimum_cooling_output.setter
def minimum_cooling_output(self, value):
"""
Set minimum heat output of heat generation devices in W
:param value: float
"""
self._minimum_cooling_output = value
@property
def cooling_efficiency(self):
"""
Get cooling_efficiency
:return: float
"""
return self._cooling_efficiency
@cooling_efficiency.setter
def cooling_efficiency(self, value):
"""
Set cooling_efficiency
:param value: float
"""
self._cooling_efficiency = value
@property
def electricity_efficiency(self):
"""
Get electricity_efficiency
:return: float
"""
return self._electricity_efficiency
@electricity_efficiency.setter
def electricity_efficiency(self, value):
"""
Set electricity_efficiency
:param value: float
"""
self._electricity_efficiency = value
@property
def source_temperature(self):
"""
Get source_temperature in degree Celsius
:return: float
"""
return self._source_temperature
@source_temperature.setter
def source_temperature(self, value):
"""
Set source_temperature in degree Celsius
:param value: float
"""
self._source_temperature = value
@property
def source_mass_flow(self):
"""
Get source_mass_flow in kg/s
:return: float
"""
return self._source_mass_flow
@source_mass_flow.setter
def source_mass_flow(self, value):
"""
Set source_mass_flow in kg/s
:param value: float
"""
self._source_mass_flow = value
@property
def nominal_electricity_output(self):
"""
Get nominal_power_output of electricity generation devices or inverters in W
:return: float
"""
return self._nominal_electricity_output
@nominal_electricity_output.setter
def nominal_electricity_output(self, value):
"""
Get nominal_power_output of electricity generation devices or inverters in W
:param value: float
"""
self._nominal_electricity_output = value
@property
def maximum_heat_supply_temperature(self):
"""
Get the maximum heat supply temperature in degree Celsius
:return: float
"""
return self._minimum_heat_supply_temperature
@maximum_heat_supply_temperature.setter
def maximum_heat_supply_temperature(self, value):
"""
Set maximum heating supply temperature in degree Celsius
:param value: float
"""
self._maximum_heat_supply_temperature = value
@property
def minimum_heat_supply_temperature(self):
"""
Get the minimum heat supply temperature in degree Celsius
:return: float
"""
return self._minimum_heat_supply_temperature
@minimum_heat_supply_temperature.setter
def minimum_heat_supply_temperature(self, value):
"""
Set minimum heating supply temperature in degree Celsius
:param value: float
"""
self._minimum_heat_supply_temperature = value
@property
def maximum_cooling_supply_temperature(self):
"""
Get the maximum cooling supply temperature in degree Celsius
:return: float
"""
return self._maximum_cooling_supply_temperature
@maximum_cooling_supply_temperature.setter
def maximum_cooling_supply_temperature(self, value):
"""
Set maximum cooling supply temperature in degree Celsius
:param value: float
"""
self._maximum_cooling_supply_temperature = value
@property
def minimum_cooling_supply_temperature(self):
"""
Get the minimum cooling supply temperature in degree Celsius
:return: float
"""
return self._minimum_cooling_supply_temperature
@minimum_cooling_supply_temperature.setter
def minimum_cooling_supply_temperature(self, value):
"""
Set minimum cooling supply temperature in degree Celsius
:param value: float
"""
self._minimum_cooling_supply_temperature = value
@property
def heat_output_curve(self) -> Union[None, PerformanceCurves]:
"""
Get the heat output curve of the heat generation device
:return: PerformanceCurve
"""
return self._heat_output_curve
@heat_output_curve.setter
def heat_output_curve(self, value):
"""
Set the heat output curve of the heat generation device
:return: PerformanceCurve
"""
self._heat_output_curve = value
@property
def heat_fuel_consumption_curve(self) -> Union[None, PerformanceCurves]:
"""
Get the heating fuel consumption curve of the heat generation device
:return: PerformanceCurve
"""
return self._heat_fuel_consumption_curve
@heat_fuel_consumption_curve.setter
def heat_fuel_consumption_curve(self, value):
"""
Set the heating fuel consumption curve of the heat generation device
:return: PerformanceCurve
"""
self._heat_fuel_consumption_curve = value
@property
def heat_efficiency_curve(self) -> Union[None, PerformanceCurves]:
"""
Get the heating efficiency curve of the heat generation device
:return: PerformanceCurve
"""
return self._heat_efficiency_curve
@heat_efficiency_curve.setter
def heat_efficiency_curve(self, value):
"""
Set the heating efficiency curve of the heat generation device
:return: PerformanceCurve
"""
self._heat_efficiency_curve = value
@property
def cooling_output_curve(self) -> Union[None, PerformanceCurves]:
"""
Get the heat output curve of the heat generation device
:return: PerformanceCurve
"""
return self._cooling_output_curve
@cooling_output_curve.setter
def cooling_output_curve(self, value):
"""
Set the cooling output curve of the heat generation device
:return: PerformanceCurve
"""
self._cooling_output_curve = value
@property
def cooling_fuel_consumption_curve(self) -> Union[None, PerformanceCurves]:
"""
Get the heating fuel consumption curve of the heat generation device
:return: PerformanceCurve
"""
return self._cooling_fuel_consumption_curve
@cooling_fuel_consumption_curve.setter
def cooling_fuel_consumption_curve(self, value):
"""
Set the heating fuel consumption curve of the heat generation device
:return: PerformanceCurve
"""
self._cooling_fuel_consumption_curve = value
@property
def cooling_efficiency_curve(self) -> Union[None, PerformanceCurves]:
"""
Get the heating efficiency curve of the heat generation device
:return: PerformanceCurve
"""
return self._cooling_efficiency_curve
@cooling_efficiency_curve.setter
def cooling_efficiency_curve(self, value):
"""
Set the heating efficiency curve of the heat generation device
:return: PerformanceCurve
"""
self._cooling_efficiency_curve = value

View File

@ -0,0 +1,187 @@
"""
Generic PV energy generation system
SPDX - License - Identifier: LGPL - 3.0 - or -later
Copyright © 2023 Concordia CERC group
Project Coder Pilar Monsalvete Alvarez de Uribarri pilar.monsalvete@concordia.ca
Code contributors: Saeed Ranjbar saeed.ranjbar@concordia.ca
"""
from hub.city_model_structure.energy_systems.generic_generation_system import GenericGenerationSystem
class GenericPvGenerationSystem(GenericGenerationSystem):
"""
GenericPvGenerationSystem class
"""
def __init__(self):
super().__init__()
self._electricity_efficiency = None
self._nominal_electricity_output = None
self._nominal_ambient_temperature = None
self._nominal_cell_temperature = None
self._nominal_radiation = None
self._standard_test_condition_cell_temperature = None
self._standard_test_condition_maximum_power = None
self._cell_temperature_coefficient = None
self._width = None
self._height = None
@property
def nominal_electricity_output(self):
"""
Get nominal_power_output of electricity generation devices or inverters in W
:return: float
"""
return self._nominal_electricity_output
@nominal_electricity_output.setter
def nominal_electricity_output(self, value):
"""
Set nominal_power_output of electricity generation devices or inverters in W
:param value: float
"""
self._nominal_electricity_output = value
@property
def electricity_efficiency(self):
"""
Get electricity_efficiency
:return: float
"""
return self._electricity_efficiency
@electricity_efficiency.setter
def electricity_efficiency(self, value):
"""
Set electricity_efficiency
:param value: float
"""
self._electricity_efficiency = value
@property
def nominal_ambient_temperature(self):
"""
Get nominal ambient temperature of PV panels in degree Celsius
:return: float
"""
return self._nominal_ambient_temperature
@nominal_ambient_temperature.setter
def nominal_ambient_temperature(self, value):
"""
Set nominal ambient temperature of PV panels in degree Celsius
:param value: float
"""
self._nominal_ambient_temperature = value
@property
def nominal_cell_temperature(self):
"""
Get nominal cell temperature of PV panels in degree Celsius
:return: float
"""
return self._nominal_cell_temperature
@nominal_cell_temperature.setter
def nominal_cell_temperature(self, value):
"""
Set nominal cell temperature of PV panels in degree Celsius
:param value: float
"""
self._nominal_cell_temperature = value
@property
def nominal_radiation(self):
"""
Get nominal radiation of PV panels
:return: float
"""
return self._nominal_radiation
@nominal_radiation.setter
def nominal_radiation(self, value):
"""
Set nominal radiation of PV panels
:param value: float
"""
self._nominal_radiation = value
@property
def standard_test_condition_cell_temperature(self):
"""
Get standard test condition cell temperature of PV panels in degree Celsius
:return: float
"""
return self._standard_test_condition_cell_temperature
@standard_test_condition_cell_temperature.setter
def standard_test_condition_cell_temperature(self, value):
"""
Set standard test condition cell temperature of PV panels in degree Celsius
:param value: float
"""
self._standard_test_condition_cell_temperature = value
@property
def standard_test_condition_maximum_power(self):
"""
Get standard test condition maximum power of PV panels in W
:return: float
"""
return self._standard_test_condition_maximum_power
@standard_test_condition_maximum_power.setter
def standard_test_condition_maximum_power(self, value):
"""
Set standard test condition maximum power of PV panels in W
:param value: float
"""
self._standard_test_condition_maximum_power = value
@property
def cell_temperature_coefficient(self):
"""
Get cell temperature coefficient of PV module
:return: float
"""
return self._cell_temperature_coefficient
@cell_temperature_coefficient.setter
def cell_temperature_coefficient(self, value):
"""
Set cell temperature coefficient of PV module
:param value: float
"""
self._cell_temperature_coefficient = value
@property
def width(self):
"""
Get PV module width in m
:return: float
"""
return self._width
@width.setter
def width(self, value):
"""
Set PV module width in m
:param value: float
"""
self._width = value
@property
def height(self):
"""
Get PV module height in m
:return: float
"""
return self._height
@height.setter
def height(self, value):
"""
Set PV module height in m
:param value: float
"""
self._height = value

View File

@ -7,21 +7,41 @@ Code contributors: Pilar Monsalvete Alvarez de Uribarri pilar.monsalvete@concord
""" """
from __future__ import annotations from __future__ import annotations
from abc import ABC
class GenericStorageSystem: class GenericStorageSystem(ABC):
""" """
Generic storage System class Generic storage System class
""" """
def __init__(self): def __init__(self):
self._type_energy_stored = None
self._storage_type = None self._storage_type = None
self._model_name = None
self._manufacturer = None
self._nominal_capacity = None self._nominal_capacity = None
self._losses_ratio = None self._losses_ratio = None
@property
def type_energy_stored(self):
"""
Get type of energy stored from ['electrical', 'thermal']
:return: string
"""
return self._type_energy_stored
@type_energy_stored.setter
def type_energy_stored(self, value):
"""
Set type of energy stored from ['electrical', 'thermal']
:return: string
"""
self._type_energy_stored = value
@property @property
def storage_type(self): def storage_type(self):
""" """
Get the type of storage system from [sensible, latent, lithium_ion, NiCd, lead_acid] Get storage type
:return: string :return: string
""" """
return self._storage_type return self._storage_type
@ -29,11 +49,43 @@ class GenericStorageSystem:
@storage_type.setter @storage_type.setter
def storage_type(self, value): def storage_type(self, value):
""" """
Set the type of storage system from [sensible, latent, lithium_ion, NiCd, lead_acid] Get storage type
:return: string :param value: string
""" """
self._storage_type = value self._storage_type = value
@property
def model_name(self):
"""
Get system model
:return: string
"""
return self._model_name
@model_name.setter
def model_name(self, value):
"""
Set system model
:param value: string
"""
self._model_name = value
@property
def manufacturer(self):
"""
Get name of manufacturer
:return: string
"""
return self._manufacturer
@manufacturer.setter
def manufacturer(self, value):
"""
Set name of manufacturer
:param value: string
"""
self._manufacturer = value
@property @property
def nominal_capacity(self): def nominal_capacity(self):
""" """

View File

@ -0,0 +1,88 @@
"""
Generic thermal storage system
SPDX - License - Identifier: LGPL - 3.0 - or -later
Copyright © 2023 Concordia CERC group
Project Coder Pilar Monsalvete Alvarez de Uribarri pilar.monsalvete@concordia.ca
Code contributors: Saeed Ranjbar saeed.ranjbar@concordia.ca
"""
from hub.city_model_structure.energy_systems.generic_storage_system import GenericStorageSystem
from hub.city_model_structure.building_demand.layer import Layer
class GenericThermalStorageSystem(GenericStorageSystem):
""""
Generic Thermal Storage System Class
"""
def __init__(self):
super().__init__()
self._volume = None
self._height = None
self._layers = None
self._maximum_operating_temperature = None
@property
def volume(self):
"""
Get the physical volume of the storage system in cubic meters
:return: float
"""
return self._volume
@volume.setter
def volume(self, value):
"""
Set the physical volume of the storage system in cubic meters
:param value: float
"""
self._volume = value
@property
def height(self):
"""
Get the diameter of the storage system in meters
:return: float
"""
return self._height
@height.setter
def height(self, value):
"""
Set the diameter of the storage system in meters
:param value: float
"""
self._height = value
@property
def layers(self) -> [Layer]:
"""
Get construction layers
:return: [layer]
"""
return self._layers
@layers.setter
def layers(self, value):
"""
Set construction layers
:param value: [layer]
"""
self._layers = value
@property
def maximum_operating_temperature(self):
"""
Get maximum operating temperature of the storage system in degree Celsius
:return: float
"""
return self._maximum_operating_temperature
@maximum_operating_temperature.setter
def maximum_operating_temperature(self, value):
"""
Set maximum operating temperature of the storage system in degree Celsius
:param value: float
"""
self._maximum_operating_temperature = value

View File

@ -38,53 +38,96 @@
</equipment> </equipment>
</generation_equipments> </generation_equipments>
<distribution_equipments> <distribution_equipments>
<equipment id="1" type="Water distribution heating"> <equipment id="1" type="Water distribution heating with baseboards">
<name>Water distribution heating</name> <name>Water distribution heating</name>
<distribution_heat_losses units="%">10</distribution_heat_losses> <distribution_heat_losses units="%">10</distribution_heat_losses>
<distribution_consumption_fix_flow units="%">2</distribution_consumption_fix_flow> <distribution_consumption_fix_flow units="%">2</distribution_consumption_fix_flow>
<distribution_consumption_variable_flow units="%">0</distribution_consumption_variable_flow> <distribution_consumption_variable_flow units="%">0</distribution_consumption_variable_flow>
<dissipation_id>1</dissipation_id>
</equipment> </equipment>
<equipment id="2" type="Water distribution cooling"> <equipment id="2" type="Water distribution heating with fan-coils">
<name>Water distribution heating</name>
<distribution_heat_losses units="%">10</distribution_heat_losses>
<distribution_consumption_fix_flow units="%">2</distribution_consumption_fix_flow>
<distribution_consumption_variable_flow units="%">0</distribution_consumption_variable_flow>
<dissipation_id>2</dissipation_id>
</equipment>
<equipment id="3" type="Water distribution heating with inductors">
<name>Water distribution heating</name>
<distribution_heat_losses units="%">10</distribution_heat_losses>
<distribution_consumption_fix_flow units="%">2</distribution_consumption_fix_flow>
<distribution_consumption_variable_flow units="%">0</distribution_consumption_variable_flow>
<dissipation_id>3</dissipation_id>
</equipment>
<equipment id="4" type="Water distribution cooling with fan-coils">
<name>Water distribution cooling</name> <name>Water distribution cooling</name>
<distribution_heat_losses units="%">5</distribution_heat_losses> <distribution_heat_losses units="%">5</distribution_heat_losses>
<distribution_consumption_fix_flow units="%">4</distribution_consumption_fix_flow> <distribution_consumption_fix_flow units="%">4</distribution_consumption_fix_flow>
<distribution_consumption_variable_flow units="%">0</distribution_consumption_variable_flow> <distribution_consumption_variable_flow units="%">0</distribution_consumption_variable_flow>
<dissipation_id>2</dissipation_id>
</equipment> </equipment>
<equipment id="3" type="Central air distribution heating"> <equipment id="5" type="Central air distribution heating with fan-coils">
<name>Central air distribution heating</name> <name>Central air distribution heating</name>
<distribution_heat_losses units="%">10</distribution_heat_losses> <distribution_heat_losses units="%">10</distribution_heat_losses>
<distribution_consumption_fix_flow units="%">0</distribution_consumption_fix_flow> <distribution_consumption_fix_flow units="%">0</distribution_consumption_fix_flow>
<distribution_consumption_variable_flow units="%">13</distribution_consumption_variable_flow> <distribution_consumption_variable_flow units="%">13</distribution_consumption_variable_flow>
<dissipation_id>2</dissipation_id>
</equipment> </equipment>
<equipment id="4" type="Central air distribution cooling"> <equipment id="6" type="Central air distribution heating with inductors">
<name>Central air distribution heating</name>
<distribution_heat_losses units="%">10</distribution_heat_losses>
<distribution_consumption_fix_flow units="%">0</distribution_consumption_fix_flow>
<distribution_consumption_variable_flow units="%">13</distribution_consumption_variable_flow>
<dissipation_id>3</dissipation_id>
</equipment>
<equipment id="7" type="Central air distribution cooling with fan-coils">
<name>Central air distribution cooling</name> <name>Central air distribution cooling</name>
<distribution_heat_losses units="%">5</distribution_heat_losses> <distribution_heat_losses units="%">5</distribution_heat_losses>
<distribution_consumption_fix_flow units="%">0</distribution_consumption_fix_flow> <distribution_consumption_fix_flow units="%">0</distribution_consumption_fix_flow>
<distribution_consumption_variable_flow units="%">13</distribution_consumption_variable_flow> <distribution_consumption_variable_flow units="%">13</distribution_consumption_variable_flow>
<dissipation_id>2</dissipation_id>
</equipment> </equipment>
<equipment id="5" type="Local air distribution heating"> <equipment id="8" type="Local air distribution heating with baseboards">
<name>Local air distribution heating</name> <name>Local air distribution heating</name>
<distribution_heat_losses units="%">5</distribution_heat_losses> <distribution_heat_losses units="%">5</distribution_heat_losses>
<distribution_consumption_fix_flow units="%">8</distribution_consumption_fix_flow> <distribution_consumption_fix_flow units="%">8</distribution_consumption_fix_flow>
<distribution_consumption_variable_flow units="%">0</distribution_consumption_variable_flow> <distribution_consumption_variable_flow units="%">0</distribution_consumption_variable_flow>
<dissipation_id>1</dissipation_id>
</equipment> </equipment>
<equipment id="6" type="Local air distribution cooling"> <equipment id="9" type="Local air distribution heating with inductors">
<name>Local air distribution heating</name>
<distribution_heat_losses units="%">5</distribution_heat_losses>
<distribution_consumption_fix_flow units="%">8</distribution_consumption_fix_flow>
<distribution_consumption_variable_flow units="%">0</distribution_consumption_variable_flow>
<dissipation_id>3</dissipation_id>
</equipment>
<equipment id="10" type="Local air distribution cooling with inductors">
<name>Local air distribution cooling</name> <name>Local air distribution cooling</name>
<distribution_heat_losses units="%">2</distribution_heat_losses> <distribution_heat_losses units="%">2</distribution_heat_losses>
<distribution_consumption_fix_flow units="%">8</distribution_consumption_fix_flow> <distribution_consumption_fix_flow units="%">8</distribution_consumption_fix_flow>
<distribution_consumption_variable_flow units="%">0</distribution_consumption_variable_flow> <distribution_consumption_variable_flow units="%">0</distribution_consumption_variable_flow>
<dissipation_id>3</dissipation_id>
</equipment> </equipment>
<equipment id="7" type="Refrigerant distribution"> <equipment id="11" type="Refrigerant distribution with fan-coils">
<name>Refrigerant distribution</name> <name>Refrigerant distribution</name>
<distribution_heat_losses units="%">1</distribution_heat_losses> <distribution_heat_losses units="%">1</distribution_heat_losses>
<distribution_consumption_fix_flow units="%">1</distribution_consumption_fix_flow> <distribution_consumption_fix_flow units="%">1</distribution_consumption_fix_flow>
<distribution_consumption_variable_flow units="%">0</distribution_consumption_variable_flow> <distribution_consumption_variable_flow units="%">0</distribution_consumption_variable_flow>
<dissipation_id>2</dissipation_id>
</equipment> </equipment>
<equipment id="8" type="No distribution"> <equipment id="12" type="No distribution with baseboards">
<name>No distribution</name> <name>No distribution</name>
<distribution_heat_losses units="%">0</distribution_heat_losses> <distribution_heat_losses units="%">0</distribution_heat_losses>
<distribution_consumption_fix_flow units="%">0</distribution_consumption_fix_flow> <distribution_consumption_fix_flow units="%">0</distribution_consumption_fix_flow>
<distribution_consumption_variable_flow units="%">0</distribution_consumption_variable_flow> <distribution_consumption_variable_flow units="%">0</distribution_consumption_variable_flow>
<dissipation_id>1</dissipation_id>
</equipment>
<equipment id="13" type="No distribution with inductors">
<name>No distribution</name>
<distribution_heat_losses units="%">0</distribution_heat_losses>
<distribution_consumption_fix_flow units="%">0</distribution_consumption_fix_flow>
<distribution_consumption_variable_flow units="%">0</distribution_consumption_variable_flow>
<dissipation_id>3</dissipation_id>
</equipment> </equipment>
</distribution_equipments> </distribution_equipments>
<dissipation_equipments> <dissipation_equipments>
@ -111,7 +154,6 @@
<equipments> <equipments>
<generation_id>1</generation_id> <generation_id>1</generation_id>
<distribution_id>1</distribution_id> <distribution_id>1</distribution_id>
<dissipation_id>1</dissipation_id>
</equipments> </equipments>
</system> </system>
<system id = "16"> <system id = "16">
@ -122,8 +164,7 @@
</demands> </demands>
<equipments> <equipments>
<generation_id>2</generation_id> <generation_id>2</generation_id>
<distribution_id>8</distribution_id> <distribution_id>12</distribution_id>
<dissipation_id>1</dissipation_id>
</equipments> </equipments>
</system> </system>
<system id = "2"> <system id = "2">
@ -134,8 +175,7 @@
</demands> </demands>
<equipments> <equipments>
<generation_id>1</generation_id> <generation_id>1</generation_id>
<distribution_id>1</distribution_id> <distribution_id>2</distribution_id>
<dissipation_id>2</dissipation_id>
</equipments> </equipments>
</system> </system>
<system id="3"> <system id="3">
@ -146,8 +186,7 @@
</demands> </demands>
<equipments> <equipments>
<generation_id>2</generation_id> <generation_id>2</generation_id>
<distribution_id>1</distribution_id> <distribution_id>2</distribution_id>
<dissipation_id>2</dissipation_id>
</equipments> </equipments>
</system> </system>
<system id="4"> <system id="4">
@ -158,9 +197,8 @@
</demands> </demands>
<equipments> <equipments>
<generation_id>3</generation_id> <generation_id>3</generation_id>
<distribution_id>5</distribution_id> <distribution_id>8</distribution_id>
<dissipation_id>1</dissipation_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>
@ -170,8 +208,7 @@
</demands> </demands>
<equipments> <equipments>
<generation_id>4</generation_id> <generation_id>4</generation_id>
<distribution_id>5</distribution_id> <distribution_id>8</distribution_id>
<dissipation_id>1</dissipation_id>
</equipments> </equipments>
</system> </system>
<system id="6"> <system id="6">
@ -183,7 +220,6 @@
<equipments> <equipments>
<generation_id>1</generation_id> <generation_id>1</generation_id>
<distribution_id>1</distribution_id> <distribution_id>1</distribution_id>
<dissipation_id>1</dissipation_id>
</equipments> </equipments>
</system> </system>
<system id="7"> <system id="7">
@ -194,8 +230,7 @@
</demands> </demands>
<equipments> <equipments>
<generation_id>2</generation_id> <generation_id>2</generation_id>
<distribution_id>8</distribution_id> <distribution_id>13</distribution_id>
<dissipation_id>3</dissipation_id>
</equipments> </equipments>
</system> </system>
<system id="8"> <system id="8">
@ -206,8 +241,7 @@
</demands> </demands>
<equipments> <equipments>
<generation_id>2</generation_id> <generation_id>2</generation_id>
<distribution_id>1</distribution_id> <distribution_id>3</distribution_id>
<dissipation_id>3</dissipation_id>
</equipments> </equipments>
</system> </system>
<system id="9"> <system id="9">
@ -218,8 +252,7 @@
</demands> </demands>
<equipments> <equipments>
<generation_id>2</generation_id> <generation_id>2</generation_id>
<distribution_id>8</distribution_id> <distribution_id>13</distribution_id>
<dissipation_id>3</dissipation_id>
</equipments> </equipments>
</system> </system>
<system id="10"> <system id="10">
@ -229,8 +262,7 @@
</demands> </demands>
<equipments> <equipments>
<generation_id>5</generation_id> <generation_id>5</generation_id>
<distribution_id>6</distribution_id> <distribution_id>10</distribution_id>
<dissipation_id>3</dissipation_id>
</equipments> </equipments>
</system> </system>
<system id="11"> <system id="11">
@ -240,8 +272,7 @@
</demands> </demands>
<equipments> <equipments>
<generation_id>5</generation_id> <generation_id>5</generation_id>
<distribution_id>2</distribution_id> <distribution_id>4</distribution_id>
<dissipation_id>2</dissipation_id>
</equipments> </equipments>
</system> </system>
<system id="12"> <system id="12">
@ -251,8 +282,7 @@
</demands> </demands>
<equipments> <equipments>
<generation_id>5</generation_id> <generation_id>5</generation_id>
<distribution_id>6</distribution_id> <distribution_id>10</distribution_id>
<dissipation_id>3</dissipation_id>
</equipments> </equipments>
</system> </system>
<system id="13"> <system id="13">
@ -262,8 +292,7 @@
</demands> </demands>
<equipments> <equipments>
<generation_id>5</generation_id> <generation_id>5</generation_id>
<distribution_id>6</distribution_id> <distribution_id>10</distribution_id>
<dissipation_id>3</dissipation_id>
</equipments> </equipments>
</system> </system>
<system id="14"> <system id="14">
@ -273,8 +302,7 @@
</demands> </demands>
<equipments> <equipments>
<generation_id>5</generation_id> <generation_id>5</generation_id>
<distribution_id>3</distribution_id> <distribution_id>6</distribution_id>
<dissipation_id>3</dissipation_id>
</equipments> </equipments>
</system> </system>
<system id="15"> <system id="15">
@ -284,8 +312,7 @@
</demands> </demands>
<equipments> <equipments>
<generation_id>6</generation_id> <generation_id>6</generation_id>
<distribution_id>5</distribution_id> <distribution_id>9</distribution_id>
<dissipation_id>3</dissipation_id>
</equipments> </equipments>
</system> </system>
<system id="17"> <system id="17">
@ -296,8 +323,7 @@
</demands> </demands>
<equipments> <equipments>
<generation_id>7</generation_id> <generation_id>7</generation_id>
<distribution_id>3</distribution_id> <distribution_id>5</distribution_id>
<dissipation_id>2</dissipation_id>
</equipments> </equipments>
</system> </system>
<system id="18"> <system id="18">
@ -307,8 +333,7 @@
</demands> </demands>
<equipments> <equipments>
<generation_id>7</generation_id> <generation_id>7</generation_id>
<distribution_id>4</distribution_id> <distribution_id>7</distribution_id>
<dissipation_id>2</dissipation_id>
</equipments> </equipments>
</system> </system>
</systems> </systems>

View File

@ -22,7 +22,7 @@ class TestSystemsCatalog(TestCase):
generation_equipments = catalog.names('generation_equipments') generation_equipments = catalog.names('generation_equipments')
self.assertEqual(7, len(generation_equipments['generation_equipments'])) self.assertEqual(7, len(generation_equipments['generation_equipments']))
distribution_equipments = catalog.names('distribution_equipments') distribution_equipments = catalog.names('distribution_equipments')
self.assertEqual(8, len(distribution_equipments['distribution_equipments'])) self.assertEqual(13, len(distribution_equipments['distribution_equipments']))
with self.assertRaises(ValueError): with self.assertRaises(ValueError):
catalog.names('unknown') catalog.names('unknown')