openstudio-standards 0.2.17.rc2 → 0.3.0

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: e9530b5c7223d50af5e3798df58867485a369ce5cfd5e403381ea43e49b7a3f1
4
- data.tar.gz: 1d8589faff7ca2883a68b757d537a2c744dcefb12d752e41ebe6b1e7c3b920c2
3
+ metadata.gz: 869188124d2251a59ea1f453f897450d7b25017970f0a507322ec8c569135ae9
4
+ data.tar.gz: d4107600d066939c8ee60b95df4d1dd7a18fd35039a575649b68866d27f95653
5
5
  SHA512:
6
- metadata.gz: aa366a20854813054da39fadd020c4193beb14522231128775ec52f49fb646d09210f9d2a8a75d8a0e327ffd3d7f3699854012d5cb8a43391357a55857d50fc2
7
- data.tar.gz: 88a723a11e10ac0f1b83278771bd8c039c45f1a1f4f58338a115a67a4bd920685f4b56b203573d0adf1d7dab1fbddfa2c94c4c7e7b63dd589608c41cc34f71c1
6
+ metadata.gz: c271293b7547a006dbd6594747f74a55278407633376060d51604320660ee86839c6bcefafaa8cf24d635fab0272236b85c496aee982aaea6f57a1b23771b987
7
+ data.tar.gz: 808dc8cc49bb9d67c8496e57eb8a504650c8417b6539be87a314c8b0165a6beef2bc93b10d48f67d2842651b33cbd42f4727307d802aca9fb468788b59c8a120
@@ -59,7 +59,7 @@ class Standard
59
59
  end
60
60
 
61
61
  # add exterior lights for parking area
62
- if area_length_count_hash[:parking_area_and_drives_area] > 0
62
+ if !area_length_count_hash[:parking_area_and_drives_area].nil? && area_length_count_hash[:parking_area_and_drives_area] > 0
63
63
 
64
64
  # lighting values
65
65
  multiplier = area_length_count_hash[:parking_area_and_drives_area] * onsite_parking_fraction
@@ -86,7 +86,7 @@ class Standard
86
86
  end
87
87
 
88
88
  # add exterior lights for facades
89
- if area_length_count_hash[:building_facades] > 0
89
+ if !area_length_count_hash[:building_facades].nil? && area_length_count_hash[:building_facades] > 0
90
90
 
91
91
  # lighting values
92
92
  multiplier = area_length_count_hash[:building_facades]
@@ -113,7 +113,7 @@ class Standard
113
113
  end
114
114
 
115
115
  # add exterior lights for main entries
116
- if area_length_count_hash[:main_entries] > 0
116
+ if !area_length_count_hash[:main_entries].nil? && area_length_count_hash[:main_entries] > 0
117
117
 
118
118
  # lighting values
119
119
  multiplier = area_length_count_hash[:main_entries]
@@ -140,7 +140,7 @@ class Standard
140
140
  end
141
141
 
142
142
  # add exterior lights for other doors
143
- if area_length_count_hash[:other_doors] > 0
143
+ if !area_length_count_hash[:other_doors].nil? && area_length_count_hash[:other_doors] > 0
144
144
 
145
145
  # lighting values
146
146
  multiplier = area_length_count_hash[:other_doors]
@@ -167,7 +167,7 @@ class Standard
167
167
  end
168
168
 
169
169
  # add exterior lights for entry canopies
170
- if area_length_count_hash[:canopy_entry_area] > 0
170
+ if !area_length_count_hash[:canopy_entry_area].nil? && area_length_count_hash[:canopy_entry_area] > 0
171
171
 
172
172
  # lighting values
173
173
  multiplier = area_length_count_hash[:canopy_entry_area]
@@ -194,7 +194,7 @@ class Standard
194
194
  end
195
195
 
196
196
  # add exterior lights for emergency canopies
197
- if area_length_count_hash[:canopy_emergency_area] > 0
197
+ if !area_length_count_hash[:canopy_emergency_area].nil? && area_length_count_hash[:canopy_emergency_area] > 0
198
198
 
199
199
  # lighting values
200
200
  multiplier = area_length_count_hash[:canopy_emergency_area]
@@ -221,7 +221,7 @@ class Standard
221
221
  end
222
222
 
223
223
  # add exterior lights for drive through windows
224
- if area_length_count_hash[:drive_through_windows] > 0
224
+ if !area_length_count_hash[:drive_through_windows].nil? && area_length_count_hash[:drive_through_windows] > 0
225
225
 
