Coverage for bim2sim/plugins/PluginTEASER/bim2sim_teaser/models/__init__.py: 0%
253 statements
« prev ^ index » next coverage.py v7.6.12, created at 2025-03-12 17:09 +0000
« prev ^ index » next coverage.py v7.6.12, created at 2025-03-12 17:09 +0000
1"""Package for Python representations of TEASER models"""
2from teaser.logic.buildingobjects.building import Building as Building_Teaser
3from teaser.logic.buildingobjects.buildingphysics.door \
4 import Door as Door_Teaser
5from teaser.logic.buildingobjects.buildingphysics.floor \
6 import Floor as Floor_Teaser
7from teaser.logic.buildingobjects.buildingphysics.ceiling \
8 import Ceiling as Ceiling_Teaser
9from teaser.logic.buildingobjects.buildingphysics.groundfloor \
10 import GroundFloor as GroundFloor_Teaser
11from teaser.logic.buildingobjects.buildingphysics.innerwall \
12 import InnerWall as InnerWall_Teaser
13from teaser.logic.buildingobjects.buildingphysics.layer \
14 import Layer as Layer_Teaser
15from teaser.logic.buildingobjects.buildingphysics.material \
16 import Material as Material_Teaser
17from teaser.logic.buildingobjects.buildingphysics.outerwall \
18 import OuterWall as OuterWall_Teaser
19from teaser.logic.buildingobjects.buildingphysics.rooftop \
20 import Rooftop as Rooftop_Teaser
21from teaser.logic.buildingobjects.buildingphysics.window \
22 import Window as Window_Teaser
23from teaser.logic.buildingobjects.thermalzone import \
24 ThermalZone as ThermalZone_Teaser
25from teaser.logic.buildingobjects.useconditions import \
26 UseConditions as UseConditions_Teaser
27from teaser.logic.buildingobjects.buildingsystems.buildingahu import \
28 BuildingAHU as BuildingAHU_Teaser
30from bim2sim.elements.aggregation.bps_aggregations import AggregatedThermalZone
31from bim2sim.elements import bps_elements as bps
32from bim2sim.elements.aggregation import bps_aggregations as bps_aggr
33from bim2sim.elements.mapping.units import ureg
34from bim2sim.plugins.PluginTEASER.bim2sim_teaser import export
37class TEASER(export.TEASERExportInstance):
38 library = "TEASER"
41class Building(TEASER, Building_Teaser):
42 represents = [bps.Building]
44 def __init__(self, bim2sim_element, parent):
45 Building_Teaser.__init__(self, parent=parent)
46 TEASER.__init__(self, bim2sim_element)
47 self.used_library_calc = "AixLib"
48 self.add_thermal_zones_to_building()
49 if bim2sim_element.with_ahu:
50 self.central_ahu = BuildingAHU(
51 element=bim2sim_element, parent=self)
53 def add_thermal_zones_to_building(self):
54 for tz in self.element.thermal_zones:
55 ThermalZone(tz, parent=self)
57 def request_params(self):
58 self.request_param("bldg_name", None, "name")
59 self.request_param("year_of_construction",
60 self.check_numeric(
61 min_value=0 * ureg.year), export_unit=ureg.year)
62 self.request_param("number_of_storeys",
63 self.check_numeric(
64 min_value=1 * ureg.dimensionless),
65 "number_of_floors")
66 self.request_param("avg_storey_height",
67 self.check_numeric(
68 min_value=1 * ureg.meter),
69 "height_of_floors")
70 # todo workaround until setter method is changed in TEASER, see TEASER
71 # issue #772
72 self.request_param("with_ahu", export_name="_with_ahu")
75class ThermalZone(TEASER, ThermalZone_Teaser):
76 represents = [bps.ThermalZone, AggregatedThermalZone]
78 def __init__(self, element, parent):
79 ThermalZone_Teaser.__init__(self, parent=parent)
80 TEASER.__init__(self, element)
81 self.number_of_elements = 2
82 self.use_conditions = UseConditions(element=element, parent=self)
83 self.add_elements_to_thermal_zone()
85 def add_elements_to_thermal_zone(self):
86 for bound_element in self.element.bound_elements:
87 export.TEASERExportInstance.factory(bound_element, parent=self)
89 def request_params(self):
90 if self.element.guid:
91 self.name = self.element.guid
92 else:
93 self.request_param("name", None)
94 self.request_param("net_area",
95 self.check_numeric(
96 min_value=0 * ureg.meter ** 2),
97 "area")
98 self.request_param("t_ground", None)
99 self.request_param("net_volume",
100 None,
101 "volume")
104class BuildingAHU(TEASER, BuildingAHU_Teaser):
105 represents = []
107 def __init__(self, element, parent):
108 BuildingAHU_Teaser.__init__(self, parent=parent)
109 self.overwrite_teaser_defaults()
110 TEASER.__init__(self, element)
112 def overwrite_teaser_defaults(self):
113 """Overwrites default BuildingAHU values from TEASER
115 This is required as TEASER sets defaults for e.g. the AHU setup and in
116 enrichment we only enrich not-existing values. Without setting the
117 defaults back to None would lead to errors.
118 """
119 self.heating = None
120 self.cooling = None
121 self.dehumidification = None
122 self.humidification = None
123 self.heat_recovery = None
124 self.efficiency_recovery = None
126 def request_params(self):
127 self.request_param("ahu_heating", export_name="heating")
128 self.request_param("ahu_cooling", export_name="cooling")
129 self.request_param("ahu_dehumidification",
130 export_name="dehumidification")
131 self.request_param("ahu_humidification", export_name="humidification")
132 self.request_param("ahu_heat_recovery", export_name="heat_recovery")
133 self.request_param("ahu_heat_recovery_efficiency",
134 export_name="efficiency_recovery")
137class UseConditions(TEASER, UseConditions_Teaser):
138 represents = []
140 def __init__(self, element, parent):
141 UseConditions_Teaser.__init__(self, parent=parent)
142 self.overwrite_teaser_defaults()
143 TEASER.__init__(self, element)
145 def overwrite_teaser_defaults(self):
146 """Overwrites default use conditions values from TEASER
148 This is required as TEASER sets defaults for e.g. the usage and in
149 enrichment we only enrich not-existing values. Without setting the
150 defaults back to None would lead to errors.
151 """
152 self.usage = None
154 self.with_heating = True
155 self.with_cooling = False
156 self.T_threshold_heating = None
157 self.T_threshold_cooling = None
159 self.fixed_heat_flow_rate_persons = None
160 self.activity_degree_persons = None
161 self._persons = None
162 self.internal_gains_moisture_no_people = None
163 self.ratio_conv_rad_persons = None
165 self.machines = None
166 self.ratio_conv_rad_machines = None
168 self.lighting_power = None
169 self.ratio_conv_rad_lighting = None
171 self.use_constant_infiltration = None
172 self.base_infiltration = None
173 self.max_user_infiltration = None
174 self.max_overheating_infiltration = []
175 self.max_summer_infiltration = []
176 self.winter_reduction_infiltration = []
178 self.min_ahu = None
179 self.max_ahu = None
180 self.with_ahu = None
182 self._first_saturday_of_year = 1
183 self.profiles_weekend_factor = None
185 self._set_back_times = None
186 self.heating_set_back = -2
187 self.cooling_set_back = 2
189 self._adjusted_opening_times = None
191 self._with_ideal_thresholds = False
193 self._heating_profile = []
194 self._cooling_profile = []
195 self._persons_profile = []
196 self._machines_profile = []
197 self._lighting_profile = []
199 self._schedules = None
201 def request_params(self):
202 self.request_param("name", None)
203 self.request_param("with_cooling", None)
204 self.request_param("with_heating", None)
205 self.request_param("with_ahu", None)
206 self.request_param("heating_profile", None)
207 self.request_param("cooling_profile", None)
208 self.request_param("persons", None)
209 self.request_param("T_threshold_heating", None)
210 self.request_param("activity_degree_persons", None)
211 self.request_param("fixed_heat_flow_rate_persons", None,
212 export_unit=ureg.W)
213 self.request_param("internal_gains_moisture_no_people", None)
214 self.request_param("T_threshold_cooling", None)
215 self.request_param("ratio_conv_rad_persons", None)
216 self.request_param("machines", None,
217 export_unit=ureg.W/ureg.m**2)
218 self.request_param("ratio_conv_rad_machines", None)
219 self.request_param("lighting_power",
220 None, export_unit=ureg.W/ureg.m**2)
221 self.request_param("ratio_conv_rad_lighting", None)
222 self.request_param("use_constant_infiltration", None)
223 self.request_param("base_infiltration", None)
224 self.request_param("max_user_infiltration", None)
225 self.request_param("max_overheating_infiltration", None)
226 self.request_param("max_summer_infiltration", None)
227 self.request_param("winter_reduction_infiltration", None)
228 self.request_param("min_ahu", None)
229 self.request_param("max_ahu", None)
230 self.request_param("with_ideal_thresholds", None)
231 self.request_param("persons_profile", None)
232 self.request_param("machines_profile", None)
233 self.request_param("lighting_profile", None)
234 self.request_param("usage", None)
237class ElementWithLayers(TEASER):
239 def __init__(self, element):
240 self.add_layers_to_element(element)
241 super().__init__(element)
242 self.name = self.element.guid
245 def add_layers_to_element(self, element):
246 if element.layerset:
247 if element.layerset.layers:
248 for layer in element.layerset.layers:
249 Layer(layer, parent=self)
251 def __repr__(self):
252 return "<%s>" % type(self).__name__
255class InnerWall(ElementWithLayers, InnerWall_Teaser):
256 represents = [
257 bps.InnerDoor,
258 bps.InnerWall,
259 bps_aggr.InnerWallDisaggregated
260 ]
262 def __init__(self, element, parent):
263 InnerWall_Teaser.__init__(self, parent=parent)
264 ElementWithLayers.__init__(self, element)
266 def request_params(self):
267 self.orientation = self.element.teaser_orientation
268 self.request_param("net_area",
269 self.check_numeric(min_value=0 * ureg.m ** 2),
270 "area")
271 self.request_param("inner_convection",
272 self.check_numeric(
273 min_value=0 * ureg.W / ureg.K / ureg.meter **
274 2),
275 "inner_convection")
278class OuterWall(ElementWithLayers, OuterWall_Teaser):
279 represents = [bps.OuterWall, bps_aggr.OuterWallDisaggregated]
281 def __init__(self, element, parent):
282 OuterWall_Teaser.__init__(self, parent=parent)
283 ElementWithLayers.__init__(self, element)
285 def request_params(self):
286 self.orientation = self.element.teaser_orientation
287 self.request_param("net_area",
288 self.check_numeric(min_value=0 * ureg.m ** 2),
289 "area")
290 self.request_param("tilt", None, "tilt")
293class Rooftop(ElementWithLayers, Rooftop_Teaser):
294 represents = [bps.Roof, bps_aggr.RoofDisaggregated]
296 def __init__(self, element, parent):
297 Rooftop_Teaser.__init__(self, parent=parent)
298 ElementWithLayers.__init__(self, element)
300 def request_params(self):
301 self.request_param("net_area",
302 self.check_numeric(min_value=0 * ureg.m ** 2),
303 "area")
306class Floor(ElementWithLayers, Floor_Teaser):
307 represents = [bps.InnerFloor, bps_aggr.InnerFloorDisaggregated]
309 def __init__(self, element, parent):
310 Floor_Teaser.__init__(self, parent=parent)
311 ElementWithLayers.__init__(self, element)
313 def request_params(self):
314 self.request_param("net_area",
315 self.check_numeric(min_value=0 * ureg.m ** 2),
316 "area")
319class Ceiling(ElementWithLayers, Ceiling_Teaser):
320 represents = [bps.InnerFloor, bps_aggr.InnerFloorDisaggregated]
322 def __init__(self, element, parent):
323 Ceiling_Teaser.__init__(self, parent=parent)
324 ElementWithLayers.__init__(self, element)
326 def request_params(self):
327 self.request_param("net_area",
328 self.check_numeric(min_value=0 * ureg.m ** 2),
329 "area")
332class GroundFloor(ElementWithLayers, GroundFloor_Teaser):
333 represents = [bps.GroundFloor, bps_aggr.GroundFloorDisaggregated]
335 def __init__(self, element, parent):
336 GroundFloor_Teaser.__init__(self, parent=parent)
337 ElementWithLayers.__init__(self, element)
339 def request_params(self):
340 self.request_param("net_area",
341 self.check_numeric(min_value=0 * ureg.m ** 2),
342 "area")
345class Window(ElementWithLayers, Window_Teaser):
346 represents = [bps.Window, bps_aggr.WindowDisaggregated]
348 def __init__(self, element, parent):
349 Window_Teaser.__init__(self, parent=parent)
350 ElementWithLayers.__init__(self, element)
352 def request_params(self):
353 self.orientation = self.element.teaser_orientation
354 self.request_param("gross_area",
355 self.check_numeric(min_value=0 * ureg.m ** 2),
356 "area")
357 self.request_param("a_conv", None)
358 self.request_param("g_value", None)
359 self.request_param("inner_convection", None)
360 self.request_param("inner_radiation", None)
361 self.request_param("outer_radiation", None)
362 self.request_param("outer_convection", None)
363 self.request_param("shading_g_total", None)
364 self.request_param("shading_max_irr", None)
367class Door(ElementWithLayers, Door_Teaser):
368 represents = [
369 bps.OuterDoor,
370 bps.Door,
371 bps_aggr.OuterDoorDisaggregated
372 ]
374 def __init__(self, element, parent):
375 Door_Teaser.__init__(self, parent=parent)
376 ElementWithLayers.__init__(self, element)
378 def request_params(self):
379 self.orientation = self.element.teaser_orientation
380 self.request_param("gross_area",
381 self.check_numeric(min_value=0 * ureg.m ** 2),
382 "area")
383 self.request_param("inner_convection", None)
386class Layer(TEASER, Layer_Teaser):
387 represents = [bps.Layer]
389 def __init__(self, element: bps.Layer, parent):
390 Layer_Teaser.__init__(self, parent=parent)
391 TEASER.__init__(self, element)
392 Material(element.material, parent=self)
394 def request_params(self):
395 self.request_param("thickness", None)
397 def __repr__(self):
398 return "<%s>" % type(self).__name__
401class Material(TEASER, Material_Teaser):
402 # represents = [element.Material]
404 def __init__(self, element, parent):
405 Material_Teaser.__init__(self, parent=parent)
406 TEASER.__init__(self, element)
408 def request_params(self):
409 self.name = self.element.material
410 self.request_param("density", None)
411 self.request_param(
412 "spec_heat_capacity", None, "heat_capac",
413 export_unit=ureg.kilojoule / (ureg.kg * ureg.K))
414 self.request_param("thermal_conduc", None)