openstudio-common-measures 0.4.0 → 0.6.1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (81) hide show
  1. checksums.yaml +4 -4
  2. data/.gitignore +1 -0
  3. data/.rubocop.yml +3 -1
  4. data/CHANGELOG.md +25 -0
  5. data/README.md +21 -2
  6. data/doc_templates/copyright_erb.txt +1 -1
  7. data/lib/measures/AddCostPerFloorAreaUnusedToLights/measure.xml +2 -8
  8. data/lib/measures/AddCostToSupplySideHVACComponentByAirLoop/measure.xml +9 -3
  9. data/lib/measures/AddSimplePvToShadingSurfacesByType/measure.xml +2 -2
  10. data/lib/measures/RemoveUnusedDefaultProfiles/measure.xml +2 -2
  11. data/lib/measures/ReportModelChanges/measure.xml +2 -2
  12. data/lib/measures/SetCOPforSingleSpeedDXCoolingUnits/measure.xml +4 -4
  13. data/lib/measures/SetCOPforTwoSpeedDXCoolingUnits/measure.xml +4 -4
  14. data/lib/measures/SetGasBurnerEfficiency/measure.xml +4 -4
  15. data/lib/measures/ShiftScheduleProfileTime/measure.xml +4 -4
  16. data/lib/measures/SwapLightsDefinition/measure.xml +3 -5
  17. data/lib/measures/add_ems_emissions_reporting/LICENSE.MD.txt +15 -0
  18. data/lib/measures/add_ems_emissions_reporting/LICENSE.md +27 -0
  19. data/lib/measures/add_ems_emissions_reporting/README.md +17 -0
  20. data/lib/measures/add_ems_emissions_reporting/measure.rb +474 -0
  21. data/lib/measures/add_ems_emissions_reporting/measure.xml +599 -0
  22. data/lib/measures/add_ems_emissions_reporting/resources/future_annual_co2e.csv +17 -0
  23. data/lib/measures/add_ems_emissions_reporting/resources/future_hourly_co2e_2020.csv +8761 -0
  24. data/lib/measures/add_ems_emissions_reporting/resources/future_hourly_co2e_2022.csv +8761 -0
  25. data/lib/measures/add_ems_emissions_reporting/resources/future_hourly_co2e_2024.csv +8761 -0
  26. data/lib/measures/add_ems_emissions_reporting/resources/future_hourly_co2e_2026.csv +8761 -0
  27. data/lib/measures/add_ems_emissions_reporting/resources/future_hourly_co2e_2028.csv +8761 -0
  28. data/lib/measures/add_ems_emissions_reporting/resources/future_hourly_co2e_2030.csv +8761 -0
  29. data/lib/measures/add_ems_emissions_reporting/resources/future_hourly_co2e_2032.csv +8761 -0
  30. data/lib/measures/add_ems_emissions_reporting/resources/future_hourly_co2e_2034.csv +8761 -0
  31. data/lib/measures/add_ems_emissions_reporting/resources/future_hourly_co2e_2036.csv +8761 -0
  32. data/lib/measures/add_ems_emissions_reporting/resources/future_hourly_co2e_2038.csv +8761 -0
  33. data/lib/measures/add_ems_emissions_reporting/resources/future_hourly_co2e_2040.csv +8761 -0
  34. data/lib/measures/add_ems_emissions_reporting/resources/future_hourly_co2e_2042.csv +8761 -0
  35. data/lib/measures/add_ems_emissions_reporting/resources/future_hourly_co2e_2044.csv +8761 -0
  36. data/lib/measures/add_ems_emissions_reporting/resources/future_hourly_co2e_2046.csv +8761 -0
  37. data/lib/measures/add_ems_emissions_reporting/resources/future_hourly_co2e_2048.csv +8761 -0
  38. data/lib/measures/add_ems_emissions_reporting/resources/future_hourly_co2e_2050.csv +8761 -0
  39. data/lib/measures/add_ems_emissions_reporting/resources/historical_annual_co2e.csv +9 -0
  40. data/lib/measures/add_ems_emissions_reporting/resources/historical_hourly_co2e_2019.csv +8761 -0
  41. data/lib/measures/add_ev_load/measure.rb +51 -8
  42. data/lib/measures/add_ev_load/measure.xml +23 -5
  43. data/lib/measures/envelope_and_internal_load_breakdown/measure.xml +3 -3
  44. data/lib/measures/envelope_and_internal_load_breakdown/resources/report.html.erb +6 -1
  45. data/lib/measures/example_report/measure.xml +3 -3
  46. data/lib/measures/example_report/resources/report.html.erb +6 -1
  47. data/lib/measures/generic_qaqc/README.md +19 -4
  48. data/lib/measures/generic_qaqc/README.md.erb +7 -1
  49. data/lib/measures/generic_qaqc/docs/generic_qaqc_detailed.jpg +0 -0
  50. data/lib/measures/generic_qaqc/docs/generic_qaqc_summary.jpg +0 -0
  51. data/lib/measures/generic_qaqc/measure.rb +34 -29
  52. data/lib/measures/generic_qaqc/measure.xml +181 -82
  53. data/lib/measures/generic_qaqc/resources/check_cond_zns.rb +3 -1
  54. data/lib/measures/generic_qaqc/resources/check_domestic_hot_water.rb +13 -8
  55. data/lib/measures/generic_qaqc/resources/check_envelope_conductance.rb +330 -231
  56. data/lib/measures/generic_qaqc/resources/check_eui_by_end_use.rb +59 -20
  57. data/lib/measures/generic_qaqc/resources/check_eui_reasonableness.rb +58 -20
  58. data/lib/measures/generic_qaqc/resources/check_internal_loads.rb +57 -56
  59. data/lib/measures/generic_qaqc/resources/check_mech_sys_capacity.rb +4 -1
  60. data/lib/measures/generic_qaqc/resources/check_mech_sys_efficiency.rb +27 -22
  61. data/lib/measures/generic_qaqc/resources/check_mech_sys_part_load_eff.rb +4 -1
  62. data/lib/measures/generic_qaqc/resources/check_mech_sys_type.rb +3 -3
  63. data/lib/measures/generic_qaqc/resources/check_schedules.rb +65 -101
  64. data/lib/measures/generic_qaqc/resources/check_simultaneous_heating_and_cooling.rb +3 -1
  65. data/lib/measures/generic_qaqc/resources/check_supply_air_and_thermostat_temp_difference.rb +3 -1
  66. data/lib/measures/generic_qaqc/resources/os_lib_reporting_qaqc.rb +49 -15
  67. data/lib/measures/generic_qaqc/resources/report.html.erb +6 -1
  68. data/lib/measures/hvac_psychrometric_chart/measure.xml +4 -3
  69. data/lib/measures/hvac_psychrometric_chart/resources/report.html.erb +6 -1
  70. data/lib/measures/openstudio_results/measure.xml +3 -3
  71. data/lib/measures/openstudio_results/resources/report.html.erb +6 -1
  72. data/lib/measures/set_run_period/measure.xml +2 -2
  73. data/lib/measures/view_data/measure.xml +9 -9
  74. data/lib/measures/view_data/resources/report.html.in +1336 -973
  75. data/lib/measures/view_data/resources/va3c.rb +1 -0
  76. data/lib/measures/view_model/measure.xml +33 -64
  77. data/lib/measures/view_model/resources/report.html.in +1339 -976
  78. data/lib/measures/view_model/resources/va3c.rb +1 -0
  79. data/lib/openstudio/common_measures/version.rb +1 -1
  80. data/openstudio-common-measures.gemspec +2 -2
  81. metadata +33 -7
