openstudio-standards 0.2.17.rc2 → 0.3.0

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.
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