226
226
  # lighting values
227
227
  multiplier = area_length_count_hash[:drive_through_windows]
@@ -2721,7 +2721,11 @@ Standard.class_eval do
2721
2721
  end
2722
2722
  end
2723
2723
  end
2724
- return window_area / wall_area * 100 if wwr
2724
+
2725
+ # check wall area is non-zero
2726
+ if wwr && wall_area > 0
2727
+ return window_area / wall_area * 100
2728
+ end
2725
2729
 
2726
2730
  # else
2727
2731
  return window_area
@@ -546,6 +546,14 @@ class Standard
546
546
  default_water_heater_ambient_temp_sch = model_add_constant_schedule_ruleset(model,
547
547
  OpenStudio.convert(70.0, 'F', 'C').get,
548
548
  name = 'Water Heater Ambient Temp Schedule - 70F')
549
+ if temp_sch_type_limits.nil?
550
+ temp_sch_type_limits = model_add_schedule_type_limits(model,
551
+ name: 'Temperature Schedule Type Limits',
552
+ lower_limit_value: 0.0,
553
+ upper_limit_value: 100.0,
554
+ numeric_type: 'Continuous',
555
+ unit_type: 'Temperature')
556
+ end
549
557
  default_water_heater_ambient_temp_sch.setScheduleTypeLimits(temp_sch_type_limits)
550
558
  tank.setAmbientTemperatureIndicator('Schedule')
551
559
  tank.setAmbientTemperatureSchedule(default_water_heater_ambient_temp_sch)
@@ -3264,7 +3264,9 @@ class Standard
3264
3264
  # To solve the issue, add economizer here for cold climates
3265
3265
  # select the climate zones with winter design temperature lower than -20C (for safer)
3266
3266
  cold_climates = ['ASHRAE 169-2006-6A', 'ASHRAE 169-2006-6B', 'ASHRAE 169-2006-7A',
3267
- 'ASHRAE 169-2006-7B', 'ASHRAE 169-2006-8A', 'ASHRAE 169-2006-8B']
3267
+ 'ASHRAE 169-2006-7B', 'ASHRAE 169-2006-8A', 'ASHRAE 169-2006-8B',
3268
+ 'ASHRAE 169-2013-6A', 'ASHRAE 169-2013-6B', 'ASHRAE 169-2013-7A',
3269
+ 'ASHRAE 169-2013-7B', 'ASHRAE 169-2013-8A', 'ASHRAE 169-2013-8B']
3268
3270
  if cold_climates.include? climate_zone
3269
3271
  # Determine the economizer type in the prototype buildings, which depends on climate zone.
3270
3272
  economizer_type = model_economizer_type(model, climate_zone)
@@ -980,7 +980,7 @@ class Standard
980
980
  end
981
981
  elsif equip.to_ZoneHVACLowTemperatureRadiantElectric.is_initialized
982
982
  equip = equip.to_ZoneHVACLowTemperatureRadiantElectric.get
983
- htg_sch = equip.heatingSetpointTemperatureSchedule.get
983
+ htg_sch = equip.heatingSetpointTemperatureSchedule
984
984
  elsif equip.to_ZoneHVACLowTempRadiantConstFlow.is_initialized
985
985
  equip = equip.to_ZoneHVACLowTempRadiantConstFlow.get
986
986
  htg_coil = equip.heatingCoil
@@ -169,15 +169,15 @@ class Standard
169
169
  end
170
170
 
171
171
  # Convert to SI
172
- ua_btu_per_hr_per_c = OpenStudio.convert(ua_btu_per_hr_per_f, 'Btu/hr*R', 'W/K').get
173
- OpenStudio.logFree(OpenStudio::Debug, 'openstudio.standards.WaterHeaterMixed', "For #{water_heater_mixed.name}, skin-loss UA = #{ua_btu_per_hr_per_c} W/K.")
172
+ ua_w_per_k = OpenStudio.convert(ua_btu_per_hr_per_f, 'Btu/hr*R', 'W/K').get
173
+ OpenStudio.logFree(OpenStudio::Debug, 'openstudio.standards.WaterHeaterMixed', "For #{water_heater_mixed.name}, skin-loss UA = #{ua_w_per_k} W/K.")
174
174
 
175
175
  # Set the water heater properties
176
176
  # Efficiency
177
177
  water_heater_mixed.setHeaterThermalEfficiency(water_heater_eff)
178
178
  # Skin loss