@@ -38,33 +38,46 @@ module OsLib_QAQC
38
38
 
39
39
  # checks the number of unmet hours in the model
40
40
  def check_eui_by_end_use(category, target_standard, min_pass, max_pass, name_only = false)
41
+
41
42
  # summary of the check
42
43
  check_elems = OpenStudio::AttributeVector.new
43
44
  check_elems << OpenStudio::Attribute.new('name', 'End Use by Category')
44
45
  check_elems << OpenStudio::Attribute.new('category', category)
45
- check_elems << OpenStudio::Attribute.new('description', "Check end use by category against #{target_standard} DOE prototype buildings.")
46
+
47
+ # update display sttandard
48
+ if target_standard.include?('90.1')
49
+ display_standard = "ASHRAE #{target_standard}"
50
+ else
51
+ display_standard = target_standard
52
+ end
46
53
 
47
54
  # stop here if only name is requested this is used to populate display name for arguments
48
55
  if name_only == true
49
56
  results = []
57
+ check_elems << OpenStudio::Attribute.new('description', "Check model consumption by end use against #{target_standard} DOE prototype building.")
50
58
  check_elems.each do |elem|
51
59
  results << elem.valueAsString
52
60
  end
53
61
  return results
54
62
  end
55
63
 
56
- # Versions of OpenStudio greater than 2.4.0 use a modified version of
57
- # openstudio-standards with different method calls. These methods
58
- # require a "Standard" object instead of the standard being passed into method calls.
59
- # This Standard object is used throughout the QAQC check.
60
- if OpenStudio::VersionString.new(OpenStudio.openStudioVersion) < OpenStudio::VersionString.new('2.4.3')
61
- use_old_gem_code = true
62
- else
63
- use_old_gem_code = false
64
+ begin
65
+
66
+ # setup standard
64
67
  std = Standard.build(target_standard)
65
- end
68
+ target_eui = std.model_find_target_eui(@model)
69
+
70
+ # gather building type for summary
71
+ bt_cz = std.model_get_building_climate_zone_and_building_type(@model)
72
+ building_type = bt_cz['building_type']
73
+ # mapping to obuilding type to match space types
74
+ if building_type.include?("Office") then building_type = "Office" end
75
+ climate_zone = bt_cz['climate_zone']
76
+ prototype_prefix = "#{display_standard} #{building_type} #{climate_zone}"
77
+ check_elems << OpenStudio::Attribute.new('description', "Check model consumption by end use against #{prototype_prefix} DOE prototype building.")
78
+ check_elems << OpenStudio::Attribute.new('min_pass', min_pass * 100)
79
+ check_elems << OpenStudio::Attribute.new('max_pass', max_pass * 100)
66
80
 
67
- begin
68
81
  # total building area
69
82
  query = 'SELECT Value FROM tabulardatawithstrings WHERE '
70
83
  query << "ReportName='AnnualBuildingUtilityPerformanceSummary' and "
@@ -107,14 +120,36 @@ module OsLib_QAQC
107
120
  actual_eui_by_end_use[end_use] = total_end_use / energy_plus_area
108
121
  end
109
122
 
110
- # gather target end uses for given standard as hash
111
- if use_old_gem_code
112
- target_eui_by_end_use = @model.find_target_eui_by_end_use(target_standard)
113
- else
114
- std = Standard.build(target_standard)
115
- target_eui_by_end_use = std.model_find_target_eui_by_end_use(@model)
123
+ # check if all spaces types used the building type defined in the model (percentage calculation doesn't check if all area is inclued in building floor area)
124
+ if building_type != ''
125
+ primary_type_floor_area = 0.0
126
+ non_pri_area = 0.0
127
+ non_pri_types = []
128
+ @model.getSpaceTypes.each do |space_type|
129
+ st_bt = space_type.standardsBuildingType
130
+ if st_bt.is_initialized
131
+ st_bt = st_bt.get.to_s
132
+ if st_bt.include?("Office") then st_bt = "Office" end
133
+ if st_bt.to_s == building_type.to_s
134
+ primary_type_floor_area += space_type.floorArea
135
+ else
136
+ non_pri_area += space_type.floorArea
137
+ if !non_pri_types.include?(st_bt) then non_pri_types << st_bt end
138
+ end
139
+ else
140
+ non_pri_area += space_type.floorArea
141
+ if !non_pri_types.include?(st_bt) then non_pri_types << st_bt end
142
+ end
143
+ end
144
+ if non_pri_area > 0.0
145
+ check_elems << OpenStudio::Attribute.new('flag', "The primary building type, #{building_type}, only represents #{(100 * primary_type_floor_area / (primary_type_floor_area + non_pri_area)).round}% of the total building area. Other standads building types included are #{non_pri_types.sort.join(",")}. While a comparison to the #{building_type} prototype consumption by end use is provided, it would not be unexpected for the building consumption by end use to be significantly different than the prototype.")
146
+ end
116
147
  end
117
148
 
149
+ # gather target end uses for given standard as hash
150
+ std = Standard.build(target_standard)
151
+ target_eui_by_end_use = std.model_find_target_eui_by_end_use(@model)
152
+
118
153
  # units for flag display text and unit conversion
119
154
  source_units = 'GJ/m^2'
120
155
  target_units = 'kBtu/ft^2'
@@ -136,13 +171,17 @@ module OsLib_QAQC
136
171
  if (end_use == 'Pumps') && (value < 0.05) && (target_value < 0.05) then skip = true end
137
172
 
138
173
  if (value < target_value * (1.0 - min_pass)) && !skip
139
- check_elems << OpenStudio::Attribute.new('flag', "#{end_use} EUI of #{eui_ip_neat} (#{target_units}) is less than #{min_pass * 100} % below the expected #{end_use} EUI of #{target_eui_ip_neat} (#{target_units}) for #{target_standard}.")
174
+ check_elems << OpenStudio::Attribute.new('flag', "#{end_use} EUI of #{eui_ip_neat} (#{target_units}) is more than #{min_pass * 100} % below the #{prototype_prefix} prototype #{end_use} EUI of #{target_eui_ip_neat} (#{target_units}) for #{target_standard}.")
140
175
  elsif (value > target_value * (1.0 + max_pass)) && !skip
141
- check_elems << OpenStudio::Attribute.new('flag', "#{end_use} EUI of #{eui_ip_neat} (#{target_units}) is more than #{max_pass * 100} % above the expected #{end_use} EUI of #{target_eui_ip_neat} (#{target_units}) for #{target_standard}.")
176
+ check_elems << OpenStudio::Attribute.new('flag', "#{end_use} EUI of #{eui_ip_neat} (#{target_units}) is more than #{max_pass * 100} % above the #{prototype_prefix} prototype #{end_use} EUI of #{target_eui_ip_neat} (#{target_units}) for #{target_standard}.")
142
177
  end
