openstudio-standards 0.8.2 → 0.8.4

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.
Files changed (152) hide show
  1. checksums.yaml +4 -4
  2. data/data/standards/OpenStudio_Standards-ashrae_90_1-ALL-comstock(space_types).xlsx +0 -0
  3. data/data/standards/openstudio_standards_duplicates_log.csv +7962 -0
  4. data/lib/openstudio-standards/btap/costing/README.md +502 -0
  5. data/lib/openstudio-standards/btap/costing/btap_costing.rb +473 -0
  6. data/lib/openstudio-standards/btap/costing/btap_measure_helper.rb +359 -0
  7. data/lib/openstudio-standards/btap/costing/btap_workflow.rb +117 -0
  8. data/lib/openstudio-standards/btap/costing/common_paths.rb +78 -0
  9. data/lib/openstudio-standards/btap/costing/common_resources/ConstructionProperties.csv +52 -0
  10. data/lib/openstudio-standards/btap/costing/common_resources/Constructions.csv +37 -0
  11. data/lib/openstudio-standards/btap/costing/common_resources/construction_sets.csv +1270 -0
  12. data/lib/openstudio-standards/btap/costing/common_resources/constructions_glazing.csv +61 -0
  13. data/lib/openstudio-standards/btap/costing/common_resources/constructions_opaque.csv +2256 -0
  14. data/lib/openstudio-standards/btap/costing/common_resources/costs.csv +1904 -0
  15. data/lib/openstudio-standards/btap/costing/common_resources/costs_local_factors.csv +2315 -0
  16. data/lib/openstudio-standards/btap/costing/common_resources/hvac_vent_ahu.csv +925 -0
  17. data/lib/openstudio-standards/btap/costing/common_resources/lighting.csv +364 -0
  18. data/lib/openstudio-standards/btap/costing/common_resources/lighting_sets.csv +2667 -0
  19. data/lib/openstudio-standards/btap/costing/common_resources/locations.csv +75 -0
  20. data/lib/openstudio-standards/btap/costing/common_resources/materials_glazing.csv +35 -0
  21. data/lib/openstudio-standards/btap/costing/common_resources/materials_hvac.csv +1699 -0
  22. data/lib/openstudio-standards/btap/costing/common_resources/materials_lighting.csv +267 -0
  23. data/lib/openstudio-standards/btap/costing/common_resources/materials_opaque.csv +164 -0
  24. data/lib/openstudio-standards/btap/costing/copy_test_results_files_to_expected_results.rb +11 -0
  25. data/lib/openstudio-standards/btap/costing/cost_building_from_file.rb +136 -0
  26. data/lib/openstudio-standards/btap/costing/costing_database_wrapper.rb +177 -0
  27. data/lib/openstudio-standards/btap/costing/daylighting_sensor_control_costing.rb +353 -0
  28. data/lib/openstudio-standards/btap/costing/dcv_costing.rb +314 -0
  29. data/lib/openstudio-standards/btap/costing/dummy.epw +8768 -0
  30. data/lib/openstudio-standards/btap/costing/dummy.osm +5320 -0
  31. data/lib/openstudio-standards/btap/costing/envelope_costing.rb +284 -0
  32. data/lib/openstudio-standards/btap/costing/heating_cooling_costing.rb +2584 -0
  33. data/lib/openstudio-standards/btap/costing/led_lighting_costing.rb +155 -0
  34. data/lib/openstudio-standards/btap/costing/lighting_costing.rb +209 -0
  35. data/lib/openstudio-standards/btap/costing/mech_sizing.json +502 -0
  36. data/lib/openstudio-standards/btap/costing/neb_end_use_prices.csv +42 -0
  37. data/lib/openstudio-standards/btap/costing/necb_2011_spacetype_info.csv +225 -0
  38. data/lib/openstudio-standards/btap/costing/necb_reference_runs.csv +28705 -0
  39. data/lib/openstudio-standards/btap/costing/nv_costing.rb +547 -0
  40. data/lib/openstudio-standards/btap/costing/parallel_tests.rb +92 -0
  41. data/lib/openstudio-standards/btap/costing/pv_ground_costing.rb +687 -0
  42. data/lib/openstudio-standards/btap/costing/shw_costing.rb +705 -0
  43. data/lib/openstudio-standards/btap/costing/test_list.txt +17 -0
  44. data/lib/openstudio-standards/btap/costing/test_run_all_test_locally.rb +26 -0
  45. data/lib/openstudio-standards/btap/costing/test_run_costing_tests.rb +80 -0
  46. data/lib/openstudio-standards/btap/costing/ventilation_costing.rb +2616 -0
  47. data/lib/openstudio-standards/constructions/modify.rb +2 -1
  48. data/lib/openstudio-standards/refrigeration/create_case.rb +58 -21
  49. data/lib/openstudio-standards/refrigeration/create_typical_refrigeration.rb +4 -2
  50. data/lib/openstudio-standards/refrigeration/create_walkin.rb +57 -22
  51. data/lib/openstudio-standards/refrigeration/data/refrigerated_cases.csv +31 -31
  52. data/lib/openstudio-standards/refrigeration/data/refrigerated_walkins.csv +76 -76
  53. data/lib/openstudio-standards/service_water_heating/create_typical.rb +10 -10
  54. data/lib/openstudio-standards/service_water_heating/create_water_heater.rb +10 -0
  55. data/lib/openstudio-standards/service_water_heating/create_water_heating_loop.rb +16 -3
  56. data/lib/openstudio-standards/service_water_heating/data/convert_data.rb +9 -9
  57. data/lib/openstudio-standards/service_water_heating/data/typical_water_use_equipment.csv +49 -49
  58. data/lib/openstudio-standards/service_water_heating/data/typical_water_use_equipment.json +159 -159
  59. data/lib/openstudio-standards/standards/Standards.CoilCoolingDXMultiSpeed.rb +7 -18
  60. data/lib/openstudio-standards/standards/Standards.CoilCoolingDXSingleSpeed.rb +10 -20
  61. data/lib/openstudio-standards/standards/Standards.CoilCoolingDXTwoSpeed.rb +6 -15
  62. data/lib/openstudio-standards/standards/Standards.CoilCoolingWaterToAirHeatPumpEquationFit.rb +5 -6
  63. data/lib/openstudio-standards/standards/Standards.CoilDX.rb +93 -43
  64. data/lib/openstudio-standards/standards/Standards.CoilHeatingDXMultiSpeed.rb +5 -5
  65. data/lib/openstudio-standards/standards/Standards.CoilHeatingDXSingleSpeed.rb +135 -37
  66. data/lib/openstudio-standards/standards/Standards.CoilHeatingWaterToAirHeatPumpEquationFit.rb +2 -2
  67. data/lib/openstudio-standards/standards/Standards.Model.rb +48 -13
  68. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2004/data/ashrae_90_1_2004.computer_room_acs.json +302 -140
  69. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2004/data/ashrae_90_1_2004.heat_pumps.json +648 -326
  70. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2004/data/ashrae_90_1_2004.heat_pumps_heating.json +371 -90
  71. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2004/data/ashrae_90_1_2004.water_heaters.json +66 -22
  72. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2007/data/ashrae_90_1_2007.computer_room_acs.json +302 -140
  73. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2007/data/ashrae_90_1_2007.heat_pumps.json +1012 -296
  74. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2007/data/ashrae_90_1_2007.heat_pumps_heating.json +443 -79
  75. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2007/data/ashrae_90_1_2007.water_heaters.json +66 -22
  76. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2010/data/ashrae_90_1_2010.computer_room_acs.json +302 -140
  77. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2010/data/ashrae_90_1_2010.heat_pumps.json +672 -306
  78. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2010/data/ashrae_90_1_2010.heat_pumps_heating.json +354 -74
  79. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2010/data/ashrae_90_1_2010.water_heaters.json +72 -24
  80. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2013/data/ashrae_90_1_2013.computer_room_acs.json +302 -140
  81. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2013/data/ashrae_90_1_2013.energy_recovery.json +8 -8
  82. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2013/data/ashrae_90_1_2013.heat_pumps.json +930 -604
  83. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2013/data/ashrae_90_1_2013.heat_pumps_heating.json +415 -111
  84. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2013/data/ashrae_90_1_2013.water_heaters.json +72 -24
  85. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2016/data/ashrae_90_1_2016.computer_room_acs.json +602 -140
  86. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2016/data/ashrae_90_1_2016.heat_pumps.json +1005 -333
  87. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2016/data/ashrae_90_1_2016.heat_pumps_heating.json +642 -88
  88. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2016/data/ashrae_90_1_2016.water_heaters.json +78 -26
  89. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2019/data/ashrae_90_1_2019.computer_room_acs.json +722 -140
  90. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2019/data/ashrae_90_1_2019.heat_pumps.json +1741 -426
  91. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2019/data/ashrae_90_1_2019.heat_pumps_heating.json +1108 -111
  92. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2019/data/ashrae_90_1_2019.water_heaters.json +186 -62
  93. data/lib/openstudio-standards/standards/ashrae_90_1/data/ashrae_90_1.schedules.json +62 -232
  94. data/lib/openstudio-standards/standards/ashrae_90_1_prm/ashrae_90_1_prm.CoilCoolingDXSingleSpeed.rb +2 -3
  95. data/lib/openstudio-standards/standards/ashrae_90_1_prm/ashrae_90_1_prm.CoilCoolingDXTwoSpeed.rb +1 -1
  96. data/lib/openstudio-standards/standards/ashrae_90_1_prm/ashrae_90_1_prm.CoilDX.rb +7 -18
  97. data/lib/openstudio-standards/standards/ashrae_90_1_prm/ashrae_90_1_prm.CoilHeatingDXSingleSpeed.rb +9 -7
  98. data/lib/openstudio-standards/standards/ashrae_90_1_prm/ashrae_90_1_prm.CoilHeatingGas.rb +1 -1
  99. data/lib/openstudio-standards/standards/ashrae_90_1_prm/ashrae_90_1_prm.Model.rb +2 -2
  100. data/lib/openstudio-standards/standards/ashrae_90_1_prm/ashrae_90_1_prm_2019/data/ashrae_90_1_prm_2019.heat_pumps.json +154 -69
  101. data/lib/openstudio-standards/standards/ashrae_90_1_prm/ashrae_90_1_prm_2019/data/ashrae_90_1_prm_2019.heat_pumps_heating.json +72 -72
  102. data/lib/openstudio-standards/standards/ashrae_90_1_prm/ashrae_90_1_prm_2019/data/ashrae_90_1_prm_2019.water_heaters.json +382 -295
  103. data/lib/openstudio-standards/standards/ashrae_90_1_prm/userdata_csv/ashrae_90_1_prm.UserData.rb +6 -1
  104. data/lib/openstudio-standards/standards/deer/data/deer.schedules.json +62 -232
  105. data/lib/openstudio-standards/standards/necb/BTAPPRE1980/btap_pre1980.rb +2 -27
  106. data/lib/openstudio-standards/standards/necb/BTAPPRE1980/data/heat_pumps.json +16 -0
  107. data/lib/openstudio-standards/standards/necb/BTAPPRE1980/data/heat_pumps_heating.json +6 -0
  108. data/lib/openstudio-standards/standards/necb/BTAPPRE1980/hvac_system_3_and_8_single_speed.rb +68 -27
  109. data/lib/openstudio-standards/standards/necb/BTAPPRE1980/hvac_system_4.rb +64 -25
  110. data/lib/openstudio-standards/standards/necb/BTAPPRE1980/hvac_system_6.rb +9 -14
  111. data/lib/openstudio-standards/standards/necb/ECMS/hvac_systems.rb +46 -20
  112. data/lib/openstudio-standards/standards/necb/NECB2011/autozone.rb +635 -248
  113. data/lib/openstudio-standards/standards/necb/NECB2011/data/constants.json +43 -7
  114. data/lib/openstudio-standards/standards/necb/NECB2011/data/fuel_type_sets.json +7 -1
  115. data/lib/openstudio-standards/standards/necb/NECB2011/data/geometry/HighriseApartmentMult.osm +14272 -0
  116. data/lib/openstudio-standards/standards/necb/NECB2011/data/heat_pumps.json +16 -0
  117. data/lib/openstudio-standards/standards/necb/NECB2011/data/heat_pumps_heating.json +6 -0
  118. data/lib/openstudio-standards/standards/necb/NECB2011/data/necb_2015_table_c1.json +1 -1
  119. data/lib/openstudio-standards/standards/necb/NECB2011/data/space_types.json +437 -437
  120. data/lib/openstudio-standards/standards/necb/NECB2011/data/systems.json +516 -0
  121. data/lib/openstudio-standards/standards/necb/NECB2011/data/systems_including_sys5.json +588 -0
  122. data/lib/openstudio-standards/standards/necb/NECB2011/hvac_namer.rb +489 -0
  123. data/lib/openstudio-standards/standards/necb/NECB2011/hvac_system_1_single_speed.rb +16 -6
  124. data/lib/openstudio-standards/standards/necb/NECB2011/hvac_system_2_and_5.rb +48 -5
  125. data/lib/openstudio-standards/standards/necb/NECB2011/hvac_system_3_and_8_multi_speed.rb +2 -2
  126. data/lib/openstudio-standards/standards/necb/NECB2011/hvac_system_3_and_8_single_speed.rb +35 -27
  127. data/lib/openstudio-standards/standards/necb/NECB2011/hvac_system_4.rb +34 -23
  128. data/lib/openstudio-standards/standards/necb/NECB2011/hvac_system_6.rb +8 -6
  129. data/lib/openstudio-standards/standards/necb/NECB2011/hvac_systems.rb +43 -14
  130. data/lib/openstudio-standards/standards/necb/NECB2011/necb_2011.rb +214 -25
  131. data/lib/openstudio-standards/standards/necb/NECB2011/system_fuels.rb +61 -1
  132. data/lib/openstudio-standards/standards/necb/NECB2015/data/heat_pumps.json +16 -0
  133. data/lib/openstudio-standards/standards/necb/NECB2015/data/heat_pumps_heating.json +8 -0
  134. data/lib/openstudio-standards/standards/necb/NECB2015/data/space_types.json +636 -636
  135. data/lib/openstudio-standards/standards/necb/NECB2015/data/unitary_acs.json +38 -38
  136. data/lib/openstudio-standards/standards/necb/NECB2015/hvac_systems.rb +15 -6
  137. data/lib/openstudio-standards/standards/necb/NECB2017/data/space_types.json +636 -636
  138. data/lib/openstudio-standards/standards/necb/NECB2020/data/chillers.json +71 -71
  139. data/lib/openstudio-standards/standards/necb/NECB2020/data/heat_pumps.json +20 -0
  140. data/lib/openstudio-standards/standards/necb/NECB2020/data/heat_pumps_heating.json +10 -0
  141. data/lib/openstudio-standards/standards/necb/README.md +343 -0
  142. data/lib/openstudio-standards/standards/necb/common/btap_data.rb +190 -28
  143. data/lib/openstudio-standards/standards/necb/common/btap_datapoint.rb +14 -5
  144. data/lib/openstudio-standards/standards/necb/common/eccc_electric_grid_intensity_20250311.csv +14 -0
  145. data/lib/openstudio-standards/standards/necb/common/nir_gas_grid_intensity_20250311.csv +14 -0
  146. data/lib/openstudio-standards/standards/necb/common/system_types.yaml +0 -0
  147. data/lib/openstudio-standards/utilities/logging.rb +18 -14
  148. data/lib/openstudio-standards/utilities/simulation.rb +3 -2
  149. data/lib/openstudio-standards/version.rb +1 -1
  150. data/lib/openstudio-standards/weather/modify.rb +2 -2
  151. data/lib/openstudio-standards.rb +12 -0
  152. metadata +56 -3
