modifications in classes for energyADE
This commit is contained in:
parent
b8e5d74e39
commit
4e4875392f
|
@ -1,149 +0,0 @@
|
||||||
"""
|
|
||||||
Building module
|
|
||||||
SPDX - License - Identifier: LGPL - 3.0 - or -later
|
|
||||||
Copyright © 2020 Project Author Sanam Dabirian sanam.dabirian@mail.concordia.ca
|
|
||||||
Contributors Pilar Monsalvete pilar_monsalvete@yahoo.es
|
|
||||||
"""
|
|
||||||
|
|
||||||
import calendar as cal
|
|
||||||
|
|
||||||
|
|
||||||
class Occupancy:
|
|
||||||
"""
|
|
||||||
Occupancy class
|
|
||||||
"""
|
|
||||||
|
|
||||||
def __init__(self):
|
|
||||||
"""
|
|
||||||
Constructor
|
|
||||||
"""
|
|
||||||
|
|
||||||
self._internal_heat_gain = None
|
|
||||||
self._heat_dissipation = None
|
|
||||||
self._occupant_rate = None
|
|
||||||
self._occupant_type = None
|
|
||||||
self._occupant_zone = None
|
|
||||||
self._occupant_schedule = None
|
|
||||||
self._number_of_occupants = None
|
|
||||||
self._arrival_time = None
|
|
||||||
self._departure_time = None
|
|
||||||
self._break_time = None
|
|
||||||
self._day_of_week = None
|
|
||||||
self._pd_of_meetings_duration = None
|
|
||||||
self._complete_year_schedule = None
|
|
||||||
|
|
||||||
@property
|
|
||||||
def internal_heat_gain(self):
|
|
||||||
"""
|
|
||||||
Get internal heat gain of occupants
|
|
||||||
:return: occupant heat gain
|
|
||||||
"""
|
|
||||||
return self._internal_heat_gain
|
|
||||||
|
|
||||||
@property
|
|
||||||
def heat_dissipation(self):
|
|
||||||
"""
|
|
||||||
Get heat dissipation of occupants
|
|
||||||
:return: heat dissipation
|
|
||||||
"""
|
|
||||||
return self._heat_dissipation
|
|
||||||
|
|
||||||
@property
|
|
||||||
def occupant_rate(self):
|
|
||||||
"""
|
|
||||||
Get rate of occupancy
|
|
||||||
:return: rate of occupancy
|
|
||||||
"""
|
|
||||||
return self._occupant_rate
|
|
||||||
|
|
||||||
@property
|
|
||||||
def occupant_type(self):
|
|
||||||
"""
|
|
||||||
Get type of occupancy
|
|
||||||
:return: type of occupancy
|
|
||||||
"""
|
|
||||||
return self._occupant_type
|
|
||||||
|
|
||||||
@property
|
|
||||||
def occupant_zone(self):
|
|
||||||
"""
|
|
||||||
Get the zone that occupant is in it
|
|
||||||
:return: occupant zone
|
|
||||||
"""
|
|
||||||
return self._occupant_zone
|
|
||||||
|
|
||||||
@property
|
|
||||||
def occupant_schedule(self):
|
|
||||||
"""
|
|
||||||
Get the schedule when an occupant is in a zone
|
|
||||||
:return: occupant schedule
|
|
||||||
"""
|
|
||||||
return self._occupant_schedule
|
|
||||||
|
|
||||||
@property
|
|
||||||
def number_of_occupants(self):
|
|
||||||
"""
|
|
||||||
Get the number of occupants
|
|
||||||
:return: number of occupants
|
|
||||||
"""
|
|
||||||
return self._number_of_occupants
|
|
||||||
|
|
||||||
@property
|
|
||||||
def arrival_time(self):
|
|
||||||
"""
|
|
||||||
Get the arrival time of the occupant (for office building)
|
|
||||||
:return: arrival time
|
|
||||||
"""
|
|
||||||
return self._arrival_time
|
|
||||||
|
|
||||||
@property
|
|
||||||
def departure_time(self):
|
|
||||||
"""
|
|
||||||
Get the departure time of the occupant (for office building)
|
|
||||||
:return: departure time
|
|
||||||
"""
|
|
||||||
return self._departure_time
|
|
||||||
|
|
||||||
@property
|
|
||||||
def break_time(self):
|
|
||||||
"""
|
|
||||||
Get the lunch or break time of the occupant (for office building)
|
|
||||||
:return: break time
|
|
||||||
"""
|
|
||||||
return self._break_time
|
|
||||||
|
|
||||||
@property
|
|
||||||
def day_of_week(self):
|
|
||||||
"""
|
|
||||||
Get the day of the week
|
|
||||||
:return: day of the week
|
|
||||||
"""
|
|
||||||
return self._day_of_week
|
|
||||||
|
|
||||||
@property
|
|
||||||
def pd_of_meetings_duration(self):
|
|
||||||
"""
|
|
||||||
Get the probability distribution of the meeting duration
|
|
||||||
:return: probability distribution of the meeting duration
|
|
||||||
"""
|
|
||||||
return self._pd_of_meetings_duration
|
|
||||||
|
|
||||||
def get_complete_year_schedule(self, schedules):
|
|
||||||
if self._complete_year_schedule is None:
|
|
||||||
self._complete_year_schedule = []
|
|
||||||
for i in range(1, 13):
|
|
||||||
month_range = cal.monthrange(2015, i)
|
|
||||||
for day in range(1, month_range[1]+1):
|
|
||||||
if cal.weekday(2015, i, day) < 5:
|
|
||||||
for j in range(0, 24):
|
|
||||||
week_schedule = schedules['WD'][j]
|
|
||||||
self._complete_year_schedule.append(week_schedule)
|
|
||||||
elif cal.weekday(2015, i, day) == 5:
|
|
||||||
for j in range(0, 24):
|
|
||||||
week_schedule = schedules['Sat'][j]
|
|
||||||
self._complete_year_schedule.append(week_schedule)
|
|
||||||
else:
|
|
||||||
for j in range(0, 24):
|
|
||||||
week_schedule = schedules['Sun'][j]
|
|
||||||
self._complete_year_schedule.append(week_schedule)
|
|
||||||
return self._complete_year_schedule
|
|
240
city_model_structure/attributes/occupants.py
Normal file
240
city_model_structure/attributes/occupants.py
Normal file
|
@ -0,0 +1,240 @@
|
||||||
|
"""
|
||||||
|
Occupants module
|
||||||
|
SPDX - License - Identifier: LGPL - 3.0 - or -later
|
||||||
|
Copyright © 2020 Project Author Sanam Dabirian sanam.dabirian@mail.concordia.ca
|
||||||
|
Contributors Pilar Monsalvete Álvarez de Uribarri pilar.monsalvete@concordia.ca
|
||||||
|
"""
|
||||||
|
|
||||||
|
import calendar as cal
|
||||||
|
from city_model_structure.attributes.usage_zone import UsageZone
|
||||||
|
|
||||||
|
|
||||||
|
class Occupants:
|
||||||
|
"""
|
||||||
|
Occupants class
|
||||||
|
"""
|
||||||
|
|
||||||
|
def __init__(self):
|
||||||
|
"""
|
||||||
|
Constructor
|
||||||
|
"""
|
||||||
|
|
||||||
|
self._internal_heat_gain = None
|
||||||
|
self._heat_dissipation = None
|
||||||
|
self._occupancy_rate = None
|
||||||
|
self._occupant_type = None
|
||||||
|
self._occupant_zone = None
|
||||||
|
self._occupant_schedule = None
|
||||||
|
self._number_of_occupants = None
|
||||||
|
self._arrival_time = None
|
||||||
|
self._departure_time = None
|
||||||
|
self._break_time = None
|
||||||
|
self._day_of_week = None
|
||||||
|
self._pd_of_meetings_duration = None
|
||||||
|
self._complete_year_schedule = None
|
||||||
|
|
||||||
|
@property
|
||||||
|
def internal_heat_gain(self):
|
||||||
|
"""
|
||||||
|
Get internal heat gain of occupants in W/person
|
||||||
|
:return: float
|
||||||
|
"""
|
||||||
|
return self._internal_heat_gain
|
||||||
|
|
||||||
|
@internal_heat_gain.setter
|
||||||
|
def internal_heat_gain(self, value):
|
||||||
|
"""
|
||||||
|
Set internal heat gain of occupants in W/person
|
||||||
|
:param value: float
|
||||||
|
:return:
|
||||||
|
"""
|
||||||
|
self._internal_heat_gain = value
|
||||||
|
|
||||||
|
@property
|
||||||
|
def heat_dissipation(self):
|
||||||
|
"""
|
||||||
|
Get heat dissipation of occupants in W/person
|
||||||
|
:return: float
|
||||||
|
"""
|
||||||
|
return self._heat_dissipation
|
||||||
|
|
||||||
|
@heat_dissipation.setter
|
||||||
|
def heat_dissipation(self, value):
|
||||||
|
"""
|
||||||
|
Set heat dissipation of occupants in W/person
|
||||||
|
:param value: float
|
||||||
|
:return:
|
||||||
|
"""
|
||||||
|
self._heat_dissipation = value
|
||||||
|
|
||||||
|
@property
|
||||||
|
def occupancy_rate(self):
|
||||||
|
"""
|
||||||
|
Get rate of occupancy
|
||||||
|
:return: float
|
||||||
|
"""
|
||||||
|
return self._occupancy_rate
|
||||||
|
|
||||||
|
@occupancy_rate.setter
|
||||||
|
def occupancy_rate(self, value):
|
||||||
|
"""
|
||||||
|
Set rate of occupancy
|
||||||
|
:param value: float
|
||||||
|
:return:
|
||||||
|
"""
|
||||||
|
self._occupancy_rate = value
|
||||||
|
|
||||||
|
@property
|
||||||
|
def occupant_type(self):
|
||||||
|
"""
|
||||||
|
Get type of occupancy
|
||||||
|
:return: string
|
||||||
|
"""
|
||||||
|
return self._occupant_type
|
||||||
|
|
||||||
|
@occupant_type.setter
|
||||||
|
def occupant_type(self, value):
|
||||||
|
"""
|
||||||
|
Set type of occupancy
|
||||||
|
:param value: float
|
||||||
|
:return:
|
||||||
|
"""
|
||||||
|
self._occupant_type = value
|
||||||
|
|
||||||
|
@property
|
||||||
|
def occupant_zone(self) -> UsageZone:
|
||||||
|
"""
|
||||||
|
Get the zone an occupant is in
|
||||||
|
:return: UsageZone
|
||||||
|
"""
|
||||||
|
return self._occupant_zone
|
||||||
|
|
||||||
|
@property
|
||||||
|
def occupant_schedule(self):
|
||||||
|
"""
|
||||||
|
Get the schedule when an occupant is in a zone (24 values, 1 per hour of the day)
|
||||||
|
:return: [float]
|
||||||
|
"""
|
||||||
|
return self._occupant_schedule
|
||||||
|
|
||||||
|
@occupant_schedule.setter
|
||||||
|
def occupant_schedule(self, value):
|
||||||
|
"""
|
||||||
|
Set the schedule when an occupant is in a zone (24 values, 1 per hour of the day)
|
||||||
|
:param value: [float]
|
||||||
|
:return:
|
||||||
|
"""
|
||||||
|
self._occupant_schedule = value
|
||||||
|
|
||||||
|
@property
|
||||||
|
def number_of_occupants(self):
|
||||||
|
"""
|
||||||
|
Get the number of occupants
|
||||||
|
:return: int
|
||||||
|
"""
|
||||||
|
return self._number_of_occupants
|
||||||
|
|
||||||
|
@number_of_occupants.setter
|
||||||
|
def number_of_occupants(self, value):
|
||||||
|
"""
|
||||||
|
Set the number of occupants
|
||||||
|
:param value: int
|
||||||
|
:return:
|
||||||
|
"""
|
||||||
|
self._number_of_occupants = value
|
||||||
|
|
||||||
|
@property
|
||||||
|
def arrival_time(self):
|
||||||
|
"""
|
||||||
|
Get the arrival time of the occupant (for office building) in UTC with format YYYYMMDD HH:mm:ss
|
||||||
|
:return: time
|
||||||
|
"""
|
||||||
|
return self._arrival_time
|
||||||
|
|
||||||
|
@arrival_time.setter
|
||||||
|
def arrival_time(self, value):
|
||||||
|
"""
|
||||||
|
Set the arrival time of the occupant (for office building) in UTC with format YYYYMMDD HH:mm:ss
|
||||||
|
:param value: time
|
||||||
|
:return:
|
||||||
|
"""
|
||||||
|
self._arrival_time = value
|
||||||
|
|
||||||
|
@property
|
||||||
|
def departure_time(self):
|
||||||
|
"""
|
||||||
|
Get the departure time of the occupant (for office building) in UTC with format YYYYMMDD HH:mm:ss
|
||||||
|
:return: time
|
||||||
|
"""
|
||||||
|
return self._departure_time
|
||||||
|
|
||||||
|
@departure_time.setter
|
||||||
|
def departure_time(self, value):
|
||||||
|
"""
|
||||||
|
Set the departure time of the occupant (for office building) in UTC with format YYYYMMDD HH:mm:ss
|
||||||
|
:param value: time
|
||||||
|
:return:
|
||||||
|
"""
|
||||||
|
self._departure_time = value
|
||||||
|
|
||||||
|
@property
|
||||||
|
def break_time(self):
|
||||||
|
"""
|
||||||
|
Get the lunch or break time of the occupant (for office building) in UTC with format ????
|
||||||
|
:return: break time
|
||||||
|
"""
|
||||||
|
# todo @Sanam: define this format, is it the starting time? is it a list with both, starting and ending time?
|
||||||
|
return self._break_time
|
||||||
|
|
||||||
|
@property
|
||||||
|
def day_of_week(self):
|
||||||
|
"""
|
||||||
|
Get the day of the week (MON, TUE, WED, THU, FRI, SAT, SUN)
|
||||||
|
:return: string
|
||||||
|
"""
|
||||||
|
# todo @Sanam: is this a property or should it be a function
|
||||||
|
# to get the day of the week of an specific day of the year?
|
||||||
|
return self._day_of_week
|
||||||
|
|
||||||
|
@property
|
||||||
|
def pd_of_meetings_duration(self):
|
||||||
|
"""
|
||||||
|
Get the probability distribution of the meeting duration
|
||||||
|
:return: ??
|
||||||
|
"""
|
||||||
|
# todo @Sanam: what format are you expecting here??
|
||||||
|
return self._pd_of_meetings_duration
|
||||||
|
|
||||||
|
@pd_of_meetings_duration.setter
|
||||||
|
def pd_of_meetings_duration(self, value):
|
||||||
|
"""
|
||||||
|
Get the probability distribution of the meeting duration
|
||||||
|
:param value: ??
|
||||||
|
:return:
|
||||||
|
"""
|
||||||
|
# todo @Sanam: what format are you expecting here??
|
||||||
|
self._pd_of_meetings_duration = value
|
||||||
|
|
||||||
|
def get_complete_year_schedule(self, schedules):
|
||||||
|
"""
|
||||||
|
Get the a non-leap year (8760 h), starting on Monday schedule out of archetypal days of week
|
||||||
|
:return: [float]
|
||||||
|
"""
|
||||||
|
if self._complete_year_schedule is None:
|
||||||
|
self._complete_year_schedule = []
|
||||||
|
for i in range(1, 13):
|
||||||
|
month_range = cal.monthrange(2018, i)
|
||||||
|
for day in range(1, month_range[1]+1):
|
||||||
|
if cal.weekday(2018, i, day) < 5:
|
||||||
|
for j in range(0, 24):
|
||||||
|
week_schedule = schedules['WD'][j]
|
||||||
|
self._complete_year_schedule.append(week_schedule)
|
||||||
|
elif cal.weekday(2018, i, day) == 5:
|
||||||
|
for j in range(0, 24):
|
||||||
|
week_schedule = schedules['Sat'][j]
|
||||||
|
self._complete_year_schedule.append(week_schedule)
|
||||||
|
else:
|
||||||
|
for j in range(0, 24):
|
||||||
|
week_schedule = schedules['Sun'][j]
|
||||||
|
self._complete_year_schedule.append(week_schedule)
|
||||||
|
return self._complete_year_schedule
|
|
@ -4,12 +4,13 @@ SPDX - License - Identifier: LGPL - 3.0 - or -later
|
||||||
Copyright © 2020 Project Author Guille Gutierrez guillermo.gutierrezmorote@concordia.ca
|
Copyright © 2020 Project Author Guille Gutierrez guillermo.gutierrezmorote@concordia.ca
|
||||||
Contributors Pilar Monsalvete Álvarez de Uribarri pilar.monsalvete@concordia.ca
|
Contributors Pilar Monsalvete Álvarez de Uribarri pilar.monsalvete@concordia.ca
|
||||||
"""
|
"""
|
||||||
from typing import List
|
from typing import List, TypeVar
|
||||||
from city_model_structure.attributes.layer import Layer
|
from city_model_structure.attributes.layer import Layer
|
||||||
from city_model_structure.attributes.thermal_opening import ThermalOpening
|
from city_model_structure.attributes.thermal_opening import ThermalOpening
|
||||||
from city_model_structure.attributes.thermal_zone import ThermalZone
|
|
||||||
from city_model_structure.attributes.surface import Surface
|
from city_model_structure.attributes.surface import Surface
|
||||||
|
|
||||||
|
ThermalZone = TypeVar('ThermalZone')
|
||||||
|
|
||||||
|
|
||||||
class ThermalBoundary:
|
class ThermalBoundary:
|
||||||
"""
|
"""
|
||||||
|
@ -24,26 +25,21 @@ class ThermalBoundary:
|
||||||
self._outside_solar_absorptance = None
|
self._outside_solar_absorptance = None
|
||||||
self._outside_thermal_absorptance = None
|
self._outside_thermal_absorptance = None
|
||||||
self._outside_visible_absorptance = None
|
self._outside_visible_absorptance = None
|
||||||
self._window_ratio = None
|
|
||||||
self._u_value = None
|
self._u_value = None
|
||||||
# todo: no sense -> window area in thermal opening?? Check in geometry_factory -> due to the definition of
|
|
||||||
# window as surface_area * window_ratio
|
|
||||||
self._window_area = None
|
|
||||||
self._shortwave_reflectance = None
|
self._shortwave_reflectance = None
|
||||||
self._construction_name = None
|
self._construction_name = None
|
||||||
self._hi = None
|
self._hi = None
|
||||||
self._he = None
|
self._he = None
|
||||||
|
self._window_ratio = None
|
||||||
# todo: to discuss with @Guille
|
|
||||||
self._azimuth = None
|
|
||||||
self._inclination = None
|
|
||||||
self._area = None
|
|
||||||
self._refurbishment_measure = None
|
self._refurbishment_measure = None
|
||||||
|
|
||||||
# todo: to discuss with @Guille: 1. emissivity is a function of absorptance
|
# todo: to discuss with @Guille: 1. emissivity is a function of absorptance
|
||||||
# 2. pg 17: fraction and surface -> NO
|
# 2. pg 17: fraction and surface -> NO
|
||||||
self._emissivity = None
|
self._emissivity = None
|
||||||
|
|
||||||
|
# todo: @Guille
|
||||||
|
self._polygon = None
|
||||||
|
|
||||||
@property
|
@property
|
||||||
def surface(self) -> Surface:
|
def surface(self) -> Surface:
|
||||||
"""
|
"""
|
||||||
|
@ -224,24 +220,6 @@ class ThermalBoundary:
|
||||||
"""
|
"""
|
||||||
self._window_ratio = value
|
self._window_ratio = value
|
||||||
|
|
||||||
@property
|
|
||||||
def window_area(self):
|
|
||||||
"""
|
|
||||||
Thermal boundary window area in square meters
|
|
||||||
:return: float
|
|
||||||
"""
|
|
||||||
if self._window_area is None:
|
|
||||||
try:
|
|
||||||
if self.surface.hole_polygons is None:
|
|
||||||
self._window_area = float(self.surface.perimeter_polygon.area) * float(self.window_ratio)
|
|
||||||
else:
|
|
||||||
self._window_area = 0
|
|
||||||
for hole_polygon in self.surface.hole_polygons:
|
|
||||||
self._window_area += hole_polygon.area
|
|
||||||
except TypeError:
|
|
||||||
raise Exception('Window ratio is not defined or invalid surface area')
|
|
||||||
return self._window_area
|
|
||||||
|
|
||||||
# todo: what if I just want to assign a number??
|
# todo: what if I just want to assign a number??
|
||||||
@property
|
@property
|
||||||
def u_value(self):
|
def u_value(self):
|
||||||
|
|
|
@ -2,7 +2,7 @@
|
||||||
ThermalOpening module
|
ThermalOpening module
|
||||||
SPDX - License - Identifier: LGPL - 3.0 - or -later
|
SPDX - License - Identifier: LGPL - 3.0 - or -later
|
||||||
Copyright © 2020 Project Author Guille Gutierrez guillermo.gutierrezmorote@concordia.ca
|
Copyright © 2020 Project Author Guille Gutierrez guillermo.gutierrezmorote@concordia.ca
|
||||||
Contributors Pilar Monsalvete pilar_monsalvete@yahoo.es
|
Contributors Pilar Monsalvete Álvarez de Uribarri pilar.monsalvete@concordia.ca
|
||||||
"""
|
"""
|
||||||
|
|
||||||
|
|
||||||
|
@ -23,6 +23,9 @@ class ThermalOpening:
|
||||||
self._hi = None
|
self._hi = None
|
||||||
self._he = None
|
self._he = None
|
||||||
|
|
||||||
|
# todo: discuss with @Guille
|
||||||
|
self._polygon = None
|
||||||
|
|
||||||
@property
|
@property
|
||||||
def area(self):
|
def area(self):
|
||||||
"""
|
"""
|
||||||
|
|
|
@ -10,6 +10,7 @@ from city_model_structure.attributes.surface import Surface
|
||||||
from city_model_structure.attributes.usage_zone import UsageZone
|
from city_model_structure.attributes.usage_zone import UsageZone
|
||||||
|
|
||||||
ThermalBoundary = TypeVar('ThermalBoundary')
|
ThermalBoundary = TypeVar('ThermalBoundary')
|
||||||
|
Polyhedron = TypeVar('Polyhedron')
|
||||||
|
|
||||||
|
|
||||||
class ThermalZone:
|
class ThermalZone:
|
||||||
|
@ -22,14 +23,15 @@ class ThermalZone:
|
||||||
self._bounded = None
|
self._bounded = None
|
||||||
self._is_heated = is_heated
|
self._is_heated = is_heated
|
||||||
self._is_cooled = is_cooled
|
self._is_cooled = is_cooled
|
||||||
|
self._is_mechanically_ventilated = None
|
||||||
self._additional_thermal_bridge_u_value = None
|
self._additional_thermal_bridge_u_value = None
|
||||||
self._effective_thermal_capacity = None
|
self._effective_thermal_capacity = None
|
||||||
self._indirectly_heated_area_ratio = None
|
self._indirectly_heated_area_ratio = None
|
||||||
self._infiltration_rate_system_on = None
|
self._infiltration_rate_system_on = None
|
||||||
self._infiltration_rate_system_off = None
|
self._infiltration_rate_system_off = None
|
||||||
self._usage_zones = None
|
self._usage_zones = None
|
||||||
|
|
||||||
self._volume = None
|
self._volume = None
|
||||||
|
self._volume_geometry = None
|
||||||
|
|
||||||
@property
|
@property
|
||||||
def is_heated(self):
|
def is_heated(self):
|
||||||
|
@ -47,6 +49,14 @@ class ThermalZone:
|
||||||
"""
|
"""
|
||||||
return self._is_cooled
|
return self._is_cooled
|
||||||
|
|
||||||
|
@property
|
||||||
|
def is_mechanically_ventilated(self):
|
||||||
|
"""
|
||||||
|
Get thermal zone mechanical ventilation flag
|
||||||
|
:return: Boolean
|
||||||
|
"""
|
||||||
|
return self._is_mechanically_ventilated
|
||||||
|
|
||||||
@property
|
@property
|
||||||
def floor_area(self):
|
def floor_area(self):
|
||||||
"""
|
"""
|
||||||
|
@ -204,3 +214,11 @@ class ThermalZone:
|
||||||
:return: None
|
:return: None
|
||||||
"""
|
"""
|
||||||
self._volume = value
|
self._volume = value
|
||||||
|
|
||||||
|
@property
|
||||||
|
def volume_geometry(self) -> Polyhedron:
|
||||||
|
"""
|
||||||
|
Get the polyhedron defined by the thermal zone
|
||||||
|
:return: Polyhedron
|
||||||
|
"""
|
||||||
|
return self._volume_geometry
|
||||||
|
|
|
@ -7,6 +7,7 @@ Contributors Guille Gutierrez guillermo.gutierrezmorote@concordia.ca
|
||||||
from typing import List
|
from typing import List
|
||||||
from city_model_structure.attributes.internal_gains import InternalGains
|
from city_model_structure.attributes.internal_gains import InternalGains
|
||||||
from city_model_structure.attributes.lighting import Lighting
|
from city_model_structure.attributes.lighting import Lighting
|
||||||
|
from city_model_structure.attributes.occupants import Occupants
|
||||||
|
|
||||||
|
|
||||||
class UsageZone:
|
class UsageZone:
|
||||||
|
@ -26,10 +27,10 @@ class UsageZone:
|
||||||
self._dhw_preparation_temperature = None
|
self._dhw_preparation_temperature = None
|
||||||
self._electrical_app_average_consumption_sqm_year = None
|
self._electrical_app_average_consumption_sqm_year = None
|
||||||
self._mechanical_air_change = None
|
self._mechanical_air_change = None
|
||||||
self._occupancy = None
|
self._occupants = None
|
||||||
self._schedules = None
|
|
||||||
self._heating_schedule = None
|
|
||||||
self._lights = None
|
self._lights = None
|
||||||
|
self._heating_schedule = None
|
||||||
|
self._cooling_schedule = None
|
||||||
|
|
||||||
@property
|
@property
|
||||||
def lights(self) -> List[Lighting]:
|
def lights(self) -> List[Lighting]:
|
||||||
|
@ -172,41 +173,25 @@ class UsageZone:
|
||||||
self._usage = value
|
self._usage = value
|
||||||
|
|
||||||
@property
|
@property
|
||||||
def occupancy(self):
|
def occupants(self) -> [Occupants]:
|
||||||
"""
|
"""
|
||||||
Get occupancy data
|
Get occupancy data
|
||||||
:return: [Occupancy]
|
:return: [Occupancy]
|
||||||
"""
|
"""
|
||||||
return self._occupancy
|
return self._occupants
|
||||||
|
|
||||||
@occupancy.setter
|
@occupants.setter
|
||||||
def occupancy(self, values):
|
def occupants(self, values):
|
||||||
"""
|
"""
|
||||||
Set occupancy
|
Set occupancy
|
||||||
:param values: [Occupancy]
|
:param values: [Occupancy]
|
||||||
"""
|
"""
|
||||||
self._occupancy = values
|
self._occupants = values
|
||||||
|
|
||||||
@property
|
|
||||||
def schedules(self):
|
|
||||||
"""
|
|
||||||
Get schedules
|
|
||||||
:return: [Schedule_Values]
|
|
||||||
"""
|
|
||||||
return self._schedules
|
|
||||||
|
|
||||||
@schedules.setter
|
|
||||||
def schedules(self, value):
|
|
||||||
"""
|
|
||||||
occupancy schedules
|
|
||||||
:param value: schedules
|
|
||||||
"""
|
|
||||||
self._schedules = value
|
|
||||||
|
|
||||||
@property
|
@property
|
||||||
def heating_schedule(self):
|
def heating_schedule(self):
|
||||||
"""
|
"""
|
||||||
Get heating schedule
|
Get heating schedule: list of 0, 1 that define whether the heating system is OFF or ON
|
||||||
:return: dict{DtaFrame(int)}
|
:return: dict{DtaFrame(int)}
|
||||||
"""
|
"""
|
||||||
return self._heating_schedule
|
return self._heating_schedule
|
||||||
|
@ -219,6 +204,22 @@ class UsageZone:
|
||||||
"""
|
"""
|
||||||
self._heating_schedule = values
|
self._heating_schedule = values
|
||||||
|
|
||||||
|
@property
|
||||||
|
def cooling_schedule(self):
|
||||||
|
"""
|
||||||
|
Get cooling schedule: list of 0, 1 that define whether the heating system is OFF or ON
|
||||||
|
:return: dict{DtaFrame(int)}
|
||||||
|
"""
|
||||||
|
return self._cooling_schedule
|
||||||
|
|
||||||
|
@cooling_schedule.setter
|
||||||
|
def cooling_schedule(self, values):
|
||||||
|
"""
|
||||||
|
cooling schedule
|
||||||
|
:param values: dict{DtaFrame(int)}
|
||||||
|
"""
|
||||||
|
self._cooling_schedule = values
|
||||||
|
|
||||||
@property
|
@property
|
||||||
def occupancy_density(self):
|
def occupancy_density(self):
|
||||||
"""
|
"""
|
||||||
|
|
|
@ -13,7 +13,6 @@ from city_model_structure.attributes.thermal_boundary import ThermalBoundary
|
||||||
from city_model_structure.attributes.thermal_zone import ThermalZone
|
from city_model_structure.attributes.thermal_zone import ThermalZone
|
||||||
from city_model_structure.attributes.usage_zone import UsageZone
|
from city_model_structure.attributes.usage_zone import UsageZone
|
||||||
from city_model_structure.city_object import CityObject
|
from city_model_structure.city_object import CityObject
|
||||||
from city_model_structure.building_unit import BuildingUnit
|
|
||||||
from helpers.geometry_helper import GeometryHelper as gh
|
from helpers.geometry_helper import GeometryHelper as gh
|
||||||
|
|
||||||
|
|
||||||
|
@ -37,7 +36,6 @@ class Building(CityObject):
|
||||||
self._storeys_above_ground = None
|
self._storeys_above_ground = None
|
||||||
self._floor_area = None
|
self._floor_area = None
|
||||||
self._usage_zones = []
|
self._usage_zones = []
|
||||||
self._building_units = []
|
|
||||||
self._type = 'building'
|
self._type = 'building'
|
||||||
self._heating = dict()
|
self._heating = dict()
|
||||||
self._cooling = dict()
|
self._cooling = dict()
|
||||||
|
@ -209,22 +207,6 @@ class Building(CityObject):
|
||||||
"""
|
"""
|
||||||
return self._type
|
return self._type
|
||||||
|
|
||||||
@property
|
|
||||||
def building_units(self) -> [BuildingUnit]:
|
|
||||||
"""
|
|
||||||
Building units
|
|
||||||
:return:
|
|
||||||
"""
|
|
||||||
return self._building_units
|
|
||||||
|
|
||||||
@building_units.setter
|
|
||||||
def building_units(self, value):
|
|
||||||
"""
|
|
||||||
Building units
|
|
||||||
:param value: [BuildingUnit]
|
|
||||||
"""
|
|
||||||
self._building_units = value
|
|
||||||
|
|
||||||
@property
|
@property
|
||||||
def heating(self) -> dict:
|
def heating(self) -> dict:
|
||||||
"""
|
"""
|
||||||
|
|
|
@ -1,48 +0,0 @@
|
||||||
"""
|
|
||||||
Building module
|
|
||||||
SPDX - License - Identifier: LGPL - 3.0 - or -later
|
|
||||||
Copyright © 2020 Project Author Sanam Dabirian sanam.dabirian@mail.concordia.ca
|
|
||||||
"""
|
|
||||||
from builtins import float
|
|
||||||
|
|
||||||
from city_model_structure.city_object import CityObject
|
|
||||||
|
|
||||||
|
|
||||||
class BuildingUnit(CityObject):
|
|
||||||
"""
|
|
||||||
BuildingUnit class
|
|
||||||
"""
|
|
||||||
|
|
||||||
def __init__(self, number_of_rooms, floor_area, energy_certificate):
|
|
||||||
"""
|
|
||||||
Constructor
|
|
||||||
"""
|
|
||||||
self._number_of_rooms = number_of_rooms
|
|
||||||
self._floor_area = floor_area
|
|
||||||
self._energy_certificate = energy_certificate
|
|
||||||
|
|
||||||
@property
|
|
||||||
def number_of_rooms(self):
|
|
||||||
"""
|
|
||||||
Get building unit number of rooms
|
|
||||||
:return: number of rooms
|
|
||||||
"""
|
|
||||||
return self._number_of_rooms
|
|
||||||
|
|
||||||
@property
|
|
||||||
def floor_area(self):
|
|
||||||
"""
|
|
||||||
Building unit floor area in square meters
|
|
||||||
:return: float
|
|
||||||
"""
|
|
||||||
return self._floor_area
|
|
||||||
|
|
||||||
@property
|
|
||||||
def energy_certificate(self):
|
|
||||||
"""
|
|
||||||
Building unit energy certificate
|
|
||||||
:return: energy_certificate
|
|
||||||
"""
|
|
||||||
#TODO: This is still not used, check in the future
|
|
||||||
return self._energy_certificate
|
|
||||||
|
|
|
@ -4,7 +4,7 @@ SPDX - License - Identifier: LGPL - 3.0 - or -later
|
||||||
Copyright © 2020 Project Author Pilar Monsalvete pilar_monsalvete@yahoo.es
|
Copyright © 2020 Project Author Pilar Monsalvete pilar_monsalvete@yahoo.es
|
||||||
"""
|
"""
|
||||||
import pandas as pd
|
import pandas as pd
|
||||||
from city_model_structure.attributes.occupancy import Occupancy
|
from city_model_structure.attributes.occupants import Occupants
|
||||||
import calendar as cal
|
import calendar as cal
|
||||||
|
|
||||||
|
|
||||||
|
@ -31,7 +31,7 @@ class MonthlyToHourlyDemand:
|
||||||
for usage_zone in self._building.usage_zones:
|
for usage_zone in self._building.usage_zones:
|
||||||
temp_set = float(usage_zone.heating_setpoint)
|
temp_set = float(usage_zone.heating_setpoint)
|
||||||
temp_back = float(usage_zone.heating_setback)
|
temp_back = float(usage_zone.heating_setback)
|
||||||
occupancy = Occupancy().get_complete_year_schedule(usage_zone.schedules['Occupancy'])
|
occupancy = Occupants().get_complete_year_schedule(usage_zone.schedules['Occupancy'])
|
||||||
heating_schedule = self._conditioning_seasons['heating']
|
heating_schedule = self._conditioning_seasons['heating']
|
||||||
|
|
||||||
hourly_heating = []
|
hourly_heating = []
|
||||||
|
|
|
@ -67,30 +67,30 @@ class IdfHelper:
|
||||||
def add_schedule(self, building):
|
def add_schedule(self, building):
|
||||||
schedule_occupancy = self._idf.newidfobject("SCHEDULE:DAY:HOURLY".upper())
|
schedule_occupancy = self._idf.newidfobject("SCHEDULE:DAY:HOURLY".upper())
|
||||||
schedule_occupancy.Name = 'occupant schedule'
|
schedule_occupancy.Name = 'occupant schedule'
|
||||||
schedule_occupancy.Hour_1 = building.usage_zones[0].occupancy.occupant_schedule[0]
|
schedule_occupancy.Hour_1 = building.usage_zones[0].occupants.occupant_schedule[0]
|
||||||
schedule_occupancy.Hour_2 = building.usage_zones[0].occupancy.occupant_schedule[1]
|
schedule_occupancy.Hour_2 = building.usage_zones[0].occupants.occupant_schedule[1]
|
||||||
schedule_occupancy.Hour_3 = building.usage_zones[0].occupancy.occupant_schedule[2]
|
schedule_occupancy.Hour_3 = building.usage_zones[0].occupants.occupant_schedule[2]
|
||||||
schedule_occupancy.Hour_4 = building.usage_zones[0].occupancy.occupant_schedule[3]
|
schedule_occupancy.Hour_4 = building.usage_zones[0].occupants.occupant_schedule[3]
|
||||||
schedule_occupancy.Hour_5 = building.usage_zones[0].occupancy.occupant_schedule[4]
|
schedule_occupancy.Hour_5 = building.usage_zones[0].occupants.occupant_schedule[4]
|
||||||
schedule_occupancy.Hour_6 = building.usage_zones[0].occupancy.occupant_schedule[5]
|
schedule_occupancy.Hour_6 = building.usage_zones[0].occupants.occupant_schedule[5]
|
||||||
schedule_occupancy.Hour_7 = building.usage_zones[0].occupancy.occupant_schedule[6]
|
schedule_occupancy.Hour_7 = building.usage_zones[0].occupants.occupant_schedule[6]
|
||||||
schedule_occupancy.Hour_8 = building.usage_zones[0].occupancy.occupant_schedule[7]
|
schedule_occupancy.Hour_8 = building.usage_zones[0].occupants.occupant_schedule[7]
|
||||||
schedule_occupancy.Hour_9 = building.usage_zones[0].occupancy.occupant_schedule[8]
|
schedule_occupancy.Hour_9 = building.usage_zones[0].occupants.occupant_schedule[8]
|
||||||
schedule_occupancy.Hour_10 = building.usage_zones[0].occupancy.occupant_schedule[9]
|
schedule_occupancy.Hour_10 = building.usage_zones[0].occupants.occupant_schedule[9]
|
||||||
schedule_occupancy.Hour_11 = building.usage_zones[0].occupancy.occupant_schedule[10]
|
schedule_occupancy.Hour_11 = building.usage_zones[0].occupants.occupant_schedule[10]
|
||||||
schedule_occupancy.Hour_12 = building.usage_zones[0].occupancy.occupant_schedule[11]
|
schedule_occupancy.Hour_12 = building.usage_zones[0].occupants.occupant_schedule[11]
|
||||||
schedule_occupancy.Hour_13 = building.usage_zones[0].occupancy.occupant_schedule[12]
|
schedule_occupancy.Hour_13 = building.usage_zones[0].occupants.occupant_schedule[12]
|
||||||
schedule_occupancy.Hour_14 = building.usage_zones[0].occupancy.occupant_schedule[13]
|
schedule_occupancy.Hour_14 = building.usage_zones[0].occupants.occupant_schedule[13]
|
||||||
schedule_occupancy.Hour_15 = building.usage_zones[0].occupancy.occupant_schedule[14]
|
schedule_occupancy.Hour_15 = building.usage_zones[0].occupants.occupant_schedule[14]
|
||||||
schedule_occupancy.Hour_16 = building.usage_zones[0].occupancy.occupant_schedule[15]
|
schedule_occupancy.Hour_16 = building.usage_zones[0].occupants.occupant_schedule[15]
|
||||||
schedule_occupancy.Hour_17 = building.usage_zones[0].occupancy.occupant_schedule[16]
|
schedule_occupancy.Hour_17 = building.usage_zones[0].occupants.occupant_schedule[16]
|
||||||
schedule_occupancy.Hour_18 = building.usage_zones[0].occupancy.occupant_schedule[17]
|
schedule_occupancy.Hour_18 = building.usage_zones[0].occupants.occupant_schedule[17]
|
||||||
schedule_occupancy.Hour_19 = building.usage_zones[0].occupancy.occupant_schedule[18]
|
schedule_occupancy.Hour_19 = building.usage_zones[0].occupants.occupant_schedule[18]
|
||||||
schedule_occupancy.Hour_20 = building.usage_zones[0].occupancy.occupant_schedule[19]
|
schedule_occupancy.Hour_20 = building.usage_zones[0].occupants.occupant_schedule[19]
|
||||||
schedule_occupancy.Hour_21 = building.usage_zones[0].occupancy.occupant_schedule[20]
|
schedule_occupancy.Hour_21 = building.usage_zones[0].occupants.occupant_schedule[20]
|
||||||
schedule_occupancy.Hour_22 = building.usage_zones[0].occupancy.occupant_schedule[21]
|
schedule_occupancy.Hour_22 = building.usage_zones[0].occupants.occupant_schedule[21]
|
||||||
schedule_occupancy.Hour_23 = building.usage_zones[0].occupancy.occupant_schedule[22]
|
schedule_occupancy.Hour_23 = building.usage_zones[0].occupants.occupant_schedule[22]
|
||||||
schedule_occupancy.Hour_24 = building.usage_zones[0].occupancy.occupant_schedule[23]
|
schedule_occupancy.Hour_24 = building.usage_zones[0].occupants.occupant_schedule[23]
|
||||||
|
|
||||||
def _add_construction(self, thermal_boundary):
|
def _add_construction(self, thermal_boundary):
|
||||||
for construction in self._idf.idfobjects[self._CONSTRUCTION]:
|
for construction in self._idf.idfobjects[self._CONSTRUCTION]:
|
||||||
|
|
|
@ -172,9 +172,6 @@ class TestGeometryFactory(TestCase):
|
||||||
self.assertIsNotNone(thermal_boundary.azimuth, 'thermal_boundary azimuth is none')
|
self.assertIsNotNone(thermal_boundary.azimuth, 'thermal_boundary azimuth is none')
|
||||||
self.assertIsNotNone(thermal_boundary.delimits, 'thermal_boundary delimits is none')
|
self.assertIsNotNone(thermal_boundary.delimits, 'thermal_boundary delimits is none')
|
||||||
self.assertIsNotNone(thermal_boundary.inclination, 'thermal_boundary inclination is none')
|
self.assertIsNotNone(thermal_boundary.inclination, 'thermal_boundary inclination is none')
|
||||||
# todo: assert exception
|
|
||||||
self.assertRaises(Exception, lambda: thermal_boundary.window_area,
|
|
||||||
'thermal_boundary window_area was initialized')
|
|
||||||
|
|
||||||
def test_citygml_thermal_opening(self):
|
def test_citygml_thermal_opening(self):
|
||||||
"""
|
"""
|
||||||
|
|
Loading…
Reference in New Issue
Block a user