143
178
  end
144
179
  else
145
- check_elems << OpenStudio::Attribute.new('flag', "Can't calculate target end use EUIs. Make sure model has expected climate zone and building type.")
180
+ if ['90.1-2016','90.1-2019'].include?(target_standard) || target_standard.include?("ComStock")
181
+ check_elems << OpenStudio::Attribute.new('flag', "target EUI end use comparison is not supported yet for #{target_standard}.")
182
+ else
183
+ check_elems << OpenStudio::Attribute.new('flag', "Can't calculate target end use EUIs. Make sure model has expected climate zone and building type.")
184
+ end
146
185
  end
147
186
  rescue StandardError => e
148
187
  # brief description of ruby error
@@ -38,14 +38,22 @@ module OsLib_QAQC
38
38
 
39
39
  # checks the number of unmet hours in the model
40
40
  def check_eui_reasonableness(category, target_standard, min_pass, max_pass, name_only = false)
41
+
41
42
  # summary of the check
42
43
  check_elems = OpenStudio::AttributeVector.new
43
44
  check_elems << OpenStudio::Attribute.new('name', 'EUI Reasonableness')
44
45
  check_elems << OpenStudio::Attribute.new('category', category)
45
- check_elems << OpenStudio::Attribute.new('description', "Check EUI for model against #{target_standard} DOE prototype buildings.")
46
+
47
+ # update display sttandard
48
+ if target_standard.include?('90.1')
49
+ display_standard = "ASHRAE #{target_standard}"
50
+ else
51
+ display_standard = target_standard
52
+ end
46
53
 
47
54
  # stop here if only name is requested this is used to populate display name for arguments
48
55
  if name_only == true
56
+ check_elems << OpenStudio::Attribute.new('description', "Check model EUI against #{display_standard} DOE prototype building.")
49
57
  results = []
50
58
  check_elems.each do |elem|
51
59
  results << elem.valueAsString
@@ -53,18 +61,26 @@ module OsLib_QAQC
53
61
  return results
54
62
  end
55
63
 
56
- # Versions of OpenStudio greater than 2.4.0 use a modified version of
57
- # openstudio-standards with different method calls. These methods
58
- # require a "Standard" object instead of the standard being passed into method calls.
59
- # This Standard object is used throughout the QAQC check.
60
- if OpenStudio::VersionString.new(OpenStudio.openStudioVersion) < OpenStudio::VersionString.new('2.4.3')
61
- use_old_gem_code = true
62
- else
63
- use_old_gem_code = false
64
+ begin
65
+
66
+ # setup standard
64
67
  std = Standard.build(target_standard)
65
- end
68
+ target_eui = std.model_find_target_eui(@model)
69
+
70
+ # gather building type for summary
71
+ bt_cz = std.model_get_building_climate_zone_and_building_type(@model)
72
+ building_type = bt_cz['building_type']
73
+ climate_zone = bt_cz['climate_zone']
74
+ prototype_prefix = "#{display_standard} #{building_type} #{climate_zone}"
75
+
76
+ # mapping to obuilding type to match space types
77
+ if building_type.include?("Office") then building_type = "Office" end
78
+
79
+ # last part of summary table
80
+ check_elems << OpenStudio::Attribute.new('description', "Check model EUI against #{prototype_prefix} DOE prototype building.")
81
+ check_elems << OpenStudio::Attribute.new('min_pass', min_pass * 100)
82
+ check_elems << OpenStudio::Attribute.new('max_pass', max_pass * 100)
66
83
 
67
- begin
68
84
  # total building area
69
85
  query = 'SELECT Value FROM tabulardatawithstrings WHERE '
70
86
  query << "ReportName='AnnualBuildingUtilityPerformanceSummary' and "
@@ -98,12 +114,30 @@ module OsLib_QAQC
98
114
  return OpenStudio::Attribute.new('check', check_elems)
99
115
  end
100
116
 
101
- # test using new method
102
- if use_old_gem_code
103
- target_eui = @model.find_target_eui(target_standard)
104
- else
105
- std = Standard.build(target_standard)
106
- target_eui = std.model_find_target_eui(@model)
117
+ # check if all spaces types used the building type defined in the model (percentage calculation doesn't check if all area is inclued in building floor area)
118
+ if building_type != ''
119
+ primary_type_floor_area = 0.0
120
+ non_pri_area = 0.0
121
+ non_pri_types = []
122
+ @model.getSpaceTypes.each do |space_type|
123
+ st_bt = space_type.standardsBuildingType
124
+ if st_bt.is_initialized
125
+ st_bt = st_bt.get.to_s
126
+ if st_bt.include?("Office") then st_bt = "Office" end
127
+ if st_bt.to_s == building_type.to_s
128
+ primary_type_floor_area += space_type.floorArea
129
+ else
130
+ non_pri_area += space_type.floorArea
131
+ if !non_pri_types.include?(st_bt) then non_pri_types << st_bt end
132
+ end
133
+ else
134
+ non_pri_area += space_type.floorArea
135
+ if !non_pri_types.include?(st_bt) then non_pri_types << st_bt end
136
+ end
137
+ end
138
+ if non_pri_area > 0.0
139
+ check_elems << OpenStudio::Attribute.new('flag', "The primary building type, #{building_type}, only represents #{(100 * primary_type_floor_area / (primary_type_floor_area + non_pri_area)).round}% of the total building area. Other standads building types included are #{non_pri_types.sort.join(",")}. While a comparison to the #{building_type} prototype EUI is provided, it would not be unexpected for the building EUI to be significantly different than the prototype.")
140
+ end
107
141
  end
108
142
 
109
143
  # check model vs. target for user specified tolerance.
@@ -111,12 +145,16 @@ module OsLib_QAQC
111
145
  eui_ip_neat = OpenStudio.toNeatString(OpenStudio.convert(eui, source_units, target_units).get, 1, true)
112
146
  target_eui_ip_neat = OpenStudio.toNeatString(OpenStudio.convert(target_eui, source_units, target_units).get, 1, true)
113
147
  if eui < target_eui * (1.0 - min_pass)
114
- check_elems << OpenStudio::Attribute.new('flag', "Model EUI of #{eui_ip_neat} (#{target_units}) is less than #{min_pass * 100} % below the expected EUI of #{target_eui_ip_neat} (#{target_units}) for #{target_standard}.")
148
+ check_elems << OpenStudio::Attribute.new('flag', "Model EUI of #{eui_ip_neat} (#{target_units}) is more than #{min_pass * 100} % below the #{prototype_prefix} prototype EUI of #{target_eui_ip_neat} (#{target_units}).")
115
149
  elsif eui > target_eui * (1.0 + max_pass)
