From d94bce4174d5a077945e1fb811f22e93cc4051fe Mon Sep 17 00:00:00 2001 From: p_monsalvete Date: Fri, 13 Oct 2023 08:23:40 -0400 Subject: [PATCH] half made changes in central data model for systems --- .../energy_systems/distribution_system.py | 1 - .../energy_systems/pv_generation_system.py | 2 +- .../energy_systems/energy_storage_system.py | 65 +++++ .../energy_systems/energy_system.py | 80 +----- .../energy_systems/generation_system.py | 211 +++----------- .../generic_distribution_system.py | 5 +- .../energy_systems/generic_storage_system.py | 1 - .../energy_systems/heat_pump.py | 64 ----- .../energy_systems/hvac_terminal_unit.py | 32 --- .../non_pv_generation_system.py | 263 ++++++++++++++++++ .../energy_systems/pv_generation_system.py | 114 ++++++++ .../energy_systems/thermal_storage_system.py | 7 +- hub/helpers/constants.py | 1 + ..._system_to_hub_energy_generation_system.py | 31 +++ hub/helpers/dictionaries.py | 8 + ...ontreal_custom_energy_system_parameters.py | 86 ++++-- 16 files changed, 595 insertions(+), 376 deletions(-) create mode 100644 hub/city_model_structure/energy_systems/energy_storage_system.py delete mode 100644 hub/city_model_structure/energy_systems/heat_pump.py delete mode 100644 hub/city_model_structure/energy_systems/hvac_terminal_unit.py create mode 100644 hub/city_model_structure/energy_systems/non_pv_generation_system.py create mode 100644 hub/city_model_structure/energy_systems/pv_generation_system.py create mode 100644 hub/helpers/data/montreal_generation_system_to_hub_energy_generation_system.py diff --git a/hub/catalog_factories/data_models/energy_systems/distribution_system.py b/hub/catalog_factories/data_models/energy_systems/distribution_system.py index 1b3ad2e2..53e3168d 100644 --- a/hub/catalog_factories/data_models/energy_systems/distribution_system.py +++ b/hub/catalog_factories/data_models/energy_systems/distribution_system.py @@ -8,7 +8,6 @@ Code contributors: Saeed Ranjbar saeed.ranjbar@concordia.ca 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.energy_storage_system import EnergyStorageSystem from hub.catalog_factories.data_models.energy_systems.emission_system import EmissionSystem diff --git a/hub/catalog_factories/data_models/energy_systems/pv_generation_system.py b/hub/catalog_factories/data_models/energy_systems/pv_generation_system.py index 61365223..5aa272b7 100644 --- a/hub/catalog_factories/data_models/energy_systems/pv_generation_system.py +++ b/hub/catalog_factories/data_models/energy_systems/pv_generation_system.py @@ -22,7 +22,7 @@ class PvGenerationSystem(GenerationSystem): super().__init__(system_id=system_id, model_name=model_name, manufacturer=manufacturer, fuel_type='renewable', distribution_systems=distribution_systems, energy_storage_systems=energy_storage_systems) - self._system_type = 'PV' + self._system_type = 'PV system' self._electricity_efficiency = electricity_efficiency self._nominal_electricity_output = nominal_electricity_output self._nominal_ambient_temperature = nominal_ambient_temperature diff --git a/hub/city_model_structure/energy_systems/energy_storage_system.py b/hub/city_model_structure/energy_systems/energy_storage_system.py new file mode 100644 index 00000000..8841db9d --- /dev/null +++ b/hub/city_model_structure/energy_systems/energy_storage_system.py @@ -0,0 +1,65 @@ +""" +Energy 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 abc import ABC + + +class EnergyStorageSystem(ABC): + """ + Energy storage System class + """ + def __init__(self, generic_storage_system): + self._generic_storage_system = generic_storage_system + + @property + def type_energy_stored(self): + """ + Get type of energy stored from ['electrical', 'thermal'] + :return: string + """ + return self._generic_storage_system.type_energy_stored + + @property + def storage_type(self): + """ + Get storage type + :return: string + """ + return self._generic_storage_system.storage_type + + @property + def model_name(self): + """ + Get system model + :return: string + """ + return self._generic_storage_system.model_name + + @property + def manufacturer(self): + """ + Get name of manufacturer + :return: string + """ + return self._generic_storage_system.manufacturer + + @property + def nominal_capacity(self): + """ + Get the nominal capacity of storage systems in Jules + :return: float + """ + return self._generic_storage_system.nominal_capacity + + @property + def losses_ratio(self): + """ + Get the losses-ratio of storage system in Jules lost / Jules stored + :return: float + """ + return self._generic_storage_system.losses_ratio diff --git a/hub/city_model_structure/energy_systems/energy_system.py b/hub/city_model_structure/energy_systems/energy_system.py index 01d683ba..0f5693ad 100644 --- a/hub/city_model_structure/energy_systems/energy_system.py +++ b/hub/city_model_structure/energy_systems/energy_system.py @@ -9,10 +9,7 @@ from typing import Union, List from hub.city_model_structure.energy_systems.generation_system import GenerationSystem from hub.city_model_structure.energy_systems.distribution_system import DistributionSystem -from hub.city_model_structure.energy_systems.emission_system import EmissionSystem from hub.city_model_structure.energy_systems.control_system import ControlSystem -from hub.city_model_structure.energy_systems.thermal_storage_system import ThermalStorageSystem -from hub.city_model_structure.energy_systems.electrical_storage_system import ElectricalStorageSystem from hub.city_model_structure.city_object import CityObject @@ -20,15 +17,12 @@ class EnergySystem: """ EnergySystem class """ - def __init__(self): - self._name = None - self._demand_types = None + def __init__(self, generic_energy_system): + self._generic_energy_system = generic_energy_system self._generation_systems = None self._distribution_systems = None - self._emission_systems = None self._connected_city_objects = None self._control_system = None - self._energy_storage_systems = None @property def name(self): @@ -36,15 +30,7 @@ class EnergySystem: Get energy system name :return: str """ - return self._name - - @name.setter - def name(self, value): - """ - Set energy system name - :param value: - """ - self._name = value + return self._generic_energy_system.name @property def demand_types(self): @@ -52,69 +38,45 @@ class EnergySystem: Get demand able to cover from [Heating, Cooling, Domestic Hot Water, Electricity] :return: [string] """ - return self._demand_types - - @demand_types.setter - def demand_types(self, value): - """ - Set demand able to cover from [Heating, Cooling, Domestic Hot Water, Electricity] - :param value: [string] - """ - self._demand_types = value + return self._generic_energy_system.demand_types @property def generation_systems(self) -> List[GenerationSystem]: """ Get generation systems - :return: GenerationSystem + :return: [GenerationSystem] """ return self._generation_systems @generation_systems.setter def generation_systems(self, value): """ - Set generation system - :param value: GenerationSystem + Set generation systems + :param value: [GenerationSystem] """ self._generation_systems = value @property def distribution_systems(self) -> Union[None, List[DistributionSystem]]: """ - Get distribution system - :return: DistributionSystem + Get distribution systems + :return: [DistributionSystem] """ return self._distribution_systems @distribution_systems.setter def distribution_systems(self, value): """ - Set distribution system - :param value: DistributionSystem + Set distribution systems + :param value: [DistributionSystem] """ self._distribution_systems = value - @property - def emission_systems(self) -> Union[None, List[EmissionSystem]]: - """ - Get emission system - :return: EmissionSystem - """ - return self._emission_systems - - @emission_systems.setter - def emission_systems(self, value): - """ - Set emission system - :param value: EmissionSystem - """ - self._emission_systems = value - @property def connected_city_objects(self) -> Union[None, List[CityObject]]: """ Get list of city objects that are connected to this energy system - :return: List[CityObject] + :return: [CityObject] """ return self._connected_city_objects @@ -122,7 +84,7 @@ class EnergySystem: def connected_city_objects(self, value): """ Set list of city objects that are connected to this energy system - :param value: List[CityObject] + :param value: [CityObject] """ self._connected_city_objects = value @@ -141,19 +103,3 @@ class EnergySystem: :param value: ControlSystem """ self._control_system = value - - @property - def energy_storage_systems(self) -> Union[None, List[ThermalStorageSystem], List[ElectricalStorageSystem]]: - """ - Get energy storage systems - :return: [EnergyStorageSystem] - """ - return self._energy_storage_systems - - @energy_storage_systems.setter - def energy_storage_systems(self, value): - """ - Set storage system - :param value: [EnergyStorageSystem] - """ - self._energy_storage_systems = value diff --git a/hub/city_model_structure/energy_systems/generation_system.py b/hub/city_model_structure/energy_systems/generation_system.py index 5d64f303..1a082bb3 100644 --- a/hub/city_model_structure/energy_systems/generation_system.py +++ b/hub/city_model_structure/energy_systems/generation_system.py @@ -6,125 +6,29 @@ Project Coder Pilar Monsalvete Alvarez de Uribarri pilar.monsalvete@concordia.ca """ from __future__ import annotations -from typing import Union +from abc import ABC +from typing import Union, List -from hub.city_model_structure.energy_systems.generic_generation_system import GenericGenerationSystem +from hub.city_model_structure.energy_systems.distribution_system import DistributionSystem +from hub.city_model_structure.energy_systems.energy_storage_system import EnergyStorageSystem -class GenerationSystem: +class GenerationSystem(ABC): """ GenerationSystem class """ - def __init__(self): - self._heat_power = None - self._cooling_power = None - self._electricity_power = None - self._storage_capacity = None - self._generic_generation_system = None - self._auxiliary_equipment = None - self._model_name = None - self._manufacturer = None - self._maximum_heat_output = None - self._minimum_heat_output = None - self._maximum_cooling_output = None - self._minimum_cooling_output = None - + def __init__(self, generic_generation_system): + self._generic_generation_system = generic_generation_system + self._distribution_systems = None + self._storage_systems = None @property - def generic_generation_system(self) -> GenericGenerationSystem: + def system_type(self): """ - Get associated generic_generation_system - :return: GenericGenerationSystem + Get type + :return: string """ - return self._generic_generation_system - - @generic_generation_system.setter - def generic_generation_system(self, value): - """ - Set associated generic_generation_system - :param value: GenericGenerationSystem - """ - self._generic_generation_system = value - - @property - def heat_power(self): - """ - Get heat_power in W - :return: float - """ - return self._heat_power - - @heat_power.setter - def heat_power(self, value): - """ - Set heat_power in W - :param value: float - """ - self._heat_power = value - - @property - def cooling_power(self): - """ - Get cooling_power in W - :return: float - """ - return self._cooling_power - - @cooling_power.setter - def cooling_power(self, value): - """ - Set cooling_power in W - :param value: float - """ - self._cooling_power = value - - @property - def electricity_power(self): - """ - Get electricity_power in W - :return: float - """ - return self._electricity_power - - @electricity_power.setter - def electricity_power(self, value): - """ - Set electricity_power in W - :param value: float - """ - self._electricity_power = value - - @property - def storage_capacity(self): - """ - Get storage_capacity in J - :return: float - """ - return self._storage_capacity - - @storage_capacity.setter - def storage_capacity(self, value): - """ - Set storage_capacity in J - :param value: float - """ - self._storage_capacity = value - - @property - def auxiliary_equipment(self) -> Union[None, GenerationSystem]: - """ - Get auxiliary_equipment - :return: GenerationSystem - """ - return self._auxiliary_equipment - - @auxiliary_equipment.setter - def auxiliary_equipment(self, value): - """ - Set auxiliary_equipment - :param value: GenerationSystem - """ - self._auxiliary_equipment = value + return self._generic_generation_system.system_type @property def model_name(self): @@ -132,15 +36,7 @@ class GenerationSystem: Get the model name :return: string """ - return self._model_name - - @model_name.setter - def model_name(self, value): - """ - Set the model name - :return: string - """ - self._model_name = value + return self._generic_generation_system.model_name @property def manufacturer(self): @@ -148,77 +44,44 @@ class GenerationSystem: Get the manufacturer name :return: string """ - return self._manufacturer + return self._generic_generation_system.manufacturer - @manufacturer.setter - def manufacturer(self, value): + @property + def fuel_type(self): """ - Set the manufacturer name + Get fuel_type from [Renewable, Gas, Diesel, Electricity, Wood, Coal] :return: string """ - self._manufacturer = value + return self._generic_generation_system.fuel_type @property - def maximum_heat_output(self): + def distribution_systems(self) -> Union[None, List[DistributionSystem]]: """ - Get maximum heat output in W - :return: float + Get distributions systems connected to this generation system + :return: [GenericDistributionSystem] """ - return self._maximum_heat_output + return self._distribution_systems - @maximum_heat_output.setter - def maximum_heat_output(self, value): + @distribution_systems.setter + def distribution_systems(self, value): """ - Set maximum heat output in W - :return: float + Set distributions systems connected to this generation system + :param value: [DistributionSystem] """ - self._maximum_heat_output = value + self._distribution_systems = value @property - def minimum_heat_output(self): + def storage_systems(self) -> Union[None, List[EnergyStorageSystem]]: """ - Get minimum heat output in W - :return: float + Get energy storage systems connected to this generation system + :return: [EnergyStorageSystem] """ - return self._minimum_heat_output + return self._storage_systems - @minimum_heat_output.setter - def minimum_heat_output(self, value): + @storage_systems.setter + def storage_systems(self, value): """ - Set minimum heat output in W - :return: float + Set energy storage systems connected to this generation system + :param value: [EnergyStorageSystem] """ - self._minimum_heat_output = value - - @property - def maximum_cooling_output(self): - """ - Get maximum cooling output in W - :return: float - """ - return self._maximum_cooling_output - - @maximum_cooling_output.setter - def maximum_cooling_output(self, value): - """ - Set maximum cooling output in W - :return: float - """ - self._maximum_cooling_output = value - - @property - def minimum_cooling_output(self): - """ - Get minimum cooling output in W - :return: float - """ - return self._minimum_cooling_output - - @minimum_cooling_output.setter - def minimum_cooling_output(self, value): - """ - Set minimum cooling output in W - :return: float - """ - self._minimum_cooling_output = value - + self._storage_systems = value diff --git a/hub/city_model_structure/energy_systems/generic_distribution_system.py b/hub/city_model_structure/energy_systems/generic_distribution_system.py index 832fb589..887fcf77 100644 --- a/hub/city_model_structure/energy_systems/generic_distribution_system.py +++ b/hub/city_model_structure/energy_systems/generic_distribution_system.py @@ -5,12 +5,13 @@ Copyright © 2023 Concordia CERC group Project Coder Pilar Monsalvete Alvarez de Uribarri pilar.monsalvete@concordia.ca """ -from typing import Union, List +from typing import Union, List, TypeVar -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 +GenericGenerationSystem = TypeVar('GenericGenerationSystem') + class GenericDistributionSystem: """ diff --git a/hub/city_model_structure/energy_systems/generic_storage_system.py b/hub/city_model_structure/energy_systems/generic_storage_system.py index 6e4771c9..1bc4efd1 100644 --- a/hub/city_model_structure/energy_systems/generic_storage_system.py +++ b/hub/city_model_structure/energy_systems/generic_storage_system.py @@ -6,7 +6,6 @@ Project Coder Saeed Ranjbar saeed.ranjbar@concordia.ca Code contributors: Pilar Monsalvete Alvarez de Uribarri pilar.monsalvete@concordia.ca """ -from __future__ import annotations from abc import ABC diff --git a/hub/city_model_structure/energy_systems/heat_pump.py b/hub/city_model_structure/energy_systems/heat_pump.py deleted file mode 100644 index 067147fe..00000000 --- a/hub/city_model_structure/energy_systems/heat_pump.py +++ /dev/null @@ -1,64 +0,0 @@ -""" -heat_pump module defines a heat pump -SPDX - License - Identifier: LGPL - 3.0 - or -later -Copyright © 2022 Concordia CERC group -Project Coder Peter Yefi peteryefi@gmail.com -""" -from typing import List -from pandas.core.series import Series - - -class HeatPump: - """ - HeatPump class - """ - - def __init__(self): - self._model = None - self._hp_monthly_fossil_consumption = None - self._hp_monthly_electricity_demand = None - - @property - def model(self) -> str: - """ - Get model name - :return: str - """ - return self._model - - @model.setter - def model(self, value): - """ - Set model (name, indicated in capacity) - :param value: str - """ - if self._model is None: - self._model = value - - @property - def hp_monthly_fossil_consumption(self) -> List: - """ - Fossil fuel consumption that results from insel simulation - ":return: [] - :return: - """ - return self._hp_monthly_fossil_consumption - - @hp_monthly_fossil_consumption.setter - def hp_monthly_fossil_consumption(self, value): - if isinstance(value, Series): - self._hp_monthly_fossil_consumption = value - - @property - def hp_monthly_electricity_demand(self) -> List: - """ - Electricity demand that results from insel simulation - ":return: [] - :return: - """ - return self._hp_monthly_electricity_demand - - @hp_monthly_electricity_demand.setter - def hp_monthly_electricity_demand(self, value): - if isinstance(value, Series): - self._hp_monthly_electricity_demand = value diff --git a/hub/city_model_structure/energy_systems/hvac_terminal_unit.py b/hub/city_model_structure/energy_systems/hvac_terminal_unit.py deleted file mode 100644 index 6bb22ef7..00000000 --- a/hub/city_model_structure/energy_systems/hvac_terminal_unit.py +++ /dev/null @@ -1,32 +0,0 @@ -""" -HvacTerminalUnit module -SPDX - License - Identifier: LGPL - 3.0 - or -later -Copyright © 2022 Concordia CERC group -Project Coder Pilar Monsalvete Alvarez de Uribarri pilar.monsalvete@concordia.ca -""" -from typing import Union - - -class HvacTerminalUnit: - """ - HvacTerminalUnit class - """ - def __init__(self): - self._type = None - - @property - def type(self) -> Union[None, str]: - """ - Get type of hvac terminal unit defined for a thermal zone - :return: None or str - """ - return self._type - - @type.setter - def type(self, value): - """ - Set type of hvac terminal unit defined for a thermal zone - :param value: str - """ - if value is not None: - self._type = str(value) diff --git a/hub/city_model_structure/energy_systems/non_pv_generation_system.py b/hub/city_model_structure/energy_systems/non_pv_generation_system.py new file mode 100644 index 00000000..7f1bdf90 --- /dev/null +++ b/hub/city_model_structure/energy_systems/non_pv_generation_system.py @@ -0,0 +1,263 @@ +""" +Non PV generation system definition +SPDX - License - Identifier: LGPL - 3.0 - or -later +Copyright © 2023 Concordia CERC group +Project Coder Pilar Monsalvete Alvarez de Uribarri pilar.monsalvete@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 NonPvGenerationSystem(GenericGenerationSystem): + """ + NonPvGenerationSystem class + """ + def __init__(self, non_pv_generation_system): + super().__init__() + self._non_pv_generation_system = non_pv_generation_system + self._heat_power = None + self._cooling_power = None + self._electricity_power = None + + @property + def heat_power(self): + """ + Get heat_power in W + :return: float + """ + return self._heat_power + + @heat_power.setter + def heat_power(self, value): + """ + Set heat_power in W + :param value: float + """ + self._heat_power = value + + @property + def cooling_power(self): + """ + Get cooling_power in W + :return: float + """ + return self._cooling_power + + @cooling_power.setter + def cooling_power(self, value): + """ + Set cooling_power in W + :param value: float + """ + self._cooling_power = value + + @property + def electricity_power(self): + """ + Get electricity_power in W + :return: float + """ + return self._electricity_power + + @electricity_power.setter + def electricity_power(self, value): + """ + Set electricity_power in W + :param value: float + """ + self._electricity_power = value + + @property + def nominal_heat_output(self): + """ + Get nominal heat output of heat generation devices in W + :return: float + """ + return self._non_pv_generation_system.nominal_heat_output + + @property + def maximum_heat_output(self): + """ + Get maximum heat output of heat generation devices in W + :return: float + """ + return self._non_pv_generation_system.maximum_heat_output + + @property + def minimum_heat_output(self): + """ + Get minimum heat output of heat generation devices in W + :return: float + """ + return self._non_pv_generation_system.minimum_heat_output + + @property + def source_medium(self): + """ + Get source_type from [air, water, ground, district_heating, grid, on_site_electricity] + :return: string + """ + return self._non_pv_generation_system.source_medium + + @property + def supply_medium(self): + """ + Get the supply medium from ['air', 'water'] + :return: string + """ + return self._non_pv_generation_system.supply_medium + + @property + def heat_efficiency(self): + """ + Get heat_efficiency + :return: float + """ + return self._non_pv_generation_system.heat_efficiency + + @property + def nominal_cooling_output(self): + """ + Get nominal cooling output of heat generation devices in W + :return: float + """ + return self._non_pv_generation_system.nominal_cooling_output + + @property + def maximum_cooling_output(self): + """ + Get maximum heat output of heat generation devices in W + :return: float + """ + return self._non_pv_generation_system.maximum_cooling_output + + @property + def minimum_cooling_output(self): + """ + Get minimum heat output of heat generation devices in W + :return: float + """ + return self._non_pv_generation_system.minimum_cooling_output + + @property + def cooling_efficiency(self): + """ + Get cooling_efficiency + :return: float + """ + return self._non_pv_generation_system.cooling_efficiency + + @property + def electricity_efficiency(self): + """ + Get electricity_efficiency + :return: float + """ + return self._non_pv_generation_system.electricity_efficiency + + @property + def source_temperature(self): + """ + Get source_temperature in degree Celsius + :return: float + """ + return self._non_pv_generation_system.source_temperature + + @property + def source_mass_flow(self): + """ + Get source_mass_flow in kg/s + :return: float + """ + return self._non_pv_generation_system.source_mass_flow + + @property + def nominal_electricity_output(self): + """ + Get nominal_power_output of electricity generation devices or inverters in W + :return: float + """ + return self._non_pv_generation_system.nominal_electricity_output + + @property + def maximum_heat_supply_temperature(self): + """ + Get the maximum heat supply temperature in degree Celsius + :return: float + """ + return self._non_pv_generation_system.maximum_heat_supply_temperature + + @property + def minimum_heat_supply_temperature(self): + """ + Get the minimum heat supply temperature in degree Celsius + :return: float + """ + return self._non_pv_generation_system.minimum_heat_supply_temperature + + @property + def maximum_cooling_supply_temperature(self): + """ + Get the maximum cooling supply temperature in degree Celsius + :return: float + """ + return self._non_pv_generation_system.maximum_cooling_supply_temperature + + @property + def minimum_cooling_supply_temperature(self): + """ + Get the minimum cooling supply temperature in degree Celsius + :return: float + """ + return self._non_pv_generation_system.minimum_cooling_supply_temperature + + @property + def heat_output_curve(self) -> Union[None, PerformanceCurves]: + """ + Get the heat output curve of the heat generation device + :return: PerformanceCurve + """ + return self._non_pv_generation_system.heat_output_curve + + @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._non_pv_generation_system.heat_fuel_consumption_curve + + @property + def heat_efficiency_curve(self) -> Union[None, PerformanceCurves]: + """ + Get the heating efficiency curve of the heat generation device + :return: PerformanceCurve + """ + return self._non_pv_generation_system.heat_efficiency_curve + + @property + def cooling_output_curve(self) -> Union[None, PerformanceCurves]: + """ + Get the heat output curve of the heat generation device + :return: PerformanceCurve + """ + return self._non_pv_generation_system.cooling_output_curve + + @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._non_pv_generation_system.cooling_fuel_consumption_curve + + @property + def cooling_efficiency_curve(self) -> Union[None, PerformanceCurves]: + """ + Get the heating efficiency curve of the heat generation device + :return: PerformanceCurve + """ + return self._non_pv_generation_system.cooling_efficiency_curve diff --git a/hub/city_model_structure/energy_systems/pv_generation_system.py b/hub/city_model_structure/energy_systems/pv_generation_system.py new file mode 100644 index 00000000..ef915aaf --- /dev/null +++ b/hub/city_model_structure/energy_systems/pv_generation_system.py @@ -0,0 +1,114 @@ +""" +PV generation system definition +SPDX - License - Identifier: LGPL - 3.0 - or -later +Copyright © 2023 Concordia CERC group +Project Coder Pilar Monsalvete Alvarez de Uribarri pilar.monsalvete@concordia.ca +""" + +from hub.city_model_structure.energy_systems.generic_generation_system import GenericGenerationSystem + + +class PvGenerationSystem(GenericGenerationSystem): + """ + PvGenerationSystem class + """ + def __init__(self, generic_pv_generation_system): + super().__init__() + self._generic_pv_generation_system = generic_pv_generation_system + self._electricity_power = None + + @property + def electricity_power(self): + """ + Get electricity_power in W + :return: float + """ + return self._electricity_power + + @electricity_power.setter + def electricity_power(self, value): + """ + Set electricity_power in W + :param value: float + """ + self._electricity_power = value + + @property + def nominal_electricity_output(self): + """ + Get nominal_power_output of electricity generation devices or inverters in W + :return: float + """ + return self._generic_pv_generation_system.nominal_electricity_output + + @property + def electricity_efficiency(self): + """ + Get electricity_efficiency + :return: float + """ + return self._generic_pv_generation_system.electricity_efficiency + + @property + def nominal_ambient_temperature(self): + """ + Get nominal ambient temperature of PV panels in degree Celsius + :return: float + """ + return self._generic_pv_generation_system.nominal_ambient_temperature + + @property + def nominal_cell_temperature(self): + """ + Get nominal cell temperature of PV panels in degree Celsius + :return: float + """ + return self._generic_pv_generation_system.nominal_cell_temperature + + @property + def nominal_radiation(self): + """ + Get nominal radiation of PV panels + :return: float + """ + return self._generic_pv_generation_system.nominal_radiation + + @property + def standard_test_condition_cell_temperature(self): + """ + Get standard test condition cell temperature of PV panels in degree Celsius + :return: float + """ + return self._generic_pv_generation_system.standard_test_condition_cell_temperature + + @property + def standard_test_condition_maximum_power(self): + """ + Get standard test condition maximum power of PV panels in W + :return: float + """ + return self._generic_pv_generation_system.standard_test_condition_maximum_power + + @property + def cell_temperature_coefficient(self): + """ + Get cell temperature coefficient of PV module + :return: float + """ + return self._generic_pv_generation_system.cell_temperature_coefficient + + @property + def width(self): + """ + Get PV module width in m + :return: float + """ + return self._generic_pv_generation_system.width + + @property + def height(self): + """ + Get PV module height in m + :return: float + """ + return self._generic_pv_generation_system.height diff --git a/hub/city_model_structure/energy_systems/thermal_storage_system.py b/hub/city_model_structure/energy_systems/thermal_storage_system.py index 23ee7c54..1dc70c88 100644 --- a/hub/city_model_structure/energy_systems/thermal_storage_system.py +++ b/hub/city_model_structure/energy_systems/thermal_storage_system.py @@ -6,15 +6,12 @@ Project Coder Saeed Ranjbar saeed.ranjbar@concordia.ca Code contributors: Pilar Monsalvete Alvarez de Uribarri pilar.monsalvete@concordia.ca """ -from __future__ import annotations - - -from hub.city_model_structure.energy_systems.generic_storage_system import GenericStorageSystem from hub.city_model_structure.building_demand.layer import Layer class ThermalStorageSystem: - def __init__(self): + def __init__(self, generic_thermal_storage_system): + self._generic_thermal_storage_system = generic_thermal_storage_system self._model_name = None self._manufacturer = None self._volume = None diff --git a/hub/helpers/constants.py b/hub/helpers/constants.py index 0f65aa59..23fab290 100644 --- a/hub/helpers/constants.py +++ b/hub/helpers/constants.py @@ -302,6 +302,7 @@ PHOTOVOLTAIC = 'Photovoltaic' BOILER = 'Boiler' HEAT_PUMP = 'Heat Pump' BASEBOARD = 'Baseboard' +ELECTRICITY_GENERATOR = 'Electricity generator' CHILLER = 'Chiller' SENSIBLE = 'sensible' LATENT = 'Latent' diff --git a/hub/helpers/data/montreal_generation_system_to_hub_energy_generation_system.py b/hub/helpers/data/montreal_generation_system_to_hub_energy_generation_system.py new file mode 100644 index 00000000..776ccd65 --- /dev/null +++ b/hub/helpers/data/montreal_generation_system_to_hub_energy_generation_system.py @@ -0,0 +1,31 @@ +""" +Dictionaries module for Montreal system to hub 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 +""" + +import hub.helpers.constants as cte + + +class MontrealGenerationSystemToHubEnergyGenerationSystem: + """ + Montreal's generation system to hub energy generation system class + """ + def __init__(self): + self._dictionary = { + 'boiler': cte.BOILER, + 'furnace': cte.BASEBOARD, + 'cooler': cte.CHILLER, + 'electricity generator': cte.ELECTRICITY_GENERATOR, + 'PV system': cte.PHOTOVOLTAIC, + 'heat pump': cte.HEAT_PUMP + } + + @property + def dictionary(self) -> dict: + """ + Get the dictionary + :return: {} + """ + return self._dictionary diff --git a/hub/helpers/dictionaries.py b/hub/helpers/dictionaries.py index 561d375e..107a543a 100644 --- a/hub/helpers/dictionaries.py +++ b/hub/helpers/dictionaries.py @@ -19,6 +19,7 @@ from hub.helpers.data.hub_usage_to_hft_usage import HubUsageToHftUsage from hub.helpers.data.hub_usage_to_nrcan_usage import HubUsageToNrcanUsage from hub.helpers.data.hub_usage_to_eilat_usage import HubUsageToEilatUsage from hub.helpers.data.montreal_system_to_hub_energy_generation_system import MontrealSystemToHubEnergyGenerationSystem +from hub.helpers.data.montreal_generation_system_to_hub_energy_generation_system import MontrealGenerationSystemToHubEnergyGenerationSystem from hub.helpers.data.montreal_demand_type_to_hub_energy_demand_type import MontrealDemandTypeToHubEnergyDemandType from hub.helpers.data.hub_function_to_montreal_custom_costs_function import HubFunctionToMontrealCustomCostsFunction from hub.helpers.data.north_america_demand_type_to_hub_energy_demand_type import NorthAmericaDemandTypeToHubEnergyDemandType @@ -154,6 +155,13 @@ class Dictionaries: """ return MontrealCustomFuelToHubFuel().dictionary + @property + def montreal_generation_system_to_hub_energy_generation_system(self): + """ + Get montreal custom generation system names to hub energy system names, transformation dictionary + """ + return MontrealGenerationSystemToHubEnergyGenerationSystem().dictionary + @property def north_america_demand_type_to_hub_energy_demand_type(self): """ diff --git a/hub/imports/energy_systems/montreal_custom_energy_system_parameters.py b/hub/imports/energy_systems/montreal_custom_energy_system_parameters.py index a884309d..972da034 100644 --- a/hub/imports/energy_systems/montreal_custom_energy_system_parameters.py +++ b/hub/imports/energy_systems/montreal_custom_energy_system_parameters.py @@ -11,9 +11,14 @@ import copy from pandas import DataFrame from hub.catalog_factories.energy_systems_catalog_factory import EnergySystemsCatalogFactory -from hub.city_model_structure.energy_systems.generic_distribution_system import GenericDistributionSystem from hub.city_model_structure.energy_systems.generic_energy_system import GenericEnergySystem -from hub.city_model_structure.energy_systems.generic_generation_system import GenericGenerationSystem +from hub.city_model_structure.energy_systems.generic_distribution_system import GenericDistributionSystem +from hub.city_model_structure.energy_systems.generic_non_pv_generation_system import GenericNonPvGenerationSystem +from hub.city_model_structure.energy_systems.generic_pv_generation_system import GenericPvGenerationSystem +from hub.city_model_structure.energy_systems.generic_electrical_storage_system import GenericElectricalStorageSystem +from hub.city_model_structure.energy_systems.generic_thermal_storage_system import GenericThermalStorageSystem +from hub.city_model_structure.energy_systems.generic_emission_system import GenericEmissionSystem + from hub.city_model_structure.energy_systems.energy_system import EnergySystem from hub.city_model_structure.energy_systems.generation_system import GenerationSystem from hub.city_model_structure.energy_systems.distribution_system import DistributionSystem @@ -86,35 +91,58 @@ class MontrealCustomEnergySystemParameters: _hub_demand_types.append(Dictionaries().montreal_demand_type_to_hub_energy_demand_type[demand_type]) energy_system.name = system.name energy_system.demand_types = _hub_demand_types - _generation_system = GenericGenerationSystem() - archetype_generation_equipment = system.generation_systems - _type = system.name - _generation_system.type = Dictionaries().montreal_system_to_hub_energy_generation_system[ - _type] - _fuel_type = Dictionaries().montreal_custom_fuel_to_hub_fuel[archetype_generation_equipment.fuel_type] - _generation_system.fuel_type = _fuel_type - _generation_system.source_types = archetype_generation_equipment.source_medium - _generation_system.heat_efficiency = archetype_generation_equipment.heat_efficiency - _generation_system.cooling_efficiency = archetype_generation_equipment.cooling_efficiency - _generation_system.electricity_efficiency = archetype_generation_equipment.electricity_efficiency - _generation_system.source_temperature = archetype_generation_equipment.source_temperature - _generation_system.source_mass_flow = archetype_generation_equipment.source_mass_flow - _generation_system.storage = archetype_generation_equipment.storage - _generation_system.auxiliary_equipment = None - energy_system.generation_systems = _generation_system + _generation_systems = [] + for catalog_generation_system in system.generation_systems: + if catalog_generation_system.system_type == 'PV system': + _generation_system = GenericPvGenerationSystem() + _type = 'PV system' + _generation_system.type = Dictionaries().montreal_generation_system_to_hub_energy_generation_system[_type] + _fuel_type = Dictionaries().montreal_custom_fuel_to_hub_fuel[catalog_generation_system.fuel_type] + _generation_system.fuel_type = _fuel_type + _generation_system.electricity_efficiency = catalog_generation_system.electricity_efficiency + _generic_storage_system = None + if catalog_generation_system.energy_storage_systems is not None: + _generic_storage_system = GenericElectricalStorageSystem() + _generic_storage_system.type_energy_stored = 'electrical' + _generation_system.generic_storage_systems = [_generic_storage_system] + else: + _generation_system = GenericNonPvGenerationSystem() + _type = catalog_generation_system.system_type + _generation_system.type = Dictionaries().montreal_generation_system_to_hub_energy_generation_system[_type] + _fuel_type = Dictionaries().montreal_custom_fuel_to_hub_fuel[catalog_generation_system.fuel_type] + _generation_system.fuel_type = _fuel_type + _generation_system.source_types = catalog_generation_system.source_medium + _generation_system.heat_efficiency = catalog_generation_system.heat_efficiency + _generation_system.cooling_efficiency = catalog_generation_system.cooling_efficiency + _generation_system.electricity_efficiency = catalog_generation_system.electricity_efficiency + _generic_storage_system = None + if catalog_generation_system.energy_storage_systems is not None: + if catalog_generation_system.energy_storage_systems.type_energy_stored == 'electrical': + _generic_storage_system = GenericElectricalStorageSystem() + _generic_storage_system.type_energy_stored = 'electrical' + else: + _generic_storage_system = GenericThermalStorageSystem() + _generic_storage_system.type_energy_stored = 'thermal' + _generation_system.generic_storage_systems = [_generic_storage_system] + _generation_systems.append(_generation_system) + energy_system.generation_systems = _generation_systems - _distribution_system = GenericDistributionSystem() - archetype_distribution_equipment = system.distribution_systems - _distribution_system.type = archetype_distribution_equipment.type - _distribution_system.supply_temperature = archetype_distribution_equipment.supply_temperature - _distribution_system.distribution_consumption_fix_flow = \ - archetype_distribution_equipment.distribution_consumption_fix_flow - _distribution_system.distribution_consumption_variable_flow = \ - archetype_distribution_equipment.distribution_consumption_variable_flow - _distribution_system.heat_losses = archetype_distribution_equipment.heat_losses - - energy_system.distribution_systems = _distribution_system + _distribution_systems = [] + for catalog_distribution_system in system.distribution_systems: + _distribution_system = GenericDistributionSystem() + _distribution_system.type = catalog_distribution_system.type + _distribution_system.distribution_consumption_fix_flow = \ + catalog_distribution_system.distribution_consumption_fix_flow + _distribution_system.distribution_consumption_variable_flow = \ + catalog_distribution_system.distribution_consumption_variable_flow + _distribution_system.heat_losses = catalog_distribution_system.heat_losses + _emission_system = None + if catalog_distribution_system.emission_systems is not None: + _emission_system = GenericEmissionSystem() + _distribution_system.generic_emission_systems = [_emission_system] + _distribution_systems.append(_distribution_system) + energy_system.distribution_systems = _distribution_systems building_systems.append(energy_system)