2020-10-28 13:42:58 -04:00
|
|
|
"""
|
|
|
|
ThermalZone module
|
|
|
|
SPDX - License - Identifier: LGPL - 3.0 - or -later
|
|
|
|
Copyright © 2020 Project Author Guille Gutierrez guillermo.gutierrezmorote@concordia.ca
|
2021-04-07 11:47:39 -04:00
|
|
|
Contributors Pilar Monsalvete Alvarez de Uribarri pilar.monsalvete@concordia.ca
|
2020-10-28 13:42:58 -04:00
|
|
|
"""
|
2021-03-26 12:53:27 -04:00
|
|
|
import uuid
|
2022-03-08 19:19:52 -05:00
|
|
|
from typing import List, Union, Tuple, TypeVar
|
2021-08-06 12:28:20 -04:00
|
|
|
from city_model_structure.building_demand.usage_zone import UsageZone
|
2022-03-08 19:19:52 -05:00
|
|
|
from city_model_structure.building_demand.thermal_control import ThermalControl
|
|
|
|
from city_model_structure.energy_systems.hvac_system import HvacSystem
|
|
|
|
from city_model_structure.attributes.schedule import Schedule
|
2020-10-28 13:42:58 -04:00
|
|
|
|
|
|
|
ThermalBoundary = TypeVar('ThermalBoundary')
|
|
|
|
|
|
|
|
|
|
|
|
class ThermalZone:
|
|
|
|
"""
|
|
|
|
ThermalZone class
|
|
|
|
"""
|
2022-03-08 19:19:52 -05:00
|
|
|
def __init__(self, thermal_boundaries, volume, floor_area):
|
|
|
|
self._id = None
|
|
|
|
self._floor_area = floor_area
|
2021-08-26 11:00:59 -04:00
|
|
|
self._thermal_boundaries = thermal_boundaries
|
2021-03-02 18:57:09 -05:00
|
|
|
self._additional_thermal_bridge_u_value = None
|
2020-10-28 13:42:58 -04:00
|
|
|
self._effective_thermal_capacity = None
|
2021-03-02 18:57:09 -05:00
|
|
|
self._indirectly_heated_area_ratio = None
|
|
|
|
self._infiltration_rate_system_on = None
|
2020-10-28 13:42:58 -04:00
|
|
|
self._infiltration_rate_system_off = None
|
2022-03-08 19:19:52 -05:00
|
|
|
self._usage_zones = None
|
2021-08-11 16:38:06 -04:00
|
|
|
self._volume = volume
|
2021-08-27 17:20:24 -04:00
|
|
|
self._ordinate_number = None
|
2022-03-08 19:19:52 -05:00
|
|
|
self._thermal_control = None
|
|
|
|
self._hvac_system = None
|
2021-03-26 12:53:27 -04:00
|
|
|
|
|
|
|
@property
|
|
|
|
def id(self):
|
2021-06-09 14:23:45 -04:00
|
|
|
"""
|
|
|
|
Get thermal zone id, an universally unique identifier randomly generated
|
|
|
|
:return: str
|
|
|
|
"""
|
2021-03-26 12:53:27 -04:00
|
|
|
if self._id is None:
|
|
|
|
self._id = uuid.uuid4()
|
|
|
|
return self._id
|
2021-03-02 18:57:09 -05:00
|
|
|
|
2021-03-16 12:19:35 -04:00
|
|
|
@property
|
2022-03-08 19:19:52 -05:00
|
|
|
def floor_area(self) -> float:
|
2020-10-28 13:42:58 -04:00
|
|
|
"""
|
2021-01-08 16:08:29 -05:00
|
|
|
Get thermal zone floor area in m2
|
2020-10-28 13:42:58 -04:00
|
|
|
:return: float
|
|
|
|
"""
|
|
|
|
return self._floor_area
|
|
|
|
|
|
|
|
@property
|
2021-08-26 11:00:59 -04:00
|
|
|
def thermal_boundaries(self) -> List[ThermalBoundary]:
|
2020-10-28 13:42:58 -04:00
|
|
|
"""
|
|
|
|
Get thermal boundaries bounding with the thermal zone
|
|
|
|
:return: [ThermalBoundary]
|
|
|
|
"""
|
2021-08-26 11:00:59 -04:00
|
|
|
return self._thermal_boundaries
|
2020-10-28 13:42:58 -04:00
|
|
|
|
|
|
|
@property
|
2021-09-14 13:46:48 -04:00
|
|
|
def additional_thermal_bridge_u_value(self) -> Union[None, float]:
|
2020-10-28 13:42:58 -04:00
|
|
|
"""
|
|
|
|
Get thermal zone additional thermal bridge u value W/m2K
|
2021-09-14 13:46:48 -04:00
|
|
|
:return: None or float
|
2020-10-28 13:42:58 -04:00
|
|
|
"""
|
|
|
|
return self._additional_thermal_bridge_u_value
|
|
|
|
|
|
|
|
@additional_thermal_bridge_u_value.setter
|
|
|
|
def additional_thermal_bridge_u_value(self, value):
|
|
|
|
"""
|
|
|
|
Set thermal zone additional thermal bridge u value W/m2K
|
|
|
|
:param value: float
|
|
|
|
"""
|
2021-09-14 13:46:48 -04:00
|
|
|
if value is not None:
|
|
|
|
self._additional_thermal_bridge_u_value = float(value)
|
2020-10-28 13:42:58 -04:00
|
|
|
|
|
|
|
@property
|
2021-09-14 13:46:48 -04:00
|
|
|
def effective_thermal_capacity(self) -> Union[None, float]:
|
2020-10-28 13:42:58 -04:00
|
|
|
"""
|
2021-01-08 16:08:29 -05:00
|
|
|
Get thermal zone effective thermal capacity in J/m2K
|
2021-09-14 13:46:48 -04:00
|
|
|
:return: None or float
|
2020-10-28 13:42:58 -04:00
|
|
|
"""
|
|
|
|
return self._effective_thermal_capacity
|
|
|
|
|
|
|
|
@effective_thermal_capacity.setter
|
|
|
|
def effective_thermal_capacity(self, value):
|
|
|
|
"""
|
2021-01-08 16:08:29 -05:00
|
|
|
Set thermal zone effective thermal capacity in J/m2K
|
2020-10-28 13:42:58 -04:00
|
|
|
:param value: float
|
|
|
|
"""
|
2021-09-14 13:46:48 -04:00
|
|
|
if value is not None:
|
|
|
|
self._effective_thermal_capacity = float(value)
|
2020-10-28 13:42:58 -04:00
|
|
|
|
|
|
|
@property
|
2021-09-14 13:46:48 -04:00
|
|
|
def indirectly_heated_area_ratio(self) -> Union[None, float]:
|
2020-10-28 13:42:58 -04:00
|
|
|
"""
|
|
|
|
Get thermal zone indirectly heated area ratio
|
2021-09-14 13:46:48 -04:00
|
|
|
:return: None or float
|
2020-10-28 13:42:58 -04:00
|
|
|
"""
|
|
|
|
return self._indirectly_heated_area_ratio
|
|
|
|
|
|
|
|
@indirectly_heated_area_ratio.setter
|
|
|
|
def indirectly_heated_area_ratio(self, value):
|
|
|
|
"""
|
|
|
|
Set thermal zone indirectly heated area ratio
|
|
|
|
:param value: float
|
|
|
|
"""
|
2021-09-14 13:46:48 -04:00
|
|
|
if value is not None:
|
|
|
|
self._indirectly_heated_area_ratio = float(value)
|
2020-10-28 13:42:58 -04:00
|
|
|
|
|
|
|
@property
|
2022-03-08 19:19:52 -05:00
|
|
|
def infiltration_rate_system_on(self) -> Union[None, Schedule]:
|
2020-10-28 13:42:58 -04:00
|
|
|
"""
|
2021-01-08 16:08:29 -05:00
|
|
|
Get thermal zone infiltration rate system on in air changes per hour (ACH)
|
2022-03-08 19:19:52 -05:00
|
|
|
:return: None or Schedule
|
2020-10-28 13:42:58 -04:00
|
|
|
"""
|
|
|
|
return self._infiltration_rate_system_on
|
|
|
|
|
|
|
|
@infiltration_rate_system_on.setter
|
|
|
|
def infiltration_rate_system_on(self, value):
|
|
|
|
"""
|
2021-01-08 16:08:29 -05:00
|
|
|
Set thermal zone infiltration rate system on in air changes per hour (ACH)
|
2022-03-08 19:19:52 -05:00
|
|
|
:param value: Schedule
|
2020-10-28 13:42:58 -04:00
|
|
|
"""
|
2022-03-08 19:19:52 -05:00
|
|
|
self._infiltration_rate_system_on = value
|
2020-10-28 13:42:58 -04:00
|
|
|
|
|
|
|
@property
|
2022-03-08 19:19:52 -05:00
|
|
|
def infiltration_rate_system_off(self) -> Union[None, Schedule]:
|
2020-10-28 13:42:58 -04:00
|
|
|
"""
|
2021-01-08 16:08:29 -05:00
|
|
|
Get thermal zone infiltration rate system off in air changes per hour (ACH)
|
2022-03-08 19:19:52 -05:00
|
|
|
:return: None or Schedule
|
2020-10-28 13:42:58 -04:00
|
|
|
"""
|
|
|
|
return self._infiltration_rate_system_off
|
|
|
|
|
|
|
|
@infiltration_rate_system_off.setter
|
|
|
|
def infiltration_rate_system_off(self, value):
|
|
|
|
"""
|
2021-01-08 16:08:29 -05:00
|
|
|
Set thermal zone infiltration rate system on in air changes per hour (ACH)
|
2022-03-08 19:19:52 -05:00
|
|
|
:param value: Schedule
|
2020-10-28 13:42:58 -04:00
|
|
|
"""
|
2022-03-08 19:19:52 -05:00
|
|
|
self._infiltration_rate_system_off = value
|
2020-10-28 13:42:58 -04:00
|
|
|
|
|
|
|
@property
|
2022-03-08 19:19:52 -05:00
|
|
|
def usage_zones(self) -> Tuple[float, UsageZone]:
|
2020-10-28 13:42:58 -04:00
|
|
|
"""
|
2022-03-08 19:19:52 -05:00
|
|
|
Get list of usage zones and the percentage of thermal zone's volume affected by that usage
|
2020-10-28 13:42:58 -04:00
|
|
|
:return: [UsageZone]
|
|
|
|
"""
|
|
|
|
return self._usage_zones
|
|
|
|
|
|
|
|
@usage_zones.setter
|
|
|
|
def usage_zones(self, values):
|
|
|
|
"""
|
2022-03-08 19:19:52 -05:00
|
|
|
Set list of usage zones and the percentage of thermal zone's volume affected by that usage
|
|
|
|
:param values: Tuple[float, UsageZone]
|
2020-10-28 13:42:58 -04:00
|
|
|
"""
|
|
|
|
self._usage_zones = values
|
2021-03-15 12:44:33 -04:00
|
|
|
|
|
|
|
@property
|
|
|
|
def volume(self):
|
|
|
|
"""
|
|
|
|
Get thermal zone volume
|
|
|
|
:return: float
|
|
|
|
"""
|
|
|
|
return self._volume
|
|
|
|
|
2021-08-27 17:20:24 -04:00
|
|
|
@property
|
2021-09-14 13:46:48 -04:00
|
|
|
def ordinate_number(self) -> Union[None, int]:
|
2021-08-27 17:20:24 -04:00
|
|
|
"""
|
2021-08-30 14:39:24 -04:00
|
|
|
Get the order in which the thermal_zones need to be enumerated
|
2021-09-14 13:46:48 -04:00
|
|
|
:return: None or int
|
2021-08-27 17:20:24 -04:00
|
|
|
"""
|
|
|
|
return self._ordinate_number
|
|
|
|
|
|
|
|
@ordinate_number.setter
|
|
|
|
def ordinate_number(self, value):
|
|
|
|
"""
|
2021-08-30 14:39:24 -04:00
|
|
|
Set a specific order of the zones to be called
|
2021-08-27 17:20:24 -04:00
|
|
|
:param value: int
|
|
|
|
"""
|
2021-09-14 13:46:48 -04:00
|
|
|
if value is not None:
|
|
|
|
self._ordinate_number = int(value)
|
2022-03-08 19:19:52 -05:00
|
|
|
|
|
|
|
@property
|
|
|
|
def thermal_control(self) -> Union[None, ThermalControl]:
|
|
|
|
"""
|
|
|
|
Get thermal control of this thermal zone
|
|
|
|
:return: None or ThermalControl
|
|
|
|
"""
|
|
|
|
return self._thermal_control
|
|
|
|
|
|
|
|
@thermal_control.setter
|
|
|
|
def thermal_control(self, value):
|
|
|
|
"""
|
|
|
|
Set thermal control for this thermal zone
|
|
|
|
:param value: ThermalControl
|
|
|
|
"""
|
|
|
|
self._thermal_control = value
|
|
|
|
|
|
|
|
@property
|
|
|
|
def hvac_system(self) -> Union[None, HvacSystem]:
|
|
|
|
"""
|
|
|
|
Get HVAC system installed for this thermal zone
|
|
|
|
:return: None or HvacSystem
|
|
|
|
"""
|
|
|
|
return self._hvac_system
|
|
|
|
|
|
|
|
@hvac_system.setter
|
|
|
|
def hvac_system(self, value):
|
|
|
|
"""
|
|
|
|
Set HVAC system installed for this thermal zone
|
|
|
|
:param value: HvacSystem
|
|
|
|
"""
|
|
|
|
self._hvac_system = value
|