116
- check_elems << OpenStudio::Attribute.new('flag', "Model EUI of #{eui_ip_neat} (#{target_units}) is more than #{max_pass * 100} % above the expected EUI of #{target_eui_ip_neat} (#{target_units}) for #{target_standard}.")
150
+ check_elems << OpenStudio::Attribute.new('flag', "Model EUI of #{eui_ip_neat} (#{target_units}) is more than #{max_pass * 100} % above the #{prototype_prefix} prototype EUI of #{target_eui_ip_neat} (#{target_units}).")
117
151
  end
118
152
  else
119
- check_elems << OpenStudio::Attribute.new('flag', "Can't calculate target EUI. Make sure model has expected climate zone and building type.")
153
+ if ['90.1-2016','90.1-2019'].include?(target_standard) || target_standard.include?("ComStock")
154
+ check_elems << OpenStudio::Attribute.new('flag', "target EUI comparison is not supported yet for #{target_standard}.")
155
+ else
156
+ check_elems << OpenStudio::Attribute.new('flag', "Can't calculate target EUI. Make sure model has expected climate zone and building type.")
157
+ end
120
158
  end
121
159
  rescue StandardError => e
122
160
  # brief description of ruby error
@@ -42,38 +42,48 @@ module OsLib_QAQC
42
42
  check_elems = OpenStudio::AttributeVector.new
43
43
  check_elems << OpenStudio::Attribute.new('name', 'Internal Loads')
44
44
  check_elems << OpenStudio::Attribute.new('category', category)
45
- if target_standard == 'ICC IECC 2015'
46
- check_elems << OpenStudio::Attribute.new('description', 'Check internal loads against Table R405.5.2(1) in ICC IECC 2015 Residential Provisions.')
45
+
46
+ # update display sttandard
47
+ if target_standard.include?('90.1')
48
+ display_standard = "ASHRAE #{target_standard}"
47
49
  else
48
- if target_standard.include?('90.1')
49
- display_standard = "ASHRAE #{target_standard}"
50
- else
51
- display_standard = target_standard
52
- end
53
- check_elems << OpenStudio::Attribute.new('description', "Check LPD, ventilation rates, occupant density, plug loads, and equipment loads against #{display_standard} and DOE Prototype buildings.")
50
+ display_standard = target_standard
54
51
  end
55
52
 
56
53
  # stop here if only name is requested this is used to populate display name for arguments
57
54
  if name_only == true
58
55
  results = []
56
+ if target_standard == 'ICC IECC 2015'
57
+ check_elems << OpenStudio::Attribute.new('description', 'Check internal loads against Table R405.5.2(1) in ICC IECC 2015 Residential Provisions.')
58
+ else
59
+ check_elems << OpenStudio::Attribute.new('description', "Check LPD, ventilation rates, occupant density, plug loads, and equipment loads against #{display_standard} DOE Prototype buildings.")
60
+ end
59
61
  check_elems.each do |elem|
60
62
  results << elem.valueAsString
61
63
  end
62
64
  return results
63
65
  end
64
66
 
65
- # Versions of OpenStudio greater than 2.4.0 use a modified version of
66
- # openstudio-standards with different method calls. These methods
67
- # require a "Standard" object instead of the standard being passed into method calls.
68
- # This Standard object is used throughout the QAQC check.
69
- if OpenStudio::VersionString.new(OpenStudio.openStudioVersion) < OpenStudio::VersionString.new('2.4.3')
70
- use_old_gem_code = true
71
- else
72
- use_old_gem_code = false
67
+ begin
68
+
69
+ # setup standard
73
70
  std = Standard.build(target_standard)
74
- end
75
71
 
76
- begin
72
+ # gather building type for summary
73
+ bt_cz = std.model_get_building_climate_zone_and_building_type(@model)
74
+ building_type = bt_cz['building_type']
75
+ # mapping to obuilding type to match space types
76
+ if building_type.include?("Office") then building_type = "Office" end
77
+ climate_zone = bt_cz['climate_zone']
78
+ prototype_prefix = "#{display_standard} #{building_type} #{climate_zone}"
79
+ if target_standard == 'ICC IECC 2015'
80
+ check_elems << OpenStudio::Attribute.new('description', 'Check internal loads against Table R405.5.2(1) in ICC IECC 2015 Residential Provisions.')
81
+ else
82
+ check_elems << OpenStudio::Attribute.new('description', "Check LPD, ventilation rates, occupant density, plug loads, and equipment loads against #{prototype_prefix} DOE Prototype building.")
83
+ end
84
+ check_elems << OpenStudio::Attribute.new('min_pass', min_pass * 100)
85
+ check_elems << OpenStudio::Attribute.new('max_pass', max_pass * 100)
86
+
77
87
  if target_standard == 'ICC IECC 2015'
78
88
 
79
89
  num_people = 0.0
@@ -88,11 +98,7 @@ module OsLib_QAQC
88
98
  # lookup iecc internal loads for the building
89
99
  bedrooms_per_unit = 2.0 # assumption
90
100
  num_units = num_people / 2.5 # Avg 2.5 units per person.
91
- if use_old_gem_code
92
- target_loads_hash = @model.find_icc_iecc_2015_internal_loads(num_units, bedrooms_per_unit)
93
- else
94
- target_loads_hash = std.model_find_icc_iecc_2015_internal_loads(@model, num_units, bedrooms_per_unit)
95
- end
101
+ target_loads_hash = std.model_find_icc_iecc_2015_internal_loads(@model, num_units, bedrooms_per_unit)
96
102
 
97
103
  # get model internal gains for lights, elec equipment, and gas equipment
98
104
  model_internal_gains_si = 0.0
@@ -172,6 +178,9 @@ module OsLib_QAQC
172
178
 
173
179
  else
174
180
 
181
+ # gather all non statandard space types so can be listed in single flag
182
+ non_tagged_space_types = []
183
+
175
184
  # loop through all space types used in the model
176
185
  @model.getSpaceTypes.each do |space_type|
177
186
  next if space_type.floorArea <= 0
@@ -181,32 +190,21 @@ module OsLib_QAQC
181
190
  num_people = space_type.getNumberOfPeople(floor_area)
182
191
 
183
192
  # load in standard info for this space type
184
- if use_old_gem_code
185
- data = space_type.get_standards_data(target_standard)
186
- else
187
- data = std.space_type_get_standards_data(space_type)
188
- end
193
+ data = std.space_type_get_standards_data(space_type)
189
194
 
190
195
  if data.nil? || data.empty?
191
196
 
192
197
  # skip if all spaces using this space type are plenums
193
198
  all_spaces_plenums = true
194
199
  space_type.spaces.each do |space|
195
- if use_old_gem_code
196
- if !space.plenum?
197
- all_spaces_plenums = false
198
- next
199
- end
200
- else
201
- if !std.space_plenum?(space)
202
- all_spaces_plenums = false
203
- next
204
- end
200
+ if !std.space_plenum?(space)
201
+ all_spaces_plenums = false
202
+ next
205
203
  end
206
204
  end
207
205
 
208
206
  if !all_spaces_plenums
