honeybee-energy 1.116.25__py2.py3-none-any.whl → 1.116.27__py2.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.

Potentially problematic release.


This version of honeybee-energy might be problematic. Click here for more details.

@@ -59,6 +59,8 @@ class ConstructionSet(object):
59
59
  * modified_constructions_unique
60
60
  * materials_unique
61
61
  * modified_materials_unique
62
+ * is_interior_defaulted
63
+ * is_interior_symmetric
62
64
  * user_data
63
65
  """
64
66
  __slots__ = ('_identifier', '_display_name', '_wall_set', '_floor_set',
@@ -271,6 +273,51 @@ class ConstructionSet(object):
271
273
  pass # ShadeConstruction or AirBoundaryConstruction
272
274
  return list(set(materials))
273
275
 
276
+ @property
277
+ def is_interior_defaulted(self):
278
+ """Get a boolean for whether all interior constructions of the set are defaulted.
279
+
280
+ If all construction sets in a model use the same default interior constructions,
281
+ it meas that the construction sets won't create any conflicts between adjacent
282
+ interior Faces.
283
+ """
284
+ return self.wall_set._interior_construction is None and \
285
+ self.aperture_set._interior_construction is None and \
286
+ self.door_set._interior_construction is None and \
287
+ self.floor_set._interior_construction is None and \
288
+ self.roof_ceiling_set._interior_construction is None
289
+
290
+ @property
291
+ def is_interior_symmetric(self):
292
+ """Get a boolean for whether all interior constructions of the set are symmetric.
293
+
294
+ This will only be true if the interior wall, window and door constructions
295
+ are symmetric and the material layers of the interior floor construction
296
+ is a reversed version of the ceiling construction. When these criteria
297
+ are met, it meas that the construction set can be applied to all rooms
298
+ of a Model without concern for it creating conflicts between adjacent
299
+ interior Faces.
300
+ """
301
+ # check the constructions that are supposed to be symmetric
302
+ wall_con = self.wall_set._interior_construction
303
+ if wall_con is not None and not wall_con.is_symmetric:
304
+ return False
305
+ win_con = self.aperture_set._interior_construction
306
+ if win_con is not None and not win_con.is_symmetric:
307
+ return False
308
+ door_con = self.door_set._interior_construction
309
+ if door_con is not None and not door_con.is_symmetric:
310
+ return False
311
+ glz_dr_con = self.door_set._interior_glass_construction
312
+ if glz_dr_con is not None and not glz_dr_con.is_symmetric:
313
+ return False
314
+ # check that the floor is the reverse of the floor
315
+ floor_con = self.floor_set.interior_construction
316
+ ceil_con = self.roof_ceiling_set.interior_construction
317
+ if floor_con.materials != tuple(reversed(ceil_con.materials)):
318
+ return False
319
+ return True
320
+
274
321
  @property
275
322
  def user_data(self):
276
323
  """Get or set an optional dictionary for additional meta data for this object.
@@ -789,7 +789,7 @@ class ModelEnergyProperties(object):
789
789
  msgs.append(self.check_all_zones_have_one_hvac(False, detailed))
790
790
  msgs.append(self.check_detailed_hvac_rooms(False, detailed))
791
791
  msgs.append(self.check_shw_rooms_in_model(False, detailed))
792
- msgs.append(self.check_all_air_boundaries_with_window(False, detailed))
792
+ msgs.append(self.check_maximum_elevation(1000, False, detailed))
793
793
  msgs.append(self.check_one_vegetation_material(False, detailed))
794
794
  msgs.append(self.check_interior_constructions_reversed(False, detailed))
795
795
 
@@ -833,7 +833,7 @@ class ModelEnergyProperties(object):
833
833
  msgs.append(self.check_all_zones_have_one_hvac(False, detailed))
834
834
  msgs.append(self.check_detailed_hvac_rooms(False, detailed))
835
835
  msgs.append(self.check_shw_rooms_in_model(False, detailed))
836
- msgs.append(self.check_all_air_boundaries_with_window(False, detailed))
836
+ msgs.append(self.check_maximum_elevation(1000, False, detailed))
837
837
  msgs.append(self.check_one_vegetation_material(False, detailed))
838
838
  msgs.append(self.check_interior_constructions_reversed(False, detailed))
839
839
  # output a final report of errors or raise an exception
