dragonfly-energy 1.35.20__tar.gz → 1.35.67__tar.gz

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 (62) hide show
  1. {dragonfly_energy-1.35.20 → dragonfly_energy-1.35.67}/PKG-INFO +3 -3
  2. {dragonfly_energy-1.35.20 → dragonfly_energy-1.35.67}/dragonfly_energy/cli/simulate.py +86 -51
  3. {dragonfly_energy-1.35.20 → dragonfly_energy-1.35.67}/dragonfly_energy/cli/translate.py +136 -23
  4. {dragonfly_energy-1.35.20 → dragonfly_energy-1.35.67}/dragonfly_energy/des/loop.py +2 -9
  5. {dragonfly_energy-1.35.20 → dragonfly_energy-1.35.67}/dragonfly_energy/run.py +21 -3
  6. {dragonfly_energy-1.35.20 → dragonfly_energy-1.35.67}/dragonfly_energy/writer.py +52 -4
  7. {dragonfly_energy-1.35.20 → dragonfly_energy-1.35.67}/dragonfly_energy.egg-info/PKG-INFO +3 -3
  8. {dragonfly_energy-1.35.20 → dragonfly_energy-1.35.67}/dragonfly_energy.egg-info/requires.txt +2 -2
  9. dragonfly_energy-1.35.67/requirements.txt +2 -0
  10. dragonfly_energy-1.35.20/requirements.txt +0 -2
  11. {dragonfly_energy-1.35.20 → dragonfly_energy-1.35.67}/.coveragerc +0 -0
  12. {dragonfly_energy-1.35.20 → dragonfly_energy-1.35.67}/CODE_OF_CONDUCT.md +0 -0
  13. {dragonfly_energy-1.35.20 → dragonfly_energy-1.35.67}/CONTRIBUTING.md +0 -0
  14. {dragonfly_energy-1.35.20 → dragonfly_energy-1.35.67}/LICENSE +0 -0
  15. {dragonfly_energy-1.35.20 → dragonfly_energy-1.35.67}/MANIFEST.in +0 -0
  16. {dragonfly_energy-1.35.20 → dragonfly_energy-1.35.67}/README.md +0 -0
  17. {dragonfly_energy-1.35.20 → dragonfly_energy-1.35.67}/dev-requirements.txt +0 -0
  18. {dragonfly_energy-1.35.20 → dragonfly_energy-1.35.67}/dragonfly_energy/__init__.py +0 -0
  19. {dragonfly_energy-1.35.20 → dragonfly_energy-1.35.67}/dragonfly_energy/__main__.py +0 -0
  20. {dragonfly_energy-1.35.20 → dragonfly_energy-1.35.67}/dragonfly_energy/_base.py +0 -0
  21. {dragonfly_energy-1.35.20 → dragonfly_energy-1.35.67}/dragonfly_energy/_extend_dragonfly.py +0 -0
  22. {dragonfly_energy-1.35.20 → dragonfly_energy-1.35.67}/dragonfly_energy/cli/__init__.py +0 -0
  23. {dragonfly_energy-1.35.20 → dragonfly_energy-1.35.67}/dragonfly_energy/cli/install.py +0 -0
  24. {dragonfly_energy-1.35.20 → dragonfly_energy-1.35.67}/dragonfly_energy/config.json +0 -0
  25. {dragonfly_energy-1.35.20 → dragonfly_energy-1.35.67}/dragonfly_energy/config.py +0 -0
  26. {dragonfly_energy-1.35.20 → dragonfly_energy-1.35.67}/dragonfly_energy/des/__init__.py +0 -0
  27. {dragonfly_energy-1.35.20 → dragonfly_energy-1.35.67}/dragonfly_energy/des/connector.py +0 -0
  28. {dragonfly_energy-1.35.20 → dragonfly_energy-1.35.67}/dragonfly_energy/des/ghe.py +0 -0
  29. {dragonfly_energy-1.35.20 → dragonfly_energy-1.35.67}/dragonfly_energy/des/junction.py +0 -0
  30. {dragonfly_energy-1.35.20 → dragonfly_energy-1.35.67}/dragonfly_energy/measure.py +0 -0
  31. {dragonfly_energy-1.35.20 → dragonfly_energy-1.35.67}/dragonfly_energy/opendss/__init__.py +0 -0
  32. {dragonfly_energy-1.35.20 → dragonfly_energy-1.35.67}/dragonfly_energy/opendss/colorobj.py +0 -0
  33. {dragonfly_energy-1.35.20 → dragonfly_energy-1.35.67}/dragonfly_energy/opendss/connector.py +0 -0
  34. {dragonfly_energy-1.35.20 → dragonfly_energy-1.35.67}/dragonfly_energy/opendss/junction.py +0 -0
  35. {dragonfly_energy-1.35.20 → dragonfly_energy-1.35.67}/dragonfly_energy/opendss/lib/__init__.py +0 -0
  36. {dragonfly_energy-1.35.20 → dragonfly_energy-1.35.67}/dragonfly_energy/opendss/lib/extended_catalog.json +0 -0
  37. {dragonfly_energy-1.35.20 → dragonfly_energy-1.35.67}/dragonfly_energy/opendss/lib/powerlines.py +0 -0
  38. {dragonfly_energy-1.35.20 → dragonfly_energy-1.35.67}/dragonfly_energy/opendss/lib/transformers.py +0 -0
  39. {dragonfly_energy-1.35.20 → dragonfly_energy-1.35.67}/dragonfly_energy/opendss/lib/wires.py +0 -0
  40. {dragonfly_energy-1.35.20 → dragonfly_energy-1.35.67}/dragonfly_energy/opendss/network.py +0 -0
  41. {dragonfly_energy-1.35.20 → dragonfly_energy-1.35.67}/dragonfly_energy/opendss/powerline.py +0 -0
  42. {dragonfly_energy-1.35.20 → dragonfly_energy-1.35.67}/dragonfly_energy/opendss/result.py +0 -0
  43. {dragonfly_energy-1.35.20 → dragonfly_energy-1.35.67}/dragonfly_energy/opendss/road.py +0 -0
  44. {dragonfly_energy-1.35.20 → dragonfly_energy-1.35.67}/dragonfly_energy/opendss/substation.py +0 -0
  45. {dragonfly_energy-1.35.20 → dragonfly_energy-1.35.67}/dragonfly_energy/opendss/transformer.py +0 -0
  46. {dragonfly_energy-1.35.20 → dragonfly_energy-1.35.67}/dragonfly_energy/opendss/transformerprop.py +0 -0
  47. {dragonfly_energy-1.35.20 → dragonfly_energy-1.35.67}/dragonfly_energy/opendss/wire.py +0 -0
  48. {dragonfly_energy-1.35.20 → dragonfly_energy-1.35.67}/dragonfly_energy/properties/__init__.py +0 -0
  49. {dragonfly_energy-1.35.20 → dragonfly_energy-1.35.67}/dragonfly_energy/properties/building.py +0 -0
  50. {dragonfly_energy-1.35.20 → dragonfly_energy-1.35.67}/dragonfly_energy/properties/context.py +0 -0
  51. {dragonfly_energy-1.35.20 → dragonfly_energy-1.35.67}/dragonfly_energy/properties/model.py +0 -0
  52. {dragonfly_energy-1.35.20 → dragonfly_energy-1.35.67}/dragonfly_energy/properties/room2d.py +0 -0
  53. {dragonfly_energy-1.35.20 → dragonfly_energy-1.35.67}/dragonfly_energy/properties/story.py +0 -0
  54. {dragonfly_energy-1.35.20 → dragonfly_energy-1.35.67}/dragonfly_energy/reopt.py +0 -0
  55. {dragonfly_energy-1.35.20 → dragonfly_energy-1.35.67}/dragonfly_energy.egg-info/SOURCES.txt +0 -0
  56. {dragonfly_energy-1.35.20 → dragonfly_energy-1.35.67}/dragonfly_energy.egg-info/dependency_links.txt +0 -0
  57. {dragonfly_energy-1.35.20 → dragonfly_energy-1.35.67}/dragonfly_energy.egg-info/entry_points.txt +0 -0
  58. {dragonfly_energy-1.35.20 → dragonfly_energy-1.35.67}/dragonfly_energy.egg-info/top_level.txt +0 -0
  59. {dragonfly_energy-1.35.20 → dragonfly_energy-1.35.67}/openstudio-requirements.txt +0 -0
  60. {dragonfly_energy-1.35.20 → dragonfly_energy-1.35.67}/setup.cfg +0 -0
  61. {dragonfly_energy-1.35.20 → dragonfly_energy-1.35.67}/setup.py +0 -0
  62. {dragonfly_energy-1.35.20 → dragonfly_energy-1.35.67}/standards-requirements.txt +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: dragonfly-energy