209
- check_elems << OpenStudio::Attribute.new('flag', "Unexpected standards type for #{space_type.name}, can't validate internal loads.")
207
+ non_tagged_space_types << space_type.floorArea
210
208
  end
211
209
 
212
210
  next
@@ -223,9 +221,9 @@ module OsLib_QAQC
223
221
  model_ip_neat = OpenStudio.toNeatString(model_ip, 2, true)
224
222
  target_ip_neat = OpenStudio.toNeatString(target_ip, 2, true)
225
223
  if model_ip < target_ip * (1.0 - min_pass)
226
- check_elems << OpenStudio::Attribute.new('flag', "#{load_type} of #{model_ip_neat} (#{target_units}) for #{space_type.name} is more than #{min_pass * 100} % below the expected value of #{target_ip_neat} (#{target_units}) for #{display_standard}.")
224
+ check_elems << OpenStudio::Attribute.new('flag', "#{load_type} of #{model_ip_neat} (#{target_units}) for #{space_type.name} is more than #{min_pass * 100} % below the value of #{target_ip_neat} (#{target_units}) for #{prototype_prefix} Prototype model.")
227
225
  elsif model_ip > target_ip * (1.0 + max_pass)
228
- check_elems << OpenStudio::Attribute.new('flag', "#{load_type} of #{model_ip_neat} (#{target_units}) for #{space_type.name} is more than #{max_pass * 100} % above the expected value of #{target_ip_neat} (#{target_units}) for #{display_standard}.")
226
+ check_elems << OpenStudio::Attribute.new('flag', "#{load_type} of #{model_ip_neat} (#{target_units}) for #{space_type.name} is more than #{max_pass * 100} % above the value of #{target_ip_neat} (#{target_units}) for #{prototype_prefix} Prototype model.")
229
227
  end
230
228
 
231
229
  # check electric equipment
@@ -239,9 +237,9 @@ module OsLib_QAQC
239
237
  model_ip_neat = OpenStudio.toNeatString(model_ip, 2, true)
240
238
  target_ip_neat = OpenStudio.toNeatString(target_ip, 2, true)
241
239
  if model_ip < target_ip * (1.0 - min_pass)
242
- check_elems << OpenStudio::Attribute.new('flag', "#{load_type} of #{model_ip_neat} (#{target_units}) for #{space_type.name} is more than #{min_pass * 100} % below the expected value of #{target_ip_neat} (#{target_units}) for #{display_standard}.")
240
+ check_elems << OpenStudio::Attribute.new('flag', "#{load_type} of #{model_ip_neat} (#{target_units}) for #{space_type.name} is more than #{min_pass * 100} % below the value of #{target_ip_neat} (#{target_units}) for #{prototype_prefix} Prototype model.")
243
241
  elsif model_ip > target_ip * (1.0 + max_pass)
244
- check_elems << OpenStudio::Attribute.new('flag', "#{load_type} of #{model_ip_neat} (#{target_units}) for #{space_type.name} is more than #{max_pass * 100} % above the expected value of #{target_ip_neat} (#{target_units}) for #{display_standard}.")
242
+ check_elems << OpenStudio::Attribute.new('flag', "#{load_type} of #{model_ip_neat} (#{target_units}) for #{space_type.name} is more than #{max_pass * 100} % above the value of #{target_ip_neat} (#{target_units}) for #{prototype_prefix} Prototype model.")
245
243
  end
246
244
 
247
245
  # check gas equipment
@@ -255,9 +253,9 @@ module OsLib_QAQC
255
253
  model_ip_neat = OpenStudio.toNeatString(model_ip, 2, true)
256
254
  target_ip_neat = OpenStudio.toNeatString(target_ip, 2, true)
257
255
  if model_ip < target_ip * (1.0 - min_pass)
258
- check_elems << OpenStudio::Attribute.new('flag', "#{load_type} of #{model_ip_neat} (#{target_units}) for #{space_type.name} is more than #{min_pass * 100} % below the expected value of #{target_ip_neat} (#{target_units}) for #{display_standard}.")
256
+ check_elems << OpenStudio::Attribute.new('flag', "#{load_type} of #{model_ip_neat} (#{target_units}) for #{space_type.name} is more than #{min_pass * 100} % below the value of #{target_ip_neat} (#{target_units}) for #{prototype_prefix} Prototype model.")
259
257
  elsif model_ip > target_ip * (1.0 + max_pass)
260
- check_elems << OpenStudio::Attribute.new('flag', "#{load_type} of #{model_ip_neat} (#{target_units}) for #{space_type.name} is more than #{max_pass * 100} % above the expected value of #{target_ip_neat} (#{target_units}) for #{display_standard}.")
258
+ check_elems << OpenStudio::Attribute.new('flag', "#{load_type} of #{model_ip_neat} (#{target_units}) for #{space_type.name} is more than #{max_pass * 100} % above the value of #{target_ip_neat} (#{target_units}) for #{prototype_prefix} Prototype model.")
261
259
  end
262
260
 
263
261
  # check people
@@ -273,9 +271,9 @@ module OsLib_QAQC
273
271
  # for people need to update target units just for display. Can't be used for converstion.
274
272
  target_units = 'People/1000 ft^2'
275
273
  if model_ip < target_ip * (1.0 - min_pass)
276
- check_elems << OpenStudio::Attribute.new('flag', "#{load_type} of #{model_ip_neat} (#{target_units}) for #{space_type.name} is more than #{min_pass * 100} % below the expected value of #{target_ip_neat} (#{target_units}) for #{display_standard}.")
274
+ check_elems << OpenStudio::Attribute.new('flag', "#{load_type} of #{model_ip_neat} (#{target_units}) for #{space_type.name} is more than #{min_pass * 100} % below the value of #{target_ip_neat} (#{target_units}) for #{prototype_prefix} Prototype model.")
277
275
  elsif model_ip > target_ip * (1.0 + max_pass)
278
- check_elems << OpenStudio::Attribute.new('flag', "#{load_type} of #{model_ip_neat} (#{target_units}) for #{space_type.name} is more than #{max_pass * 100} % above the expected value of #{target_ip_neat} (#{target_units}) for #{display_standard}.")
276
+ check_elems << OpenStudio::Attribute.new('flag', "#{load_type} of #{model_ip_neat} (#{target_units}) for #{space_type.name} is more than #{max_pass * 100} % above the value of #{target_ip_neat} (#{target_units}) for #{prototype_prefix} Prototype model.")
279
277
  end
280
278
 
281
279
  # get volume for space type for use with ventilation and infiltration
@@ -340,9 +338,9 @@ module OsLib_QAQC
340
338
  model_ip_neat = OpenStudio.toNeatString(OpenStudio.convert(oa_per_person, source_units, target_units).get, 2, true)
341
339
  target_ip_neat = OpenStudio.toNeatString(target_oa_per_person_ip, 2, true)
342
340
  if oa_per_person < target_oa_per_person_si * (1.0 - min_pass)