179
- water_heater_mixed.setOffCycleLossCoefficienttoAmbientTemperature(ua_btu_per_hr_per_c)
180
- water_heater_mixed.setOnCycleLossCoefficienttoAmbientTemperature(ua_btu_per_hr_per_c)
179
+ water_heater_mixed.setOffCycleLossCoefficienttoAmbientTemperature(ua_w_per_k)
180
+ water_heater_mixed.setOnCycleLossCoefficienttoAmbientTemperature(ua_w_per_k)
181
181
  # @todo Parasitic loss (pilot light)
182
182
  # PNNL document says pilot lights were removed, but IDFs
183
183
  # still have the on/off cycle parasitic fuel consumptions filled in
@@ -190,7 +190,7 @@ class Standard
190
190
 
191
191
  # Append the name with standards information
192
192
  water_heater_mixed.setName("#{water_heater_mixed.name} #{water_heater_eff.round(3)} Therm Eff")
193
- OpenStudio.logFree(OpenStudio::Info, 'openstudio.standards.WaterHeaterMixed', "For #{template}: #{water_heater_mixed.name}; thermal efficiency = #{water_heater_eff.round(3)}, skin-loss UA = #{ua_btu_per_hr_per_f.round}Btu/hr")
193
+ OpenStudio.logFree(OpenStudio::Info, 'openstudio.standards.WaterHeaterMixed', "For #{template}: #{water_heater_mixed.name}; thermal efficiency = #{water_heater_eff.round(3)}, skin-loss UA = #{ua_btu_per_hr_per_f.round}Btu/hr-R")
194
194
 
195
195
  return true
196
196
  end
@@ -9,7 +9,7 @@
9
9
  "emergency_canopies": null,
10
10
  "canopy_size": null,
11
11
  "floor_area_per_drive_through_window": null,
12
- "notes": "match secondary school"
12
+ "notes": "match SecondarySchool"
13
13
  },
14
14
  {
15
15
  "building_type": "Courthouse",
@@ -20,7 +20,7 @@
20
20
  "emergency_canopies": null,
21
21
  "canopy_size": null,
22
22
  "floor_area_per_drive_through_window": null,
23
- "notes": "match medium office"
23
+ "notes": "match MediumOffice"
24
24
  },
25
25
  {
26
26
  "building_type": "FullServiceRestaurant",
@@ -55,6 +55,17 @@
55
55
  "floor_area_per_drive_through_window": null,
56
56
  "notes": "No source for canopy size, Table 5.41. Exterior Lighting Savings Summary for Addendum 90.1-07i doesn't indicate canopy lighting. Section 5.4.2 Exterior Lights in U.S. Department of Energy Commercial Reference Building Models of the National Building Stock shows their use."
57
57
  },
58
+ {
59
+ "building_type": "Laboratory",
60
+ "rollup_doors_per_10,000": 0.0,
61
+ "entrance_doors_per_10,000": 2.0,
62
+ "others_doors_per_10,000": 2.45,
63
+ "entrance_canopies": null,
64
+ "emergency_canopies": null,
65
+ "canopy_size": null,
66
+ "floor_area_per_drive_through_window": null,
67
+ "notes": "match SecondarySchool"
68
+ },
58
69
  {
59
70
  "building_type": "LargeDataCenterHighITE",
60
71
  "rollup_doors_per_10,000": null,
@@ -7,7 +7,7 @@
7
7
  "students_per_spot": null,
8
8
  "beds_per_spot": null,
9
9
  "parking_area_per_spot": 405.0,
10
- "notes": "Based on Table 4.17 Illuminated Parking Area from Achieving the 30% Goal: Energy and Cost Savings Analysis of ASHRAE Standard 90.1-2010"
10
+ "notes": "match MediumOffice"
11
11
  },
12
12
  {
13
13
  "building_type": "Courthouse",
@@ -16,7 +16,7 @@
16
16
  "students_per_spot": null,
17
17
  "beds_per_spot": null,
18
18
  "parking_area_per_spot": 405.0,
19
- "notes": "Based on Table 4.17 Illuminated Parking Area from Achieving the 30% Goal: Energy and Cost Savings Analysis of ASHRAE Standard 90.1-2010"
19
+ "notes": "match MediumOffice"
20
20
  },
21
21
  {
22
22
  "building_type": "FullServiceRestaurant",
@@ -45,6 +45,15 @@
45
45
  "parking_area_per_spot": 405.0,
46
46
  "notes": "Based on Table 4.17 Illuminated Parking Area from Achieving the 30% Goal: Energy and Cost Savings Analysis of ASHRAE Standard 90.1-2010"
47
47
  },