@@ -980,7 +980,7 @@ class ModelEnergyProperties(object):
980
980
  error_type='Duplicate SHW Identifier')
981
981
 
982
982
  def check_all_zones_have_one_hvac(self, raise_exception=True, detailed=False):
983
- """Check that all rooms within each zone have only ony HVAC assigned to them.
983
+ """Check that all rooms within each zone have only one HVAC assigned to them.
984
984
 
985
985
  Multiple HVAC systems serving one zone typically causes EnergyPlus simulation
986
986
  failures and is often a mistake that results from changing zoning strategies
@@ -1099,99 +1099,6 @@ class ModelEnergyProperties(object):
1099
1099
  return msg
1100
1100
  return [] if detailed else ''
1101
1101
 
1102
- def check_one_vegetation_material(self, raise_exception=True, detailed=False):
1103
- """Check that there no more than one EnergyMaterialVegetation in the model.
1104
-
1105
- It is a limitation of EnergyPlus that it can only simulate a single
1106
- eco roof per model. This should probably be addressed at some point
1107
- so that we don't always have to check for it.
1108
-
1109
- Args:
1110
- raise_exception: Boolean for whether a ValueError should be raised if there's
1111
- more than one EnergyMaterialVegetation in the Model. (Default: True).
1112
- detailed: Boolean for whether the returned object is a detailed list of
1113
- dicts with error info or a string with a message. (Default: False).
1114
-
1115
- Returns:
1116
- A string with the message or a list with a dictionary if detailed is True.
1117
- """
1118
- # first see if there's more than one vegetation material
1119
- all_constrs = self.room_constructions + self.face_constructions
1120
- materials = []
1121
- for constr in all_constrs:
1122
- try:
1123
- materials.extend(constr.materials)
1124
- except AttributeError:
1125
- pass # ShadeConstruction
1126
- all_mats = list(set(materials))
1127
- veg_mats = [m for m in all_mats if isinstance(m, EnergyMaterialVegetation)]
1128
-
1129
- # if more than one vegetation material was found, then report the issue
1130
- if len(veg_mats) > 1:
1131
- if detailed:
1132
- all_err = []
1133
- for v_mat in veg_mats:
1134
- msg = 'EnergyMaterialVegetation "{}" is one of several vegetation ' \
1135
- 'materials in the model.\nThis is not allowed by ' \
1136
- 'EnergyPlus.'.format(v_mat.identifier)
1137
- error_dict = {
1138
- 'type': 'ValidationError',
1139
- 'code': '020010',
1140
- 'error_type': 'Multiple Vegetation Materials',
1141
- 'extension_type': 'Energy',
1142
- 'element_type': 'Material',
1143
- 'element_id': [v_mat.identifier],
1144
- 'element_name': [v_mat.display_name],
1145
- 'message': msg
1146
- }
1147
- all_err.append(error_dict)
1148
- return all_err
1149
- else:
1150
- veg_mats_ids = [v_mat.identifier for v_mat in veg_mats]
1151
- msg = 'The model has multiple vegetation materials. This is not ' \
1152
- 'allowed by EnergyPlus:\n{}'.format('\n'.join(veg_mats_ids))
1153
- if raise_exception:
1154
- raise ValueError(msg)
1155
- return msg
1156
- return [] if detailed else ''
1157
-
1158
- def check_all_air_boundaries_with_window(self, raise_exception=True, detailed=False):
1159
- """Check there are no Rooms with windows and otherwise composed of AirBoundaries.
1160
-
1161
- This is a requirement for energy simulation since EnergyPlus will throw
1162
- an error if it encounters a Room composed entirely of AirBoundaries except
1163
- for one Face with a window.
1164
-
1165
- Args:
1166
- raise_exception: Boolean to note whether a ValueError should be raised
1167
- if a Room composed entirely of AirBoundaries is found. (Default: True).
1168
- detailed: Boolean for whether the returned object is a detailed list of
1169
- dicts with error info or a string with a message. (Default: False).
1170
-
1171
- Returns:
1172
- A string with the message or a list with a dictionary if detailed is True.
1173
- """
1174
- detailed = False if raise_exception else detailed
1175
- msgs = []
1176
- for room in self.host._rooms:
1177
- non_ab = [f for f in room._faces if not isinstance(f.type, AirBoundary)]
1178
- if all(len(f.apertures) > 0 for f in non_ab):
1179
- if len(non_ab) != 0:
1180
- st_msg = 'is almost entirely composed of AirBoundary Faces with ' \
1181
- 'the other {} Faces having Apertures'.format(len(non_ab))
1182
- msg = 'Room "{}" {}.\nIt should be merged with adjacent ' \
1183
- 'rooms.'.format(room.full_id, st_msg)
1184
- msg = self.host._validation_message_child(
1185
- msg, room, detailed, '000207',
1186
- error_type='Room Composed Entirely of AirBoundaries')
1187
- msgs.append(msg)
1188
- if detailed:
1189
- return msgs
1190
- full_msg = '\n'.join(msgs)
1191
- if raise_exception and len(msgs) != 0:
1192
- raise ValueError(full_msg)
1193
- return full_msg
1194
-
1195
1102
  def check_detailed_hvac_rooms(self, raise_exception=True, detailed=False):
