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.
- honeybee_energy/__init__.py +24 -0
- honeybee_energy/__main__.py +4 -0
- honeybee_energy/_extend_honeybee.py +145 -0
- honeybee_energy/altnumber.py +21 -0
- honeybee_energy/baseline/__init__.py +2 -0
- honeybee_energy/baseline/create.py +608 -0
- honeybee_energy/baseline/data/__init__.py +1 -0
- honeybee_energy/baseline/data/constructions.csv +64 -0
- honeybee_energy/baseline/data/fen_ratios.csv +15 -0
- honeybee_energy/baseline/data/lpd_building.csv +21 -0
- honeybee_energy/baseline/data/pci_2016.csv +22 -0
- honeybee_energy/baseline/data/pci_2019.csv +22 -0
- honeybee_energy/baseline/data/pci_2022.csv +22 -0
- honeybee_energy/baseline/data/shw.csv +21 -0
- honeybee_energy/baseline/pci.py +512 -0
- honeybee_energy/baseline/result.py +371 -0
- honeybee_energy/boundarycondition.py +128 -0
- honeybee_energy/cli/__init__.py +69 -0
- honeybee_energy/cli/baseline.py +475 -0
- honeybee_energy/cli/edit.py +327 -0
- honeybee_energy/cli/lib.py +1154 -0
- honeybee_energy/cli/result.py +810 -0
- honeybee_energy/cli/setconfig.py +124 -0
- honeybee_energy/cli/settings.py +569 -0
- honeybee_energy/cli/simulate.py +380 -0
- honeybee_energy/cli/translate.py +1714 -0
- honeybee_energy/cli/validate.py +224 -0
- honeybee_energy/config.json +11 -0
- honeybee_energy/config.py +842 -0
- honeybee_energy/construction/__init__.py +1 -0
- honeybee_energy/construction/_base.py +374 -0
- honeybee_energy/construction/air.py +325 -0
- honeybee_energy/construction/dictutil.py +89 -0
- honeybee_energy/construction/dynamic.py +607 -0
- honeybee_energy/construction/opaque.py +460 -0
- honeybee_energy/construction/shade.py +319 -0
- honeybee_energy/construction/window.py +1096 -0
- honeybee_energy/construction/windowshade.py +847 -0
- honeybee_energy/constructionset.py +1655 -0
- honeybee_energy/dictutil.py +56 -0
- honeybee_energy/generator/__init__.py +5 -0
- honeybee_energy/generator/loadcenter.py +204 -0
- honeybee_energy/generator/pv.py +535 -0
- honeybee_energy/hvac/__init__.py +21 -0
- honeybee_energy/hvac/_base.py +124 -0
- honeybee_energy/hvac/_template.py +270 -0
- honeybee_energy/hvac/allair/__init__.py +22 -0
- honeybee_energy/hvac/allair/_base.py +349 -0
- honeybee_energy/hvac/allair/furnace.py +168 -0
- honeybee_energy/hvac/allair/psz.py +131 -0
- honeybee_energy/hvac/allair/ptac.py +163 -0
- honeybee_energy/hvac/allair/pvav.py +109 -0
- honeybee_energy/hvac/allair/vav.py +128 -0
- honeybee_energy/hvac/detailed.py +337 -0
- honeybee_energy/hvac/doas/__init__.py +28 -0
- honeybee_energy/hvac/doas/_base.py +345 -0
- honeybee_energy/hvac/doas/fcu.py +127 -0
- honeybee_energy/hvac/doas/radiant.py +329 -0
- honeybee_energy/hvac/doas/vrf.py +81 -0
- honeybee_energy/hvac/doas/wshp.py +91 -0
- honeybee_energy/hvac/heatcool/__init__.py +23 -0
- honeybee_energy/hvac/heatcool/_base.py +177 -0
- honeybee_energy/hvac/heatcool/baseboard.py +61 -0
- honeybee_energy/hvac/heatcool/evapcool.py +72 -0
- honeybee_energy/hvac/heatcool/fcu.py +92 -0
- honeybee_energy/hvac/heatcool/gasunit.py +53 -0
- honeybee_energy/hvac/heatcool/radiant.py +269 -0
- honeybee_energy/hvac/heatcool/residential.py +77 -0
- honeybee_energy/hvac/heatcool/vrf.py +54 -0
- honeybee_energy/hvac/heatcool/windowac.py +70 -0
- honeybee_energy/hvac/heatcool/wshp.py +62 -0
- honeybee_energy/hvac/idealair.py +699 -0
- honeybee_energy/internalmass.py +310 -0
- honeybee_energy/lib/__init__.py +1 -0
- honeybee_energy/lib/_loadconstructions.py +194 -0
- honeybee_energy/lib/_loadconstructionsets.py +117 -0
- honeybee_energy/lib/_loadmaterials.py +83 -0
- honeybee_energy/lib/_loadprogramtypes.py +125 -0
- honeybee_energy/lib/_loadschedules.py +87 -0
- honeybee_energy/lib/_loadtypelimits.py +64 -0
- honeybee_energy/lib/constructions.py +207 -0
- honeybee_energy/lib/constructionsets.py +95 -0
- honeybee_energy/lib/materials.py +67 -0
- honeybee_energy/lib/programtypes.py +125 -0
- honeybee_energy/lib/schedules.py +61 -0
- honeybee_energy/lib/scheduletypelimits.py +31 -0
- honeybee_energy/load/__init__.py +1 -0
- honeybee_energy/load/_base.py +190 -0
- honeybee_energy/load/daylight.py +397 -0
- honeybee_energy/load/dictutil.py +47 -0
- honeybee_energy/load/equipment.py +771 -0
- honeybee_energy/load/hotwater.py +543 -0
- honeybee_energy/load/infiltration.py +460 -0
- honeybee_energy/load/lighting.py +480 -0
- honeybee_energy/load/people.py +497 -0
- honeybee_energy/load/process.py +472 -0
- honeybee_energy/load/setpoint.py +816 -0
- honeybee_energy/load/ventilation.py +550 -0
- honeybee_energy/material/__init__.py +1 -0
- honeybee_energy/material/_base.py +166 -0
- honeybee_energy/material/dictutil.py +59 -0
- honeybee_energy/material/frame.py +367 -0
- honeybee_energy/material/gas.py +1087 -0
- honeybee_energy/material/glazing.py +854 -0
- honeybee_energy/material/opaque.py +1351 -0
- honeybee_energy/material/shade.py +1360 -0
- honeybee_energy/measure.py +472 -0
- honeybee_energy/programtype.py +723 -0
- honeybee_energy/properties/__init__.py +1 -0
- honeybee_energy/properties/aperture.py +333 -0
- honeybee_energy/properties/door.py +342 -0
- honeybee_energy/properties/extension.py +244 -0
- honeybee_energy/properties/face.py +274 -0
- honeybee_energy/properties/model.py +2640 -0
- honeybee_energy/properties/room.py +1747 -0
- honeybee_energy/properties/shade.py +314 -0
- honeybee_energy/properties/shademesh.py +262 -0
- honeybee_energy/reader.py +48 -0
- honeybee_energy/result/__init__.py +1 -0
- honeybee_energy/result/colorobj.py +648 -0
- honeybee_energy/result/emissions.py +290 -0
- honeybee_energy/result/err.py +101 -0
- honeybee_energy/result/eui.py +100 -0
- honeybee_energy/result/generation.py +160 -0
- honeybee_energy/result/loadbalance.py +890 -0
- honeybee_energy/result/match.py +202 -0
- honeybee_energy/result/osw.py +90 -0
- honeybee_energy/result/rdd.py +59 -0
- honeybee_energy/result/zsz.py +190 -0
- honeybee_energy/run.py +1577 -0
- honeybee_energy/schedule/__init__.py +1 -0
- honeybee_energy/schedule/day.py +626 -0
- honeybee_energy/schedule/dictutil.py +59 -0
- honeybee_energy/schedule/fixedinterval.py +1012 -0
- honeybee_energy/schedule/rule.py +619 -0
- honeybee_energy/schedule/ruleset.py +1867 -0
- honeybee_energy/schedule/typelimit.py +310 -0
- honeybee_energy/shw.py +315 -0
- honeybee_energy/simulation/__init__.py +1 -0
- honeybee_energy/simulation/control.py +214 -0
- honeybee_energy/simulation/daylightsaving.py +185 -0
- honeybee_energy/simulation/dictutil.py +51 -0
- honeybee_energy/simulation/output.py +646 -0
- honeybee_energy/simulation/parameter.py +606 -0
- honeybee_energy/simulation/runperiod.py +443 -0
- honeybee_energy/simulation/shadowcalculation.py +295 -0
- honeybee_energy/simulation/sizing.py +546 -0
- honeybee_energy/ventcool/__init__.py +5 -0
- honeybee_energy/ventcool/_crack_data.py +91 -0
- honeybee_energy/ventcool/afn.py +289 -0
- honeybee_energy/ventcool/control.py +269 -0
- honeybee_energy/ventcool/crack.py +126 -0
- honeybee_energy/ventcool/fan.py +493 -0
- honeybee_energy/ventcool/opening.py +365 -0
- honeybee_energy/ventcool/simulation.py +314 -0
- honeybee_energy/writer.py +1078 -0
- honeybee_energy-1.116.106.dist-info/METADATA +113 -0
- honeybee_energy-1.116.106.dist-info/RECORD +162 -0
- honeybee_energy-1.116.106.dist-info/WHEEL +5 -0
- honeybee_energy-1.116.106.dist-info/entry_points.txt +2 -0
- honeybee_energy-1.116.106.dist-info/licenses/LICENSE +661 -0
- 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
|
+
)
|