48
+ {
49
+ "building_type": "Laboratory",
50
+ "building_area_per_spot": 250.0,
51
+ "units_per_spot": null,
52
+ "students_per_spot": null,
53
+ "beds_per_spot": null,
54
+ "parking_area_per_spot": 405.0,
55
+ "notes": "match MediumOffice"
56
+ },
48
57
  {
49
58
  "building_type": "LargeDataCenterHighITE",
50
59
  "building_area_per_spot": 0.0,
@@ -222,7 +222,7 @@ class NECB2011
222
222
 
223
223
  # Append the name with standards information
224
224
  water_heater_mixed.setName("#{water_heater_mixed.name} #{water_heater_eff.round(3)} Therm Eff")
225
- OpenStudio.logFree(OpenStudio::Info, 'openstudio.model.WaterHeaterMixed', "For #{template}: #{water_heater_mixed.name}; thermal efficiency = #{water_heater_eff.round(3)}, skin-loss UA = #{ua_btu_per_hr_per_f.round}Btu/hr")
225
+ OpenStudio.logFree(OpenStudio::Info, 'openstudio.model.WaterHeaterMixed', "For #{template}: #{water_heater_mixed.name}; thermal efficiency = #{water_heater_eff.round(3)}, skin-loss UA = #{ua_btu_per_hr_per_f.round}Btu/hr-R")
226
226
  return true
227
227
  end
228
228
 
@@ -153,7 +153,7 @@ class NECB2020
153
153
 
154
154
  # Append the name with standards information
155
155
  water_heater_mixed.setName("#{water_heater_mixed.name} #{water_heater_eff.round(3)} Therm Eff")
156
- OpenStudio.logFree(OpenStudio::Info, 'openstudio.model.WaterHeaterMixed', "For #{template}: #{water_heater_mixed.name}; thermal efficiency = #{water_heater_eff.round(3)}, skin-loss UA = #{ua_btu_per_hr_per_f.round}Btu/hr")
156
+ OpenStudio.logFree(OpenStudio::Info, 'openstudio.model.WaterHeaterMixed', "For #{template}: #{water_heater_mixed.name}; thermal efficiency = #{water_heater_eff.round(3)}, skin-loss UA = #{ua_btu_per_hr_per_f.round}Btu/hr-R")
157
157
  return true
158
158
  end
159
159
  end
@@ -13,5 +13,5 @@ module OpenstudioStandards
13
13
  end
14
14
  return 'git-not-found-on-this-system'
15
15
  end
16
- VERSION = '0.2.17.rc2'.freeze
16
+ VERSION = '0.3.0'.freeze
17
17
  end
@@ -98,6 +98,11 @@ class Standard
98
98
  weather_dir = File.expand_path(File.join(Dir.pwd, 'extracted_files/weather/'))
99
99
  OpenStudio.logFree(OpenStudio::Info, 'openstudio.weather.Model', "Extracting weather files from OpenStudio CLI to #{weather_dir}")
100
100
  FileUtils.mkdir_p(weather_dir)
101
+
102
+ path_length = "#{weather_dir}/#{weather_file_name}".length
103
+ if path_length > 260
104
+ OpenStudio.logFree(OpenStudio::Warn, 'openstudio.weather.Model', "Weather file path length #{path_length} is >260 characters and may cause issues in Windows environments.")
105
+ end
101
106
  File.open("#{weather_dir}/#{weather_file_name}", 'wb') { |f| f << epw_string; f.flush }
102
107
  File.open("#{weather_dir}/#{weather_file_name.gsub('.epw', '.ddy')}", 'wb') { |f| f << ddy_string; f.flush }
103
108
  File.open("#{weather_dir}/#{weather_file_name.gsub('.epw', '.stat')}", 'wb') { |f| f << stat_string; f.flush }
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: openstudio-standards
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.2.17.rc2
4
+ version: 0.3.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Andrew Parker
@@ -28,7 +28,7 @@ authors:
28
28
  autorequire:
29
29
  bindir: bin
30
30
  cert_chain: []
31
- date: 2022-10-20 00:00:00.000000000 Z
31
+ date: 2022-11-03 00:00:00.000000000 Z
32
32
  dependencies:
33
33
  - !ruby/object:Gem::Dependency
34
34
  name: minitest-reporters