@@ -0,0 +1,359 @@
1
+ module BTAPMeasureHelper
2
+ ###################Helper functions
3
+
4
+ # define the arguments that the user will input
5
+ def arguments(model)
6
+ args = OpenStudio::Measure::OSArgumentVector.new
7
+
8
+ if true == @use_json_package
9
+ #Set up package version of input.
10
+ json_default = {}
11
+ @measure_interface_detailed.each do |argument|
12
+ json_default[argument['name']] = argument["default_value"]
13
+ end
14
+ default = JSON.pretty_generate(json_default)
15
+ arg = OpenStudio::Ruleset::OSArgument.makeStringArgument('json_input', true)
16
+ arg.setDisplayName('Contains a json version of the input as a single package.')
17
+ arg.setDefaultValue(default)
18
+ args << arg
19
+ else
20
+ # Conductances for all surfaces and subsurfaces.
21
+ @measure_interface_detailed.each do |argument|
22
+ arg = nil
23
+ statement = nil
24
+ case argument['type']
25
+ when "String"
26
+ arg = OpenStudio::Ruleset::OSArgument.makeStringArgument(argument['name'], argument['is_required'])
27
+ arg.setDisplayName(argument['display_name'])
28
+ arg.setDefaultValue(argument['default_value'].to_s)
29
+
30
+ when "Double"
31
+ arg = OpenStudio::Ruleset::OSArgument.makeDoubleArgument(argument['name'], argument['is_required'])
32
+ arg.setDisplayName("#{argument['display_name']}")
33
+ arg.setDefaultValue("#{argument['default_value']}".to_f)
34
+
35
+ when "Choice"
36
+ arg = OpenStudio::Measure::OSArgument.makeChoiceArgument(argument['name'], argument['choices'], argument['is_required'])
37
+ arg.setDisplayName(argument['display_name'])
38
+ arg.setDefaultValue(argument['default_value'].to_s)
39
+ puts arg.defaultValueAsString
40
+
41
+ when "Bool"
42
+ arg = OpenStudio::Measure::OSArgument.makeBoolArgument(argument['name'], argument['is_required'])
43
+ arg.setDisplayName(argument['display_name'])
44
+ arg.setDefaultValue(argument['default_value'])
45
+
46
+
47
+ when "StringDouble"
48
+ if @use_string_double == false
49
+ arg = OpenStudio::Ruleset::OSArgument.makeDoubleArgument(argument['name'], argument['is_required'])
50
+ arg.setDefaultValue(argument['default_value'].to_f)
51
+ else
52
+ arg = OpenStudio::Ruleset::OSArgument.makeStringArgument(argument['name'], argument['is_required'])
53
+ arg.setDefaultValue(argument['default_value'].to_s)
54
+ end
55
+ arg.setDisplayName(argument['display_name'])
56
+ end
57
+ args << arg
58
+ end
59
+ end
60
+ return args
61
+ end
62
+
63
+ #returns a hash of the user inputs for you to use in your measure.
64
+ def get_hash_of_arguments(user_arguments, runner)
65
+ values = {}
66
+ if @use_json_package
67
+ return JSON.parse(runner.getStringArgumentValue('json_input', user_arguments))
68
+ else
69
+
70
+ @measure_interface_detailed.each do |argument|
71
+
72
+ case argument['type']
73
+ when "String", "Choice"
74
+ values[argument['name']] = runner.getStringArgumentValue(argument['name'], user_arguments)
75
+ when "Double"
76
+ values[argument['name']] = runner.getDoubleArgumentValue(argument['name'], user_arguments)
77
+ when "Bool"
78
+ values[argument['name']] = runner.getBoolArgumentValue(argument['name'], user_arguments)
79
+ when "StringDouble"
80
+ value = nil
81
+ if @use_string_double == false
82
+ value = (runner.getDoubleArgumentValue(argument['name'], user_arguments).to_f)
83
+ else
84
+ value = runner.getStringArgumentValue(argument['name'], user_arguments)
85
+ if valid_float?(value)
86
+ value = value.to_f
87
+ end
88
+ end
89
+ values[argument['name']] = value
90
+ end
91
+ end
92
+ end
93
+ return values
94
+ end
95
+
96
+ # boilerplate that validated ranges of inputs.
97
+ def validate_and_get_arguments_in_hash(model, runner, user_arguments)
98
+ return_value = true
99
+ values = get_hash_of_arguments(user_arguments, runner)
100
+ # use the built-in error checking
101
+ if !runner.validateUserArguments(arguments(model), user_arguments)
102
+ runner_register(runner, 'Error', "validateUserArguments failed... Check the argument definition for errors.")
103
+ return_value = false
104
+ end
105
+
106
+ # Validate arguments
107
+ errors = ""
108
+ @measure_interface_detailed.each do |argument|
109
+ case argument['type']
110
+ when "Double"
111
+ value = values[argument['name']]
112
+ if (not argument["max_double_value"].nil? and value.to_f > argument["max_double_value"].to_f) or
113
+ (not argument["min_double_value"].nil? and value.to_f < argument["min_double_value"].to_f)
114
+ error = "#{argument['name']} must be between #{argument["min_double_value"]} and #{argument["max_double_value"]}. You entered #{value.to_f} for this #{argument['name']}.\n Please enter a value withing the expected range.\n"
115
+ errors << error
116
+ end
117
+ when "StringDouble"
118
+ value = values[argument['name']]
119
+ if (not argument["valid_strings"].include?(value)) and (not valid_float?(value))
120
+ error = "#{argument['name']} must be a string that can be converted to a float, or one of these #{argument["valid_strings"]}. You have entered #{value}\n"
121
+ errors << error
122
+ elsif (not argument["max_double_value"].nil? and value.to_f > argument["max_double_value"]) or
123
+ (not argument["min_double_value"].nil? and value.to_f < argument["min_double_value"])
124
+ error = "#{argument['name']} must be between #{argument["min_double_value"]} and #{argument["max_double_value"]}. You entered #{value} for #{argument['name']}. Please enter a stringdouble value in the expected range.\n"
125
+ errors << error
126
+ end
127
+ end
128
+ end
129
+ #If any errors return false, else return the hash of argument values for user to use in measure.
130
+ if errors != ""
131
+ runner.registerError(errors)
132
+ return false
133
+ end
134
+ return values
135
+ end
136
+
137
+ # Helper method to see if str is a valid float.
138
+ def valid_float?(str)
139
+ !!Float(str) rescue false
140
+ end
141
+
142
+ end
143
+
144
+ module BTAPMeasureTestHelper
145
+ ##### Helper methods Do notouch unless you know the consequences.
146
+
147
+ #Boiler plate to default values and number of arguments against what is in your test's setup method.
148
+ def test_arguments_and_defaults
149
+ [true, false].each do |json_input|
150
+ [true, false].each do |string_double|
151
+ @use_json_package = json_input
152
+ @use_string_double = string_double
153
+
154
+ # Create an instance of the measure
155
+ measure = get_measure_object()
156
+ measure.use_json_package = @use_json_package
157
+ measure.use_string_double = @use_string_double
158
+ model = OpenStudio::Model::Model.new
159
+
160
+ # Create an instance of a runner
161
+ runner = OpenStudio::Measure::OSRunner.new(OpenStudio::WorkflowJSON.new)
162
+
163
+ # Test arguments and defaults
164
+ arguments = measure.arguments(model)
165
+ #convert whatever the input was into a hash. Then test.
166
+
167
+ #check number of arguments.
168
+ if @use_json_package
169
+ assert_equal(@measure_interface_detailed.size, JSON.parse(arguments[0].defaultValueAsString).size, "The measure should have #{@measure_interface_detailed.size} but actually has #{arguments.size}. Here the the arguement expected #{@measure_interface_detailed} and this is the actual #{arguments}")
170
+ else
171
+ assert_equal(@measure_interface_detailed.size, arguments.size, "The measure should have #{@measure_interface_detailed.size} but actually has #{arguments.size}. Here the the arguement expected #{@measure_interface_detailed} and this is the actual #{arguments}")
172
+ (@measure_interface_detailed).each_with_index do |argument_expected, index|
173
+ assert_equal(argument_expected['name'], arguments[index].name, "Measure argument name of #{argument_expected['name']} was expected, but got #{arguments[index].name} instead.")
174
+ assert_equal(argument_expected['display_name'], arguments[index].displayName, "Display name for argument #{argument_expected['name']} was expected to be #{argument_expected['display_name']}, but got #{arguments[index].displayName} instead.")
175
+ case argument_type(arguments[index])
176
+ when "String", "Choice"
177
+ assert_equal(argument_expected['default_value'].to_s, arguments[index].defaultValueAsString, "The default value for argument #{argument_expected['name']} was #{argument_expected['default_value']}, but actual was #{arguments[index].defaultValueAsString}")
178
+ when "Double", "Integer"
179
+ assert_equal(argument_expected['default_value'].to_f, arguments[index].defaultValueAsDouble.to_f, "The default value for argument #{argument_expected['name']} was #{argument_expected['default_value']}, but actual was #{arguments[index].defaultValueAsString}")
180
+ when "Bool"
181
+ assert_equal(argument_expected['default_value'], arguments[index].defaultValueAsBool, "The default value for argument #{argument_expected['name']} was #{argument_expected['default_value']}, but actual was #{arguments[index].defaultValueAsString}")
182
+ end
183
+ end
184
+ end
185
+ end
186
+ end
187
+ end
188
+
189
+ # Test argument ranges.
190
+ def test_argument_ranges
191
+ [true, false].each do |json_input|
192
+ [true, false].each do |string_double|
193
+ @use_json_package = json_input
194
+ @use_string_double = string_double
195
+ (@measure_interface_detailed).each_with_index do |argument|
196
+ if argument['type'] == 'Double' or argument['type'] == 'StringDouble'
197
+ puts "testing range for #{argument['name']} "
198
+ #Check over max
199
+ if not argument['max_double_value'].nil?
200
+ puts "testing max limit"
201
+ model = OpenStudio::Model::Model.new
202
+ input_arguments = @good_input_arguments.clone
203
+ over_max_value = argument['max_double_value'].to_f + 1.0
204
+ over_max_value = over_max_value.to_s if argument['type'].downcase == "StringDouble".downcase
205
+ input_arguments[argument['name']] = over_max_value
206
+ puts "Testing argument #{argument['name']} max limit of #{argument['max_double_value']}"
207
+ input_arguments = {'json_input' => JSON.pretty_generate(input_arguments)} if @use_json_package
208
+ run_measure(input_arguments, model)
209
+ runner = run_measure(input_arguments, model)
210
+ assert(runner.result.value.valueName != 'Success', "Checks did not stop a lower than limit value of #{over_max_value} for #{argument['name']}")
211
+ puts "Success: Testing argument #{argument['name']} max limit of #{argument['max_double_value']}"
212
+ end
213
+ #Check over max
214
+ if not argument['min_double_value'].nil?
215
+ puts "testing min limit"
216
+ model = OpenStudio::Model::Model.new
217
+ input_arguments = @good_input_arguments.clone
218
+ over_min_value = argument['min_double_value'].to_f - 1.0
219
+ over_min_value = over_max_value.to_s if argument['type'].downcase == "StringDouble".downcase
220
+ input_arguments[argument['name']] = over_min_value
221
+ puts "Testing argument #{argument['name']} min limit of #{argument['min_double_value']}"
222
+ input_arguments = {'json_input' => JSON.pretty_generate(input_arguments)} if @use_json_package
223
+ runner = run_measure(input_arguments, model)
224
+ assert(runner.result.value.valueName != 'Success', "Checks did not stop a lower than limit value of #{over_min_value} for #{argument['name']}")
225
+ puts "Success:Testing argument #{argument['name']} min limit of #{argument['min_double_value']}"
226
+ end
227
+
228
+ end
229
+ if (argument['type'] == 'StringDouble') and (not argument["valid_strings"].nil?) and @use_string_double
230
+ model = OpenStudio::Model::Model.new
231
+ input_arguments = @good_input_arguments.clone
232
+ input_arguments[argument['name']] = SecureRandom.uuid.to_s
233
+ puts "Testing argument #{argument['name']} min limit of #{argument['min_double_value']}"
234
+ input_arguments = {'json_input' => JSON.pretty_generate(input_arguments)} if @use_json_package
235
+ runner = run_measure(input_arguments, model)
236
+ assert(runner.result.value.valueName != 'Success', "Checks did not stop a lower than limit value of #{over_min_value} for #{argument['name']}")
237
+ end
238
+ end
239
+ end
240
+ end
241
+ end
242
+
243
+ # helper method to create necb archetype as a starting point for testing.
244
+ def create_necb_protype_model(building_type, climate_zone, epw_file, template)
245
+
246
+ osm_directory = "#{Dir.pwd}/output/#{building_type}-#{template}-#{climate_zone}-#{epw_file}"
247
+ FileUtils.mkdir_p (osm_directory) unless Dir.exist?(osm_directory)
248
+ #Get Weather climate zone from lookup
249
+ weather = BTAP::Environment::WeatherFile.new(epw_file)
250
+ #create model
251
+ building_name = "#{template}_#{building_type}"
252
+
253
+ prototype_creator = Standard.build(template)
254
+ model = prototype_creator.model_create_prototype_model(
255
+ epw_file: epw_file,
256
+ sizing_run_dir: osm_directory,
257
+ debug: @debug,
258
+ template: template,
259
+ building_type: building_type)
260
+
261
+ #set weather file to epw_file passed to model.
262
+ weather.set_weather_file(model)
263
+ return model
264
+ end
265
+
266
+ # Custom way to run the measure in the test.
267
+ def run_measure(input_arguments, model)
268
+
269
+ # This will create a instance of the measure you wish to test. It does this based on the test class name.
270
+ measure = get_measure_object()
271
+ measure.use_json_package = @use_json_package
272
+ measure.use_string_double = @use_string_double
273
+ # Return false if can't
274
+ return false if false == measure
275
+ arguments = measure.arguments(model)
276
+ argument_map = OpenStudio::Measure.convertOSArgumentVectorToMap(arguments)
277
+ runner = OpenStudio::Measure::OSRunner.new(OpenStudio::WorkflowJSON.new)
278
+ #Check if
279
+
280
+ # Set the arguements in the argument map use json or real arguments.
281
+ if @use_json_package
282
+ argument = arguments[0].clone
283
+ assert(argument.setValue(input_arguments['json_input']), "Could not set value for 'json_input' to #{input_arguments['json_input']}")
284
+ argument_map['json_input'] = argument
285
+ else
286
+ input_arguments.each_with_index do |(key, value), index|
287
+ argument = arguments[index].clone
288
+ if argument_type(argument) == "Double"
289
+ #forces it to a double if it is a double.
290
+ assert(argument.setValue(value.to_f), "Could not set value for #{key} to #{value}")
291
+ else
292
+ assert(argument.setValue(value.to_s), "Could not set value for #{key} to #{value}")
293
+ end
294
+ argument_map[key] = argument
295
+ end
296
+ end
297
+ #run the measure
298
+ measure.run(model, runner, argument_map)
299
+ runner.result
300
+ return runner
301
+ end
302
+
303
+
304
+ #Fancy way of getting the measure object automatically.
305
+ def get_measure_object()
306
+ measure_class_name = self.class.name.to_s.match(/(BTAP.*)(\_Test)/i).captures[0]
307
+ measure = nil
308
+ eval "measure = #{measure_class_name}.new"
309
+ if measure.nil?
310
+ puts "Measure class #{measure_class_name} is invalid. Please ensure the test class name is of the form 'MeasureName_Test' "
311
+ return false
312
+ end
313
+ return measure
314
+ end
315
+
316
+ #Determines the OS argument type dynamically.
317
+ def argument_type(argument)
318
+ case argument.type.value
319
+ when 0
320
+ return "Bool"
321
+ when 1 #Double
322
+ return "Double"
323
+ when 2 #Quantity
324
+ return "Quantity"
325
+ when 3 #Integer
326
+ return "Integer"
327
+ when 4
328
+ return "String"
329
+ when 5 #Choice
330
+ return "Choice"
331
+ when 6 #Path
332
+ return "Path"
333
+ when 7 #Separator
334
+ return "Separator"
335
+ else
336
+ return "Blah"
337
+ end
338
+ end
339
+
340
+ # Valid float helper.
341
+ def valid_float?(str)
342
+ !!Float(str) rescue false
343
+ end
344
+
345
+ #Method does a deep copy of a model.
346
+ def copy_model(model)
347
+ copy_model = OpenStudio::Model::Model.new
348
+ # remove existing objects from model
349
+ handles = OpenStudio::UUIDVector.new
350
+ copy_model.objects.each do |obj|
351
+ handles << obj.handle
352
+ end
353
+ copy_model.removeObjects(handles)
354
+ # put contents of new_model into model_to_replace
355
+ copy_model.addObjects(model.toIdfFile.objects)
356
+ return copy_model
357
+ end
358
+
359
+ end
@@ -0,0 +1,117 @@
1
+ require_relative '../../../../lib/openstudio-standards.rb'
2
+
3
+ class BTAPWorkflow
4
+ attr_accessor :workflow
5
+
6
+ def initialize(measures_folder: File.join(__dir__, '../../measures'))
7
+ @model = nil
8
+ @run_dir = nil
9
+ @sql_path = nil
10
+ @idf_name = 'in.idf'
11
+ @osm_name = 'in.osm'
12
+ @osw_name = 'out.osw'
13
+ @epw_path = 'in.epw'
14
+ @workflow = OpenStudio::WorkflowJSON.new
15
+ @workflow.addMeasurePath(measures_folder)
16
+ @run_cli_verbose = true
17
+ @os_measures = []
18
+ @ep_measures = []
19
+ @report_measures = []
20
+ end
21
+
22
+ def set_run_dir(run_dir: "#{Dir.pwd}/Run")
23
+ puts "set run folder to #{run_dir}"
24
+ @run_dir = run_dir
25
+ @sql_path = OpenStudio::Path.new("#{@run_dir}/run/eplusout.sql")
26
+ return self
27
+ end
28
+
29
+ def add_os_measure(measure)
30
+ @os_measures << measure
31
+ end
32
+
33
+ def add_ep_measure(measure)
34
+ @ep_measures << measure
35
+ end
36
+
37
+ def add_reporting_measure(measure)
38
+ @report_measures << measure
39
+ return self
40
+ end
41
+
42
+ def add_measures_to_workflow
43
+ unless @os_measures.empty?
44
+ measure_type = OpenStudio::MeasureType.new("ModelMeasure")
45
+ @workflow.setMeasureSteps(measure_type, @os_measures)
46
+ end
47
+ unless @ep_measures.empty?
48
+ measure_type = OpenStudio::MeasureType.new("EnergyPlusMeasure")
49
+ @workflow.setMeasureSteps(measure_type, @ep_measures)
50
+ end
51
+ unless @report_measures.empty?
52
+ measure_type = OpenStudio::MeasureType.new("ReportingMeasure")
53
+ @workflow.setMeasureSteps(measure_type, @report_measures)
54
+ end
55
+ @workflow
56
+ return self
57
+ end
58
+
59
+ def add_btap_create_necb_prototype_building_measure(building_type:, epw_file:, template:, primary_heating_fuel:)
60
+ os_measure_type = OpenStudio::MeasureType.new("ModelMeasure")
61
+ create_prototype_measure = OpenStudio::MeasureStep.new("btap_create_necb_prototype_building")
62
+ create_prototype_measure.setName("btap_create_necb_prototype_building")
63
+ create_prototype_measure.setArgument('building_type', building_type)
64
+ create_prototype_measure.setArgument('epw_file', epw_file)
65
+ create_prototype_measure.setArgument('template', template)
66
+ create_prototype_measure.setArgument('primary_heating_fuel', primary_heating_fuel)
67
+ @os_measures << create_prototype_measure
68
+ end
69
+
70
+
71
+ def add_btap_results_measure
72
+ reporting_measure_type = OpenStudio::MeasureType.new("ReportingMeasure")
73
+ btap_results = OpenStudio::MeasureStep.new("btap_results")
74
+ btap_results.setName("btap_results")
75
+ btap_results.setArgument('generate_hourly_report', 'false')
76
+ btap_results.setArgument('output_diet', false)
77
+ btap_results.setArgument('envelope_costing', true)
78
+ btap_results.setArgument('lighting_costing', true)
79
+ btap_results.setArgument('boilers_costing', true)
80
+ btap_results.setArgument('chillers_costing', true)
81
+ btap_results.setArgument('cooling_towers_costing', true)
82
+ btap_results.setArgument('shw_costing', true)
83
+ btap_results.setArgument('ventilation_costing', true)
84
+ btap_results.setArgument('zone_system_costing', true)
85
+ @report_measures << btap_results
86
+ end
87
+
88
+
89
+ def run_command(command:)
90
+ stdout_str, stderr_str, status = Open3.capture3({}, command)
91
+ if status.success?
92
+ puts "Command completed successfully"
93
+ puts "stdout: #{stdout_str}"
94
+ puts "stderr: #{stderr_str}"
95
+ return true
96
+ else
97
+ puts "Error running command: '#{command}'"
98
+ puts "stdout: #{stdout_str}"
99
+ puts "stderr: #{stderr_str}"
100
+ return false
101
+ end
102
+ end
103
+
104
+ def run_workflow(postprocess_only: nil, osw_path:)
105
+ #command to run workflow
106
+ os_ruby_cli = "bundle exec ruby #{File.join(File.dirname(OpenStudio.getOpenStudioCLI.to_s), '..', 'Ruby', 'openstudio_cli.rb')}"
107
+ extra_args = ' --postprocess_only ' if postprocess_only == true
108
+ cmd = "#{os_ruby_cli} run #{extra_args} --debug --workflow \"#{osw_path}\""
109
+ puts "running cli command: #{cmd}"
110
+ OpenStudio.logFree(OpenStudio::Info, 'openstudio.model.Model', "running cli command: #{cmd}")
111
+ self.run_command(command: cmd)
112
+ OpenStudio.logFree(OpenStudio::Info, 'openstudio.model.Model', 'Finished cli run.')
113
+ #Ensure items are written to disk.
114
+ sleep 3
115
+ return true
116
+ end
117
+ end
@@ -0,0 +1,78 @@
1
+ require 'singleton'
2
+
3
+ class CommonPaths
4
+ include Singleton
5
+
6
+ # Raw data
7
+ attr_reader :raw_paths
8
+
9
+ attr_reader :locations_path
10
+ attr_reader :construction_sets_path
11
+ attr_reader :constructions_opaque_path
12
+ attr_reader :materials_opaque_path
13
+ attr_reader :constructions_glazing_path
14
+ attr_reader :materials_glazing_path
15
+ attr_reader :constructions_path
16
+ attr_reader :construction_properties_path
17
+ attr_reader :lighting_sets_path
18
+ attr_reader :lighting_path
19
+ attr_reader :materials_lighting_path
20
+ attr_reader :hvac_vent_ahu_path
21
+ attr_reader :materials_hvac_path
22
+
23
+ # Costing data
24
+ attr_accessor :costs_path
25
+ attr_accessor :costs_local_factors_path
26
+
27
+ # Costing database location
28
+ attr_reader :costing_database_path
29
+
30
+ # Other
31
+ attr_reader :error_log
32
+ attr_reader :cost_output_file
33
+ attr_reader :mech_sizing_data_file
34
+
35
+ def initialize
36
+ dir_relative = __dir__
37
+ dir_database = "#{dir_relative}/common_resources"
38
+
39
+ @locations_path = "#{dir_database}/locations.csv"
40
+ @construction_sets_path = "#{dir_database}/construction_sets.csv"
41
+ @constructions_opaque_path = "#{dir_database}/constructions_opaque.csv"
42
+ @materials_opaque_path = "#{dir_database}/materials_opaque.csv"
43
+ @constructions_glazing_path = "#{dir_database}/constructions_glazing.csv"
44
+ @materials_glazing_path = "#{dir_database}/materials_glazing.csv"
45
+ @constructions_path = "#{dir_database}/Constructions.csv"
46
+ @construction_properties_path = "#{dir_database}/ConstructionProperties.csv"
47
+ @lighting_sets_path = "#{dir_database}/lighting_sets.csv"
48
+ @lighting_path = "#{dir_database}/lighting.csv"
49
+ @materials_lighting_path = "#{dir_database}/materials_lighting.csv"
50
+ @hvac_vent_ahu_path = "#{dir_database}/hvac_vent_ahu.csv"
51
+ @materials_hvac_path = "#{dir_database}/materials_hvac.csv"
52
+
53
+ @raw_paths = [
54
+ @locations_path,
55
+ @construction_sets_path,
56
+ @constructions_opaque_path,
57
+ @materials_opaque_path,
58
+ @constructions_glazing_path,
59
+ @materials_glazing_path,
60
+ @constructions_path,
61
+ @construction_properties_path,
62
+ @lighting_sets_path,
63
+ @lighting_path,
64
+ @materials_lighting_path,
65
+ @hvac_vent_ahu_path,
66
+ @materials_hvac_path
67
+ ]
68
+
69
+ @costs_path = "#{dir_database}/costs.csv"
70
+ @costs_local_factors_path = "#{dir_database}/costs_local_factors.csv"
71
+
72
+ @costing_database_path = "#{dir_relative}/costing_database.json"
73
+
74
+ @error_log = "#{dir_relative}/errors.json"
75
+ @cost_output_file = "#{dir_relative}/cost_output.json"
76
+ @mech_sizing_data_file = "#{dir_relative}/mech_sizing.json"
77
+ end
78
+ end
@@ -0,0 +1,52 @@
1
+ Template,Climate Zone Set,Intended Surface Type,Standards Construction Type,Building Category,Construction,Minimum Percent of Surface,Maximum Percent of Surface,Assembly Maximum U-Value,Assembly Maximum F Factor,Assembly Maximum C Factor,Assembly Maximum Solar Heat Gain Coefficient
2
+ NECB 2011,NECB-CNEB ClimatZone 4-8,ExteriorFloor,BTAP-ExteriorFloor-SteelFramed-1,Nonresidential,BTAP - Typical Insulated Steel Framed Exterior Floor-1,,,,,,
3
+ NECB 2011,NECB-CNEB ClimatZone 4-8,ExteriorFloor,BTAP-ExteriorFloor-WoodFramed-1,Nonresidential,BTAP - Typical Insulated Wood Framed Exterior Floor-1,,,,,,
4
+ NECB 2011,NECB-CNEB ClimatZone 4-8,ExteriorRoof,BTAP-ExteriorRoof-IEAD-1,Nonresidential,BTAP - Typical IEAD Roof-1,,,,,,
5
+ NECB 2011,NECB-CNEB ClimatZone 4-8,ExteriorRoof,BTAP-ExteriorRoof-IEAD-2,Nonresidential,BTAP - Typical IEAD Roof-2,,,,,,
6
+ NECB 2011,NECB-CNEB ClimatZone 4-8,ExteriorRoof,BTAP-ExteriorRoof-IEAD-3,Nonresidential,BTAP - Typical IEAD Roof-3,,,,,,
7
+ NECB 2011,NECB-CNEB ClimatZone 4-8,ExteriorRoof,BTAP-ExteriorRoof-IEAD-4,Nonresidential,BTAP - Typical IEAD Roof-4,,,,,,
8
+ NECB 2011,NECB-CNEB ClimatZone 4-8,ExteriorRoof,BTAP-ExteriorRoof-IEAD-5,Nonresidential,BTAP - Typical IEAD Roof-5,,,,,,
9
+ NECB 2011,NECB-CNEB ClimatZone 4-8,ExteriorRoof,BTAP-ExteriorRoof-IEAD-6,Nonresidential,BTAP - Typical IEAD Roof-6,,,,,,
10
+ NECB 2011,NECB-CNEB ClimatZone 4-8,ExteriorRoof,BTAP-ExteriorRoof-Metal-1,Nonresidential,BTAP - Typical Insulated Metal Building Roof-1,,,,,,
11
+ NECB 2011,NECB-CNEB ClimatZone 4-8,ExteriorRoof,BTAP-ExteriorRoof-Metal-2,Nonresidential,BTAP - Typical Insulated Metal Building Roof-2,,,,,,
12
+ NECB 2011,NECB-CNEB ClimatZone 4-8,ExteriorWall,BTAP-ExteriorWall-Mass-1,Nonresidential,BTAP - Typical Insulated Exterior Mass Wall-1,,,,,,
13
+ NECB 2011,NECB-CNEB ClimatZone 4-8,ExteriorWall,BTAP-ExteriorWall-Mass-2,Nonresidential,BTAP - Typical Insulated Exterior Mass Wall-2,,,,,,
14
+ NECB 2011,NECB-CNEB ClimatZone 4-8,ExteriorWall,BTAP-ExteriorWall-Mass-3,Nonresidential,BTAP - Typical Insulated Exterior Mass Wall-3,,,,,,
15
+ NECB 2011,NECB-CNEB ClimatZone 4-8,ExteriorWall,BTAP-ExteriorWall-Mass-4,Nonresidential,BTAP - Typical Insulated Exterior Mass Wall-4,,,,,,
16
+ NECB 2011,NECB-CNEB ClimatZone 4-8,ExteriorWall,BTAP-ExteriorWall-Mass-5,Nonresidential,BTAP - Typical Insulated Exterior Mass Wall-5,,,,,,
17
+ NECB 2011,NECB-CNEB ClimatZone 4-8,ExteriorWall,BTAP-ExteriorWall-Mass-6,Nonresidential,BTAP - Typical Insulated Exterior Mass Wall-6,,,,,,
18
+ NECB 2011,NECB-CNEB ClimatZone 4-8,ExteriorWall,BTAP-ExteriorWall-Mass-7,Nonresidential,BTAP - Typical Insulated Exterior Mass Wall-7,,,,,,
19
+ NECB 2011,NECB-CNEB ClimatZone 4-8,ExteriorWall,BTAP-ExteriorWall-Mass-8,Nonresidential,BTAP - Typical Insulated Exterior Mass Wall-8,,,,,,
20
+ NECB 2011,NECB-CNEB ClimatZone 4-8,ExteriorWall,BTAP-ExteriorWall-Mass-9,Nonresidential,BTAP - Typical Insulated Exterior Mass Wall-9,,,,,,
21
+ NECB 2011,NECB-CNEB ClimatZone 4-8,ExteriorWall,BTAP-ExteriorWall-Metal-1,Nonresidential,BTAP - Typical Insulated Metal Building Wall-1,,,,,,
22
+ NECB 2011,NECB-CNEB ClimatZone 4-8,ExteriorWall,BTAP-ExteriorWall-Metal-2,Nonresidential,BTAP - Typical Insulated Metal Building Wall-2,,,,,,
23
+ NECB 2011,NECB-CNEB ClimatZone 4-8,ExteriorWall,BTAP-ExteriorWall-Metal-3,Nonresidential,BTAP - Typical Insulated Metal Building Wall-3,,,,,,
24
+ NECB 2011,NECB-CNEB ClimatZone 4-8,ExteriorWall,BTAP-ExteriorWall-SteelFramed-1,Nonresidential,BTAP - Typical Insulated Steel Framed Exterior Wall-1,,,,,,
25
+ NECB 2011,NECB-CNEB ClimatZone 4-8,ExteriorWall,BTAP-ExteriorWall-WoodFramed-1,Nonresidential,BTAP -Typical Insulated Wood Framed Exterior Wall-1,,,,,,
26
+ NECB 2011,NECB-CNEB ClimatZone 4-8,ExteriorWall,BTAP-ExteriorWall-WoodFramed-2,Nonresidential,BTAP -Typical Insulated Wood Framed Exterior Wall-2,,,,,,
27
+ NECB 2011,NECB-CNEB ClimatZone 4-8,ExteriorWall,BTAP-ExteriorWall-WoodFramed-3,Nonresidential,BTAP -Typical Insulated Wood Framed Exterior Wall-3,,,,,,
28
+ NECB 2011,NECB-CNEB ClimatZone 4-8,ExteriorWall,BTAP-ExteriorWall-WoodFramed-4,Nonresidential,BTAP -Typical Insulated Wood Framed Exterior Wall-4,,,,,,
29
+ NECB 2011,NECB-CNEB ClimatZone 4-8,ExteriorWall,BTAP-ExteriorWall-WoodFramed-5,Nonresidential,BTAP -Typical Insulated Wood Framed Exterior Wall-5,,,,,,
30
+ NECB 2011,NECB-CNEB ClimatZone 4-8,GroundContactFloor,BTAP-GroundContactFloor-Unheated-1,Nonresidential,BTAP - Typical Insulated Carpeted 8in Slab Floor-1,,,,,,
31
+ NECB 2011,NECB-CNEB ClimatZone 4-8,GroundContactRoof,BTAP-GroundContactRoof-Mass-1,Nonresidential,BTAP - Typical Insulated Carpeted 6in Slab Floor,,,,,,
32
+ NECB 2011,NECB-CNEB ClimatZone 4-8,GroundContactRoof,BTAP-GroundContactRoof-Mass-2,Nonresidential,BTAP - Typical Insulated Carpeted 6in Slab Floor,,,,,,
33
+ NECB 2011,NECB-CNEB ClimatZone 4-8,GroundContactWall,BTAP-GroundContactWall-Mass-1,Nonresidential,BTAP - Typical Insulated Basement Mass Wall-1,,,,,,
34
+ NECB 2011,NECB-CNEB ClimatZone 4-8,GroundContactWall,BTAP-GroundContactWall-Mass-2,Nonresidential,BTAP - Typical Insulated Basement Mass Wall-2,,,,,,
35
+ NECB 2011,NECB-CNEB ClimatZone 4-8,ExteriorWindow,Nonmetal framing (all),Nonresidential,U 0.35 SHGC 0.35 Dbl LoE (e2-.1) Tint 6mm/13mm Air,,,0.35,,,0.4
36
+ NECB 2011,NECB-CNEB ClimatZone 4-8,ExteriorDoor,Swinging,Nonresidential,Typical Insulated Metal Door,,,0.7,,,
37
+ NECB 2011,NECB-CNEB ClimatZone 4-8,ExteriorDoor,OverheadDoor,Nonresidential,Typical Overhead Door,,,0.5,,,
38
+ NECB 2011,NECB-CNEB ClimatZone 4-8,ExteriorFloor,Mass,Nonresidential,Typical Insulated Exterior Mass Floor,,,0.064,,,
39
+ NECB 2011,NECB-CNEB ClimatZone 4-8,ExteriorRoof,Metal Building,Nonresidential,Typical Insulated Metal Building Roof,,,0.049,,,
40
+ NECB 2011,NECB-CNEB ClimatZone 4-8,ExteriorWall,Mass,Nonresidential,Typical Insulated Exterior Mass Wall,,,0.08,,,
41
+ NECB 2011,NECB-CNEB ClimatZone 4-8,ExteriorWall,WoodFramed,Nonresidential,Typical Insulated Wood Framed Exterior Wall,,,0.051,,,
42
+ NECB 2011,NECB-CNEB ClimatZone 4-8,ExteriorWindow,Metal framing (all other),Nonresidential,U 0.55 SHGC 0.31 Dbl Ref-D Tint 6mm/6mm Air,,,0.55,,,0.4
43
+ NECB 2011,NECB-CNEB ClimatZone 4-8,GroundContactFloor,Unheated,Nonresidential,Typical Insulated Carpeted 6in Slab Floor,,,,0.54,,
44
+ NECB 2011,NECB-CNEB ClimatZone 4-8,GroundContactWall,Mass,Nonresidential,Typical Insulated Carpeted 6in Slab Floor,,,,,0.119,
45
+ NECB 2011,NECB-CNEB ClimatZone 4-8,Skylight,Glass with Curb,Nonresidential,U 0.48 SHGC 0.40 Dbl Ref-D Clr 6mm/13mm,0.0,2.0,0.5,,,0.19
46
+ NECB 2011,NECB-CNEB ClimatZone 4-8,GroundContactRoof,Mass,Nonresidential,Typical Insulated Carpeted 6in Slab Floor,,,,,0.119,
47
+ NECB 2011,NECB-CNEB ClimatZone 4-8,GlassDoor,Nonmetal framing (all),Nonresidential,U 0.35 SHGC 0.35 Dbl LoE (e2-.1) Tint 6mm/13mm Air,,,0.35,,,0.4
48
+ NECB 2011,NECB-CNEB ClimatZone 4-8,TubularDaylightDome,Glass with Curb,Nonresidential,U 0.48 SHGC 0.40 Dbl Ref-D Clr 6mm/13mm,0.0,2.0,0.5,,,0.19
49
+ NECB 2011,NECB-CNEB ClimatZone 4-8,TubularDaylightDiffuser,Glass with Curb,Nonresidential,U 0.48 SHGC 0.40 Dbl Ref-D Clr 6mm/13mm,0.0,2.0,0.5,,,0.19
50
+ ,,,,Nonresidential,Typical Insulated Steel Framed Exterior Floor,,,,,,
51
+ ,,,,Nonresidential,Typical Insulated Wood Framed Exterior Floor,,,,,,
52
+ NECB 2011,NECB-CNEB ClimatZone 4-8,ExteriorFloor,Mass,Nonresidential,Typical Insulated Exterior Mass Floor,,,0.064,,,
@@ -0,0 +1,37 @@
1
+ Name,Intended Surface Type,Standards Construction Type,Insulation Layer,Material 1,Material 2,Material 3,Material 4,Material 5
2
+ BTAP - Typical Insulated Steel Framed Exterior Floor-1,ExteriorFloor,BTAP-ExteriorFloor-SteelFramed-1,Typical Insulation,25mm Stucco,5/8 in. Gypsum Board,Typical Insulation,5/8 in. Gypsum Board,Typical Carpet Pad
3
+ BTAP - Typical Insulated Wood Framed Exterior Floor-1,ExteriorFloor,BTAP-ExteriorFloor-WoodFramed-1,Typical Insulation,25mm Stucco,5/8 in. Gypsum Board,Typical Insulation,5/8 in. Gypsum Board,Typical Carpet Pad
4
+ BTAP - Typical IEAD Roof-1,ExteriorRoof,BTAP-ExteriorRoof-IEAD-1,Typical Insulation,Roof Membrane,Typical Insulation,Metal Roof Surface,,
5
+ BTAP - Typical IEAD Roof-2,ExteriorRoof,BTAP-ExteriorRoof-IEAD-2,Typical Insulation,Roof Membrane,Typical Insulation,Metal Roof Surface,,
6
+ BTAP - Typical IEAD Roof-3,ExteriorRoof,BTAP-ExteriorRoof-IEAD-3,Typical Insulation,Roof Membrane,Typical Insulation,Metal Roof Surface,,
7
+ BTAP - Typical IEAD Roof-4,ExteriorRoof,BTAP-ExteriorRoof-IEAD-4,Typical Insulation,Roof Membrane,Typical Insulation,Metal Roof Surface,,
8
+ BTAP - Typical IEAD Roof-5,ExteriorRoof,BTAP-ExteriorRoof-IEAD-5,Typical Insulation,Roof Membrane,Typical Insulation,Metal Roof Surface,,
9
+ BTAP - Typical IEAD Roof-6,ExteriorRoof,BTAP-ExteriorRoof-IEAD-6,Typical Insulation,Roof Membrane,Typical Insulation,Metal Roof Surface,,
10
+ BTAP - Typical Insulated Metal Building Roof-1,ExteriorRoof,BTAP-ExteriorRoof-Metal-1,Typical Insulation,Metal Roof Surface,Typical Insulation,,,
11
+ BTAP - Typical Insulated Metal Building Roof-2,ExteriorRoof,BTAP-ExteriorRoof-Metal-2,Typical Insulation,Metal Roof Surface,Typical Insulation,,,
12
+ BTAP - Typical Insulated Exterior Mass Wall-1,ExteriorWall,BTAP-ExteriorWall-Mass-1,Typical Insulation,1IN Stucco,8IN CONCRETE HW RefBldg,Typical Insulation,1/2IN Gypsum,
13
+ BTAP - Typical Insulated Exterior Mass Wall-2,ExteriorWall,BTAP-ExteriorWall-Mass-2,Typical Insulation,1IN Stucco,8IN CONCRETE HW RefBldg,Typical Insulation,1/2IN Gypsum,
14
+ BTAP - Typical Insulated Exterior Mass Wall-3,ExteriorWall,BTAP-ExteriorWall-Mass-3,Typical Insulation,1IN Stucco,8IN CONCRETE HW RefBldg,Typical Insulation,1/2IN Gypsum,
15
+ BTAP - Typical Insulated Exterior Mass Wall-4,ExteriorWall,BTAP-ExteriorWall-Mass-4,Typical Insulation,1IN Stucco,8IN CONCRETE HW RefBldg,Typical Insulation,1/2IN Gypsum,
16
+ BTAP - Typical Insulated Exterior Mass Wall-5,ExteriorWall,BTAP-ExteriorWall-Mass-5,Typical Insulation,1IN Stucco,8IN CONCRETE HW RefBldg,Typical Insulation,1/2IN Gypsum,
17
+ BTAP - Typical Insulated Exterior Mass Wall-6,ExteriorWall,BTAP-ExteriorWall-Mass-6,Typical Insulation,1IN Stucco,8IN CONCRETE HW RefBldg,Typical Insulation,1/2IN Gypsum,
18
+ BTAP - Typical Insulated Exterior Mass Wall-7,ExteriorWall,BTAP-ExteriorWall-Mass-7,Typical Insulation,1IN Stucco,8IN CONCRETE HW RefBldg,Typical Insulation,1/2IN Gypsum,
19
+ BTAP - Typical Insulated Exterior Mass Wall-8,ExteriorWall,BTAP-ExteriorWall-Mass-8,Typical Insulation,1IN Stucco,8IN CONCRETE HW RefBldg,Typical Insulation,1/2IN Gypsum,
20
+ BTAP - Typical Insulated Exterior Mass Wall-9,ExteriorWall,BTAP-ExteriorWall-Mass-9,Typical Insulation,1IN Stucco,8IN CONCRETE HW RefBldg,Typical Insulation,1/2IN Gypsum,
21
+ BTAP - Typical Insulated Metal Building Wall-1,ExteriorWall,BTAP-ExteriorWall-Metal-1,Typical Insulation,Metal Siding,Typical Insulation,1/2IN Gypsum,,
22
+ BTAP - Typical Insulated Metal Building Wall-2,ExteriorWall,BTAP-ExteriorWall-Metal-2,Typical Insulation,Metal Siding,Typical Insulation,1/2IN Gypsum,,
23
+ BTAP - Typical Insulated Metal Building Wall-3,ExteriorWall,BTAP-ExteriorWall-Metal-3,Typical Insulation,Metal Siding,Typical Insulation,1/2IN Gypsum,,
24
+ BTAP - Typical Insulated Steel Framed Exterior Wall-1,ExteriorWall,BTAP-ExteriorWall-SteelFramed-1,Typical Insulation,25mm Stucco,5/8 in. Gypsum Board,Typical Insulation,5/8 in. Gypsum Board,
25
+ BTAP -Typical Insulated Wood Framed Exterior Wall-1,ExteriorWall,BTAP-ExteriorWall-WoodFramed-1,Typical Insulation,25mm Stucco,5/8 in. Gypsum Board,Typical Insulation,5/8 in. Gypsum Board,
26
+ BTAP -Typical Insulated Wood Framed Exterior Wall-2,ExteriorWall,BTAP-ExteriorWall-WoodFramed-2,Typical Insulation,25mm Stucco,5/8 in. Gypsum Board,Typical Insulation,5/8 in. Gypsum Board,
27
+ BTAP -Typical Insulated Wood Framed Exterior Wall-3,ExteriorWall,BTAP-ExteriorWall-WoodFramed-3,Typical Insulation,25mm Stucco,5/8 in. Gypsum Board,Typical Insulation,5/8 in. Gypsum Board,
28
+ BTAP -Typical Insulated Wood Framed Exterior Wall-4,ExteriorWall,BTAP-ExteriorWall-WoodFramed-4,Typical Insulation,25mm Stucco,5/8 in. Gypsum Board,Typical Insulation,5/8 in. Gypsum Board,
29
+ BTAP -Typical Insulated Wood Framed Exterior Wall-5,ExteriorWall,BTAP-ExteriorWall-WoodFramed-5,Typical Insulation,25mm Stucco,5/8 in. Gypsum Board,Typical Insulation,5/8 in. Gypsum Board,
30
+ BTAP - Typical Insulated Carpeted 8in Slab Floor-1,GroundContactFloor,BTAP-GroundContactFloor-Unheated-1,Typical Insulation,Typical Insulation,8 in. Normalweight Concrete Floor,Typical Carpet Pad,,
31
+ BTAP - Typical Insulated Carpeted 6in Slab Floor-1,GroundContactRoof,BTAP-GroundContactRoof-Mass-1,Typical Insulation,Typical Insulation,6 in. Normalweight Concrete Floor,Typical Carpet Pad,,
32
+ BTAP - Typical Insulated Carpeted 6in Slab Floor-2,GroundContactRoof,BTAP-GroundContactRoof-Mass-2,Typical Insulation,Typical Insulation,6 in. Normalweight Concrete Floor,Typical Carpet Pad,,
33
+ BTAP - Typical Insulated Basement Mass Wall-1,GroundContactWall,BTAP-GroundContactWall-Mass-1,Typical Insulation,Typical Insulation,8 in. Concrete Block Basement Wall,,,
34
+ BTAP - Typical Insulated Basement Mass Wall-2,GroundContactWall,BTAP-GroundContactWall-Mass-2,Typical Insulation,Typical Insulation,8 in. Concrete Block Basement Wall,,,
35
+ BTAP - Typical Interior Wall-1,InteriorWall,BTAP-InteriorWall-1,,G01 13mm gypsum board,G01 13mm gypsum board,,,
36
+ BTAP - Typical Interior Window-1,InteriorWindow,BTAP-InteriorWindow-1,,Clear 3mm,,,,
37
+ BTAP - Typical Overhead Door-1,OverheadDoor,BTAP-OverheadDoor-1,Typical Insulation,Typical Insulation,,,,