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,214 @@
|
|
|
1
|
+
# coding=utf-8
|
|
2
|
+
"""Simulation controls for which types of calculations to run."""
|
|
3
|
+
from __future__ import division
|
|
4
|
+
|
|
5
|
+
from ..reader import parse_idf_string
|
|
6
|
+
from ..writer import generate_idf_string
|
|
7
|
+
|
|
8
|
+
|
|
9
|
+
class SimulationControl(object):
|
|
10
|
+
"""Simulation controls for which types of calculations to run.
|
|
11
|
+
|
|
12
|
+
Args:
|
|
13
|
+
do_zone_sizing: Boolean for whether the zone sizing calculation
|
|
14
|
+
should be run. Default: True.
|
|
15
|
+
do_system_sizing: Boolean for whether the system sizing calculation
|
|
16
|
+
should be run. Default: True.
|
|
17
|
+
do_plant_sizing: Boolean for whether the plant sizing calculation
|
|
18
|
+
should be run. Default: True.
|
|
19
|
+
run_for_sizing_periods: Boolean for whether the simulation should
|
|
20
|
+
be run for the sizing periods. Default: False.
|
|
21
|
+
run_for_run_periods: Boolean for whether the simulation should
|
|
22
|
+
be run for the run periods. Default: True.
|
|
23
|
+
|
|
24
|
+
Properties:
|
|
25
|
+
* do_zone_sizing
|
|
26
|
+
* do_system_sizing
|
|
27
|
+
* do_plant_sizing
|
|
28
|
+
* run_for_sizing_periods
|
|
29
|
+
* run_for_run_periods
|
|
30
|
+
"""
|
|
31
|
+
__slots__ = ('_do_zone_sizing', '_do_system_sizing', '_do_plant_sizing',
|
|
32
|
+
'_run_for_sizing_periods', '_run_for_run_periods')
|
|
33
|
+
|
|
34
|
+
def __init__(self, do_zone_sizing=True, do_system_sizing=True,
|
|
35
|
+
do_plant_sizing=True, run_for_sizing_periods=False,
|
|
36
|
+
run_for_run_periods=True):
|
|
37
|
+
"""Initialize SimulationControl."""
|
|
38
|
+
self.do_zone_sizing = do_zone_sizing
|
|
39
|
+
self.do_system_sizing = do_system_sizing
|
|
40
|
+
self.do_plant_sizing = do_plant_sizing
|
|
41
|
+
self.run_for_sizing_periods = run_for_sizing_periods
|
|
42
|
+
self.run_for_run_periods = run_for_run_periods
|
|
43
|
+
|
|
44
|
+
@property
|
|
45
|
+
def do_zone_sizing(self):
|
|
46
|
+
"""Get or set a boolean for whether the zone sizing calculation is run."""
|
|
47
|
+
return self._do_zone_sizing
|
|
48
|
+
|
|
49
|
+
@do_zone_sizing.setter
|
|
50
|
+
def do_zone_sizing(self, value):
|
|
51
|
+
self._do_zone_sizing = bool(value)
|
|
52
|
+
|
|
53
|
+
@property
|
|
54
|
+
def do_system_sizing(self):
|
|
55
|
+
"""Get or set a boolean for whether the system sizing calculation is run."""
|
|
56
|
+
return self._do_system_sizing
|
|
57
|
+
|
|
58
|
+
@do_system_sizing.setter
|
|
59
|
+
def do_system_sizing(self, value):
|
|
60
|
+
self._do_system_sizing = bool(value)
|
|
61
|
+
|
|
62
|
+
@property
|
|
63
|
+
def do_plant_sizing(self):
|
|
64
|
+
"""Get or set a boolean for whether the plant sizing calculation is run."""
|
|
65
|
+
return self._do_plant_sizing
|
|
66
|
+
|
|
67
|
+
@do_plant_sizing.setter
|
|
68
|
+
def do_plant_sizing(self, value):
|
|
69
|
+
self._do_plant_sizing = bool(value)
|
|
70
|
+
|
|
71
|
+
@property
|
|
72
|
+
def run_for_sizing_periods(self):
|
|
73
|
+
"""Get or set a boolean for whether the simulation is run for sizing periods."""
|
|
74
|
+
return self._run_for_sizing_periods
|
|
75
|
+
|
|
76
|
+
@run_for_sizing_periods.setter
|
|
77
|
+
def run_for_sizing_periods(self, value):
|
|
78
|
+
self._run_for_sizing_periods = bool(value)
|
|
79
|
+
|
|
80
|
+
@property
|
|
81
|
+
def run_for_run_periods(self):
|
|
82
|
+
"""Get or set a boolean for whether the simulation is run for run periods."""
|
|
83
|
+
return self._run_for_run_periods
|
|
84
|
+
|
|
85
|
+
@run_for_run_periods.setter
|
|
86
|
+
def run_for_run_periods(self, value):
|
|
87
|
+
self._run_for_run_periods = bool(value)
|
|
88
|
+
|
|
89
|
+
@classmethod
|
|
90
|
+
def from_idf(cls, idf_string):
|
|
91
|
+
"""Create a SimulationControl object from an EnergyPlus IDF text string.
|
|
92
|
+
|
|
93
|
+
Args:
|
|
94
|
+
idf_string: A text string fully describing an EnergyPlus
|
|
95
|
+
SimulationControl definition.
|
|
96
|
+
"""
|
|
97
|
+
# check the inputs
|
|
98
|
+
ep_strs = parse_idf_string(idf_string, 'SimulationControl,')
|
|
99
|
+
|
|
100
|
+
# extract the properties from the string
|
|
101
|
+
do_zone_sizing = False
|
|
102
|
+
do_system_sizing = False
|
|
103
|
+
do_plant_sizing = False
|
|
104
|
+
run_for_sizing_periods = True
|
|
105
|
+
run_for_run_periods = True
|
|
106
|
+
try:
|
|
107
|
+
do_zone_sizing = True if ep_strs[0].lower() == 'yes' else False
|
|
108
|
+
do_system_sizing = True if ep_strs[1].lower() == 'yes' else False
|
|
109
|
+
do_plant_sizing = True if ep_strs[2].lower() == 'yes' else False
|
|
110
|
+
run_for_sizing_periods = False if ep_strs[3].lower() == 'no' else True
|
|
111
|
+
run_for_run_periods = False if ep_strs[4].lower() == 'no' else True
|
|
112
|
+
except IndexError:
|
|
113
|
+
pass # shorter SimulationControl definition
|
|
114
|
+
|
|
115
|
+
return cls(do_zone_sizing, do_system_sizing, do_plant_sizing,
|
|
116
|
+
run_for_sizing_periods, run_for_run_periods)
|
|
117
|
+
|
|
118
|
+
@classmethod
|
|
119
|
+
def from_dict(cls, data):
|
|
120
|
+
"""Create a SimulationControl object from a dictionary.
|
|
121
|
+
|
|
122
|
+
Args:
|
|
123
|
+
data: A SimulationControl dictionary in following the format below.
|
|
124
|
+
|
|
125
|
+
.. code-block:: python
|
|
126
|
+
|
|
127
|
+
{
|
|
128
|
+
"type": "SimulationControl",
|
|
129
|
+
"do_zone_sizing": True,
|
|
130
|
+
"do_system_sizing": True,
|
|
131
|
+
"do_plant_sizing": True,
|
|
132
|
+
"run_for_sizing_periods": False,
|
|
133
|
+
"run_for_run_periods": True
|
|
134
|
+
}
|
|
135
|
+
"""
|
|
136
|
+
assert data['type'] == 'SimulationControl', \
|
|
137
|
+
'Expected SimulationControl dictionary. Got {}.'.format(data['type'])
|
|
138
|
+
do_zone_sizing = data['do_zone_sizing'] if \
|
|
139
|
+
'do_zone_sizing' in data else True
|
|
140
|
+
do_system_sizing = data['do_system_sizing'] if \
|
|
141
|
+
'do_system_sizing' in data else True
|
|
142
|
+
do_plant_sizing = data['do_plant_sizing'] if \
|
|
143
|
+
'do_plant_sizing' in data else True
|
|
144
|
+
run_for_sizing_periods = data['run_for_sizing_periods'] if \
|
|
145
|
+
'run_for_sizing_periods' in data else False
|
|
146
|
+
run_for_run_periods = data['run_for_run_periods'] if \
|
|
147
|
+
'run_for_run_periods' in data else False
|
|
148
|
+
return cls(do_zone_sizing, do_system_sizing, do_plant_sizing,
|
|
149
|
+
run_for_sizing_periods, run_for_run_periods)
|
|
150
|
+
|
|
151
|
+
def to_idf(self):
|
|
152
|
+
"""Get an EnergyPlus string representation of the SimulationControl.
|
|
153
|
+
|
|
154
|
+
.. code-block:: shell
|
|
155
|
+
|
|
156
|
+
SimulationControl,
|
|
157
|
+
Yes, !- do zone sizing
|
|
158
|
+
Yes, !- do system sizing
|
|
159
|
+
Yes, !- do plant sizing
|
|
160
|
+
No, !- run for sizing periods
|
|
161
|
+
Yes; !- run for run periods
|
|
162
|
+
"""
|
|
163
|
+
do_zone_sizing = 'Yes' if self.do_zone_sizing else 'No'
|
|
164
|
+
do_system_sizing = 'Yes' if self.do_system_sizing else 'No'
|
|
165
|
+
do_plant_sizing = 'Yes' if self.do_plant_sizing else 'No'
|
|
166
|
+
run_for_sizing_periods = 'Yes' if self.run_for_sizing_periods else 'No'
|
|
167
|
+
run_for_run_periods = 'Yes' if self.run_for_run_periods else 'No'
|
|
168
|
+
values = (do_zone_sizing, do_system_sizing, do_plant_sizing,
|
|
169
|
+
run_for_sizing_periods, run_for_run_periods)
|
|
170
|
+
comments = ('do zone sizing', 'do system sizing', 'do plant sizing',
|
|
171
|
+
'run for sizing periods', 'run for run periods')
|
|
172
|
+
return generate_idf_string('SimulationControl', values, comments)
|
|
173
|
+
|
|
174
|
+
def to_dict(self):
|
|
175
|
+
"""SimulationControl dictionary representation."""
|
|
176
|
+
return {
|
|
177
|
+
'type': 'SimulationControl',
|
|
178
|
+
'do_zone_sizing': self.do_zone_sizing,
|
|
179
|
+
'do_system_sizing': self.do_system_sizing,
|
|
180
|
+
'do_plant_sizing': self.do_plant_sizing,
|
|
181
|
+
'run_for_sizing_periods': self.run_for_sizing_periods,
|
|
182
|
+
'run_for_run_periods': self.run_for_run_periods
|
|
183
|
+
}
|
|
184
|
+
|
|
185
|
+
def duplicate(self):
|
|
186
|
+
"""Get a copy of this object."""
|
|
187
|
+
return self.__copy__()
|
|
188
|
+
|
|
189
|
+
def ToString(self):
|
|
190
|
+
"""Overwrite .NET ToString."""
|
|
191
|
+
return self.__repr__()
|
|
192
|
+
|
|
193
|
+
def __copy__(self):
|
|
194
|
+
return SimulationControl(
|
|
195
|
+
self.do_zone_sizing, self.do_system_sizing,
|
|
196
|
+
self.do_plant_sizing, self.run_for_sizing_periods,
|
|
197
|
+
self.run_for_run_periods)
|
|
198
|
+
|
|
199
|
+
def __key(self):
|
|
200
|
+
"""A tuple based on the object properties, useful for hashing."""
|
|
201
|
+
return (self.do_zone_sizing, self.do_system_sizing, self.do_plant_sizing,
|
|
202
|
+
self.run_for_sizing_periods, self.run_for_run_periods)
|
|
203
|
+
|
|
204
|
+
def __hash__(self):
|
|
205
|
+
return hash(self.__key())
|
|
206
|
+
|
|
207
|
+
def __eq__(self, other):
|
|
208
|
+
return isinstance(other, SimulationControl) and self.__key() == other.__key()
|
|
209
|
+
|
|
210
|
+
def __ne__(self, other):
|
|
211
|
+
return not self.__eq__(other)
|
|
212
|
+
|
|
213
|
+
def __repr__(self):
|
|
214
|
+
return self.to_idf()
|
|
@@ -0,0 +1,185 @@
|
|
|
1
|
+
# coding=utf-8
|
|
2
|
+
"""EnergyPlus Daylight Saving Time Period."""
|
|
3
|
+
from __future__ import division
|
|
4
|
+
|
|
5
|
+
from ..reader import parse_idf_string
|
|
6
|
+
from ..writer import generate_idf_string
|
|
7
|
+
|
|
8
|
+
from ladybug.analysisperiod import AnalysisPeriod
|
|
9
|
+
from ladybug.dt import Date
|
|
10
|
+
|
|
11
|
+
|
|
12
|
+
class DaylightSavingTime(object):
|
|
13
|
+
"""EnergyPlus Daylight Saving Time Period.
|
|
14
|
+
|
|
15
|
+
Args:
|
|
16
|
+
start_date: A ladybug Date object for the start of daylight saving time.
|
|
17
|
+
Must be before the end date and have a leap_year property matching the
|
|
18
|
+
end_date. Default: 12 Mar (daylight savings in the US in 2017)
|
|
19
|
+
end_date: A ladybug Date object for the end of daylight saving time.
|
|
20
|
+
Must be after the start date and have a leap_year property matching the
|
|
21
|
+
start_date. Default: 5 Nov (daylight savings in the US in 2017)
|
|
22
|
+
|
|
23
|
+
Properties:
|
|
24
|
+
* start_date
|
|
25
|
+
* end_date
|
|
26
|
+
"""
|
|
27
|
+
__slots__ = ('_start_date', '_end_date')
|
|
28
|
+
|
|
29
|
+
def __init__(self, start_date=Date(3, 12), end_date=Date(11, 5)):
|
|
30
|
+
"""Initialize DaylightSavingTime."""
|
|
31
|
+
# process the dates
|
|
32
|
+
if start_date is not None:
|
|
33
|
+
self._check_date(start_date, 'start_date')
|
|
34
|
+
self._start_date = start_date
|
|
35
|
+
else:
|
|
36
|
+
self._start_date = Date(3, 12)
|
|
37
|
+
self.end_date = end_date
|
|
38
|
+
|
|
39
|
+
@property
|
|
40
|
+
def start_date(self):
|
|
41
|
+
"""Get or set a ladybug Date object for the start of the period."""
|
|
42
|
+
return self._start_date
|
|
43
|
+
|
|
44
|
+
@start_date.setter
|
|
45
|
+
def start_date(self, value):
|
|
46
|
+
if value is not None:
|
|
47
|
+
self._check_date(value, 'start_date')
|
|
48
|
+
self._start_date = value
|
|
49
|
+
else:
|
|
50
|
+
self._start_date = Date(1, 1)
|
|
51
|
+
self._check_start_before_end()
|
|
52
|
+
|
|
53
|
+
@property
|
|
54
|
+
def end_date(self):
|
|
55
|
+
"""Get or set a ladybug Date object for the end of the period."""
|
|
56
|
+
return self._end_date
|
|
57
|
+
|
|
58
|
+
@end_date.setter
|
|
59
|
+
def end_date(self, value):
|
|
60
|
+
if value is not None:
|
|
61
|
+
self._check_date(value, 'end_date')
|
|
62
|
+
self._end_date = value
|
|
63
|
+
else:
|
|
64
|
+
self._end_date = Date(12, 31)
|
|
65
|
+
self._check_start_before_end()
|
|
66
|
+
|
|
67
|
+
@classmethod
|
|
68
|
+
def from_analysis_period(cls, analysis_period=AnalysisPeriod(3, 12, 0, 11, 5, 23)):
|
|
69
|
+
"""Initialize a DaylightSavingTime object from a ladybug AnalysisPeriod.
|
|
70
|
+
|
|
71
|
+
Args:
|
|
72
|
+
analysis_period: A ladybug AnalysisPeriod object that has the start
|
|
73
|
+
and end dates for daylight savings time.
|
|
74
|
+
Default: 12 Mar - 5 Nov (daylight savings in the US in 2017)
|
|
75
|
+
"""
|
|
76
|
+
assert isinstance(analysis_period, AnalysisPeriod), 'Expected AnalysisPeriod ' \
|
|
77
|
+
'for DaylightSavingTime.from_analysis_period. Got {}.'.format(
|
|
78
|
+
type(analysis_period))
|
|
79
|
+
st_date = Date(analysis_period.st_month, analysis_period.st_day,
|
|
80
|
+
analysis_period.is_leap_year)
|
|
81
|
+
end_date = Date(analysis_period.end_month, analysis_period.end_day,
|
|
82
|
+
analysis_period.is_leap_year)
|
|
83
|
+
return cls(st_date, end_date)
|
|
84
|
+
|
|
85
|
+
@classmethod
|
|
86
|
+
def from_idf(cls, idf_string):
|
|
87
|
+
"""Create a DaylightSavingTime object from an EnergyPlus IDF text string.
|
|
88
|
+
|
|
89
|
+
Args:
|
|
90
|
+
idf_string: A text string fully describing an EnergyPlus
|
|
91
|
+
RunPeriodControl:DaylightSavingTime definition.
|
|
92
|
+
"""
|
|
93
|
+
# check the inputs
|
|
94
|
+
ep_strs = parse_idf_string(idf_string, 'RunPeriodControl:DaylightSavingTime,')
|
|
95
|
+
start_vals = ep_strs[0].split('/')
|
|
96
|
+
end_vals = ep_strs[1].split('/')
|
|
97
|
+
start_date = Date(int(start_vals[0]), int(start_vals[1]))
|
|
98
|
+
end_date = Date(int(end_vals[0]), int(end_vals[1]))
|
|
99
|
+
return cls(start_date, end_date)
|
|
100
|
+
|
|
101
|
+
@classmethod
|
|
102
|
+
def from_dict(cls, data):
|
|
103
|
+
"""Create a DaylightSavingTime object from a dictionary.
|
|
104
|
+
|
|
105
|
+
Args:
|
|
106
|
+
data: A DaylightSavingTime dictionary in following the format below.
|
|
107
|
+
|
|
108
|
+
.. code-block:: python
|
|
109
|
+
|
|
110
|
+
{
|
|
111
|
+
"type": "DaylightSavingTime",
|
|
112
|
+
"start_date": [3, 12],
|
|
113
|
+
"end_date": [11, 5]
|
|
114
|
+
}
|
|
115
|
+
"""
|
|
116
|
+
assert data['type'] == 'DaylightSavingTime', \
|
|
117
|
+
'Expected DaylightSavingTime dictionary. Got {}.'.format(data['type'])
|
|
118
|
+
start_date = Date.from_array(data['start_date']) if 'start_date' in data and \
|
|
119
|
+
data['start_date'] is not None else Date(1, 1)
|
|
120
|
+
end_date = Date.from_array(data['end_date']) if 'end_date' in data and \
|
|
121
|
+
data['end_date'] is not None else Date(12, 31)
|
|
122
|
+
return cls(start_date, end_date)
|
|
123
|
+
|
|
124
|
+
def to_idf(self):
|
|
125
|
+
"""Get an EnergyPlus string representation of the DaylightSavingTime.
|
|
126
|
+
|
|
127
|
+
.. code-block:: shell
|
|
128
|
+
|
|
129
|
+
RunPeriodControl:DaylightSavingTime,
|
|
130
|
+
2nd Sunday in March, !- Start Date
|
|
131
|
+
1st Sunday in November; !- End Date
|
|
132
|
+
"""
|
|
133
|
+
values = ('{}/{}'.format(self.start_date.month, self.start_date.day),
|
|
134
|
+
'{}/{}'.format(self.end_date.month, self.end_date.day))
|
|
135
|
+
comments = ('start date', 'end date')
|
|
136
|
+
return generate_idf_string('RunPeriodControl:DaylightSavingTime',
|
|
137
|
+
values, comments)
|
|
138
|
+
|
|
139
|
+
def to_dict(self):
|
|
140
|
+
"""DaylightSavingTime dictionary representation."""
|
|
141
|
+
return {
|
|
142
|
+
'type': 'DaylightSavingTime',
|
|
143
|
+
'start_date': self.start_date.to_array(),
|
|
144
|
+
'end_date': self.end_date.to_array()
|
|
145
|
+
}
|
|
146
|
+
|
|
147
|
+
def duplicate(self):
|
|
148
|
+
"""Get a copy of this object."""
|
|
149
|
+
return self.__copy__()
|
|
150
|
+
|
|
151
|
+
def _check_start_before_end(self):
|
|
152
|
+
"""Check that the start_date is before the end_date."""
|
|
153
|
+
assert self.start_date.leap_year is self.end_date.leap_year, \
|
|
154
|
+
'DaylightSavingTime start_date.leap_year must match the end_date.leap_year'
|
|
155
|
+
assert self._start_date <= self._end_date, \
|
|
156
|
+
'DaylightSavingTime start_date must be before end_date. ' \
|
|
157
|
+
'{} is after {}.'.format(self.start_date, self.end_date)
|
|
158
|
+
|
|
159
|
+
@staticmethod
|
|
160
|
+
def _check_date(date, date_name='date'):
|
|
161
|
+
assert isinstance(date, Date), 'Expected ladybug Date for ' \
|
|
162
|
+
'DaylightSavingTime {}. Got {}.'.format(date_name, type(date))
|
|
163
|
+
|
|
164
|
+
def ToString(self):
|
|
165
|
+
"""Overwrite .NET ToString."""
|
|
166
|
+
return self.__repr__()
|
|
167
|
+
|
|
168
|
+
def __copy__(self):
|
|
169
|
+
return DaylightSavingTime(self.start_date, self.end_date)
|
|
170
|
+
|
|
171
|
+
def __key(self):
|
|
172
|
+
"""A tuple based on the object properties, useful for hashing."""
|
|
173
|
+
return (hash(self.start_date), hash(self.end_date))
|
|
174
|
+
|
|
175
|
+
def __hash__(self):
|
|
176
|
+
return hash(self.__key())
|
|
177
|
+
|
|
178
|
+
def __eq__(self, other):
|
|
179
|
+
return isinstance(other, DaylightSavingTime) and self.__key() == other.__key()
|
|
180
|
+
|
|
181
|
+
def __ne__(self, other):
|
|
182
|
+
return not self.__eq__(other)
|
|
183
|
+
|
|
184
|
+
def __repr__(self):
|
|
185
|
+
return self.to_idf()
|
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
# coding=utf-8
|
|
2
|
+
"""Utilities to convert simulation dictionaries to Python objects."""
|
|
3
|
+
from honeybee_energy.simulation.control import SimulationControl
|
|
4
|
+
from honeybee_energy.simulation.runperiod import RunPeriod
|
|
5
|
+
from honeybee_energy.simulation.daylightsaving import DaylightSavingTime
|
|
6
|
+
from honeybee_energy.simulation.shadowcalculation import ShadowCalculation
|
|
7
|
+
from honeybee_energy.simulation.sizing import SizingParameter
|
|
8
|
+
from honeybee_energy.simulation.output import SimulationOutput
|
|
9
|
+
from honeybee_energy.simulation.parameter import SimulationParameter
|
|
10
|
+
|
|
11
|
+
|
|
12
|
+
SIMULATION_TYPES = ('SimulationControl', 'RunPeriod', 'DaylightSavingTime',
|
|
13
|
+
'ShadowCalculation', 'SizingParameter', 'SimulationOutput',
|
|
14
|
+
'SimulationParameter')
|
|
15
|
+
|
|
16
|
+
|
|
17
|
+
def dict_to_simulation(sim_dict, raise_exception=True):
|
|
18
|
+
"""Get a Python object of any Simulation object from a dictionary.
|
|
19
|
+
|
|
20
|
+
Args:
|
|
21
|
+
sim_dict: A dictionary of any Honeybee energy simulation object. Note
|
|
22
|
+
that this should be a non-abridged dictionary to be valid.
|
|
23
|
+
raise_exception: Boolean to note whether an excpetion should be raised
|
|
24
|
+
if the object is not identified as a simulation object. Default: True.
|
|
25
|
+
|
|
26
|
+
Returns:
|
|
27
|
+
A Python object derived from the input sim_dict.
|
|
28
|
+
"""
|
|
29
|
+
try: # get the type key from the dictionary
|
|
30
|
+
sim_type = sim_dict['type']
|
|
31
|
+
except KeyError:
|
|
32
|
+
raise ValueError('Simulation dictionary lacks required "type" key.')
|
|
33
|
+
|
|
34
|
+
if sim_type == 'SimulationControl':
|
|
35
|
+
return SimulationControl.from_dict(sim_dict)
|
|
36
|
+
elif sim_type == 'RunPeriod':
|
|
37
|
+
return RunPeriod.from_dict(sim_dict)
|
|
38
|
+
elif sim_type == 'DaylightSavingTime':
|
|
39
|
+
return DaylightSavingTime.from_dict(sim_dict)
|
|
40
|
+
elif sim_type == 'ShadowCalculation':
|
|
41
|
+
return ShadowCalculation.from_dict(sim_dict)
|
|
42
|
+
elif sim_type == 'SizingParameter':
|
|
43
|
+
return SizingParameter.from_dict(sim_dict)
|
|
44
|
+
elif sim_type == 'SimulationOutput':
|
|
45
|
+
return SimulationOutput.from_dict(sim_dict)
|
|
46
|
+
elif sim_type == 'SimulationParameter':
|
|
47
|
+
return SimulationParameter.from_dict(sim_dict)
|
|
48
|
+
elif raise_exception:
|
|
49
|
+
raise ValueError(
|
|
50
|
+
'{} is not a recognized energy Simulation type'.format(sim_type)
|
|
51
|
+
)
|