1196
1103
  """Check that any rooms referenced within a DetailedHVAC exist in the model.
1197
1104
 
@@ -1303,6 +1210,122 @@ class ModelEnergyProperties(object):
1303
1210
  return all_err if detailed else '\n'.join(all_err)
1304
1211
  return [] if detailed else ''
1305
1212
 
1213
+ def check_one_vegetation_material(self, raise_exception=True, detailed=False):
1214
+ """Check that there no more than one EnergyMaterialVegetation in the model.
1215
+
1216
+ It is a limitation of EnergyPlus that it can only simulate a single
1217
+ eco roof per model. This should probably be addressed at some point
1218
+ so that we don't always have to check for it.
1219
+
1220
+ Args:
1221
+ raise_exception: Boolean for whether a ValueError should be raised if there's
1222
+ more than one EnergyMaterialVegetation in the Model. (Default: True).
1223
+ detailed: Boolean for whether the returned object is a detailed list of
1224
+ dicts with error info or a string with a message. (Default: False).
1225
+
1226
+ Returns:
1227
+ A string with the message or a list with a dictionary if detailed is True.
1228
+ """
1229
+ # first see if there's more than one vegetation material
1230
+ all_constrs = self.room_constructions + self.face_constructions
1231
+ materials = []
1232
+ for constr in all_constrs:
1233
+ try:
1234
+ materials.extend(constr.materials)
1235
+ except AttributeError:
1236
+ pass # ShadeConstruction
1237
+ all_mats = list(set(materials))
1238
+ veg_mats = [m for m in all_mats if isinstance(m, EnergyMaterialVegetation)]
1239
+
1240
+ # if more than one vegetation material was found, then report the issue
1241
+ if len(veg_mats) > 1:
1242
+ if detailed:
1243
+ all_err = []
1244
+ for v_mat in veg_mats:
1245
+ msg = 'EnergyMaterialVegetation "{}" is one of several vegetation ' \
1246
+ 'materials in the model.\nThis is not allowed by ' \
1247
+ 'EnergyPlus.'.format(v_mat.identifier)
1248
+ error_dict = {
1249
+ 'type': 'ValidationError',
1250
+ 'code': '020010',
1251
+ 'error_type': 'Multiple Vegetation Materials',
1252
+ 'extension_type': 'Energy',
1253
+ 'element_type': 'Material',
1254
+ 'element_id': [v_mat.identifier],
1255
+ 'element_name': [v_mat.display_name],
1256
+ 'message': msg
1257
+ }
1258
+ all_err.append(error_dict)
1259
+ return all_err
1260
+ else:
1261
+ veg_mats_ids = [v_mat.identifier for v_mat in veg_mats]
1262
+ msg = 'The model has multiple vegetation materials. This is not ' \
1263
+ 'allowed by EnergyPlus:\n{}'.format('\n'.join(veg_mats_ids))
1264
+ if raise_exception:
1265
+ raise ValueError(msg)
1266
+ return msg
1267
+ return [] if detailed else ''
1268
+
1269
+ def check_maximum_elevation(self, max_elevation=1000, raise_exception=True,
1270
+ detailed=False):
1271
+ """Check that no Rooms of the model are above a certain elevation.
1272
+
1273
+ EnergyPlus computes wind speeds, air pressures, and adjusts outdoor
1274
+ temperatures to account for the height above the ground using the Z values
1275
+ of the geometry coordinates. This is an important consideration when modeling
1276
+ skyscrapers but it can be detrimental when a building has been modeled
1277
+ with its coordinates at the height above sea level and the location
1278
+ is significantly above sea level (eg. Denver, Colorado).
1279
+
1280
+ This validation check is intended to catch such cases and make the user
1281
+ aware of the repercussions.
1282
+
1283
+ Args:
1284
+ max_elevation: A number for the maximum elevation in Meters that the
1285
+ model's rooms are permitted to be at before a ValidationError is
1286
+ reported. While EnergyPlus technically still simulates with models that
1287
+ are 12 kilometers above the origin, better practice is to set this
1288
+ value at the maximum height above the ground that any human-made
1289
+ structure can reasonably obtain. For this reason, the default is
1290
+ set to 1000 meters or roughly the height of the Burj tower.
1291
+ raise_exception: Boolean to note whether a ValueError should be raised
1292
+ if a Room composed entirely of AirBoundaries is found. (Default: True).
1293
+ detailed: Boolean for whether the returned object is a detailed list of
1294
+ dicts with error info or a string with a message. (Default: False).
1295
+
1296
+ Returns:
1297
+ A string with the message or a list with a dictionary if detailed is True.
1298
+ """
1299
+ # get the maximum elevation of all the rooms
1300
+ conv_fac = conversion_factor_to_meters(self.host.units)
1301
+ max_elev_model = max_elevation / conv_fac
1302
+ room_elevations = tuple(room.max.z for room in self.host.rooms)
1303
+ max_bldg_elev = max(room_elevations)
1304
+
1305
+ # if the maximum elevation was exceeded, then report the issue
1306
+ if max_bldg_elev > max_elev_model:
1307
+ msg = 'The building height is currently {} meters above the ground ' \
1308
+ 'given the Z values of the coordinates.\nThis is above the ' \
1309
+ 'maximum recommended height of {} meters.'.format(
1310
+ int(max_bldg_elev * conv_fac), max_elevation)
1311
+ if detailed:
1312
+ error_dict = {
1313
+ 'type': 'ValidationError',
1314
+ 'code': '020101',
1315
+ 'error_type': 'Building Height Exceeds Max Elevation',
1316
+ 'extension_type': 'Energy',
1317
+ 'element_type': 'Building',
1318
+ 'element_id': [self.host.identifier],
1319
+ 'element_name': [self.host.display_name],
1320
+ 'message': msg
1321
+ }
1322
+ return [error_dict]
1323
+ else:
1324
+ if raise_exception:
1325
+ raise ValueError(msg)
1326
+ return msg
1327
+ return [] if detailed else ''
1328
+
1306
1329
  def check_interior_constructions_reversed(
1307
1330
  self, raise_exception=True, detailed=False):
1308
1331
  """Check that all interior constructions are in reversed order for paired faces.