343
- check_elems << OpenStudio::Attribute.new('flag', "#{load_type} of #{model_ip_neat} (#{target_units}) for #{space_type.name} is more than #{min_pass * 100} % below the expected value of #{target_ip_neat} (#{target_units}) for #{display_standard}.")
341
+ check_elems << OpenStudio::Attribute.new('flag', "#{load_type} of #{model_ip_neat} (#{target_units}) for #{space_type.name} is more than #{min_pass * 100} % below the value of #{target_ip_neat} (#{target_units}) for #{prototype_prefix} Prototype model.")
344
342
  elsif oa_per_person > target_oa_per_person_si * (1.0 + max_pass)
345
- check_elems << OpenStudio::Attribute.new('flag', "#{load_type} of #{model_ip_neat} (#{target_units}) for #{space_type.name} is more than #{max_pass * 100} % above the expected value of #{target_ip_neat} (#{target_units}) for #{display_standard}.")
343
+ check_elems << OpenStudio::Attribute.new('flag', "#{load_type} of #{model_ip_neat} (#{target_units}) for #{space_type.name} is more than #{max_pass * 100} % above the value of #{target_ip_neat} (#{target_units}) for #{prototype_prefix} Prototype model.")
346
344
  end
347
345
 
348
346
  # check other oa
@@ -352,19 +350,22 @@ module OsLib_QAQC
352
350
  model_ip_neat = OpenStudio.toNeatString(OpenStudio.convert(oa_total, source_units, target_units).get, 2, true)
353
351
  target_ip_neat = OpenStudio.toNeatString(OpenStudio.convert(target_oa_total, source_units, target_units).get, 2, true)
354
352
  if oa_total < target_oa_total * (1.0 - min_pass)
355
- check_elems << OpenStudio::Attribute.new('flag', "#{load_type} of #{model_ip_neat} (#{target_units}) for #{space_type.name} is more than #{min_pass * 100} % below the expected value of #{target_ip_neat} (#{target_units}) for #{display_standard}.")
353
+ check_elems << OpenStudio::Attribute.new('flag', "#{load_type} of #{model_ip_neat} (#{target_units}) for #{space_type.name} is more than #{min_pass * 100} % below the value of #{target_ip_neat} (#{target_units}) for #{prototype_prefix} Prototype model.")
356
354
  elsif oa_total > target_oa_total * (1.0 + max_pass)
357
- check_elems << OpenStudio::Attribute.new('flag', "#{load_type} of #{model_ip_neat} (#{target_units}) for #{space_type.name} is more than #{max_pass * 100} % above the expected value of #{target_ip_neat} (#{target_units}) for #{display_standard}.")
355
+ check_elems << OpenStudio::Attribute.new('flag', "#{load_type} of #{model_ip_neat} (#{target_units}) for #{space_type.name} is more than #{max_pass * 100} % above the value of #{target_ip_neat} (#{target_units}) for #{prototype_prefix} Prototype model.")
358
356
  end
359
357
  end
360
358
 
359
+ # report about non standard space types
360
+ if non_tagged_space_types.size > 0
361
+ impacted_floor_area = non_tagged_space_types.sum
362
+ building_area = @model.getBuilding.floorArea
363
+ check_elems << OpenStudio::Attribute.new('flag', "Unexpected standard building/space types found for #{non_tagged_space_types.size} space types covering #{(100.0 * impacted_floor_area/building_area).round}% of floor area, can't provide comparisons for internal loads for those space types.")
364
+ end
365
+
361
366
  # warn if there are spaces in model that don't use space type unless they appear to be plenums
362
367
  @model.getSpaces.each do |space|
363
- if use_old_gem_code
364
- next if space.plenum?
365
- else
366
- next if std.space_plenum?(space)
367
- end
368
+ next if std.space_plenum?(space)
368
369
 
369
370
  if !space.spaceType.is_initialized
370
371
  check_elems << OpenStudio::Attribute.new('flag', "#{space.name} doesn't have a space type assigned, can't validate internal loads.")
@@ -43,11 +43,14 @@ module OsLib_QAQC
43
43
  check_elems << OpenStudio::Attribute.new('name', 'Mechanical System Capacity')
44
44
  check_elems << OpenStudio::Attribute.new('category', category)
45
45
  check_elems << OpenStudio::Attribute.new('description', 'Check HVAC capacity against ASHRAE rules of thumb for chiller max flow rate, air loop max flow rate, air loop cooling capciaty, and zone heating capcaity. Zone heating check will skip thermal zones without any exterior exposure, and thermal zones that are not conditioned.')
46
-
46
+ check_elems << OpenStudio::Attribute.new('min_pass', "Var")
47
+ check_elems << OpenStudio::Attribute.new('max_pass', "Var")
48
+
47
49
  # stop here if only name is requested this is used to populate display name for arguments
48
50
  if name_only == true
49
51
  results = []
50
52
  check_elems.each do |elem|
53
+ next if ['Double','Integer'].include? (elem.valueType.valueDescription)
51
54
  results << elem.valueAsString
52
55
  end
53
56
  return results
@@ -44,7 +44,9 @@ module OsLib_QAQC
44
44
  check_elems = OpenStudio::AttributeVector.new
45
45
  check_elems << OpenStudio::Attribute.new('name', 'Mechanical System Efficiency')
46
46
  check_elems << OpenStudio::Attribute.new('category', category)
47
-
47
+ check_elems << OpenStudio::Attribute.new('min_pass', min_pass * 100)
48
+ check_elems << OpenStudio::Attribute.new('max_pass', max_pass * 100)
49
+
48
50
  if target_standard.include?('90.1-2013')
49
51
  display_standard = "ASHRAE #{target_standard}"
50
52
  check_elems << OpenStudio::Attribute.new('description', "Check against #{display_standard} Tables 6.8.1 A-K for the following component types: #{component_type_array.join(', ')}.")
@@ -62,6 +64,7 @@ module OsLib_QAQC
62
64
  if name_only == true
63
65
  results = []
64
66
  check_elems.each do |elem|
67
+ next if ['Double','Integer'].include? (elem.valueType.valueDescription)
65
68
  results << elem.valueAsString
66
69
  end
67
70
  return results
@@ -96,9 +99,9 @@ module OsLib_QAQC
96
99
  if standard_minimum_full_load_efficiency.nil?
97
100
  check_elems << OpenStudio::Attribute.new('flag', "Can't find target full load efficiency for #{component.name}.")
98
101
  elsif reference_COP < standard_minimum_full_load_efficiency * (1.0 - min_pass)
99
- check_elems << OpenStudio::Attribute.new('flag', "COP of #{reference_COP.round(2)} for #{component.name} is more than #{min_pass * 100} % below the expected value of #{standard_minimum_full_load_efficiency.round(2)}.")
102
+ check_elems << OpenStudio::Attribute.new('flag', "COP of #{reference_COP.round(2)} for #{component.name} is more than #{min_pass * 100} % below the value of #{standard_minimum_full_load_efficiency.round(2)}.")
100
103
  elsif reference_COP > standard_minimum_full_load_efficiency * (1.0 + max_pass)
