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 +4 -4
- data/data/standards/OpenStudio_Standards-ashrae_90_1.xlsx +0 -0
- data/lib/openstudio-standards/prototypes/common/objects/Prototype.Model.exterior_lights.rb +7 -7
- data/lib/openstudio-standards/prototypes/common/objects/Prototype.Model.rb +5 -1
- data/lib/openstudio-standards/prototypes/common/objects/Prototype.ServiceWaterHeating.rb +8 -0
- data/lib/openstudio-standards/prototypes/common/objects/Prototype.hvac_systems.rb +3 -1
- data/lib/openstudio-standards/standards/Standards.ThermalZone.rb +1 -1
- data/lib/openstudio-standards/standards/Standards.WaterHeaterMixed.rb +5 -5
- data/lib/openstudio-standards/standards/ashrae_90_1/data/ashrae_90_1.entryways.json +13 -2
- data/lib/openstudio-standards/standards/ashrae_90_1/data/ashrae_90_1.parking.json +11 -2
- data/lib/openstudio-standards/standards/necb/NECB2011/service_water_heating.rb +1 -1
- data/lib/openstudio-standards/standards/necb/NECB2020/service_water_heating.rb +1 -1
- data/lib/openstudio-standards/version.rb +1 -1
- data/lib/openstudio-standards/weather/Weather.Model.rb +5 -0
- metadata +2 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 869188124d2251a59ea1f453f897450d7b25017970f0a507322ec8c569135ae9
|
4
|
+
data.tar.gz: d4107600d066939c8ee60b95df4d1dd7a18fd35039a575649b68866d27f95653
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: c271293b7547a006dbd6594747f74a55278407633376060d51604320660ee86839c6bcefafaa8cf24d635fab0272236b85c496aee982aaea6f57a1b23771b987
|
7
|
+
data.tar.gz: 808dc8cc49bb9d67c8496e57eb8a504650c8417b6539be87a314c8b0165a6beef2bc93b10d48f67d2842651b33cbd42f4727307d802aca9fb468788b59c8a120
|
Binary file
|
@@ -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
|
-
|
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
|
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
|
-
|
173
|
-
OpenStudio.logFree(OpenStudio::Debug, 'openstudio.standards.WaterHeaterMixed', "For #{water_heater_mixed.name}, skin-loss UA = #{
|
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(
|
180
|
-
water_heater_mixed.setOnCycleLossCoefficienttoAmbientTemperature(
|
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
|
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
|
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": "
|
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": "
|
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
|
@@ -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.
|
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-
|
31
|
+
date: 2022-11-03 00:00:00.000000000 Z
|
32
32
|
dependencies:
|
33
33
|
- !ruby/object:Gem::Dependency
|
34
34
|
name: minitest-reporters
|