3
- Version: 1.35.20
3
+ Version: 1.35.67
4
4
  Summary: Dragonfly extension for energy simulation.
5
5
  Home-page: https://github.com/ladybug-tools/dragonfly-energy
6
6
  Author: Ladybug Tools
@@ -18,8 +18,8 @@ Classifier: Programming Language :: Python :: Implementation :: IronPython
18
18
  Classifier: Operating System :: OS Independent
19
19
  Description-Content-Type: text/markdown
20
20
  License-File: LICENSE
21
- Requires-Dist: dragonfly-core==1.70.3
22
- Requires-Dist: honeybee-energy==1.116.81
21
+ Requires-Dist: dragonfly-core==1.74.21
22
+ Requires-Dist: honeybee-energy==1.116.102
23
23
  Provides-Extra: standards
24
24
  Requires-Dist: honeybee-energy-standards==2.2.6; extra == "standards"
25
25
  Provides-Extra: openstudio
@@ -24,60 +24,92 @@ def simulate():
24
24
 
25
25
 
26
26
  @simulate.command('model')
27
- @click.argument('model-json', type=click.Path(
28
- exists=True, file_okay=True, dir_okay=False, resolve_path=True))
29
- @click.argument('epw-file', type=click.Path(
30
- exists=True, file_okay=True, dir_okay=False, resolve_path=True))
27
+ @click.argument(
28
+ 'model-json',
29
+ type=click.Path(exists=True, file_okay=True, dir_okay=False, resolve_path=True)
30
+ )
31
+ @click.argument(
32
+ 'epw-file',
33
+ type=click.Path(exists=True, file_okay=True, dir_okay=False, resolve_path=True)
34
+ )
31
35
  @click.option(
32
36
  '--sim-par-json', '-sp', help='Full path to a honeybee energy '
33
37
  'SimulationParameter JSON that describes all of the settings for '
34
38
  'the simulation.', default=None, show_default=True,
35
- type=click.Path(exists=True, file_okay=True, dir_okay=False, resolve_path=True))
36
- @click.option('--obj-per-model', '-o', help='Text to describe how the input Model '
37
- 'should be divided across the output Models. Choose from: District, '
38
- 'Building, Story.', type=str, default="Building", show_default=True)
39
- @click.option('--multiplier/--full-geometry', ' /-fg', help='Flag to note if the '
40
- 'multipliers on each Building story will be passed along to the '
41
- 'generated Honeybee Room objects or if full geometry objects should be '
42
- 'written for each story in the building.', default=True, show_default=True)
43
- @click.option('--plenum/--no-plenum', '-p/-np', help='Flag to indicate whether '
44
- 'ceiling/floor plenum depths assigned to Room2Ds should generate '
45
- 'distinct 3D Rooms in the translation.', default=True, show_default=True)
46
- @click.option('--no-cap/--cap', ' /-c', help='Flag to indicate whether context shade '
47
- 'buildings should be capped with a top face.',
48
- default=True, show_default=True)
49
- @click.option('--shade-dist', '-sd', help='An optional number to note the distance '
50
- 'beyond which other buildings shade should not be exported into a given '
51
- 'Model. If None, all other buildings will be included as context shade in '
52
- 'each and every Model. Set to 0 to exclude all neighboring buildings '
53
- 'from the resulting models.', type=float, default=None, show_default=True)
54
- @click.option('--no-ceil-adjacency/--ceil-adjacency', ' /-a', help='Flag to indicate '
55
- 'whether adjacencies should be solved between interior stories when '
56
- 'Room2Ds perfectly match one another in their floor plate. This ensures '
57
- 'that Surface boundary conditions are used instead of Adiabatic ones. '
58
- 'Note that this input has no effect when the object-per-model is Story.',
59
- default=True, show_default=True)
60
- @click.option('--measures', '-m', help='Full path to a folder containing an OSW JSON '
61
- 'be used as the base for the execution of the OpenStudio CLI. While this '
62
- 'OSW can contain paths to measures that exist anywhere on the machine, '
63
- 'the best practice is to copy the measures into this measures '
64
- 'folder and use relative paths within the OSW. '
65
- 'This makes it easier to move the inputs for this command from one '
66
- 'machine to another.', default=None, show_default=True,
67
- type=click.Path(file_okay=False, dir_okay=True, resolve_path=True))
68
- @click.option('--folder', '-f', help='Folder on this computer, into which the IDF '
69
- 'and result files will be written. If None, the files will be output '
70
- 'to the honeybee default simulation folder and placed in a project '
71
- 'folder with the same name as the model json.',
72
- default=None, show_default=True,
73
- type=click.Path(file_okay=False, dir_okay=True, resolve_path=True))
74
- @click.option('--log-file', '-log', help='Optional log file to output a dictionary '
75
- 'with the paths of the generated files under the following keys: '
76
- 'osm, idf, sql. By default the list will be printed out to stdout',
77
- type=click.File('w'), default='-', show_default=True)
78
- def simulate_model(model_json, epw_file, sim_par_json, obj_per_model, multiplier,
79
- plenum, no_cap, shade_dist, no_ceil_adjacency,
80
- measures, folder, log_file):
39
+ type=click.Path(exists=True, file_okay=True, dir_okay=False, resolve_path=True)
40
+ )
41
+ @click.option(
42
+ '--obj-per-model', '-o', help='Text to describe how the input Model '
43
+ 'should be divided across the output Models. Choose from: District, '
44
+ 'Building, Story.', type=str, default="Building", show_default=True
45
+ )
46
+ @click.option(
47
+ '--multiplier/--full-geometry', ' /-fg', help='Flag to note if the '
48
+ 'multipliers on each Building story will be passed along to the '
49
+ 'generated Honeybee Room objects or if full geometry objects should be '
50
+ 'written for each story in the building.', default=True, show_default=True
51
+ )
52
+ @click.option(
53
+ '--plenum/--no-plenum', '-p/-np', help='Flag to indicate whether '
54
+ 'ceiling/floor plenum depths assigned to Room2Ds should generate '
55
+ 'distinct 3D Rooms in the translation.', default=True, show_default=True
56
+ )
57
+ @click.option(
58
+ '--no-cap/--cap', ' /-c', help='Flag to indicate whether context shade '
59
+ 'buildings should be capped with a top face.', default=True, show_default=True
60
+ )
61
+ @click.option(
62
+ '--shade-dist', '-sd', help='An optional number to note the distance '
63
+ 'beyond which other buildings shade should not be exported into a given '
64
+ 'Model. If None, all other buildings will be included as context shade in '
65
+ 'each and every Model. Set to 0 to exclude all neighboring buildings '
66
+ 'from the resulting models.', type=float, default=None, show_default=True
67
+ )
68
+ @click.option(
69
+ '--no-ceil-adjacency/--ceil-adjacency', ' /-a', help='Flag to indicate '
70
+ 'whether adjacencies should be solved between interior stories when '
71
+ 'Room2Ds perfectly match one another in their floor plate. This ensures '
72
+ 'that Surface boundary conditions are used instead of Adiabatic ones. '
73
+ 'Note that this input has no effect when the object-per-model is Story.',
74
+ default=True, show_default=True
75
+ )
76
+ @click.option(
77
+ '--merge-method', '-m', help='Text to describe how the Room2Ds should '
78
+ 'be merged into individual Rooms during the translation. Specifying a '
79
+ 'value here can be an effective way to reduce the number of Room '
80
+ 'volumes in the resulting Model and, ultimately, yield a faster simulation '
81
+ 'time with less results to manage. Choose from: None, Zones, PlenumZones, '
82
+ 'Stories, PlenumStories.', type=str, default='None', show_default=True
83
+ )
84
+ @click.option(
85
+ '--measures', '-m', help='Full path to a folder containing an OSW JSON '
86
+ 'be used as the base for the execution of the OpenStudio CLI. While this '
87
+ 'OSW can contain paths to measures that exist anywhere on the machine, '
88
+ 'the best practice is to copy the measures into this measures '
89
+ 'folder and use relative paths within the OSW. '
90
+ 'This makes it easier to move the inputs for this command from one '
91
+ 'machine to another.', default=None, show_default=True,
92
+ type=click.Path(file_okay=False, dir_okay=True, resolve_path=True)
93
+ )
94
+ @click.option(
95
+ '--folder', '-f', help='Folder on this computer, into which the IDF '
96
+ 'and result files will be written. If None, the files will be output '
97
+ 'to the honeybee default simulation folder and placed in a project '
98
+ 'folder with the same name as the model json.',
99
+ default=None, show_default=True,
100
+ type=click.Path(file_okay=False, dir_okay=True, resolve_path=True)
101
+ )
102
+ @click.option(
103
+ '--log-file', '-log', help='Optional log file to output a dictionary '
104
+ 'with the paths of the generated files under the following keys: '
105
+ 'osm, idf, sql. By default the list will be printed out to stdout',
106
+ type=click.File('w'), default='-', show_default=True
107
+ )
108
+ def simulate_model(
109
+ model_json, epw_file, sim_par_json, obj_per_model, multiplier,
110
+ plenum, no_cap, shade_dist, no_ceil_adjacency, merge_method,
111
+ measures, folder, log_file
112
+ ):
81
113
  """Simulate a Dragonfly Model JSON file in EnergyPlus.
82
114
 
83
115
  \b
@@ -160,7 +192,10 @@ def simulate_model(model_json, epw_file, sim_par_json, obj_per_model, multiplier
160
192
  cap = not no_cap
161
193
  ceil_adjacency = not no_ceil_adjacency
162
194
  hb_models = model.to_honeybee(
163
- obj_per_model, shade_dist, multiplier, no_plenum, cap, ceil_adjacency)
195
+ obj_per_model, shade_dist, use_multiplier=multiplier,
196
+ exclude_plenums=no_plenum, cap=cap,
197
+ solve_ceiling_adjacencies=ceil_adjacency, merge_method=merge_method
198
+ )
164
199
 
165
200
  # write out the honeybee JSONs
166
201
  osms = []
@@ -54,6 +54,12 @@ def translate():
54
54
  'that Surface boundary conditions are used instead of Adiabatic ones. '
55
55
  'Note that this input has no effect when the object-per-model is Story.',
56
56
  default=True, show_default=True)
57
+ @click.option('--merge-method', '-m', help='Text to describe how the Room2Ds should '
58
+ 'be merged into individual Rooms during the translation. Specifying a '
59
+ 'value here can be an effective way to reduce the number of Room '
60
+ 'volumes in the resulting Model and, ultimately, yield a faster simulation '
61
+ 'time with less results to manage. Choose from: None, Zones, PlenumZones, '
62
+ 'Stories, PlenumStories.', type=str, default='None', show_default=True)
57
63
  @click.option('--folder', '-f', help='Deprecated input that is no longer used.',
58
64
  default=None, show_default=True,
59
65
  type=click.Path(file_okay=False, dir_okay=True, resolve_path=True))
@@ -87,8 +93,10 @@ def translate():
87
93
  'By default this will be printed out to stdout',
88
94
  type=click.File('w'), default='-', show_default=True)
89
95
  def model_to_osm_cli(
90
- model_file, sim_par_json, epw_file, multiplier, plenum, no_ceil_adjacency,
91
- folder, osm_file, idf_file, geometry_ids, resource_ids, log_file):
96
+ model_file, sim_par_json, epw_file,
97
+ multiplier, plenum, no_ceil_adjacency, merge_method,
98
+ folder, osm_file, idf_file, geometry_ids, resource_ids, log_file
99
+ ):
92
100
  """Translate a Dragonfly Model to an OpenStudio Model.