101
- check_elems << OpenStudio::Attribute.new('flag', "COP of #{reference_COP.round(2)} for #{component.name} is more than #{max_pass * 100} % above the expected value of #{standard_minimum_full_load_efficiency.round(2)}.")
104
+ check_elems << OpenStudio::Attribute.new('flag', "COP of #{reference_COP.round(2)} for #{component.name} is more than #{max_pass * 100} % above the value of #{standard_minimum_full_load_efficiency.round(2)}.")
102
105
  end
103
106
  end
104
107
 
@@ -118,9 +121,9 @@ module OsLib_QAQC
118
121
  if standard_minimum_cop.nil?
119
122
  check_elems << OpenStudio::Attribute.new('flag', "Can't find target COP for #{component.name}.")
120
123
  elsif rated_COP < standard_minimum_cop * (1.0 - min_pass)
121
- check_elems << OpenStudio::Attribute.new('flag', "The COP of #{rated_COP.round(2)} for #{component.name} is more than #{min_pass * 100} % below the expected value of #{standard_minimum_cop.round(2)} for #{display_standard}.")
124
+ check_elems << OpenStudio::Attribute.new('flag', "The COP of #{rated_COP.round(2)} for #{component.name} is more than #{min_pass * 100} % below the value of #{standard_minimum_cop.round(2)} for #{display_standard}.")
122
125
  elsif rated_COP > standard_minimum_cop * (1.0 + max_pass)
123
- check_elems << OpenStudio::Attribute.new('flag', "The COP of #{rated_COP.round(2)} for #{component.name} is more than #{max_pass * 100} % above the expected value of #{standard_minimum_cop.round(2)} for #{display_standard}.")
126
+ check_elems << OpenStudio::Attribute.new('flag', "The COP of #{rated_COP.round(2)} for #{component.name} is more than #{max_pass * 100} % above the value of #{standard_minimum_cop.round(2)} for #{display_standard}.")
124
127
  end
125
128
  end
126
129
 
@@ -141,16 +144,16 @@ module OsLib_QAQC
141
144
  if standard_minimum_cop.nil?
142
145
  check_elems << OpenStudio::Attribute.new('flag', "Can't find target COP for #{component.name}.")
143
146
  elsif rated_high_speed_COP < standard_minimum_cop * (1.0 - min_pass)
144
- check_elems << OpenStudio::Attribute.new('flag', "The high speed COP of #{rated_high_speed_COP.round(2)} for #{component.name} is more than #{min_pass * 100} % below the expected value of #{standard_minimum_cop.round(2)} for #{display_standard}.")
147
+ check_elems << OpenStudio::Attribute.new('flag', "The high speed COP of #{rated_high_speed_COP.round(2)} for #{component.name} is more than #{min_pass * 100} % below the value of #{standard_minimum_cop.round(2)} for #{display_standard}.")
145
148
  elsif rated_high_speed_COP > standard_minimum_cop * (1.0 + max_pass)
146
- check_elems << OpenStudio::Attribute.new('flag', "The high speed COP of #{rated_high_speed_COP.round(2)} for #{component.name} is more than #{max_pass * 100} % above the expected value of #{standard_minimum_cop.round(2)} for #{display_standard}.")
149
+ check_elems << OpenStudio::Attribute.new('flag', "The high speed COP of #{rated_high_speed_COP.round(2)} for #{component.name} is more than #{max_pass * 100} % above the value of #{standard_minimum_cop.round(2)} for #{display_standard}.")
147
150
  end
148
151
  if standard_minimum_cop.nil?
149
152
  check_elems << OpenStudio::Attribute.new('flag', "Can't find target COP for #{component.name}.")
150
153
  elsif rated_low_speed_COP < standard_minimum_cop * (1.0 - min_pass)
151
- check_elems << OpenStudio::Attribute.new('flag', "The low speed COP of #{rated_low_speed_COP.round(2)} for #{component.name} is more than #{min_pass * 100} % below the expected value of #{standard_minimum_cop.round(2)} for #{display_standard}.")
154
+ check_elems << OpenStudio::Attribute.new('flag', "The low speed COP of #{rated_low_speed_COP.round(2)} for #{component.name} is more than #{min_pass * 100} % below the value of #{standard_minimum_cop.round(2)} for #{display_standard}.")
152
155
  elsif rated_low_speed_COP > standard_minimum_cop * (1.0 + max_pass)
153
- check_elems << OpenStudio::Attribute.new('flag', "The low speed COP of #{rated_low_speed_COP.round(2)} for #{component.name} is more than #{max_pass * 100} % above the expected value of #{standard_minimum_cop.round(2)} for #{display_standard}.")
156
+ check_elems << OpenStudio::Attribute.new('flag', "The low speed COP of #{rated_low_speed_COP.round(2)} for #{component.name} is more than #{max_pass * 100} % above the value of #{standard_minimum_cop.round(2)} for #{display_standard}.")
154
157
  end
155
158
  end
156
159
 
@@ -171,9 +174,9 @@ module OsLib_QAQC
171
174
  if standard_minimum_cop.nil?
172
175
  check_elems << OpenStudio::Attribute.new('flag', "Can't find target COP for #{component.name}.")
173
176
  elsif rated_COP < standard_minimum_cop * (1.0 - min_pass)
174
- check_elems << OpenStudio::Attribute.new('flag', "The COP of #{rated_COP.round(2)} for #{component.name} is more than #{min_pass * 100} % below the expected value of #{standard_minimum_cop.round(2)} for #{display_standard}.")
177
+ check_elems << OpenStudio::Attribute.new('flag', "The COP of #{rated_COP.round(2)} for #{component.name} is more than #{min_pass * 100} % below the value of #{standard_minimum_cop.round(2)} for #{display_standard}.")
175
178
  elsif rated_COP > standard_minimum_cop * (1.0 + max_pass)
176
- check_elems << OpenStudio::Attribute.new('flag', "The COP of #{rated_COP.round(2)} for #{component.name} is more than #{max_pass * 100} % above the expected value of #{standard_minimum_cop.round(2)}. for #{display_standard}")
179
+ check_elems << OpenStudio::Attribute.new('flag', "The COP of #{rated_COP.round(2)} for #{component.name} is more than #{max_pass * 100} % above the value of #{standard_minimum_cop.round(2)}. for #{display_standard}")
177
180
  end
178
181
  end
179
182
 
@@ -190,12 +193,14 @@ module OsLib_QAQC
190
193
  end
191
194
 
192
195
  # check actual against target
193
- if standard_minimum_thermal_efficiency.nil?
196
+ if component.autosizedNominalCapacity.get == 0
197
+ check_elems << OpenStudio::Attribute.new('flag', "Boiler named #{component.name} has a capacity of 0.")
198
+ elsif standard_minimum_thermal_efficiency.nil?
194
199
  check_elems << OpenStudio::Attribute.new('flag', "Can't find target thermal efficiency for #{component.name}.")
195
200
  elsif nominal_thermal_efficiency < standard_minimum_thermal_efficiency * (1.0 - min_pass)
