honeybee-openstudio 2.6.0 → 2.6.5

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: c28727c336caac62e6fe1758d4bdcb3c7440a8f6da5bedf777094d4786926ba7
4
- data.tar.gz: 8d111e901b300df779ed35574b98e5c4d82231ba50ba398f1f88fb3b61d2016a
3
+ metadata.gz: f0cd1e90f3447c7eaac2dd6292a705f79de608789270dcfab5a431027870190f
4
+ data.tar.gz: 9bd7a9af5dffb44bf6fa16c7f7626d07fc4dcbd2b596298425c16b6b80543568
5
5
  SHA512:
6
- metadata.gz: 40be5068a614f6c171eca8465381692d5273035688e047cecd4f14a2115d5f8a0f2ee356944383b854bdcf4af9e12955b1dd83831ec2f4a5e7971d49d4ddf8c8
7
- data.tar.gz: c7273c379fc78675073e4bbd482b903cbad150624ff908fdb2da96bd7b5961277a1350a5d74c9f0aacd51f029657680377b7e93363fec835903cd3639623a41b
6
+ metadata.gz: d4ac4d6f8edfa3adcd377db33357250b96bf1bb56bef117b63690c67ed22354ed27edb40560ce79daf0360513d237d7f0a7d6c50d9b754ef0fd361b4fbcc7703
7
+ data.tar.gz: 0e1067509315f8f2e503e3b78b61a1aaf2b68aedcd8d95c450c011980022a83a349d2bff04ccf5074a760b4673f3494c9df422c9699428b94df1f1c0407bbcc6
@@ -4,7 +4,7 @@ $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
4
4
 
5
5
  Gem::Specification.new do |spec|
6
6
  spec.name = 'honeybee-openstudio'
7
- spec.version = '2.6.0'
7
+ spec.version = '2.6.5'
8
8
  spec.authors = ['Tanushree Charan', 'Dan Macumber', 'Chris Mackey', 'Mostapha Sadeghipour Roudsari']
9
9
  spec.email = ['tanushree.charan@nrel.gov', 'chris@ladybug.tools']
10
10
 
@@ -21,4 +21,4 @@ else
21
21
  end
22
22
 
23
23
  # include the honeybee-openstudio-gem
24
- gem 'honeybee-openstudio', '2.5.3'
24
+ gem 'honeybee-openstudio', '2.6.4'
@@ -55,7 +55,12 @@ module FromHoneybee
55
55
  os_construction = OpenStudio::Model::ConstructionAirBoundary.new(openstudio_model)
56
56
  os_construction.setName(@hash[:identifier])
57
57
  os_construction.setSolarAndDaylightingMethod('GroupedZones')
58
- os_construction.setRadiantExchangeMethod('GroupedZones')
58
+ # REMOVE: Remove the use of IRTSurface once the AFN works with GroupedZone air walls
59
+ if !$use_simple_vent # we're using the AFN!
60
+ os_construction.setRadiantExchangeMethod('IRTSurface')
61
+ else
62
+ os_construction.setRadiantExchangeMethod('GroupedZones')
63
+ end
59
64
  os_construction.setAirExchangeMethod('None')
60
65
 
61
66
  os_construction
@@ -140,7 +140,8 @@ module FromHoneybee
140
140
  if face[:apertures]
141
141
  face[:apertures].each do |aperture|
142
142
  if aperture[:properties][:energy][:vent_opening]
143
- window_vent[aperture[:identifier]] = aperture[:properties][:energy][:vent_opening]
143
+ window_vent[aperture[:identifier]] = \
144
+ [aperture[:properties][:energy][:vent_opening], aperture[:boundary_condition][:type]]
144
145
  end
145
146
  if aperture[:outdoor_shades]
146
147
  unless os_shd_group
@@ -157,7 +158,8 @@ module FromHoneybee
157
158
  if face[:doors]
158
159
  face[:doors].each do |door|
159
160
  if door[:properties][:energy][:vent_opening]
160
- window_vent[door[:identifier]] = door[:properties][:energy][:vent_opening]
161
+ window_vent[door[:identifier]] = \
162
+ [door[:properties][:energy][:vent_opening], door[:boundary_condition][:type]]
161
163
  end
162
164
  if door[:outdoor_shades]
163
165
  unless os_shd_group
@@ -312,14 +314,18 @@ module FromHoneybee
312
314
 
313
315
  # assign window ventilation objects if they exist
314
316
  if $use_simple_vent && !window_vent.empty? # write simple WindAndStack ventilation
