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