honeybee-energy 1.116.106__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (162) hide show
  1. honeybee_energy/__init__.py +24 -0
  2. honeybee_energy/__main__.py +4 -0
  3. honeybee_energy/_extend_honeybee.py +145 -0
  4. honeybee_energy/altnumber.py +21 -0
  5. honeybee_energy/baseline/__init__.py +2 -0
  6. honeybee_energy/baseline/create.py +608 -0
  7. honeybee_energy/baseline/data/__init__.py +1 -0
  8. honeybee_energy/baseline/data/constructions.csv +64 -0
  9. honeybee_energy/baseline/data/fen_ratios.csv +15 -0
  10. honeybee_energy/baseline/data/lpd_building.csv +21 -0
  11. honeybee_energy/baseline/data/pci_2016.csv +22 -0
  12. honeybee_energy/baseline/data/pci_2019.csv +22 -0
  13. honeybee_energy/baseline/data/pci_2022.csv +22 -0
  14. honeybee_energy/baseline/data/shw.csv +21 -0
  15. honeybee_energy/baseline/pci.py +512 -0
  16. honeybee_energy/baseline/result.py +371 -0
  17. honeybee_energy/boundarycondition.py +128 -0
  18. honeybee_energy/cli/__init__.py +69 -0
  19. honeybee_energy/cli/baseline.py +475 -0
  20. honeybee_energy/cli/edit.py +327 -0
  21. honeybee_energy/cli/lib.py +1154 -0
  22. honeybee_energy/cli/result.py +810 -0
  23. honeybee_energy/cli/setconfig.py +124 -0
  24. honeybee_energy/cli/settings.py +569 -0
  25. honeybee_energy/cli/simulate.py +380 -0
  26. honeybee_energy/cli/translate.py +1714 -0
  27. honeybee_energy/cli/validate.py +224 -0
  28. honeybee_energy/config.json +11 -0
  29. honeybee_energy/config.py +842 -0
  30. honeybee_energy/construction/__init__.py +1 -0
  31. honeybee_energy/construction/_base.py +374 -0
  32. honeybee_energy/construction/air.py +325 -0
  33. honeybee_energy/construction/dictutil.py +89 -0
  34. honeybee_energy/construction/dynamic.py +607 -0
  35. honeybee_energy/construction/opaque.py +460 -0
  36. honeybee_energy/construction/shade.py +319 -0
  37. honeybee_energy/construction/window.py +1096 -0
  38. honeybee_energy/construction/windowshade.py +847 -0
  39. honeybee_energy/constructionset.py +1655 -0
  40. honeybee_energy/dictutil.py +56 -0
  41. honeybee_energy/generator/__init__.py +5 -0
  42. honeybee_energy/generator/loadcenter.py +204 -0
  43. honeybee_energy/generator/pv.py +535 -0
  44. honeybee_energy/hvac/__init__.py +21 -0
  45. honeybee_energy/hvac/_base.py +124 -0
  46. honeybee_energy/hvac/_template.py +270 -0
  47. honeybee_energy/hvac/allair/__init__.py +22 -0
  48. honeybee_energy/hvac/allair/_base.py +349 -0
  49. honeybee_energy/hvac/allair/furnace.py +168 -0
  50. honeybee_energy/hvac/allair/psz.py +131 -0
  51. honeybee_energy/hvac/allair/ptac.py +163 -0
  52. honeybee_energy/hvac/allair/pvav.py +109 -0
  53. honeybee_energy/hvac/allair/vav.py +128 -0
  54. honeybee_energy/hvac/detailed.py +337 -0
  55. honeybee_energy/hvac/doas/__init__.py +28 -0
  56. honeybee_energy/hvac/doas/_base.py +345 -0
  57. honeybee_energy/hvac/doas/fcu.py +127 -0
  58. honeybee_energy/hvac/doas/radiant.py +329 -0
  59. honeybee_energy/hvac/doas/vrf.py +81 -0
  60. honeybee_energy/hvac/doas/wshp.py +91 -0
  61. honeybee_energy/hvac/heatcool/__init__.py +23 -0
  62. honeybee_energy/hvac/heatcool/_base.py +177 -0
  63. honeybee_energy/hvac/heatcool/baseboard.py +61 -0
  64. honeybee_energy/hvac/heatcool/evapcool.py +72 -0
  65. honeybee_energy/hvac/heatcool/fcu.py +92 -0
  66. honeybee_energy/hvac/heatcool/gasunit.py +53 -0
  67. honeybee_energy/hvac/heatcool/radiant.py +269 -0
  68. honeybee_energy/hvac/heatcool/residential.py +77 -0
  69. honeybee_energy/hvac/heatcool/vrf.py +54 -0
  70. honeybee_energy/hvac/heatcool/windowac.py +70 -0
  71. honeybee_energy/hvac/heatcool/wshp.py +62 -0
  72. honeybee_energy/hvac/idealair.py +699 -0
  73. honeybee_energy/internalmass.py +310 -0
  74. honeybee_energy/lib/__init__.py +1 -0
  75. honeybee_energy/lib/_loadconstructions.py +194 -0
  76. honeybee_energy/lib/_loadconstructionsets.py +117 -0
  77. honeybee_energy/lib/_loadmaterials.py +83 -0
  78. honeybee_energy/lib/_loadprogramtypes.py +125 -0
  79. honeybee_energy/lib/_loadschedules.py +87 -0
  80. honeybee_energy/lib/_loadtypelimits.py +64 -0
  81. honeybee_energy/lib/constructions.py +207 -0
  82. honeybee_energy/lib/constructionsets.py +95 -0
  83. honeybee_energy/lib/materials.py +67 -0
  84. honeybee_energy/lib/programtypes.py +125 -0
  85. honeybee_energy/lib/schedules.py +61 -0
  86. honeybee_energy/lib/scheduletypelimits.py +31 -0
  87. honeybee_energy/load/__init__.py +1 -0
  88. honeybee_energy/load/_base.py +190 -0
  89. honeybee_energy/load/daylight.py +397 -0
  90. honeybee_energy/load/dictutil.py +47 -0
  91. honeybee_energy/load/equipment.py +771 -0
  92. honeybee_energy/load/hotwater.py +543 -0
  93. honeybee_energy/load/infiltration.py +460 -0
  94. honeybee_energy/load/lighting.py +480 -0
  95. honeybee_energy/load/people.py +497 -0
  96. honeybee_energy/load/process.py +472 -0
  97. honeybee_energy/load/setpoint.py +816 -0
  98. honeybee_energy/load/ventilation.py +550 -0
  99. honeybee_energy/material/__init__.py +1 -0
  100. honeybee_energy/material/_base.py +166 -0
  101. honeybee_energy/material/dictutil.py +59 -0
  102. honeybee_energy/material/frame.py +367 -0
  103. honeybee_energy/material/gas.py +1087 -0
  104. honeybee_energy/material/glazing.py +854 -0
  105. honeybee_energy/material/opaque.py +1351 -0
  106. honeybee_energy/material/shade.py +1360 -0
  107. honeybee_energy/measure.py +472 -0
  108. honeybee_energy/programtype.py +723 -0
  109. honeybee_energy/properties/__init__.py +1 -0
  110. honeybee_energy/properties/aperture.py +333 -0
  111. honeybee_energy/properties/door.py +342 -0
  112. honeybee_energy/properties/extension.py +244 -0
  113. honeybee_energy/properties/face.py +274 -0
  114. honeybee_energy/properties/model.py +2640 -0
  115. honeybee_energy/properties/room.py +1747 -0
  116. honeybee_energy/properties/shade.py +314 -0
  117. honeybee_energy/properties/shademesh.py +262 -0
  118. honeybee_energy/reader.py +48 -0
  119. honeybee_energy/result/__init__.py +1 -0
  120. honeybee_energy/result/colorobj.py +648 -0
  121. honeybee_energy/result/emissions.py +290 -0
  122. honeybee_energy/result/err.py +101 -0
  123. honeybee_energy/result/eui.py +100 -0
  124. honeybee_energy/result/generation.py +160 -0
  125. honeybee_energy/result/loadbalance.py +890 -0
  126. honeybee_energy/result/match.py +202 -0
  127. honeybee_energy/result/osw.py +90 -0
  128. honeybee_energy/result/rdd.py +59 -0
  129. honeybee_energy/result/zsz.py +190 -0
  130. honeybee_energy/run.py +1577 -0
  131. honeybee_energy/schedule/__init__.py +1 -0
  132. honeybee_energy/schedule/day.py +626 -0
  133. honeybee_energy/schedule/dictutil.py +59 -0
  134. honeybee_energy/schedule/fixedinterval.py +1012 -0
  135. honeybee_energy/schedule/rule.py +619 -0
  136. honeybee_energy/schedule/ruleset.py +1867 -0
  137. honeybee_energy/schedule/typelimit.py +310 -0
  138. honeybee_energy/shw.py +315 -0
  139. honeybee_energy/simulation/__init__.py +1 -0
  140. honeybee_energy/simulation/control.py +214 -0
  141. honeybee_energy/simulation/daylightsaving.py +185 -0
  142. honeybee_energy/simulation/dictutil.py +51 -0
  143. honeybee_energy/simulation/output.py +646 -0
  144. honeybee_energy/simulation/parameter.py +606 -0
  145. honeybee_energy/simulation/runperiod.py +443 -0
  146. honeybee_energy/simulation/shadowcalculation.py +295 -0
  147. honeybee_energy/simulation/sizing.py +546 -0
  148. honeybee_energy/ventcool/__init__.py +5 -0
  149. honeybee_energy/ventcool/_crack_data.py +91 -0
  150. honeybee_energy/ventcool/afn.py +289 -0
  151. honeybee_energy/ventcool/control.py +269 -0
  152. honeybee_energy/ventcool/crack.py +126 -0
  153. honeybee_energy/ventcool/fan.py +493 -0
  154. honeybee_energy/ventcool/opening.py +365 -0
  155. honeybee_energy/ventcool/simulation.py +314 -0
  156. honeybee_energy/writer.py +1078 -0
  157. honeybee_energy-1.116.106.dist-info/METADATA +113 -0
  158. honeybee_energy-1.116.106.dist-info/RECORD +162 -0
  159. honeybee_energy-1.116.106.dist-info/WHEEL +5 -0
  160. honeybee_energy-1.116.106.dist-info/entry_points.txt +2 -0
  161. honeybee_energy-1.116.106.dist-info/licenses/LICENSE +661 -0
  162. honeybee_energy-1.116.106.dist-info/top_level.txt +1 -0