196
- check_elems << OpenStudio::Attribute.new('flag', "Nominal thermal efficiency of #{nominal_thermal_efficiency.round(2)} for #{component.name} is more than #{min_pass * 100} % below the expected value of #{standard_minimum_thermal_efficiency.round(2)} for #{display_standard}.")
201
+ check_elems << OpenStudio::Attribute.new('flag', "Nominal thermal efficiency of #{nominal_thermal_efficiency.round(2)} for #{component.name} is more than #{min_pass * 100} % below the value of #{standard_minimum_thermal_efficiency.round(2)} for #{display_standard}.")
197
202
  elsif nominal_thermal_efficiency > standard_minimum_thermal_efficiency * (1.0 + max_pass)
198
- check_elems << OpenStudio::Attribute.new('flag', "Nominal thermal efficiency of #{nominal_thermal_efficiency.round(2)} for #{component.name} is more than #{max_pass * 100} % above the expected value of #{standard_minimum_thermal_efficiency.round(2)} for #{display_standard}.")
203
+ check_elems << OpenStudio::Attribute.new('flag', "Nominal thermal efficiency of #{nominal_thermal_efficiency.round(2)} for #{component.name} is more than #{max_pass * 100} % above the value of #{standard_minimum_thermal_efficiency.round(2)} for #{display_standard}.")
199
204
  end
200
205
  end
201
206
 
@@ -219,9 +224,9 @@ module OsLib_QAQC
219
224
 
220
225
  # check actual against target
221
226
  if motor_eff < standard_minimum_motor_efficiency_and_size * (1.0 - min_pass)
222
- check_elems << OpenStudio::Attribute.new('flag', "Motor efficiency of #{motor_eff.round(2)} for #{component.name} is more than #{min_pass * 100} % below the expected value of #{standard_minimum_motor_efficiency_and_size.round(2)} for #{display_standard}.")
227
+ check_elems << OpenStudio::Attribute.new('flag', "Motor efficiency of #{motor_eff.round(2)} for #{component.name} is more than #{min_pass * 100} % below the value of #{standard_minimum_motor_efficiency_and_size.round(2)} for #{display_standard}.")
223
228
  elsif motor_eff > standard_minimum_motor_efficiency_and_size * (1.0 + max_pass)
224
- check_elems << OpenStudio::Attribute.new('flag', "Motor efficiency of #{motor_eff.round(2)} for #{component.name} is more than #{max_pass * 100} % above the expected value of #{standard_minimum_motor_efficiency_and_size.round(2)} for #{display_standard}.")
229
+ check_elems << OpenStudio::Attribute.new('flag', "Motor efficiency of #{motor_eff.round(2)} for #{component.name} is more than #{max_pass * 100} % above the value of #{standard_minimum_motor_efficiency_and_size.round(2)} for #{display_standard}.")
225
230
  end
226
231
  end
227
232
 
@@ -244,9 +249,9 @@ module OsLib_QAQC
244
249
 
245
250
  # check actual against target
246
251
  if motor_eff < standard_minimum_motor_efficiency_and_size * (1.0 - min_pass)
247
- check_elems << OpenStudio::Attribute.new('flag', "Motor efficiency of #{motor_eff.round(2)} for #{component.name} is more than #{min_pass * 100} % below the expected value of #{standard_minimum_motor_efficiency_and_size.round(2)} for #{display_standard}.")
252
+ check_elems << OpenStudio::Attribute.new('flag', "Motor efficiency of #{motor_eff.round(2)} for #{component.name} is more than #{min_pass * 100} % below the value of #{standard_minimum_motor_efficiency_and_size.round(2)} for #{display_standard}.")
248
253
  elsif motor_eff > standard_minimum_motor_efficiency_and_size * (1.0 + max_pass)
249
- check_elems << OpenStudio::Attribute.new('flag', "Motor efficiency of #{motor_eff.round(2)} for #{component.name} is more than #{max_pass * 100} % above the expected value of #{standard_minimum_motor_efficiency_and_size.round(2)} for #{display_standard}.")
254
+ check_elems << OpenStudio::Attribute.new('flag', "Motor efficiency of #{motor_eff.round(2)} for #{component.name} is more than #{max_pass * 100} % above the value of #{standard_minimum_motor_efficiency_and_size.round(2)} for #{display_standard}.")
250
255
  end
251
256
  end
252
257
 
@@ -270,9 +275,9 @@ module OsLib_QAQC
270
275
 
271
276
  # check actual against target
272
277
  if motor_eff < standard_minimum_motor_efficiency_and_size * (1.0 - min_pass)
273
- check_elems << OpenStudio::Attribute.new('flag', "Motor efficiency of #{motor_eff.round(2)} for #{component.name} is more than #{min_pass * 100} % below the expected value of #{standard_minimum_motor_efficiency_and_size.round(2)} for #{display_standard}.")
278
+ check_elems << OpenStudio::Attribute.new('flag', "Motor efficiency of #{motor_eff.round(2)} for #{component.name} is more than #{min_pass * 100} % below the value of #{standard_minimum_motor_efficiency_and_size.round(2)} for #{display_standard}.")
274
279
  elsif motor_eff > standard_minimum_motor_efficiency_and_size * (1.0 + max_pass)
275
- check_elems << OpenStudio::Attribute.new('flag', "Motor efficiency of #{motor_eff.round(2)} for #{component.name} is more than #{max_pass * 100} % above the expected value of #{standard_minimum_motor_efficiency_and_size.round(2)} for #{display_standard}.")
280
+ check_elems << OpenStudio::Attribute.new('flag', "Motor efficiency of #{motor_eff.round(2)} for #{component.name} is more than #{max_pass * 100} % above the value of #{standard_minimum_motor_efficiency_and_size.round(2)} for #{display_standard}.")
276
281
  end
277
282
  end
278
283
 
@@ -296,9 +301,9 @@ module OsLib_QAQC
296
301
 
297
302
  # check actual against target
298
303
  if motor_eff < standard_minimum_motor_efficiency_and_size * (1.0 - min_pass)
299
- check_elems << OpenStudio::Attribute.new('flag', "Motor efficiency of #{motor_eff.round(2)} for #{component.name} is more than #{min_pass * 100} % below the expected value of #{standard_minimum_motor_efficiency_and_size.round(2)} for #{display_standard}.")
304
+ check_elems << OpenStudio::Attribute.new('flag', "Motor efficiency of #{motor_eff.round(2)} for #{component.name} is more than #{min_pass * 100} % below the value of #{standard_minimum_motor_efficiency_and_size.round(2)} for #{display_standard}.")
300
305
  elsif motor_eff > standard_minimum_motor_efficiency_and_size * (1.0 + max_pass)
301
- check_elems << OpenStudio::Attribute.new('flag', "Motor efficiency of #{motor_eff.round(2)} for #{component.name} is more than #{max_pass * 100} % above the expected value of #{standard_minimum_motor_efficiency_and_size.round(2)} for #{display_standard}.")
306
+ check_elems << OpenStudio::Attribute.new('flag', "Motor efficiency of #{motor_eff.round(2)} for #{component.name} is more than #{max_pass * 100} % above the value of #{standard_minimum_motor_efficiency_and_size.round(2)} for #{display_standard}.")
302
307
  end
303
308
  end
304
309