93
101
 
94
102
  \b
@@ -103,8 +111,10 @@ def model_to_osm_cli(
103
111
  geo_names = not geometry_ids
104
112
  res_names = not resource_ids
105
113
  model_to_osm(
106
- model_file, sim_par_json, epw_file, full_geometry, no_plenum, ceil_adjacency,
107
- folder, osm_file, idf_file, geo_names, res_names, log_file)
114
+ model_file, sim_par_json, epw_file,
115
+ full_geometry, no_plenum, ceil_adjacency, merge_method,
116
+ folder, osm_file, idf_file, geo_names, res_names, log_file
117
+ )
108
118
  except Exception as e:
109
119
  _logger.exception('Model translation failed.\n{}'.format(e))
110
120
  sys.exit(1)
@@ -114,7 +124,7 @@ def model_to_osm_cli(
114
124
 
115
125
  def model_to_osm(
116
126
  model_file, sim_par_json=None, epw_file=None,
117
- full_geometry=False, no_plenum=False, ceil_adjacency=False,
127
+ full_geometry=False, no_plenum=False, ceil_adjacency=False, merge_method='None',
118
128
  folder=None, osm_file=None, idf_file=None,
119
129
  geometry_names=False, resource_names=False, log_file=None,
120
130
  multiplier=True, plenum=True, no_ceil_adjacency=True,
@@ -145,6 +155,21 @@ def model_to_osm(
145
155
  in their floor plate. This ensures that Surface boundary conditions
146
156
  are used instead of Adiabatic ones. Note that this input has no
147
157
  effect when the object-per-model is Story. (Default: False).
158
+ merge_method: An optional text string to describe how the Room2Ds should
159
+ be merged into individual Rooms during the translation. Specifying a
160
+ value here can be an effective way to reduce the number of Room
161
+ volumes in the resulting Model and, ultimately, yield a faster simulation
162
+ time with less results to manage. Note that Room2Ds will only be merged if
163
+ they form a contiguous volume. Otherwise, there will be multiple Rooms per
164
+ zone or story, each with an integer added at the end of their
165
+ identifiers. Choose from the following options:
166
+
167
+ * None - No merging will occur
168
+ * Zones - Room2Ds in the same zone will be merged
169
+ * PlenumZones - Only plenums in the same zone will be merged
170
+ * Stories - Rooms in the same story will be merged
171
+ * PlenumStories - Only plenums in the same story will be merged
172
+
148
173
  folder: Deprecated input that is no longer used.
149
174
  osm_file: Optional path where the OSM will be copied after it is translated
150
175
  in the folder. If None, the file will not be copied.
@@ -238,7 +263,8 @@ def model_to_osm(
238
263
  hb_models = model.to_honeybee(
239
264
  object_per_model='District', use_multiplier=multiplier,
240
265
  exclude_plenums=no_plenum, solve_ceiling_adjacencies=ceil_adjacency,
241
- enforce_adj=False)
266
+ merge_method=merge_method, enforce_adj=False
267
+ )
242
268
  hb_model = hb_models[0]
243
269
 
244
270
  # create the HBJSON for input to OpenStudio CLI
@@ -286,6 +312,12 @@ def model_to_osm(
286
312
  'that Surface boundary conditions are used instead of Adiabatic ones. '
287
313
  'Note that this input has no effect when the object-per-model is Story.',
288
314
  default=True, show_default=True)
315
+ @click.option('--merge-method', '-m', help='Text to describe how the Room2Ds should '
316
+ 'be merged into individual Rooms during the translation. Specifying a '
317
+ 'value here can be an effective way to reduce the number of Room '
318
+ 'volumes in the resulting Model and, ultimately, yield a faster simulation '
319
+ 'time with less results to manage. Choose from: None, Zones, PlenumZones, '
320
+ 'Stories, PlenumStories.', type=str, default='None', show_default=True)
289
321
  @click.option('--additional-str', '-a', help='Text string for additional lines that '
290
322
  'should be added to the IDF.', type=str, default='', show_default=True)
291
323
  @click.option('--compact-schedules/--csv-schedules', ' /-c', help='Flag to note '
@@ -320,7 +352,7 @@ def model_to_osm(
320
352
  'of the translation. By default this will be printed out to stdout',
321
353
  type=click.File('w'), default='-', show_default=True)
322
354
  def model_to_idf_cli(
323
- model_file, sim_par_json, multiplier, plenum, no_ceil_adjacency,
355
+ model_file, sim_par_json, multiplier, plenum, no_ceil_adjacency, merge_method,
324
356
  additional_str, compact_schedules, hvac_to_ideal_air,
325
357
  geometry_ids, resource_ids, output_file
326
358
  ):
@@ -344,7 +376,7 @@ def model_to_idf_cli(
344
376
  res_names = not resource_ids
345
377
  model_to_idf(
346
378
  model_file, sim_par_json, full_geometry, no_plenum, ceil_adjacency,
347
- additional_str, csv_schedules,
379
+ merge_method, additional_str, csv_schedules,
348
380
  hvac_check, geo_names, res_names, output_file)
349
381
  except Exception as e:
350
382
  _logger.exception('Model translation failed.\n{}\n'.format(e))
@@ -355,7 +387,7 @@ def model_to_idf_cli(
355
387
 
356
388
  def model_to_idf(
357
389
  model_file, sim_par_json=None,
358
- full_geometry=False, no_plenum=False, ceil_adjacency=False,
390
+ full_geometry=False, no_plenum=False, ceil_adjacency=False, merge_method='None',
359
391
  additional_str='', csv_schedules=False, hvac_check=False,
360
392
  geometry_names=False, resource_names=False, output_file=None,
361
393
  multiplier=True, plenum=True, no_ceil_adjacency=True,
@@ -384,6 +416,21 @@ def model_to_idf(
384
416
  in their floor plate. This ensures that Surface boundary conditions
385
417
  are used instead of Adiabatic ones. Note that this input has no
386
418
  effect when the object-per-model is Story. (Default: False).
419
+ merge_method: An optional text string to describe how the Room2Ds should
420
+ be merged into individual Rooms during the translation. Specifying a
421
+ value here can be an effective way to reduce the number of Room
422
+ volumes in the resulting Model and, ultimately, yield a faster simulation
423
+ time with less results to manage. Note that Room2Ds will only be merged if
424
+ they form a contiguous volume. Otherwise, there will be multiple Rooms per
425
+ zone or story, each with an integer added at the end of their
426
+ identifiers. Choose from the following options:
427
+
428
+ * None - No merging will occur
429
+ * Zones - Room2Ds in the same zone will be merged
430
+ * PlenumZones - Only plenums in the same zone will be merged
431
+ * Stories - Rooms in the same story will be merged
432
+ * PlenumStories - Only plenums in the same story will be merged
433
+
387
434
  additional_str: Text string for additional lines that should be added
388
435
  to the IDF.
389
436
  csv_schedules: Boolean to note whether any ScheduleFixedIntervals in the
@@ -435,7 +482,8 @@ def model_to_idf(
435
482
  hb_models = model.to_honeybee(
436
483
  object_per_model='District', use_multiplier=multiplier,
437
484
  exclude_plenums=no_plenum, solve_ceiling_adjacencies=ceil_adjacency,
438
- enforce_adj=False)
485
+ merge_method=merge_method, enforce_adj=False
486
+ )
439
487
  hb_model = hb_models[0]
440
488
 
441
489
  # reset the IDs to be derived from the display_names if requested
@@ -481,6 +529,12 @@ def model_to_idf(
481
529
  'that Surface boundary conditions are used instead of Adiabatic ones. '
482
530
  'Note that this input has no effect when the object-per-model is Story.',
483
531
  default=True, show_default=True)
532
+ @click.option('--merge-method', '-m', help='Text to describe how the Room2Ds should '
533
+ 'be merged into individual Rooms during the translation. Specifying a '
534
+ 'value here can be an effective way to reduce the number of Room '
535
+ 'volumes in the resulting Model and, ultimately, yield a faster simulation '
536
+ 'time with less results to manage. Choose from: None, Zones, PlenumZones, '
537
+ 'Stories, PlenumStories.', type=str, default='None', show_default=True)
484
538
  @click.option('--osw-folder', '-osw', help='Deprecated input that is no longer used.',
485
539
  default=None,
486
540
  type=click.Path(file_okay=False, dir_okay=True, resolve_path=True))
@@ -524,7 +578,7 @@ def model_to_idf(
524
578
  'of the translation. By default it printed out to stdout', default='-',
525
579
  type=click.Path(file_okay=True, dir_okay=False, resolve_path=True))
526
580
  def model_to_gbxml_cli(
527
- model_file, multiplier, plenum, no_ceil_adjacency,
581
+ model_file, multiplier, plenum, no_ceil_adjacency, merge_method,
528
582
  osw_folder, default_subfaces, triangulate_non_planar, minimal,
529
583
  interior_face_type, ground_face_type, program_name, program_version, output_file
530
584
  ):
@@ -543,7 +597,7 @@ def model_to_gbxml_cli(
543
597
  permit_non_planar = not triangulate_non_planar
544
598
  complete_geometry = not minimal
545
599
  model_to_gbxml(
546
- model_file, osw_folder, full_geometry, no_plenum, ceil_adjacency,
600
+ model_file, osw_folder, full_geometry, no_plenum, ceil_adjacency, merge_method,
547
601
  triangulate_subfaces, permit_non_planar, complete_geometry,
548
602
  interior_face_type, ground_face_type, program_name, program_version,
549
603
  output_file)
@@ -556,7 +610,7 @@ def model_to_gbxml_cli(
556
610
 
557
611
  def model_to_gbxml(
558
612
  model_file, osw_folder=None, full_geometry=False,
559
- no_plenum=False, ceil_adjacency=False,
613
+ no_plenum=False, ceil_adjacency=False, merge_method='None',
560
614
  triangulate_subfaces=False, permit_non_planar=False, complete_geometry=False,
561
615
  interior_face_type='', ground_face_type='',
562
616
  program_name=None, program_version=None, output_file=None,
@@ -581,6 +635,21 @@ def model_to_gbxml(
581
635
  in their floor plate. This ensures that Surface boundary conditions
582
636
  are used instead of Adiabatic ones. Note that this input has no
583
637
  effect when the object-per-model is Story. (Default: False).
638
+ merge_method: An optional text string to describe how the Room2Ds should
639
+ be merged into individual Rooms during the translation. Specifying a
640
+ value here can be an effective way to reduce the number of Room
641
+ volumes in the resulting Model and, ultimately, yield a faster simulation
642
+ time with less results to manage. Note that Room2Ds will only be merged if
643
+ they form a contiguous volume. Otherwise, there will be multiple Rooms per
644
+ zone or story, each with an integer added at the end of their
645
+ identifiers. Choose from the following options:
646
+
647
+ * None - No merging will occur
648
+ * Zones - Room2Ds in the same zone will be merged
649
+ * PlenumZones - Only plenums in the same zone will be merged
650
+ * Stories - Rooms in the same story will be merged
651
+ * PlenumStories - Only plenums in the same story will be merged
652
+
584
653
  triangulate_subfaces: Boolean to note whether sub-faces (including
585
654
  Apertures and Doors) should be triangulated if they have more
586
655
  than 4 sides (True) or whether they should be left as they are (False).
@@ -632,7 +701,7 @@ def model_to_gbxml(
632
701
  hb_models = model.to_honeybee(
633
702
  object_per_model='District', use_multiplier=multiplier,
634
703
  exclude_plenums=no_plenum, solve_ceiling_adjacencies=ceil_adjacency,
635
- enforce_adj=False)
704
+ merge_method=merge_method, enforce_adj=False)
636
705
  hb_model = hb_models[0]
637
706
 
638
707
  # translate the model to a gbXML string
@@ -664,6 +733,12 @@ def model_to_gbxml(
664
733
  'that Surface boundary conditions are used instead of Adiabatic ones. '
665
734
  'Note that this input has no effect when the object-per-model is Story.',
666
735
  default=True, show_default=True)
736
+ @click.option('--merge-method', '-m', help='Text to describe how the Room2Ds should '
737
+ 'be merged into individual Rooms during the translation. Specifying a '
738
+ 'value here can be an effective way to reduce the number of Room '
739
+ 'volumes in the resulting Model and, ultimately, yield a faster simulation '
740
+ 'time with less results to manage. Choose from: None, Zones, PlenumZones, '
741
+ 'Stories, PlenumStories.', type=str, default='None', show_default=True)
667
742
  @click.option('--single-window/--detailed-windows', ' /-dw', help='Flag to note '
668
743
  'whether all windows within walls should be converted to a single '
669
744
  'window with an area that matches the original geometry.',
@@ -702,7 +777,7 @@ def model_to_gbxml(
702
777
  'of the translation. By default it printed out to stdout.', default='-',
703
778
  type=click.Path(file_okay=True, dir_okay=False, resolve_path=True))
704
779
  def model_to_trace_gbxml_cli(
705
- model_file, multiplier, plenum, no_ceil_adjacency,
780
+ model_file, multiplier, plenum, no_ceil_adjacency, merge_method,
706
781
  single_window, rect_sub_distance, frame_merge_distance,
707
782
  program_name, program_version, osw_folder, output_file
708
783
  ):
@@ -719,8 +794,8 @@ def model_to_trace_gbxml_cli(
719
794
  ceil_adjacency = not no_ceil_adjacency
720
795
  detailed_windows = not single_window
721
796
  model_to_trace_gbxml(
722
- model_file, full_geometry, no_plenum, ceil_adjacency, detailed_windows,
723
- rect_sub_distance, frame_merge_distance, osw_folder,
797
+ model_file, full_geometry, no_plenum, ceil_adjacency, merge_method,
798
+ detailed_windows, rect_sub_distance, frame_merge_distance, osw_folder,
724
799
  program_name, program_version, output_file)
725
800
  except Exception as e:
726
801
  _logger.exception('Model translation failed.\n{}'.format(e))
@@ -730,7 +805,8 @@ def model_to_trace_gbxml_cli(
730
805
 
731
806
 
732
807
  def model_to_trace_gbxml(
733
- model_file, full_geometry=False, no_plenum=False, ceil_adjacency=False,
808
+ model_file, full_geometry=False,
809
+ no_plenum=False, ceil_adjacency=False, merge_method='None',
734
810
  detailed_windows=False, rect_sub_distance='0.15m', frame_merge_distance='0.2m',
735
811
  program_name=None, program_version=None, osw_folder=None, output_file=None,
736
812
  multiplier=True, plenum=True, no_ceil_adjacency=True, single_window=True
@@ -752,6 +828,21 @@ def model_to_trace_gbxml(
752
828
  in their floor plate. This ensures that Surface boundary conditions
753
829
  are used instead of Adiabatic ones. Note that this input has no
754
830
  effect when the object-per-model is Story. (Default: False).
831
+ merge_method: An optional text string to describe how the Room2Ds should
832
+ be merged into individual Rooms during the translation. Specifying a
833
+ value here can be an effective way to reduce the number of Room
834
+ volumes in the resulting Model and, ultimately, yield a faster simulation
835
+ time with less results to manage. Note that Room2Ds will only be merged if
836
+ they form a contiguous volume. Otherwise, there will be multiple Rooms per
837
+ zone or story, each with an integer added at the end of their
838
+ identifiers. Choose from the following options:
839
+
840
+ * None - No merging will occur
841
+ * Zones - Room2Ds in the same zone will be merged
842
+ * PlenumZones - Only plenums in the same zone will be merged
843
+ * Stories - Rooms in the same story will be merged
844
+ * PlenumStories - Only plenums in the same story will be merged
845
+
755
846
  detailed_windows: A boolean for whether all windows within walls should be
756
847
  left as they are (True) or converted to a single window with an area
757
848
  that matches the original geometry (False). (Default: False).
@@ -799,7 +890,7 @@ def model_to_trace_gbxml(
799
890
  hb_models = model.to_honeybee(
800
891
  object_per_model='District', use_multiplier=multiplier,
801
892
  exclude_plenums=no_plenum, solve_ceiling_adjacencies=ceil_adjacency,
802
- enforce_adj=False)
893
+ merge_method=merge_method, enforce_adj=False)
803
894
  hb_model = hb_models[0]
804
895
 
805
896
  # translate the honeybee model to a TRACE-compatible gbXML string
@@ -831,6 +922,12 @@ def model_to_trace_gbxml(
831
922
  'that Surface boundary conditions are used instead of Adiabatic ones. '
832
923
  'Note that this input has no effect when the object-per-model is Story.',
833
924
  default=True, show_default=True)
925
+ @click.option('--merge-method', '-m', help='Text to describe how the Room2Ds should '
926
+ 'be merged into individual Rooms during the translation. Specifying a '
927
+ 'value here can be an effective way to reduce the number of Room '
928
+ 'volumes in the resulting Model and, ultimately, yield a faster simulation '
929
+ 'time with less results to manage. Choose from: None, Zones, PlenumZones, '
930
+ 'Stories, PlenumStories.', type=str, default='None', show_default=True)
834
931
  @click.option('--osw-folder', '-osw', help='Deprecated input that is no longer used.',
835
932
  default=None,
836
933
  type=click.Path(file_okay=False, dir_okay=True, resolve_path=True))
@@ -856,8 +953,8 @@ def model_to_trace_gbxml(
856
953
  'of the translation. By default it printed out to stdout', default='-',
857
954
  type=click.Path(file_okay=True, dir_okay=False, resolve_path=True))
858
955
  def model_to_sdd_cli(
859
- model_file, multiplier, plenum, no_ceil_adjacency, osw_folder,
860
- geometry_ids, resource_ids, output_file
956
+ model_file, multiplier, plenum, no_ceil_adjacency, merge_method,
957
+ osw_folder, geometry_ids, resource_ids, output_file
861
958
  ):
862
959
  """Translate a Dragonfly Model to a CBECC SDD file.
863
960
 
@@ -873,7 +970,7 @@ def model_to_sdd_cli(
873
970
  geo_names = not geometry_ids
874
971
  res_names = not resource_ids
875
972
  model_to_sdd(
876
- model_file, full_geometry, no_plenum, ceil_adjacency,
973
+ model_file, full_geometry, no_plenum, ceil_adjacency, merge_method,
877
974
  osw_folder, geo_names, res_names, output_file)
878
975
  except Exception as e:
879
976
  _logger.exception('Model translation failed.\n{}'.format(e))
@@ -883,7 +980,8 @@ def model_to_sdd_cli(
883
980
 
884
981
 
885
982
  def model_to_sdd(
886
- model_file, full_geometry=False, no_plenum=False, ceil_adjacency=False,
983
+ model_file, full_geometry=False,
984
+ no_plenum=False, ceil_adjacency=False, merge_method='None',
887
985
  osw_folder=None, geometry_names=False, resource_names=False, output_file=None,
888
986
  multiplier=True, plenum=True, no_ceil_adjacency=True,
889
987
  geometry_ids=True, resource_ids=True
@@ -905,6 +1003,21 @@ def model_to_sdd(
905
1003
  in their floor plate. This ensures that Surface boundary conditions
906
1004
  are used instead of Adiabatic ones. Note that this input has no
907
1005
  effect when the object-per-model is Story. (Default: False).
1006
+ merge_method: An optional text string to describe how the Room2Ds should
1007
+ be merged into individual Rooms during the translation. Specifying a
1008
+ value here can be an effective way to reduce the number of Room
1009
+ volumes in the resulting Model and, ultimately, yield a faster simulation
1010
+ time with less results to manage. Note that Room2Ds will only be merged if
1011
+ they form a contiguous volume. Otherwise, there will be multiple Rooms per
1012
+ zone or story, each with an integer added at the end of their
1013
+ identifiers. Choose from the following options:
1014
+
1015
+ * None - No merging will occur
1016
+ * Zones - Room2Ds in the same zone will be merged
1017
+ * PlenumZones - Only plenums in the same zone will be merged
1018
+ * Stories - Rooms in the same story will be merged
1019
+ * PlenumStories - Only plenums in the same story will be merged
1020
+
908
1021
  osw_folder: Deprecated input that is no longer used.
909
1022
  geometry_names: Boolean to note whether a cleaned version of all geometry
910
1023
  display names should be used instead of identifiers when translating
@@ -798,7 +798,7 @@ class GHEThermalLoop(object):
798
798
  # add the fifth generation system parameters
799
799
  des_param = {
800
800
  'fifth_generation': {
801
- 'ghe_parameters': self.to_ghe_param_dict(tolerance),
801
+ 'ghe_parameters': self.to_ghe_param_dict(),
802
802
  'central_pump_parameters': pump_par,
803
803
  'horizontal_piping_parameters': horiz_par,
804
804
  'soil': soil_par
@@ -809,11 +809,6 @@ class GHEThermalLoop(object):
809
809
 
810
810
  def to_ghe_param_dict(self, tolerance=0.01):
811
811
  """Get the GroundHeatExchanger as it appears in a System Parameter dictionary.
812
-
813
- Args:
814
- tolerance: The minimum difference between the coordinate values of two
815
- geometries at which they are considered co-located. (Default: 0.01,
816
- suitable for objects in meters).
817
812
  """
818
813
  # compute the geometric constraints of the borehole fields
819
814
  geo_pars = []
@@ -825,9 +820,7 @@ class GHEThermalLoop(object):
825
820
  'b_max_x': self.borehole_parameters.max_spacing,
826
821
  'b_max_y': self.borehole_parameters.max_spacing,
827
822
  'max_height': self.borehole_parameters.max_depth,
828
- 'min_height': self.borehole_parameters.min_depth,
829
- 'property_boundary': [], # TODO: remove when GMT is better
830
- 'no_go_boundaries': [] # TODO: remove when GMT is better
823
+ 'min_height': self.borehole_parameters.min_depth
831
824
  }
832
825
  }
833
826
  geo_pars.append(geo_par)
@@ -213,7 +213,9 @@ def base_honeybee_osw(
213
213
  json.dump(geo_dict, fp, indent=4)
214
214
 
215
215
  # if the DES system is GSHP, specify any autocalculated ground temperatures
216
- dead_band = 8 # minimum annual delta T of the ground GHEDesigner needs
216
+ msg_template = 'Autocalculated EPW ground temperature in this climate is ' \
217
+ '{}C, which is too {} for a {} EFT of {}C. {} EFT is being reset to {}.'
218
+ dead_band = 12 # minimum annual delta T of the ground GHEDesigner needs
217
219
  with open(sys_param_file, 'r') as spf:
218
220
  sys_dict = json.load(spf)
219
221
  if 'district_system' in sys_dict:
@@ -230,11 +232,27 @@ def base_honeybee_osw(
230
232
  if 'min_eft' in design and \
231
233
  design['min_eft'] + dead_band > start_temp:
232
234
  # ground is too cold
233
- start_temp = design['min_eft'] + dead_band
235
+ new_min_eft = round(start_temp - dead_band)
236
+ if new_min_eft < -6.67: # just too cold
237
+ new_min_eft = -6.67
238
+ msg = msg_template.format(
239
+ start_temp, 'cold', 'min', design['min_eft'],
240
+ 'Min', new_min_eft)
241
+ print(msg)
242
+ design['min_eft'] = new_min_eft
243
+ # set fluid to ensure it does not freeze
244
+ fluid = g5_par['ghe_parameters']['fluid']
245
+ fluid['fluid_name'] = 'PropyleneGlycol'
246
+ fluid['concentration_percent'] = 25
234
247
  elif 'max_eft' in design and \
235
248
  design['max_eft'] - dead_band < start_temp:
236
249
  # ground is too hot
237
- start_temp = design['max_eft'] - dead_band
250
+ new_max_eft = round(start_temp + dead_band)
251
+ msg = msg_template.format(
252
+ start_temp, 'hot', 'max', design['max_eft'],
253
+ 'Max', new_max_eft)
254
+ print(msg)
255
+ design['max_eft'] = new_max_eft
238
256
  soil_par['undisturbed_temp'] = start_temp
239
257
  with open(sys_param_file, 'w') as fp:
240
258
  json.dump(sys_dict, fp, indent=4)
@@ -15,7 +15,7 @@ from honeybee.model import Model as hb_model
15
15
 
16
16
  def model_to_urbanopt(
17
17
  model, location, point=Point2D(0, 0), shade_distance=None, use_multiplier=True,
18
- exclude_plenums=False, solve_ceiling_adjacencies=False,
18
+ exclude_plenums=False, solve_ceiling_adjacencies=False, merge_method='None',
19
19
  des_loop=None, electrical_network=None, road_network=None, ground_pv=None,
20
20
  folder=None, tolerance=None
21
21
  ):
@@ -51,6 +51,22 @@ def model_to_urbanopt(
51
51
  another in their floor plate. This ensures that Surface boundary
52
52
  conditions are used instead of Adiabatic ones. Note that this input
53
53
  has no effect when the object_per_model is Story. (Default: False).
54
+ merge_method: An optional text string to describe how the Room2Ds should
55
+ be merged into individual Rooms during the translation. Specifying a
56
+ value here can be an effective way to reduce the number of Room
57
+ volumes in the resulting 3D Honeybee Model and, ultimately, yield
58
+ a faster simulation time in the destination engine with fewer results
59
+ to manage. Note that Room2Ds will only be merged if they form a
60
+ continuous volume. Otherwise, there will be multiple Rooms per
61
+ zone or story, each with an integer added at the end of their
62
+ identifiers. Choose from the following options:
63
+
64
+ * None - No merging of Room2Ds will occur
65
+ * Zones - Room2Ds in the same zone will be merged
66
+ * PlenumZones - Only plenums in the same zone will be merged
67
+ * Stories - Rooms in the same story will be merged
68
+ * PlenumStories - Only plenums in the same story will be merged
69
+
54
70
  des_loop: An optional District Energy System (DES) ThermalLoop that's
55
71
  associated with the dragonfly Model. (Default: None).
56
72
  electrical_network: An optional OpenDSS ElectricalNetwork that's associated
@@ -202,7 +218,9 @@ def model_to_urbanopt(
202
218
  hb_model_jsons = []
203
219
  hb_models = model.to_honeybee(
204
220
  'Building', shade_distance, use_multiplier, exclude_plenums,
205
- solve_ceiling_adjacencies=solve_ceiling_adjacencies, tolerance=tolerance)
221
+ solve_ceiling_adjacencies=solve_ceiling_adjacencies, merge_method=merge_method,
222
+ tolerance=tolerance
223
+ )
206
224
  for bldg_model in hb_models:
207
225
  try:
208
226
  bldg_model.remove_degenerate_geometry(0.01)
@@ -353,6 +371,9 @@ def model_to_des(
353
371
  geojson_dict['project']['weather_filename'] = epw_f_name
354
372
 
355
373
  # if the DES system is GSHP, specify any autocalculated ground temperatures
374
+ msg_template = 'Autocalculated EPW ground temperature in this climate is ' \
375
+ '{}C, which is too {} for a {} EFT of {}C. {} EFT is being reset to {}.'
376
+ dead_band = 12 # minimum annual delta T of the ground GHEDesigner needs
356
377
  if 'district_system' in des_dict:
357
378
  if 'fifth_generation' in des_dict['district_system']:
358
379
  g5_par = des_dict['district_system']['fifth_generation']
@@ -360,8 +381,35 @@ def model_to_des(
360
381
  soil_par = g5_par['soil']
361
382
  if soil_par['undisturbed_temp'] == 'Autocalculate':
362
383
  epw_obj = EPW(epw_file)
363
- soil_par['undisturbed_temp'] = \
364
- epw_obj.dry_bulb_temperature.average
384
+ start_temp = epw_obj.dry_bulb_temperature.average
385
+ if 'ghe_parameters' in g5_par and \
386
+ 'design' in g5_par['ghe_parameters']:
387
+ design = g5_par['ghe_parameters']['design']
388
+ if 'min_eft' in design and \
389
+ design['min_eft'] + dead_band > start_temp:
390
+ # ground is too cold
391
+ new_min_eft = round(start_temp - dead_band)
392
+ if new_min_eft < -6.67: # just too cold
393
+ new_min_eft = -6.67
394
+ msg = msg_template.format(
395
+ start_temp, 'cold', 'min', design['min_eft'],
396
+ 'Min', new_min_eft)
397
+ print(msg)
398
+ design['min_eft'] = new_min_eft
399
+ # set fluid to ensure it does not freeze
400
+ fluid = g5_par['ghe_parameters']['fluid']
401
+ fluid['fluid_name'] = 'PropyleneGlycol'
402
+ fluid['concentration_percent'] = 25
403
+ elif 'max_eft' in design and \
404
+ design['max_eft'] - dead_band < start_temp:
405
+ # ground is too hot
406
+ new_max_eft = round(start_temp + dead_band)
407
+ msg = msg_template.format(
408
+ start_temp, 'hot', 'max', design['max_eft'],
409
+ 'Max', new_max_eft)
410
+ print(msg)
411
+ design['max_eft'] = new_max_eft
412
+ soil_par['undisturbed_temp'] = start_temp
365
413
 
366
414
  # write out the GeoJSON and system parameter files
367
415
  feature_geojson = os.path.join(folder, '{}.geojson'.format(model.identifier))
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: dragonfly-energy
3
- Version: 1.35.20
3
+ Version: 1.35.67
4
4
  Summary: Dragonfly extension for energy simulation.
5
5
  Home-page: https://github.com/ladybug-tools/dragonfly-energy
6
6
  Author: Ladybug Tools
@@ -18,8 +18,8 @@ Classifier: Programming Language :: Python :: Implementation :: IronPython
18
18
  Classifier: Operating System :: OS Independent
19
19
  Description-Content-Type: text/markdown
20
20
  License-File: LICENSE
21
- Requires-Dist: dragonfly-core==1.70.3
22
- Requires-Dist: honeybee-energy==1.116.81
21
+ Requires-Dist: dragonfly-core==1.74.21
22
+ Requires-Dist: honeybee-energy==1.116.102
23
23
  Provides-Extra: standards
24
24
  Requires-Dist: honeybee-energy-standards==2.2.6; extra == "standards"
25
25
  Provides-Extra: openstudio
@@ -1,5 +1,5 @@
1
- dragonfly-core==1.70.3
2
- honeybee-energy==1.116.81
1
+ dragonfly-core==1.74.21
2
+ honeybee-energy==1.116.102
3
3
 
4
4
  [openstudio]
5
5
  honeybee-openstudio>=0.3.14
@@ -0,0 +1,2 @@
1
+ dragonfly-core==1.74.21
2
+ honeybee-energy==1.116.102
@@ -1,2 +0,0 @@
1
- dragonfly-core==1.70.3
2
- honeybee-energy==1.116.81