@@ -0,0 +1,345 @@
1
+ # coding=utf-8
2
+ """Base class for all HVAC systems with DOAS ventilation."""
3
+ from __future__ import division
4
+ import os
5
+
6
+ from honeybee._lockable import lockable
7
+ from honeybee.typing import float_in_range
8
+ from honeybee.altnumber import autosize
9
+
10
+ from .._template import _TemplateSystem, _EnumerationBase
11
+ from ..idealair import IdealAirSystem
12
+ from ...properties.extension import DOASSystemProperties
13
+
14
+
15
+ @lockable
16
+ class _DOASBase(_TemplateSystem):
17
+ """Base class for all HVAC systems with DOAS ventilation.
18
+
19
+ Args:
20
+ identifier: Text string for system identifier. Must be < 100 characters
21
+ and not contain any EnergyPlus special characters. This will be used to
22
+ identify the object across a model and in the exported IDF.
23
+ vintage: Text for the vintage of the template system. This will be used
24
+ to set efficiencies for various pieces of equipment within the system.
25
+ Choose from the following.
26
+
27
+ * DOE_Ref_Pre_1980
28
+ * DOE_Ref_1980_2004
29
+ * ASHRAE_2004
30
+ * ASHRAE_2007
31
+ * ASHRAE_2010
32
+ * ASHRAE_2013
33
+ * ASHRAE_2016
34
+ * ASHRAE_2019
35
+
36
+ equipment_type: Text for the specific type of the system and equipment.
37
+ For example, 'DOAS with fan coil chiller with boiler'.
38
+ sensible_heat_recovery: A number between 0 and 1 for the effectiveness
39
+ of sensible heat recovery within the system. (Default: 0).
40
+ latent_heat_recovery: A number between 0 and 1 for the effectiveness
41
+ of latent heat recovery within the system. (Default: 0).
42
+ demand_controlled_ventilation: Boolean to note whether demand controlled
43
+ ventilation should be used on the system, which will vary the amount
44
+ of ventilation air according to the occupancy schedule of the
45
+ Rooms. (Default: False).
46
+ doas_availability_schedule: An optional On/Off discrete schedule to set when
47
+ the dedicated outdoor air system (DOAS) shuts off. This will not only
48
+ prevent any outdoor air from flowing thorough the system but will also
49
+ shut off the fans, which can result in more energy savings when spaces
50
+ served by the DOAS are completely unoccupied. If None, the DOAS will be
51
+ always on. (Default: None).
52
+
53
+ Properties:
54
+ * identifier
55
+ * display_name
56
+ * vintage
57
+ * equipment_type
58
+ * sensible_heat_recovery
59
+ * latent_heat_recovery
60
+ * demand_controlled_ventilation
61
+ * doas_availability_schedule
62
+ * schedules
63
+ * has_district_heating
64
+ * has_district_cooling
65
+ * user_data
66
+ * properties
67
+ """
68
+ __slots__ = ('_sensible_heat_recovery', '_latent_heat_recovery',
69
+ '_demand_controlled_ventilation', '_doas_availability_schedule',
70
+ '_properties')
71
+ COOL_ONLY_TYPES = ('DOAS_FCU_Chiller', 'DOAS_FCU_ACChiller', 'DOAS_FCU_DCW')
72
+ HEAT_ONLY_TYPES = ()
73
+
74
+ def __init__(self, identifier, vintage='ASHRAE_2019', equipment_type=None,
75
+ sensible_heat_recovery=0, latent_heat_recovery=0,
76
+ demand_controlled_ventilation=False, doas_availability_schedule=None):
77
+ """Initialize HVACSystem."""
78
+ # initialize base HVAC system properties
79
+ _TemplateSystem.__init__(self, identifier, vintage, equipment_type)
80
+
81
+ # set the main features of the HVAC system
82
+ self.sensible_heat_recovery = sensible_heat_recovery
83
+ self.latent_heat_recovery = latent_heat_recovery
84
+ self.demand_controlled_ventilation = demand_controlled_ventilation
85
+ self.doas_availability_schedule = doas_availability_schedule
86
+ self._properties = DOASSystemProperties(self)
87
+
88
+ @property
89
+ def sensible_heat_recovery(self):
90
+ """Get or set a number for the effectiveness of sensible heat recovery."""
91
+ return self._sensible_heat_recovery
92
+
93
+ @sensible_heat_recovery.setter
94
+ def sensible_heat_recovery(self, value):
95
+ if value is None or value == 0:
96
+ self._sensible_heat_recovery = 0
97
+ else:
98
+ self._sensible_heat_recovery = \
99
+ float_in_range(value, 0.0, 1.0, 'hvac sensible heat recovery')
100
+
101
+ @property
102
+ def latent_heat_recovery(self):
103
+ """Get or set a number for the effectiveness of latent heat recovery."""
104
+ return self._latent_heat_recovery
105
+
106
+ @latent_heat_recovery.setter
107
+ def latent_heat_recovery(self, value):
108
+ if value is None:
109
+ self._latent_heat_recovery = 0
110
+ else:
111
+ self._latent_heat_recovery = \
112
+ float_in_range(value, 0.0, 1.0, 'hvac latent heat recovery')
113
+
114
+ @property
115
+ def demand_controlled_ventilation(self):
116
+ """Get or set a boolean for whether demand controlled ventilation is present."""
117
+ return self._demand_controlled_ventilation
118
+
119
+ @demand_controlled_ventilation.setter
120
+ def demand_controlled_ventilation(self, value):
121
+ self._demand_controlled_ventilation = bool(value)
122
+
123
+ @property
124
+ def doas_availability_schedule(self):
125
+ """Get or set am on/off schedule for availability of the DOAS air loop.
126
+ """
127
+ return self._doas_availability_schedule
128
+
129
+ @doas_availability_schedule.setter
130
+ def doas_availability_schedule(self, value):
131
+ if value is not None:
132
+ self._check_schedule(value, 'doas_availability_schedule')
133
+ value.lock() # lock editing in case schedule has multiple references
134
+ self._doas_availability_schedule = value
135
+
136
+ @property
137
+ def schedules(self):
138
+ """Get an array of all the schedules associated with the HVAC system."""
139
+ schedules = []
140
+ if self._doas_availability_schedule is not None:
141
+ schedules.append(self._doas_availability_schedule)
142
+ return schedules
143
+
144
+ @property
145
+ def properties(self):
146
+ """Get properties for extensions."""
147
+ return self._properties
148
+
149
+ @classmethod
150
+ def from_dict(cls, data):
151
+ """Create a HVAC object from a dictionary.
152
+
153
+ Args:
154
+ data: A DOAS dictionary in following the format below.
155
+
156
+ .. code-block:: python
157
+
158
+ {
159
+ "type": "", # text for the class name of the HVAC
160
+ "identifier": "Classroom1_System", # identifier for the HVAC
161
+ "display_name": "Standard System", # name for the HVAC
162
+ "vintage": "ASHRAE_2019", # text for the vintage of the template
163
+ "equipment_type": "", # text for the HVAC equipment type
164
+ "sensible_heat_recovery": 0.75, # Sensible heat recovery effectiveness
165
+ "latent_heat_recovery": 0.7, # Latent heat recovery effectiveness
166
+ "demand_controlled_ventilation": False # Boolean for DCV
167
+ "doas_availability_schedule": {} # Schedule for DOAS availability or None
168
+ "properties": { ... } # dict of the DOASSystemProperties
169
+ }
170
+ """
171
+ assert data['type'] == cls.__name__, \
172
+ 'Expected {} dictionary. Got {}.'.format(cls.__name__, data['type'])
173
+ # extract the key features and properties of the HVAC
174
+ sensible, latent, dcv = cls._properties_from_dict(data)
175
+ # extract the schedule
176
+ doas_avail = cls._get_schedule_from_dict(data['doas_availability_schedule']) if \
177
+ 'doas_availability_schedule' in data and \
178
+ data['doas_availability_schedule'] is not None else None
179
+
180
+ new_obj = cls(data['identifier'], data['vintage'], data['equipment_type'],
181
+ sensible, latent, dcv, doas_avail)
182
+ if 'display_name' in data and data['display_name'] is not None:
183
+ new_obj.display_name = data['display_name']
184
+ if 'user_data' in data and data['user_data'] is not None:
185
+ new_obj.user_data = data['user_data']
186
+ if 'properties' in data and data['properties'] is not None:
187
+ new_obj.properties._load_extension_attr_from_dict(data['properties'])
188
+ return new_obj
189
+
190
+ @classmethod
191
+ def from_dict_abridged(cls, data, schedule_dict):
192
+ """Create a HVAC object from an abridged dictionary.
193
+
194
+ Args:
195
+ data: A DOAS abridged dictionary in following the format below.
196
+ schedule_dict: A dictionary with schedule identifiers as keys and honeybee
197
+ schedule objects as values (either ScheduleRuleset or
198
+ ScheduleFixedInterval). These will be used to assign the schedules
199
+ to the Setpoint object.
200
+
201
+ .. code-block:: python
202
+
203
+ {
204
+ "type": "", # text for the class name of the HVAC
205
+ "identifier": "Classroom1_System", # identifier for the HVAC
206
+ "display_name": "Standard System", # name for the HVAC
207
+ "vintage": "ASHRAE_2019", # text for the vintage of the template
208
+ "equipment_type": "", # text for the HVAC equipment type
209
+ "sensible_heat_recovery": 0.75, # Sensible heat recovery effectiveness
210
+ "latent_heat_recovery": 0.7, # Latent heat recovery effectiveness
211
+ "demand_controlled_ventilation": False # Boolean for DCV
212
+ "doas_availability_schedule": "" # Schedule id for DOAS availability
213
+ "properties": { ... } # dict of the DOASSystemProperties
214
+ }
215
+ """
216
+ assert cls.__name__ in data['type'], \
217
+ 'Expected {} dictionary. Got {}.'.format(cls.__name__, data['type'])
218
+ # extract the key features and properties of the HVAC
219
+ sensible, latent, dcv = cls._properties_from_dict(data)
220
+ # extract the schedule
221
+ doas_avail = None
222
+ if 'doas_availability_schedule' in data and \
223
+ data['doas_availability_schedule'] is not None:
224
+ try:
225
+ doas_avail = schedule_dict[data['doas_availability_schedule']]
226
+ except KeyError as e:
227
+ raise ValueError('Failed to find {} in the schedule_dict.'.format(e))
228
+ new_obj = cls(data['identifier'], data['vintage'], data['equipment_type'],
229
+ sensible, latent, dcv, doas_avail)
230
+ if 'display_name' in data and data['display_name'] is not None:
231
+ new_obj.display_name = data['display_name']
232
+ if 'user_data' in data and data['user_data'] is not None:
233
+ new_obj.user_data = data['user_data']
234
+ if 'properties' in data and data['properties'] is not None:
235
+ new_obj.properties._load_extension_attr_from_dict(data['properties'])
236
+ return new_obj
237
+
238
+ def to_dict(self, abridged=False):
239
+ """DOAS system dictionary representation.
240
+
241
+ Args:
242
+ abridged: Boolean to note whether the full dictionary describing the
243
+ object should be returned (False) or just an abridged version (True).
244
+ This input currently has no effect but may eventually have one if
245
+ schedule-type properties are exposed on this template.
246
+ """
247
+ return self._base_dict(abridged)
248
+
249
+ def to_ideal_air_equivalent(self):
250
+ """Get a version of this HVAC as an IdealAirSystem.
251
+
252
+ Relevant properties will be transferred to the resulting ideal air such as
253
+ sensible_heat_recovery, latent_heat_recovery, and demand_controlled_ventilation.
254
+ """
255
+ i_sys = IdealAirSystem(
256
+ self.identifier, economizer_type='NoEconomizer',
257
+ sensible_heat_recovery=self.sensible_heat_recovery,
258
+ latent_heat_recovery=self.latent_heat_recovery,
259
+ demand_controlled_ventilation=self.demand_controlled_ventilation)
260
+ if self.equipment_type in self.COOL_ONLY_TYPES:
261
+ i_sys.heating_limit = 0
262
+ if self.equipment_type in self.HEAT_ONLY_TYPES:
263
+ i_sys.cooling_limit = 0
264
+ i_sys._display_name = self._display_name
265
+ return i_sys
266
+
267
+ def _base_dict(self, abridged):
268
+ """Get a base dictionary of the DOAS system."""
269
+ class_type = '{}Abridged'.format(self.__class__.__name__) \
270
+ if abridged else self.__class__.__name__
271
+ base = {'type': class_type}
272
+ base['identifier'] = self.identifier
273
+ if self._display_name is not None:
274
+ base['display_name'] = self.display_name
275
+ base['vintage'] = self.vintage
276
+ base['equipment_type'] = self.equipment_type
277
+ if self.sensible_heat_recovery != 0:
278
+ base['sensible_heat_recovery'] = self.sensible_heat_recovery
279
+ if self.latent_heat_recovery != 0:
280
+ base['latent_heat_recovery'] = self.latent_heat_recovery
281
+ base['demand_controlled_ventilation'] = self.demand_controlled_ventilation
282
+ if self.doas_availability_schedule is not None:
283
+ base['doas_availability_schedule'] = \
284
+ self.doas_availability_schedule.identifier if \
285
+ abridged else self.doas_availability_schedule.to_dict()
286
+ if self._user_data is not None:
287
+ base['user_data'] = self.user_data
288
+ prop_dict = self.properties.to_dict()
289
+ if prop_dict is not None:
290
+ base['properties'] = prop_dict
291
+ return base
292
+
293
+ @staticmethod
294
+ def _properties_from_dict(data):
295
+ """Extract basic properties from a dictionary and assign defaults."""
296
+ sensible = data['sensible_heat_recovery'] if \
297
+ 'sensible_heat_recovery' in data else 0
298
+ sensible = sensible if sensible != autosize.to_dict() else 0
299
+ latent = data['latent_heat_recovery'] if \
300
+ 'latent_heat_recovery' in data else 0
301
+ latent = latent if latent != autosize.to_dict() else 0
302
+ dcv = data['demand_controlled_ventilation'] \
303
+ if 'demand_controlled_ventilation' in data else False
304
+ return sensible, latent, dcv
305
+
306
+ def __copy__(self):
307
+ new_obj = self.__class__(
308
+ self._identifier, self._vintage, self._equipment_type,
309
+ self._sensible_heat_recovery, self._latent_heat_recovery,
310
+ self._demand_controlled_ventilation, self._doas_availability_schedule)
311
+ new_obj._display_name = self._display_name
312
+ new_obj._user_data = None if self._user_data is None else self._user_data.copy()
313
+ new_obj._properties._duplicate_extension_attr(self._properties)
314
+ return new_obj
315
+
316
+ def __key(self):
317
+ """A tuple based on the object properties, useful for hashing."""
318
+ return (self._identifier, self._vintage, self._equipment_type,
319
+ self._sensible_heat_recovery, self._latent_heat_recovery,
320
+ self._demand_controlled_ventilation,
321
+ hash(self._doas_availability_schedule))
322
+
323
+ def __hash__(self):
324
+ return hash(self.__key())
325
+
326
+ def __eq__(self, other):
327
+ return isinstance(other, self.__class__) and self.__key() == other.__key()
328
+
329
+ def __ne__(self, other):
330
+ return not self.__eq__(other)
331
+
332
+
333
+ class _DOASEnumeration(_EnumerationBase):
334
+ """Enumerates the systems that inherit from _DOASBase."""
335
+
336
+ def __init__(self, import_modules=True):
337
+ if import_modules:
338
+ self._import_modules(os.path.dirname(__file__), 'honeybee_energy.hvac.doas')
339
+
340
+ self._HVAC_TYPES = {}
341
+ self._EQUIPMENT_TYPES = {}
342
+ for clss in _DOASBase.__subclasses__():
343
+ self._HVAC_TYPES[clss.__name__] = clss
344
+ for equip_type in clss.EQUIPMENT_TYPES:
345
+ self._EQUIPMENT_TYPES[equip_type] = clss
@@ -0,0 +1,127 @@
1
+ # coding=utf-8
2
+ """Fan Coil Unit (FCU) with DOAS HVAC system."""
3
+ from __future__ import division
4
+
5
+ from ._base import _DOASBase
6
+
7
+ from honeybee._lockable import lockable
8
+
9
+
10
+ @lockable
11
+ class FCUwithDOAS(_DOASBase):
12
+ """Fan Coil Unit (FCU) with DOAS HVAC system.
13
+
14
+ All rooms/zones in the system are connected to a Dedicated Outdoor Air System
15
+ (DOAS) that supplies a constant volume of ventilation air at the same temperature
16
+ to all rooms/zones. The ventilation air temperature will vary from 21.1C (70F)
17
+ to 15.5C (60F) depending on the outdoor air temperature (the DOAS supplies cooler air
18
+ when outdoor conditions are warmer). The ventilation air temperature is maintained
19
+ by a chilled water cooling coil and a heating coil. The heating coil is a hot
20
+ water coil except when electric baseboards or gas heaters are specified, in
21
+ which case the heating coil is a single-speed direct expansion (DX) heat pump
22
+ with a backup electrical resistance coil.
23
+
24
+ Each room/zone also receives its own Fan Coil Unit (FCU), which meets the heating
25
+ and cooling loads of the space. The cooling coil in the FCU is always chilled
26
+ water cooling coil, which is connected to a chilled water loop operating
27
+ at 6.7C (44F). The heating coil is a hot water coil except when when electric
28
+ baseboards or gas heaters are specified. Hot water temperature is 82C (180F) for
29
+ boiler/district heating and 49C (120F) when ASHP is used.
30
+
31
+ The FCU with DOAS template is relatively close in performance to active chilled
32
+ beams (ACBs). When using this template to represent ACBs, care must be taken
33
+ to ensure that the DOAS ventilation air requirement is sufficient to extract
34
+ the heating cooling from the ACB. If so, then this FCUwithDOAS template can be
35
+ used but with the energy use of the FCU fans ignored.
36
+
37
+ Args:
38
+ identifier: Text string for system identifier. Must be < 100 characters
39
+ and not contain any EnergyPlus special characters. This will be used to
40
+ identify the object across a model and in the exported IDF.
41
+ vintage: Text for the vintage of the template system. This will be used
42
+ to set efficiencies for various pieces of equipment within the system.
43
+ Choose from the following.
44
+
45
+ * DOE_Ref_Pre_1980
46
+ * DOE_Ref_1980_2004
47
+ * ASHRAE_2004
48
+ * ASHRAE_2007
49
+ * ASHRAE_2010
50
+ * ASHRAE_2013
51
+ * ASHRAE_2016
52
+ * ASHRAE_2019
53
+
54
+ equipment_type: Text for the specific type of the system and equipment. (Default:
55
+ the first option below) Choose from.
56
+
57
+ * DOAS_FCU_Chiller_Boiler
58
+ * DOAS_FCU_Chiller_ASHP
59
+ * DOAS_FCU_Chiller_DHW
60
+ * DOAS_FCU_Chiller_ElectricBaseboard
61
+ * DOAS_FCU_Chiller_GasHeaters
62
+ * DOAS_FCU_Chiller
63
+ * DOAS_FCU_ACChiller_Boiler
64
+ * DOAS_FCU_ACChiller_ASHP
65
+ * DOAS_FCU_ACChiller_DHW
66
+ * DOAS_FCU_ACChiller_ElectricBaseboard
67
+ * DOAS_FCU_ACChiller_GasHeaters
68
+ * DOAS_FCU_ACChiller
69
+ * DOAS_FCU_DCW_Boiler
70
+ * DOAS_FCU_DCW_ASHP
71
+ * DOAS_FCU_DCW_DHW
72
+ * DOAS_FCU_DCW_ElectricBaseboard
73
+ * DOAS_FCU_DCW_GasHeaters
74
+ * DOAS_FCU_DCW
75
+
76
+ sensible_heat_recovery: A number between 0 and 1 for the effectiveness
77
+ of sensible heat recovery within the system. (Default: 0).
78
+ latent_heat_recovery: A number between 0 and 1 for the effectiveness
79
+ of latent heat recovery within the system. (Default: 0).
80
+ demand_controlled_ventilation: Boolean to note whether demand controlled
81
+ ventilation should be used on the system, which will vary the amount
82
+ of ventilation air according to the occupancy schedule of the
83
+ Rooms. (Default: False).
84
+ doas_availability_schedule: An optional On/Off discrete schedule to set when
85
+ the dedicated outdoor air system (DOAS) shuts off. This will not only
86
+ prevent any outdoor air from flowing thorough the system but will also
87
+ shut off the fans, which can result in more energy savings when spaces
88
+ served by the DOAS are completely unoccupied. If None, the DOAS will be
89
+ always on. (Default: None).
90
+
91
+ Properties:
92
+ * identifier
93
+ * display_name
94
+ * vintage
95
+ * equipment_type
96
+ * sensible_heat_recovery
97
+ * latent_heat_recovery
98
+ * demand_controlled_ventilation
99
+ * doas_availability_schedule
100
+ * schedules
101
+ * has_district_heating
102
+ * has_district_cooling
103
+ * user_data
104
+ * properties
105
+ """
106
+ __slots__ = ()
107
+
108
+ EQUIPMENT_TYPES = (
109
+ 'DOAS_FCU_Chiller_Boiler',
110
+ 'DOAS_FCU_Chiller_ASHP',
111
+ 'DOAS_FCU_Chiller_DHW',
112
+ 'DOAS_FCU_Chiller_ElectricBaseboard',
113
+ 'DOAS_FCU_Chiller_GasHeaters',
114
+ 'DOAS_FCU_Chiller',
115
+ 'DOAS_FCU_ACChiller_Boiler',
116
+ 'DOAS_FCU_ACChiller_ASHP',
117
+ 'DOAS_FCU_ACChiller_DHW',
118
+ 'DOAS_FCU_ACChiller_ElectricBaseboard',
119
+ 'DOAS_FCU_ACChiller_GasHeaters',
120
+ 'DOAS_FCU_ACChiller',
121
+ 'DOAS_FCU_DCW_Boiler',
122
+ 'DOAS_FCU_DCW_ASHP',
123
+ 'DOAS_FCU_DCW_DHW',
124
+ 'DOAS_FCU_DCW_ElectricBaseboard',
125
+ 'DOAS_FCU_DCW_GasHeaters',
126
+ 'DOAS_FCU_DCW'
127
+ )