315
- window_vent.each do |sub_f_id, opening|
316
- opt_sub_f = openstudio_model.getSubSurfaceByName(sub_f_id)
317
- unless opt_sub_f.empty?
318
- sub_f = opt_sub_f.get
319
- window_vent = VentilationOpening.new(opening)
320
- os_window_vent = window_vent.to_openstudio(
321
- openstudio_model, sub_f, @hash[:properties][:energy][:window_vent_control])
322
- os_window_vent.addToThermalZone(os_thermal_zone)
317
+ window_vent.each do |sub_f_id, open_prop|
318
+ opening = open_prop[0]
319
+ bc = open_prop[1]
320
+ if bc == 'Outdoors'
321
+ opt_sub_f = openstudio_model.getSubSurfaceByName(sub_f_id)
322
+ unless opt_sub_f.empty?
323
+ sub_f = opt_sub_f.get
324
+ vent_open = VentilationOpening.new(opening)
325
+ os_vent_open = vent_open.to_openstudio(
326
+ openstudio_model, sub_f, @hash[:properties][:energy][:window_vent_control])
327
+ os_vent_open.addToThermalZone(os_thermal_zone)
328
+ end
323
329
  end
324
330
  end
325
331
  elsif !$use_simple_vent # we're using the AFN!
@@ -329,13 +335,14 @@ module FromHoneybee
329
335
  # write the opening objects for each Aperture / Door
330
336
  operable_subfs = [] # collect the sub-face objects for the EMS
331
337
  opening_factors = [] # collect the maximum opening factors for the EMS
332
- window_vent.each do |sub_f_id, opening|
338
+ window_vent.each do |sub_f_id, open_prop|
339
+ opening = open_prop[0]
333
340
  opt_sub_f = openstudio_model.getSubSurfaceByName(sub_f_id)
334
341
  unless opt_sub_f.empty?
335
342
  sub_f = opt_sub_f.get
336
343
  if sub_f.adjacentSubSurface.empty? # not an interior window that's already in the AFN
337
- window_vent = VentilationOpening.new(opening)
338
- open_fac = window_vent.to_openstudio_afn(openstudio_model, sub_f)
344
+ vent_open = VentilationOpening.new(opening)
345
+ open_fac = vent_open.to_openstudio_afn(openstudio_model, sub_f)
339
346
  operable_subfs << sub_f
340
347
  opening_factors << open_fac
341
348
  end
@@ -533,12 +533,14 @@ module FromHoneybee
533
533
  system_type = hvac[:type]
534
534
  if system_type == 'IdealAirSystemAbridged'
535
535
  ideal_air_system = IdealAirSystemAbridged.new(hvac)
536
- os_ideal_air_system = ideal_air_system.to_openstudio(@openstudio_model)
537
536
  hvac['rooms'].each do |room_id|
537
+ os_ideal_air = ideal_air_system.to_openstudio(@openstudio_model)
538
+ # enforce a strict naming system for each zone so results can be matched
539
+ os_ideal_air.setName(room_id + ' Ideal Loads Air System')
538
540
  zone_get = @openstudio_model.getThermalZoneByName(room_id)
539
541
  unless zone_get.empty?
540
542
  os_thermal_zone = zone_get.get
541
- os_ideal_air_system.addToThermalZone(os_thermal_zone)
543
+ os_ideal_air.addToThermalZone(os_thermal_zone)
542
544
  end
543
545
  end
544
546
  elsif TemplateHVAC.types.include?(system_type)
@@ -138,7 +138,7 @@ module FromHoneybee
138
138
  openstudio_schedule_rule.setApplyFriday(rule[:apply_friday])
139
139
  openstudio_schedule_rule.setApplySaturday(rule[:apply_saturday])
140
140
  year_description = openstudio_model.getYearDescription
141
- start_date = year_description.makeDate(rule[:start_date][0], rule[:start_date][1])
141
+ start_date = year_description.makeDate(rule[:start_date][0], rule[:start_date][1])
142
142
  end_date = year_description.makeDate(rule[:end_date][0], rule[:end_date][1])
143
143
  openstudio_schedule_rule.setStartDate(start_date)
144
144
  openstudio_schedule_rule.setEndDate(end_date)
@@ -288,7 +288,18 @@ module FromHoneybee
288
288
  @hash[:run_period][:daylight_saving_time][:end_date][1])
289
289
  end
290
290
 
291
- # TODO: set the holidays once they are available in OpenStudio SDK
291
+ # Set the holidays
292
+ if @hash[:run_period][:holidays]
293
+ @hash[:run_period][:holidays].each do |hol|
294
+ begin
295
+ os_hol = OpenStudio::Model::RunPeriodControlSpecialDays.new(
296
+ OpenStudio::MonthOfYear.new(hol[0]), hol[1], @openstudio_model)
297
+ os_hol.setDuration(1)
298
+ os_hol.setSpecialDayType('Holiday')
299
+ rescue NoMethodError # REMOVE: Once the upgrade to OpenStudio 3.0 is official
300
+ end
301
+ end
302
+ end
292
303
  end