@@ -757,11 +757,11 @@ class RoomEnergyProperties(object):
757
757
  def add_default_ideal_air(self):
758
758
  """Add a default IdealAirSystem to this Room.
759
759
 
760
- The identifier of this system will be derived from the room identifier
760
+ The identifier of this system will be derived from the room zone name
761
761
  and will align with the naming convention that EnergyPlus uses for
762
762
  templates Ideal Air systems.
763
763
  """
764
- hvac_id = '{} Ideal Loads Air System'.format(self.host.identifier)
764
+ hvac_id = '{} Ideal Loads Air System'.format(self.host.zone)
765
765
  self.hvac = IdealAirSystem(hvac_id)
766
766
 
767
767
  def assign_ideal_air_equivalent(self):
@@ -4,6 +4,7 @@ from __future__ import division
4
4
 
5
5
  import re
6
6
 
7
+ from honeybee.typing import clean_ep_string
7
8
  from honeybee.door import Door
8
9
  from honeybee.aperture import Aperture
9
10
  from honeybee.face import Face
@@ -81,10 +82,11 @@ def match_rooms_to_data(
81
82
  if not space_based and zone_correct_mult:
82
83
  zone_counter = {}
83
84
  for room in rooms:
85
+ z_id = clean_ep_string(room.zone)
84
86
  try:
85
- zone_counter[room.zone] += 1
87
+ zone_counter[z_id] += 1
86
88
  except KeyError: # first room found in the zone
87
- zone_counter[room.zone] = 1
89
+ zone_counter[z_id] = 1
88
90
 
89
91
  # loop through the rooms and match the data to them
90
92
  matched_tuples = [] # list of matched rooms and data collections
@@ -92,8 +94,9 @@ def match_rooms_to_data(
92
94
  if space_based:
93
95
  rm_id, zc = room.identifier.upper(), 1
94
96
  else:
95
- rm_id = room.zone.upper()
96
- zc = zone_counter[room.zone] if zone_correct_mult else 1
97
+ z_id = clean_ep_string(room.zone)
98
+ rm_id = z_id.upper()
99
+ zc = zone_counter[z_id] if zone_correct_mult else 1
97
100
  for i, data_id in enumerate(zone_ids):
98
101
  if data_id == rm_id:
99
102
  mult = 1 if not use_mult else room.multiplier
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: honeybee-energy
3
- Version: 1.116.25
3
+ Version: 1.116.27
4
4
  Summary: Energy simulation library for honeybee.
5
5
  Home-page: https://github.com/ladybug-tools/honeybee-energy
6
6
  Author: Ladybug Tools
@@ -5,7 +5,7 @@ honeybee_energy/altnumber.py,sha256=_B5DcoyV1_D8tSKFoo-jjh5Xo1Yy4TTuHB7frDNKxLg,
5
5
  honeybee_energy/boundarycondition.py,sha256=7zPGwJVRC56jC75fVwRVQgew0RtPDID4YGVQzglcIVE,5740
6
6
  honeybee_energy/config.json,sha256=r1y_CZbDeYJu3HIAOHMzn3NJ_IHld0nejzHeLMDlDFs,344
7
7
  honeybee_energy/config.py,sha256=Wv-JIv5j-Z97_DC7FLnd49tbv53nfNoFcsvjXEeIaRk,35899
8
- honeybee_energy/constructionset.py,sha256=zfAgoo4dpK83vyRMQjX8lgNMD7GoG700vAt0YavqcpA,71464
8
+ honeybee_energy/constructionset.py,sha256=cG7NY834qOj-hB_JFE5-Ksh5u8Vagk41cmS_NP1uv44,73739
9
9
  honeybee_energy/dictutil.py,sha256=fW7zqf2uxl9fdCOOo2ltOx-CuAP9HyYs-fX1WvAcFfg,2457
10
10
  honeybee_energy/internalmass.py,sha256=8b4NuQpi5jBue31Q56YvMTx1iXPEEKmKe9-J9aLh5Ys,12464
11
11
  honeybee_energy/measure.py,sha256=S4MBqC8eLWzqCLFeTa0uQQgWE6-NOPcmUU0wlu9uXB0,17403
@@ -115,8 +115,8 @@ honeybee_energy/properties/aperture.py,sha256=lR2zMmGg-c0uhAiIq26Rk3iAV0_v-c6kiI
115
115
  honeybee_energy/properties/door.py,sha256=IYNOkzLWJG5c4_EsHc1avWzZ-08a2RfjV0WzfivIvwc,15622
116
116
  honeybee_energy/properties/extension.py,sha256=ILzHYtu5Y_KCOUixipWY9NTJHFgvZI7v27sDcFLuSmg,8539
117
117
  honeybee_energy/properties/face.py,sha256=-7lj9_fzoGQ0QhGo_f7U6gUuB3Xy87fpgwSYnVWwZ8s,11400
118
- honeybee_energy/properties/model.py,sha256=gxqtpKyXCMunHMIS8XqfwlzpWEsIhb4UfV6fMDfiAHQ,126108
119
- honeybee_energy/properties/room.py,sha256=lCiw8wqRVOFgZc4FjXVjcrKk3hziZ9IvZ0CSEHUuXlo,82318
118
+ honeybee_energy/properties/model.py,sha256=BqGjshRK3oUOgWC-5vKj-roknF71lLdpHRX1ByMPxas,127420
119
+ honeybee_energy/properties/room.py,sha256=QAVRTWQKuSRHH7-nGx74q3UuaLfb01ZIbvixFTup9Ew,82311
120
120
  honeybee_energy/properties/shade.py,sha256=Aj1RZh2KSkVMn5VT_QUckF_5R3I0O3b35EabqaI2i5g,14107
121
121
  honeybee_energy/properties/shademesh.py,sha256=ykbs4llT86C_U5BhQy2EbINewfg9eVxiPaq5yCRhud8,11486
122
122
  honeybee_energy/result/__init__.py,sha256=U9VEpLsVJg2vHfFflTkmXxc4QUpkw1Phz2io8pYHbHs,43
@@ -126,7 +126,7 @@ honeybee_energy/result/err.py,sha256=xdxtpZFMbX2_hoCSPFgmgiOZzhSX1NCLNj3PkC8xjHc
126
126
  honeybee_energy/result/eui.py,sha256=L3uWBoB6pE46seS9u6_791EhcZ7JGp2ZJgaXKM3kP5Y,4327
127
127
  honeybee_energy/result/generation.py,sha256=fKoBq4CslK9IL-b3HpArY7d2XVuKcs9iYyzLkTPig10,7006
128
128
  honeybee_energy/result/loadbalance.py,sha256=dYdZXyUQeIdEUYY_fy2m4VDqpuplZj7OhuSTo0Xof5c,42572
129
- honeybee_energy/result/match.py,sha256=cNHT2gLeyCst63Pvrhjz8gmO8rNsvZW6ASMGVPutiH0,9168
129
+ honeybee_energy/result/match.py,sha256=wIYcJN8p1vPwyfJZ8AyOz7tYJkE239eFfd7iN5TVgsc,9284
130
130
  honeybee_energy/result/osw.py,sha256=5j1Vs2P8iGb16rgK1LyDPi1jb4VRsoSIMJgp2cYrhH4,2672
131
131
  honeybee_energy/result/rdd.py,sha256=V9Cik36DFslLm3SKMPBHA1ES4xbX5kgU7z0oQjqUVJU,1873
132
132
  honeybee_energy/result/zsz.py,sha256=IXun5bmAWvk-SACdP0gvldsgfbnBr8phTvo1koqAUWc,7532
@@ -156,9 +156,9 @@ honeybee_energy/ventcool/opening.py,sha256=ZywoADlNQ6_8OfjV71ZUpbCAetQrRVj7aprBj
156
156
  honeybee_energy/ventcool/simulation.py,sha256=gMF4sgCQ5R4iFWPnvvB3wxgeP_zEwnWl71ObIIe4XGU,14423
157
157
  tests/fixtures/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
158
158
  tests/fixtures/userdata_fixtures.py,sha256=yDvBR6nsltel_U8hUoUsJ6yufPKTR7Wnsgxe68HtswQ,313
159
- honeybee_energy-1.116.25.dist-info/LICENSE,sha256=hIahDEOTzuHCU5J2nd07LWwkLW7Hko4UFO__ffsvB-8,34523
160
- honeybee_energy-1.116.25.dist-info/METADATA,sha256=IEL7GRy_QmMZboFj5QL4KNYTAXdWcg008jjixbwEtWs,3575
161
- honeybee_energy-1.116.25.dist-info/WHEEL,sha256=AHX6tWk3qWuce7vKLrj7lnulVHEdWoltgauo8bgCXgU,109
162
- honeybee_energy-1.116.25.dist-info/entry_points.txt,sha256=QOMJbH-StaxT4hCjskZtqetNCMNioP3ZiuhoLQ6MANc,63
163
- honeybee_energy-1.116.25.dist-info/top_level.txt,sha256=V9Lz0281hfT83Fy0fSdn_6vwRK9vTQe1_LQXd0_-gAI,22
164
- honeybee_energy-1.116.25.dist-info/RECORD,,
159
+ honeybee_energy-1.116.27.dist-info/LICENSE,sha256=hIahDEOTzuHCU5J2nd07LWwkLW7Hko4UFO__ffsvB-8,34523
160
+ honeybee_energy-1.116.27.dist-info/METADATA,sha256=-3G-Rz-JN-OD01bZsoWshz2k6OMOz2OXudiZVDJOQ5Q,3575
161
+ honeybee_energy-1.116.27.dist-info/WHEEL,sha256=AHX6tWk3qWuce7vKLrj7lnulVHEdWoltgauo8bgCXgU,109
162
+ honeybee_energy-1.116.27.dist-info/entry_points.txt,sha256=QOMJbH-StaxT4hCjskZtqetNCMNioP3ZiuhoLQ6MANc,63
163
+ honeybee_energy-1.116.27.dist-info/top_level.txt,sha256=V9Lz0281hfT83Fy0fSdn_6vwRK9vTQe1_LQXd0_-gAI,22
164
+ honeybee_energy-1.116.27.dist-info/RECORD,,