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,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
+ )