293
304
 
294
305
  # set the simulation timestep
@@ -38,6 +38,9 @@ module FromHoneybee
38
38
  attr_reader :errors, :warnings
39
39
  @@outdoor_node = nil
40
40
  @@program_manager = nil
41
+ @@sensor_count = 1
42
+ @@actuator_count = 1
43
+ @@program_count = 1
41
44
 
42
45
  def initialize(hash = {})
43
46
  super(hash)
@@ -72,6 +75,13 @@ module FromHoneybee
72
75
  @@program_manager
73
76
  end
74
77
 
78
+ def replace_ems_special_characters(ems_variable_name)
79
+ # remove special characters from an name to be used as an EMS variable
80
+ new_name = ems_variable_name.to_s
81
+ new_name.gsub!(/[^A-Za-z]/, '')
82
+ new_name
83
+ end
84
+
75
85
  def to_openstudio(openstudio_model, parent_zone, vent_opening_surfaces, vent_opening_factors)
76
86
  # Get the outdoor temperature sensor and the room air temperature sensor
77
87
  out_air_temp = get_outdoor_node(openstudio_model)
@@ -84,7 +94,8 @@ module FromHoneybee
84
94
  in_var.setKeyValue(os_zone_name)
85
95
  end
86
96
  in_air_temp = OpenStudio::Model::EnergyManagementSystemSensor.new(openstudio_model, in_var)
87
- in_sensor_name = os_zone_name.delete(' ').delete('.') + '_Sensor'
97
+ in_sensor_name = replace_ems_special_characters(os_zone_name) + '_Sensor' + @@sensor_count.to_s
98
+ @@sensor_count = @@sensor_count + 1
88
99
  in_air_temp.setName(in_sensor_name)
89
100
 
90
101
  # create the actuators for each of the operaable windows
@@ -94,7 +105,9 @@ module FromHoneybee
94
105
  vent_srf, 'AirFlow Network Window/Door Opening', 'Venting Opening Factor')
95
106
  vent_srf_name = vent_srf.name
96
107
  unless vent_srf_name.empty?
97
- act_name = vent_srf_name.get.delete(' ').delete('.') + '_OpenFactor'
108
+ act_name = replace_ems_special_characters(vent_srf_name.get) + \
109
+ '_OpenFactor' + @@actuator_count.to_s
110
+ @@actuator_count = @@actuator_count + 1
98
111
  window_act.setName(act_name)
99
112
  actuator_names << act_name
100
113
  end
@@ -136,7 +149,9 @@ module FromHoneybee
136
149
 
137
150
  # initialize the program and add the complete logic
138
151
  ems_program = OpenStudio::Model::EnergyManagementSystemProgram.new(openstudio_model)
139
- ems_program.setName(os_zone_name.delete(' ').delete('.') + '_WindowOpening')
152
+ prog_name = replace_ems_special_characters(os_zone_name) + '_WindowOpening' + @@program_count.to_s
153
+ @@program_count = @@program_count + 1
154
+ ems_program.setName(prog_name)
140
155
  ems_program.addLine(complete_logic)
141
156
 
142
157
  # loop through each of the actuators and open each window
@@ -150,7 +150,7 @@ module FromHoneybee
150
150
 
151
151
  # create the simple opening object for the Aperture or Door using default values
152
152
  flow_exponent = defaults[:flow_exponent_closed][:default].to_f
153
- two_way_thresh= defaults[:two_way_threshold][:default].to_f
153
+ two_way_thresh = defaults[:two_way_threshold][:default].to_f
154
154
  discharge_coeff = defaults[:discharge_coefficient][:default].to_f
155
155
  os_opening = OpenStudio::Model::AirflowNetworkSimpleOpening.new(
156
156
  openstudio_model, flow_coefficient, flow_exponent, two_way_thresh, discharge_coeff)
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: honeybee-openstudio
3
3
  version: !ruby/object:Gem::Version
4
- version: 2.6.0
4
+ version: 2.6.5
5
5
  platform: ruby
6
6
  authors:
7
7
  - Tanushree Charan
@@ -11,7 +11,7 @@ authors:
11
11
  autorequire:
12
12
  bindir: exe
13
13
  cert_chain: []
14
- date: 2020-09-01 00:00:00.000000000 Z
14
+ date: 2020-09-16 00:00:00.000000000 Z
15
15
  dependencies:
16
16
  - !ruby/object:Gem::Dependency
17
17
  name: bundler