openstudio-standards 0.8.3 → 0.8.5.rc1

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 (330) hide show
  1. checksums.yaml +4 -4
  2. data/data/geometry/ASHRAECollege.osm +30 -30
  3. data/data/geometry/ASHRAECourthouse.osm +22 -22
  4. data/data/geometry/ASHRAESmallOfficeDetailed.osm +2 -2
  5. data/data/geometry/DEER_Asm.osm +1 -1
  6. data/data/geometry/DEER_ECC.osm +1 -1
  7. data/data/geometry/DEER_EPr.osm +1 -1
  8. data/data/geometry/DEER_ERC.osm +1 -1
  9. data/data/geometry/DEER_ESe.osm +1 -1
  10. data/data/geometry/DEER_EUn.osm +1 -1
  11. data/data/geometry/DEER_Hsp.osm +1 -1
  12. data/data/geometry/DEER_Htl.osm +1 -1
  13. data/data/geometry/DEER_MBT.osm +1 -1
  14. data/data/geometry/DEER_MFm.osm +1 -1
  15. data/data/geometry/DEER_Nrs.osm +1 -1
  16. data/data/geometry/DEER_OfL.osm +1 -1
  17. data/data/geometry/DEER_OfS.osm +1 -1
  18. data/data/geometry/DEER_RFF.osm +1 -1
  19. data/data/geometry/DEER_RSD.osm +1 -1
  20. data/data/geometry/DEER_Rt3.osm +1 -1
  21. data/data/geometry/DEER_RtS.osm +1 -1
  22. data/data/standards/export_OpenStudio_libraries.rb +2 -3
  23. data/data/standards/test_performance_expected_dd_results.csv +42 -42
  24. data/lib/openstudio-standards/btap/NECB_building_types.csv +35 -0
  25. data/lib/openstudio-standards/btap/NECB_space_types.csv +109 -0
  26. data/lib/openstudio-standards/btap/activity.rb +480 -0
  27. data/lib/openstudio-standards/btap/attributes.rb +166 -0
  28. data/lib/openstudio-standards/btap/bridging.rb +561 -1402
  29. data/lib/openstudio-standards/btap/btap.rb +4 -2
  30. data/lib/openstudio-standards/btap/btap_test_helper.rb +86 -0
  31. data/lib/openstudio-standards/btap/carbon/btap_carbon.rb +177 -0
  32. data/lib/openstudio-standards/btap/common_paths.rb +81 -0
  33. data/lib/openstudio-standards/btap/common_resources/ConstructionProperties.csv +52 -0
  34. data/lib/openstudio-standards/btap/common_resources/Constructions.csv +37 -0
  35. data/lib/openstudio-standards/btap/common_resources/carbon_frame.csv +35 -0
  36. data/lib/openstudio-standards/btap/common_resources/carbon_glazing.csv +35 -0
  37. data/lib/openstudio-standards/btap/common_resources/carbon_opaque.csv +164 -0
  38. data/lib/openstudio-standards/btap/common_resources/construction_sets.csv +1270 -0
  39. data/lib/openstudio-standards/btap/common_resources/constructions_glazing.csv +121 -0
  40. data/lib/openstudio-standards/btap/common_resources/constructions_opaque.csv +2256 -0
  41. data/lib/openstudio-standards/btap/common_resources/costs.csv +1897 -0
  42. data/lib/openstudio-standards/btap/common_resources/costs_local_factors.csv +2315 -0
  43. data/lib/openstudio-standards/btap/common_resources/hvac_vent_ahu.csv +925 -0
  44. data/lib/openstudio-standards/btap/common_resources/lighting.csv +364 -0
  45. data/lib/openstudio-standards/btap/common_resources/lighting_sets.csv +2667 -0
  46. data/lib/openstudio-standards/btap/common_resources/locations.csv +75 -0
  47. data/lib/openstudio-standards/btap/common_resources/materials_glazing.csv +35 -0
  48. data/lib/openstudio-standards/btap/common_resources/materials_hvac.csv +1686 -0
  49. data/lib/openstudio-standards/btap/common_resources/materials_lighting.csv +267 -0
  50. data/lib/openstudio-standards/btap/common_resources/materials_opaque.csv +164 -0
  51. data/lib/openstudio-standards/btap/costing/README.md +502 -0
  52. data/lib/openstudio-standards/btap/costing/btap_costing.rb +469 -0
  53. data/lib/openstudio-standards/btap/costing/btap_measure_helper.rb +359 -0
  54. data/lib/openstudio-standards/btap/costing/btap_workflow.rb +117 -0
  55. data/lib/openstudio-standards/btap/costing/copy_test_results_files_to_expected_results.rb +11 -0
  56. data/lib/openstudio-standards/btap/costing/cost_building_from_file.rb +136 -0
  57. data/lib/openstudio-standards/btap/costing/costing_database_wrapper.rb +173 -0
  58. data/lib/openstudio-standards/btap/costing/daylighting_sensor_control_costing.rb +354 -0
  59. data/lib/openstudio-standards/btap/costing/dcv_costing.rb +314 -0
  60. data/lib/openstudio-standards/btap/costing/dummy.epw +8768 -0
  61. data/lib/openstudio-standards/btap/costing/dummy.osm +5320 -0
  62. data/lib/openstudio-standards/btap/costing/envelope_costing.rb +215 -0
  63. data/lib/openstudio-standards/btap/costing/heating_cooling_costing.rb +2584 -0
  64. data/lib/openstudio-standards/btap/costing/led_lighting_costing.rb +156 -0
  65. data/lib/openstudio-standards/btap/costing/lighting_costing.rb +209 -0
  66. data/lib/openstudio-standards/btap/costing/mech_sizing.json +502 -0
  67. data/lib/openstudio-standards/btap/costing/neb_end_use_prices.csv +42 -0
  68. data/lib/openstudio-standards/btap/costing/necb_2011_spacetype_info.csv +225 -0
  69. data/lib/openstudio-standards/btap/costing/necb_reference_runs.csv +28705 -0
  70. data/lib/openstudio-standards/btap/costing/nv_costing.rb +547 -0
  71. data/lib/openstudio-standards/btap/costing/parallel_tests.rb +92 -0
  72. data/lib/openstudio-standards/btap/costing/pv_ground_costing.rb +687 -0
  73. data/lib/openstudio-standards/btap/costing/shw_costing.rb +705 -0
  74. data/lib/openstudio-standards/btap/costing/test_list.txt +15 -0
  75. data/lib/openstudio-standards/btap/costing/test_run_all_test_locally.rb +27 -0
  76. data/lib/openstudio-standards/btap/costing/test_run_costing_tests.rb +80 -0
  77. data/lib/openstudio-standards/btap/costing/ventilation_costing.rb +2616 -0
  78. data/lib/openstudio-standards/btap/geometry.rb +86 -6
  79. data/lib/openstudio-standards/btap/structure.rb +657 -0
  80. data/lib/openstudio-standards/constructions/modify.rb +2 -1
  81. data/lib/openstudio-standards/create_typical/create_typical.rb +17 -33
  82. data/lib/openstudio-standards/create_typical/space_type_ratios.rb +36 -36
  83. data/lib/openstudio-standards/equipment/create_transformer.rb +104 -0
  84. data/lib/openstudio-standards/equipment/create_typical_equipment.rb +117 -0
  85. data/lib/openstudio-standards/equipment/data/electric_equipment_space_types.json +1514 -0
  86. data/lib/openstudio-standards/equipment/data/gas_equipment_space_types.json +227 -0
  87. data/lib/openstudio-standards/exterior_lighting/create.rb +22 -22
  88. data/lib/openstudio-standards/exterior_lighting/information.rb +3 -2
  89. data/lib/openstudio-standards/hvac/components/air_conditioner_vrf.rb +482 -0
  90. data/lib/openstudio-standards/hvac/components/air_terminal.rb +31 -0
  91. data/lib/openstudio-standards/hvac/components/boiler_hot_water.rb +163 -0
  92. data/lib/openstudio-standards/hvac/components/central_air_source_heat_pump.rb +220 -0
  93. data/lib/openstudio-standards/hvac/components/chiller.rb +25 -0
  94. data/lib/openstudio-standards/hvac/components/coil.rb +276 -0
  95. data/lib/openstudio-standards/hvac/components/coil_cooling_dx_multi_speed.rb +40 -0
  96. data/lib/openstudio-standards/hvac/components/coil_cooling_dx_single_speed.rb +300 -0
  97. data/lib/openstudio-standards/hvac/components/coil_cooling_dx_two_speed.rb +187 -0
  98. data/lib/openstudio-standards/hvac/components/coil_cooling_water.rb +80 -0
  99. data/lib/openstudio-standards/hvac/components/coil_cooling_water_to_air_heat_pump_equation_fit.rb +182 -0
  100. data/lib/openstudio-standards/hvac/components/coil_heating_dx_single_speed.rb +220 -0
  101. data/lib/openstudio-standards/hvac/components/coil_heating_electric.rb +56 -0
  102. data/lib/openstudio-standards/hvac/components/coil_heating_gas.rb +90 -0
  103. data/lib/openstudio-standards/hvac/components/coil_heating_gas_multi_stage.rb +33 -0
  104. data/lib/openstudio-standards/hvac/components/coil_heating_water.rb +98 -0
  105. data/lib/openstudio-standards/hvac/components/coil_heating_water_to_air_heat_pump_equation_fit.rb +147 -0
  106. data/lib/openstudio-standards/hvac/components/component.rb +39 -0
  107. data/lib/openstudio-standards/{standards/ashrae_90_1/data/ashrae_90_1.fans.json → hvac/components/data/fans.json} +6 -6
  108. data/lib/openstudio-standards/hvac/components/fan.rb +363 -0
  109. data/lib/openstudio-standards/hvac/components/heat_exchanger_air_to_air.rb +203 -0
  110. data/lib/openstudio-standards/hvac/components/pump.rb +181 -0
  111. data/lib/openstudio-standards/hvac/controls/radiant_system_controls.rb +594 -0
  112. data/lib/openstudio-standards/hvac/conversions.rb +222 -0
  113. data/lib/openstudio-standards/hvac/curves.rb +192 -0
  114. data/lib/openstudio-standards/hvac/helpers.rb +357 -0
  115. data/lib/openstudio-standards/hvac/setpoint_managers/information.rb +4 -4
  116. data/lib/openstudio-standards/interior_lighting/create_lights.rb +52 -0
  117. data/lib/openstudio-standards/interior_lighting/create_typical_interior_lighting.rb +254 -0
  118. data/lib/openstudio-standards/interior_lighting/data/convert_lighting_data.rb +249 -0
  119. data/lib/openstudio-standards/interior_lighting/data/lighting_space_types.csv +96 -0
  120. data/lib/openstudio-standards/interior_lighting/data/lighting_space_types.json +1429 -0
  121. data/lib/openstudio-standards/interior_lighting/data/lighting_technology.csv +46 -0
  122. data/lib/openstudio-standards/interior_lighting/data/lighting_technology.json +859 -0
  123. data/lib/openstudio-standards/prototypes/ashrae_90_1/ashrae_90_1_2010/ashrae_90_1_2010.AirTerminalSingleDuctVAVReheat.rb +1 -1
  124. data/lib/openstudio-standards/prototypes/ashrae_90_1/ashrae_90_1_2013/ashrae_90_1_2013.AirTerminalSingleDuctVAVReheat.rb +1 -1
  125. data/lib/openstudio-standards/prototypes/ashrae_90_1/ashrae_90_1_2016/ashrae_90_1_2016.AirTerminalSingleDuctVAVReheat.rb +1 -1
  126. data/lib/openstudio-standards/prototypes/ashrae_90_1/ashrae_90_1_2016/ashrae_90_1_2016.Model.rb +4 -4
  127. data/lib/openstudio-standards/prototypes/ashrae_90_1/ashrae_90_1_2019/ashrae_90_1_2019.AirTerminalSingleDuctVAVReheat.rb +1 -1
  128. data/lib/openstudio-standards/prototypes/ashrae_90_1/ashrae_90_1_2019/ashrae_90_1_2019.Model.rb +4 -4
  129. data/lib/openstudio-standards/prototypes/ashrae_90_1/nrel_nze_ready_2017/nrel_zne_ready_2017.AirTerminalSingleDuctVAVReheat.rb +1 -1
  130. data/lib/openstudio-standards/prototypes/ashrae_90_1/ze_aedg_multifamily/ze_aedg_multifamily.AirTerminalSingleDuctVAVReheat.rb +1 -1
  131. data/lib/openstudio-standards/prototypes/common/buildings/Prototype.HighRiseApartment.rb +6 -7
  132. data/lib/openstudio-standards/prototypes/common/buildings/Prototype.Hospital.rb +15 -15
  133. data/lib/openstudio-standards/prototypes/common/buildings/Prototype.LargeHotel.rb +4 -4
  134. data/lib/openstudio-standards/prototypes/common/buildings/Prototype.LargeOffice.rb +5 -5
  135. data/lib/openstudio-standards/prototypes/common/buildings/Prototype.MediumOffice.rb +6 -6
  136. data/lib/openstudio-standards/prototypes/common/buildings/Prototype.Outpatient.rb +7 -7
  137. data/lib/openstudio-standards/prototypes/common/buildings/Prototype.PrimarySchool.rb +4 -4
  138. data/lib/openstudio-standards/prototypes/common/buildings/Prototype.SecondarySchool.rb +6 -6
  139. data/lib/openstudio-standards/prototypes/common/buildings/Prototype.SmallOfficeDetailed.rb +5 -1
  140. data/lib/openstudio-standards/prototypes/common/data/prototype_space_type_map.json +2594 -0
  141. data/lib/openstudio-standards/prototypes/common/data/thermostat_schedule_lookup.json +2108 -0
  142. data/lib/openstudio-standards/prototypes/common/objects/Prototype.AirTerminalSingleDuctVAVReheat.rb +33 -0
  143. data/lib/openstudio-standards/prototypes/common/objects/Prototype.Fan.rb +0 -140
  144. data/lib/openstudio-standards/prototypes/common/objects/Prototype.FanConstantVolume.rb +1 -73
  145. data/lib/openstudio-standards/prototypes/common/objects/Prototype.FanOnOff.rb +1 -69
  146. data/lib/openstudio-standards/prototypes/common/objects/Prototype.FanVariableVolume.rb +0 -116
  147. data/lib/openstudio-standards/prototypes/common/objects/Prototype.FanZoneExhaust.rb +0 -61
  148. data/lib/openstudio-standards/prototypes/common/objects/Prototype.Model.hvac.rb +2 -2
  149. data/lib/openstudio-standards/prototypes/common/objects/Prototype.Model.rb +128 -13
  150. data/lib/openstudio-standards/prototypes/common/objects/Prototype.hvac_systems.rb +606 -607
  151. data/lib/openstudio-standards/prototypes/common/prototype_space_type_map.rb +41 -0
  152. data/lib/openstudio-standards/prototypes/common/space_type_equipment_map.rb +184 -0
  153. data/lib/openstudio-standards/prototypes/common/space_type_thermostat_schedule_map.rb +116 -0
  154. data/lib/openstudio-standards/qaqc/hvac.rb +12 -12
  155. data/lib/openstudio-standards/refrigeration/create_compressor.rb +2 -5
  156. data/lib/openstudio-standards/refrigeration/data/refrigeration_compressors.csv +4 -4
  157. data/lib/openstudio-standards/service_water_heating/create_water_heater.rb +1 -2
  158. data/lib/openstudio-standards/service_water_heating/create_water_use.rb +5 -5
  159. data/lib/openstudio-standards/space_type/data/level_1_space_types.json +612 -0
  160. data/lib/openstudio-standards/space_type/standards_space_type.rb +53 -0
  161. data/lib/openstudio-standards/standards/Standards.AirConditionerVariableRefrigerantFlow.rb +8 -26
  162. data/lib/openstudio-standards/standards/Standards.AirLoopHVAC.rb +13 -13
  163. data/lib/openstudio-standards/standards/Standards.AirTerminalSingleDuctVAVReheat.rb +0 -24
  164. data/lib/openstudio-standards/standards/Standards.BoilerHotWater.rb +6 -43
  165. data/lib/openstudio-standards/standards/Standards.ChillerElectricEIR.rb +7 -24
  166. data/lib/openstudio-standards/standards/Standards.CoilCoolingDXMultiSpeed.rb +19 -44
  167. data/lib/openstudio-standards/standards/Standards.CoilCoolingDXSingleSpeed.rb +25 -50
  168. data/lib/openstudio-standards/standards/Standards.CoilCoolingDXTwoSpeed.rb +25 -33
  169. data/lib/openstudio-standards/standards/Standards.CoilCoolingWaterToAirHeatPumpEquationFit.rb +9 -22
  170. data/lib/openstudio-standards/standards/Standards.CoilDX.rb +15 -157
  171. data/lib/openstudio-standards/standards/Standards.CoilHeatingDXMultiSpeed.rb +2 -2
  172. data/lib/openstudio-standards/standards/Standards.CoilHeatingDXSingleSpeed.rb +18 -105
  173. data/lib/openstudio-standards/standards/Standards.CoilHeatingGas.rb +3 -23
  174. data/lib/openstudio-standards/standards/Standards.CoilHeatingGasMultiStage.rb +0 -24
  175. data/lib/openstudio-standards/standards/Standards.CoilHeatingWaterToAirHeatPumpEquationFit.rb +2 -86
  176. data/lib/openstudio-standards/standards/Standards.FanVariableVolume.rb +0 -107
  177. data/lib/openstudio-standards/standards/Standards.Model.rb +45 -20
  178. data/lib/openstudio-standards/standards/Standards.People.rb +113 -0
  179. data/lib/openstudio-standards/standards/Standards.PlantLoop.rb +11 -11
  180. data/lib/openstudio-standards/standards/Standards.Pump.rb +2 -147
  181. data/lib/openstudio-standards/standards/Standards.PumpVariableSpeed.rb +57 -41
  182. data/lib/openstudio-standards/standards/Standards.SpaceType.rb +30 -153
  183. data/lib/openstudio-standards/standards/Standards.Ventilation.rb +74 -0
  184. data/lib/openstudio-standards/standards/Standards.ZoneHVACComponent.rb +1 -1
  185. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2004/ashrae_90_1_2004.PlantLoop.rb +4 -4
  186. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2004/data/ashrae_90_1_2004.heat_pumps_heating.json +3 -3
  187. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2004/data/ashrae_90_1_2004.spc_typ.json +37 -112
  188. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2007/comstock_ashrae_90_1_2007/data/comstock_ashrae_90_1_2007.spc_typ.json +37 -102
  189. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2007/data/ashrae_90_1_2007.heat_pumps_heating.json +3 -3
  190. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2007/data/ashrae_90_1_2007.spc_typ.json +37 -112
  191. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2010/ashrae_90_1_2010.AirTerminalSingleDuctVAVReheat.rb +1 -1
  192. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2010/comstock_ashrae_90_1_2010/data/comstock_ashrae_90_1_2010.spc_typ.json +37 -37
  193. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2010/data/ashrae_90_1_2010.heat_pumps_heating.json +6 -6
  194. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2010/data/ashrae_90_1_2010.spc_typ.json +37 -37
  195. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2013/ashrae_90_1_2013.AirTerminalSingleDuctVAVReheat.rb +1 -1
  196. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2013/ashrae_90_1_2013.BoilerHotWater.rb +1 -1
  197. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2013/comstock_ashrae_90_1_2013/data/comstock_ashrae_90_1_2013.spc_typ.json +37 -102
  198. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2013/data/ashrae_90_1_2013.heat_pumps_heating.json +6 -6
  199. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2013/data/ashrae_90_1_2013.spc_typ.json +37 -37
  200. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2016/ashrae_90_1_2016.AirTerminalSingleDuctVAVReheat.rb +1 -1
  201. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2016/ashrae_90_1_2016.BoilerHotWater.rb +1 -1
  202. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2016/comstock_ashrae_90_1_2016/data/comstock_ashrae_90_1_2016.spc_typ.json +45 -109
  203. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2016/data/ashrae_90_1_2016.heat_pumps_heating.json +6 -6
  204. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2016/data/ashrae_90_1_2016.spc_typ.json +37 -37
  205. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2019/ashrae_90_1_2019.AirLoopHVAC.rb +1 -1
  206. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2019/ashrae_90_1_2019.AirTerminalSingleDuctVAVReheat.rb +1 -1
  207. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2019/ashrae_90_1_2019.BoilerHotWater.rb +1 -1
  208. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2019/ashrae_90_1_2019.CoilHeatingGas.rb +1 -1
  209. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2019/comstock_ashrae_90_1_2019/data/comstock_ashrae_90_1_2019.spc_typ.json +45 -109
  210. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2019/data/ashrae_90_1_2019.heat_pumps_heating.json +6 -6
  211. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2019/data/ashrae_90_1_2019.spc_typ.json +37 -37
  212. data/lib/openstudio-standards/standards/ashrae_90_1/data/ashrae_90_1.curves.json +0 -200
  213. data/lib/openstudio-standards/standards/ashrae_90_1/doe_ref_1980_2004/comstock_doe_ref_1980_2004/data/comstock_doe_ref_1980_2004.spc_typ.json +37 -37
  214. data/lib/openstudio-standards/standards/ashrae_90_1/doe_ref_1980_2004/data/doe_ref_1980_2004.spc_typ.json +37 -37
  215. data/lib/openstudio-standards/standards/ashrae_90_1/doe_ref_pre_1980/comstock_doe_ref_pre_1980/data/comstock_doe_ref_pre_1980.spc_typ.json +37 -37
  216. data/lib/openstudio-standards/standards/ashrae_90_1/doe_ref_pre_1980/data/doe_ref_pre_1980.spc_typ.json +37 -37
  217. data/lib/openstudio-standards/standards/ashrae_90_1/nrel_zne_ready_2017/nrel_zne_ready_2017.AirTerminalSingleDuctVAVReheat.rb +1 -1
  218. data/lib/openstudio-standards/standards/ashrae_90_1/nrel_zne_ready_2017/nrel_zne_ready_2017.PlantLoop.rb +5 -5
  219. data/lib/openstudio-standards/standards/ashrae_90_1/ze_aedg_multifamily/ze_aedg_multifamily.AirTerminalSingleDuctVAVReheat.rb +1 -1
  220. data/lib/openstudio-standards/standards/ashrae_90_1/ze_aedg_multifamily/ze_aedg_multifamily.PlantLoop.rb +5 -5
  221. data/lib/openstudio-standards/standards/ashrae_90_1_prm/ashrae_90_1_prm.AirLoopHVAC.rb +1 -1
  222. data/lib/openstudio-standards/standards/ashrae_90_1_prm/ashrae_90_1_prm.ChillerElectricEIR.rb +2 -2
  223. data/lib/openstudio-standards/standards/ashrae_90_1_prm/ashrae_90_1_prm.CoilCoolingDXSingleSpeed.rb +2 -68
  224. data/lib/openstudio-standards/standards/ashrae_90_1_prm/ashrae_90_1_prm.CoilCoolingDXTwoSpeed.rb +2 -35
  225. data/lib/openstudio-standards/standards/ashrae_90_1_prm/ashrae_90_1_prm.CoilDX.rb +42 -0
  226. data/lib/openstudio-standards/standards/ashrae_90_1_prm/ashrae_90_1_prm.CoilHeatingDXSingleSpeed.rb +5 -2
  227. data/lib/openstudio-standards/standards/ashrae_90_1_prm/ashrae_90_1_prm.CoilHeatingGas.rb +2 -2
  228. data/lib/openstudio-standards/standards/ashrae_90_1_prm/ashrae_90_1_prm.Model.rb +2 -2
  229. data/lib/openstudio-standards/standards/ashrae_90_1_prm/ashrae_90_1_prm.PlantLoop.rb +3 -3
  230. data/lib/openstudio-standards/standards/ashrae_90_1_prm/ashrae_90_1_prm.SpaceType.rb +1 -1
  231. data/lib/openstudio-standards/standards/ashrae_90_1_prm/ashrae_90_1_prm_2019/ashrae_90_1_prm_2019.Model.rb +1 -0
  232. data/lib/openstudio-standards/standards/ashrae_90_1_prm/ashrae_90_1_prm_2019/ashrae_90_1_prm_2019_WaterHeaterMixed.rb +2 -4
  233. data/lib/openstudio-standards/standards/ashrae_90_1_prm/data/ashrae_90_1_prm.curves.json +0 -200
  234. data/lib/openstudio-standards/standards/ashrae_90_1_prm/data/ashrae_90_1_prm.fans.json +5 -5
  235. data/lib/openstudio-standards/standards/ashrae_90_1_prm/userdata_csv/ashrae_90_1_prm.UserData.rb +7 -1
  236. data/lib/openstudio-standards/standards/ashrae_90_1_prm/userdata_csv/userdata_enums.rb +0 -1
  237. data/lib/openstudio-standards/standards/cbes/data/cbes.curves.json +0 -200
  238. data/lib/openstudio-standards/standards/deer/data/deer.curves.json +0 -200
  239. data/lib/openstudio-standards/standards/necb/BTAPPRE1980/btap_pre1980.rb +21 -37
  240. data/lib/openstudio-standards/standards/necb/BTAPPRE1980/building_envelope.rb +12 -11
  241. data/lib/openstudio-standards/standards/necb/BTAPPRE1980/hvac_system_3_and_8_single_speed.rb +68 -27
  242. data/lib/openstudio-standards/standards/necb/BTAPPRE1980/hvac_system_4.rb +64 -25
  243. data/lib/openstudio-standards/standards/necb/BTAPPRE1980/hvac_system_6.rb +9 -14
  244. data/lib/openstudio-standards/standards/necb/BTAPPRE1980/hvac_systems.rb +4 -4
  245. data/lib/openstudio-standards/standards/necb/ECMS/ecms.rb +1 -1
  246. data/lib/openstudio-standards/standards/necb/ECMS/hvac_systems.rb +115 -112
  247. data/lib/openstudio-standards/standards/necb/NECB2011/autozone.rb +637 -249
  248. data/lib/openstudio-standards/standards/necb/NECB2011/beps_compliance_path.rb +16 -12
  249. data/lib/openstudio-standards/standards/necb/NECB2011/building_envelope.rb +799 -46
  250. data/lib/openstudio-standards/standards/necb/NECB2011/data/chillers.json +33 -51
  251. data/lib/openstudio-standards/standards/necb/NECB2011/data/constants.json +75 -7
  252. data/lib/openstudio-standards/standards/necb/NECB2011/data/fuel_type_sets.json +25 -1
  253. data/lib/openstudio-standards/standards/necb/NECB2011/data/geometry/HighriseApartmentMult.osm +14272 -0
  254. data/lib/openstudio-standards/standards/necb/NECB2011/data/heat_pumps_heating.json +21 -15
  255. data/lib/openstudio-standards/standards/necb/NECB2011/data/necb_2015_table_c1.json +1 -1
  256. data/lib/openstudio-standards/standards/necb/NECB2011/data/space_types.json +437 -437
  257. data/lib/openstudio-standards/standards/necb/NECB2011/data/systems.json +516 -0
  258. data/lib/openstudio-standards/standards/necb/NECB2011/data/systems_including_sys5.json +588 -0
  259. data/lib/openstudio-standards/standards/necb/NECB2011/hvac_namer.rb +489 -0
  260. data/lib/openstudio-standards/standards/necb/NECB2011/hvac_system_1_single_speed.rb +18 -6
  261. data/lib/openstudio-standards/standards/necb/NECB2011/hvac_system_2_and_5.rb +48 -5
  262. data/lib/openstudio-standards/standards/necb/NECB2011/hvac_system_3_and_8_multi_speed.rb +2 -2
  263. data/lib/openstudio-standards/standards/necb/NECB2011/hvac_system_3_and_8_single_speed.rb +35 -27
  264. data/lib/openstudio-standards/standards/necb/NECB2011/hvac_system_4.rb +34 -23
  265. data/lib/openstudio-standards/standards/necb/NECB2011/hvac_system_6.rb +8 -6
  266. data/lib/openstudio-standards/standards/necb/NECB2011/hvac_systems.rb +68 -150
  267. data/lib/openstudio-standards/standards/necb/NECB2011/necb_2011.rb +444 -134
  268. data/lib/openstudio-standards/standards/necb/NECB2011/system_fuels.rb +61 -1
  269. data/lib/openstudio-standards/standards/necb/NECB2015/data/heat_pumps_heating.json +10 -2
  270. data/lib/openstudio-standards/standards/necb/NECB2015/data/space_types.json +636 -636
  271. data/lib/openstudio-standards/standards/necb/NECB2015/data/unitary_acs.json +38 -38
  272. data/lib/openstudio-standards/standards/necb/NECB2015/hvac_systems.rb +17 -8
  273. data/lib/openstudio-standards/standards/necb/NECB2017/data/space_types.json +636 -636
  274. data/lib/openstudio-standards/standards/necb/NECB2020/data/chillers.json +71 -71
  275. data/lib/openstudio-standards/standards/necb/NECB2020/data/heat_pumps_heating.json +16 -6
  276. data/lib/openstudio-standards/standards/necb/NECB2020/data/unitary_acs.json +60 -61
  277. data/lib/openstudio-standards/standards/necb/NECB2020/service_water_heating.rb +30 -30
  278. data/lib/openstudio-standards/standards/necb/README.md +343 -0
  279. data/lib/openstudio-standards/standards/necb/common/btap_analysis.rb +79 -0
  280. data/lib/openstudio-standards/standards/necb/common/btap_data.rb +206 -32
  281. data/lib/openstudio-standards/standards/necb/common/btap_datapoint.rb +75 -43
  282. data/lib/openstudio-standards/standards/necb/common/eccc_electric_grid_intensity_20250311.csv +14 -0
  283. data/lib/openstudio-standards/standards/necb/common/nir_gas_grid_intensity_20250311.csv +14 -0
  284. data/lib/openstudio-standards/standards/necb/common/system_types.yaml +0 -0
  285. data/lib/openstudio-standards/thermal_zone/{thermal_zone.rb → information.rb} +12 -45
  286. data/lib/openstudio-standards/thermal_zone/thermostat_schedules.rb +152 -0
  287. data/lib/openstudio-standards/utilities/logging.rb +18 -14
  288. data/lib/openstudio-standards/version.rb +1 -1
  289. data/lib/openstudio-standards/weather/modify.rb +2 -2
  290. data/lib/openstudio-standards/weather/stat_file.rb +2 -2
  291. data/lib/openstudio-standards.rb +67 -38
  292. metadata +141 -50
  293. data/lib/openstudio-standards/hvac/components/create.rb +0 -169
  294. data/lib/openstudio-standards/hvac/components/modify.rb +0 -42
  295. data/lib/openstudio-standards/prototypes/common/objects/Prototype.AirConditionerVariableRefrigerantFlow.rb +0 -438
  296. data/lib/openstudio-standards/prototypes/common/objects/Prototype.BoilerHotWater.rb +0 -123
  297. data/lib/openstudio-standards/prototypes/common/objects/Prototype.CentralAirSourceHeatPump.rb +0 -216
  298. data/lib/openstudio-standards/prototypes/common/objects/Prototype.CoilCoolingDXSingleSpeed.rb +0 -273
  299. data/lib/openstudio-standards/prototypes/common/objects/Prototype.CoilCoolingDXTwoSpeed.rb +0 -159
  300. data/lib/openstudio-standards/prototypes/common/objects/Prototype.CoilCoolingWater.rb +0 -77
  301. data/lib/openstudio-standards/prototypes/common/objects/Prototype.CoilCoolingWaterToAirHeatPumpEquationFit.rb +0 -154
  302. data/lib/openstudio-standards/prototypes/common/objects/Prototype.CoilHeatingDXSingleSpeed.rb +0 -214
  303. data/lib/openstudio-standards/prototypes/common/objects/Prototype.CoilHeatingElectric.rb +0 -53
  304. data/lib/openstudio-standards/prototypes/common/objects/Prototype.CoilHeatingGas.rb +0 -72
  305. data/lib/openstudio-standards/prototypes/common/objects/Prototype.CoilHeatingWater.rb +0 -95
  306. data/lib/openstudio-standards/prototypes/common/objects/Prototype.CoilHeatingWaterToAirHeatPumpEquationFit.rb +0 -125
  307. data/lib/openstudio-standards/prototypes/common/objects/Prototype.ControllerWaterCoil.rb +0 -17
  308. data/lib/openstudio-standards/prototypes/common/objects/Prototype.Model.transformers.rb +0 -90
  309. data/lib/openstudio-standards/prototypes/common/objects/Prototype.Pump.rb +0 -4
  310. data/lib/openstudio-standards/prototypes/common/objects/Prototype.PumpVariableSpeed.rb +0 -70
  311. data/lib/openstudio-standards/prototypes/common/objects/Prototype.radiant_system_controls.rb +0 -590
  312. data/lib/openstudio-standards/prototypes/common/objects/Prototype.utilities.rb +0 -901
  313. data/lib/openstudio-standards/standards/Standards.FanConstantVolume.rb +0 -5
  314. data/lib/openstudio-standards/standards/Standards.FanOnOff.rb +0 -5
  315. data/lib/openstudio-standards/standards/Standards.FanZoneExhaust.rb +0 -5
  316. data/lib/openstudio-standards/standards/Standards.HeaderedPumpsConstantSpeed.rb +0 -5
  317. data/lib/openstudio-standards/standards/Standards.HeaderedPumpsVariableSpeed.rb +0 -55
  318. data/lib/openstudio-standards/standards/Standards.PumpConstantSpeed.rb +0 -5
  319. data/lib/openstudio-standards/standards/ashrae_90_1_prm/ashrae_90_1_prm.FanConstantVolume.rb +0 -5
  320. data/lib/openstudio-standards/standards/ashrae_90_1_prm/ashrae_90_1_prm.FanOnOff.rb +0 -5
  321. data/lib/openstudio-standards/standards/ashrae_90_1_prm/ashrae_90_1_prm.FanZoneExhaust.rb +0 -5
  322. data/lib/openstudio-standards/standards/cbes/data/cbes.fans.json +0 -328
  323. data/lib/openstudio-standards/standards/deer/data/deer.fans.json +0 -328
  324. /data/lib/openstudio-standards/{prototypes → standards}/ashrae_90_1/ashrae_90_1_2004/ashrae_90_1_2004.PumpVariableSpeed.rb +0 -0
  325. /data/lib/openstudio-standards/{prototypes → standards}/ashrae_90_1/ashrae_90_1_2007/ashrae_90_1_2007.PumpVariableSpeed.rb +0 -0
  326. /data/lib/openstudio-standards/{prototypes → standards}/ashrae_90_1/ashrae_90_1_2010/ashrae_90_1_2010.PumpVariableSpeed.rb +0 -0
  327. /data/lib/openstudio-standards/{prototypes → standards}/ashrae_90_1/ashrae_90_1_2013/ashrae_90_1_2013.PumpVariableSpeed.rb +0 -0
  328. /data/lib/openstudio-standards/{prototypes → standards}/ashrae_90_1/ashrae_90_1_2016/ashrae_90_1_2016.PumpVariableSpeed.rb +0 -0
  329. /data/lib/openstudio-standards/{prototypes → standards}/ashrae_90_1/ashrae_90_1_2019/ashrae_90_1_2019.Pump.rb +0 -0
  330. /data/lib/openstudio-standards/{prototypes → standards}/ashrae_90_1/ashrae_90_1_2019/ashrae_90_1_2019.PumpVariableSpeed.rb +0 -0
@@ -0,0 +1,35 @@
1
+ Activity,LiveLoad,Category,Includes,Excludes,Fallback
2
+ arena,16,recreation,arena,,
3
+ gym,16,recreation,gym,,
4
+ exercise,23,commerce,exercise,,
5
+ office,21,commerce,office,,
6
+ retail,38,commerce,retail,,
7
+ leisure,23,commerce,leisure/lounge/bar,fast/cafeteria/family,
8
+ fastfood,23,commerce,fast/cafeteria,leisure/lounge/bar/family,
9
+ restaurant,23,commerce,family/restaurant,leisure/lounge/bar/fast/cafeteria,
10
+ hotel,21,lodging,hotel,,
11
+ motel,21,lodging,motel,hotel,hotel
12
+ dorm,14,housing,dorm,,
13
+ residential,13,housing,multi/residential/apartment,health/care,
14
+ care,13,housing,care,health/clinic/multi/residential,residential
15
+ clinic,20,public,clinic,,
16
+ hospital,20,public,hospital/healthcare/outpatient,clinic,
17
+ religious,4,public,religious,,
18
+ terminal,15,public,transportation/terminal,,
19
+ theatre,10,public,perform/art/theatre,motion/picture/cineplex,
20
+ cineplex,10,public,motion/picture/cineplex,perform/art,
21
+ convention,6,public,convention,,
22
+ museum,12,public,museum,,
23
+ library,37,public,library,,
24
+ school,14,public,school/university,,
25
+ postal,37,public,post,,
26
+ townhall,21,public,town,house,
27
+ court,15,public,court,,
28
+ precinct,17,public,precinct/police,,
29
+ penitentiary,22,robust,penitentiary,,
30
+ parking,41,robust,storage/garage/parking,automotive,
31
+ warehouse,61,industry,warehouse,,
32
+ workshop,38,industry,workshop,,
33
+ manufacturing,58,industry,manufacturing,,
34
+ automotive,37,industry,automotive,,
35
+ firehouse,37,industry,fire,,
@@ -0,0 +1,109 @@
1
+ Activity,Includes,Excludes,Fallback
2
+ undefined::common,undefined,,
3
+ washroom::common,washroom,,
4
+ atrium::common,atrium,,
5
+ concourse::retail,concourse,airport/terminal/transp,
6
+ concourse::terminal,concourse,retail/mall,
7
+ corridor::common,corr,manufacturing/hospital,corridor::common
8
+ corridor::hospital,corr,manufacturing/common/other,corridor::common
9
+ corridor::manufacturing,corr,hospital/common/other,corridor::common
10
+ stairway::common,stair,,
11
+ elevator::common,elevator/foyer,,
12
+ lobby::common,lobby,otel/motion/picture/cineplex/perform/art/theatre,lobby::common
13
+ lobby::hotel,lobby,motion/picture/cineplex/perform/art/theatre/common/other,lobby::common
14
+ lobby::cineplex,lobby,otel/perform/art/common/other,lobby::common
15
+ lobby::theatre,lobby,otel/motion/picture/cineplex/common/other,lobby::common
16
+ restoration::museum,restoration,,
17
+ exhibit::museum,exhibit,convention,
18
+ exhibit::convention,exhibit,museum,
19
+ baggage::terminal,baggage/carousel,,
20
+ counter::terminal,counter,,
21
+ seating::common,seating,airport/terminal/transp/audience,
22
+ seating::terminal,seating,general/common/other/audience,
23
+ refectory::religious,fellowship/refectory,,
24
+ pulpit::religious,pulpit/choir,,
25
+ chapel::religious,chapel,,
26
+ audience::common,audience,auditorium/religious/penitentiary/motion/picture/cineplex/perform/art/theatre/convention/gym/arena,audience::common
27
+ audience::religious,audience,auditorium/penitentiary/motion/picture/cineplex/perform/art/theatre/convention/gym/arena/common/other,audience::common
28
+ audience::penitentiary,audience,auditorium/religious/motion/picture/cineplex/perform/art/theatre/convention/gym/arena/common/other,audience::common
29
+ audience::cineplex,audience,auditorium/religious/penitentiary/perform/art/theatre/convention/gym/arena/common/other,audience::common
30
+ audience::theatre,audience,auditorium/religious/penitentiary/motion/picture/cineplex/convention/gym/arena/common/other,audience::common
31
+ audience::convention,audience,auditorium/religious/penitentiary/motion/picture/cineplex/perform/art/theatre/gym/arena/common/other,audience::common
32
+ audience::gym,audience,auditorium/religious/penitentiary/motion/picture/cineplex/perform/art/theatre/convention/arena/common/other,audience::common
33
+ audience::arena,audience,auditorium/religious/penitentiary/motion/picture/cineplex/perform/art/theatre/convention/gym/common/other,audience::common
34
+ c1::arena,class 1/class I,,
35
+ c2::arena,class 2/class II,,
36
+ c3::arena,class 3/class III,,
37
+ c4::arena,class 4/class IV,,
38
+ octogon::arena,ring/octogon,manufacturing,
39
+ exercise::gym,exercise,,
40
+ court::gym,court,class 1/class 2/class 3/class 4/class I/class II/class III/class IV/courthouse/courtroom/chambers/tribunal,
41
+ locker::common,locker,
42
+ dressing::theatre,dress/fitt,retail,
43
+ dressing::retail,dress/fitt,perform/art/theatre,
44
+ sales::common,sales,retail,sales::common
45
+ sales::retail,retail,dress/fitt/mall/concourse,sales::retail
46
+ dining::common,dining,penitentiary/leisure/lounge/bar/cafeteria/fast/family/restaurant/otel/lodging,dining::common
47
+ dining::penitentiary,dining,leisure/lounge/bar/cafeteria/fast/family/restaurant/otel/lodging/common/other,dining::common
48
+ dining::leisure,dining,cafeteria/fast/family/restaurant/penitentiary/otel/lodging/common/other,dining::common
49
+ dining::fastfood,dining,penitentiary/leisure/lounge/bar/family/restaurant/otel/lodging/common/other,dining::common
50
+ dining::restaurant,dining,penitentiary/leisure/lounge/bar/cafeteria/fast/otel/lodging/common/other,dining::common
51
+ dining::motel,dining,penitentiary/leisure/lounge/bar/cafeteria/fast/family/restaurant/hotel/common/other,dining::common
52
+ dining::hotel,dining,penitentiaryleisure/lounge/bar/cafeteria/fast/family/restaurant/motel/lodging/common/other,dining::common
53
+ cuisine::common,food/preparation,
54
+ rooms::common,guest,otel,rooms::hotel
55
+ rooms::motel,guest/otel,hotel,rooms::common
56
+ rooms::hotel,guest/otel,motel/hway/lodging,rooms::common
57
+ quarters::dorm,quarter,fire,
58
+ quarters::firehouse,quarter,dorm,
59
+ units::residential,unit,care,units::residential
60
+ units::care,unit,residential,units::residential
61
+ recreation::common,recreation,hospital/healthcare,
62
+ meeting::common,conference/meeting/multi-purpose,,
63
+ office::common,office/enclosed,bank/open,office::common
64
+ openplan::common,open,enclosed/bank,office::common
65
+ bank::common,bank,,
66
+ copiers::common,copier/copy/print,,
67
+ computer::common,computer,server,computer::common
68
+ server::common,server,computer,computer::common
69
+ sorting::postal,sorting,,
70
+ chambers::court,chambers,,
71
+ tribunal::court,tribunal/courtroom,,
72
+ cell::common,cell,courthouse,cell::common
73
+ cell::court,cell,confinement,cell::common
74
+ classroom::common,classroom/lecture/training,penitentiary,classroom::common
75
+ classroom::penitentiary,classroom,lecture/training,classroom::common
76
+ reading::library,reading,,
77
+ stacks::library,stacks,,
78
+ catalog::library,catalog,,
79
+ lab::common,lab,teaching,lab::common
80
+ teachinglab::common,lab,research/industr/medical/common/other,lab::common
81
+ storage::common,storage,suppl/garage,storage::common
82
+ supplies::hospital,suppl,,
83
+ exam::hospital,exam/treatment,,
84
+ nursery::hospital,nursery,,
85
+ nurses::hospital,nurses,,
86
+ operating::hospital,operat,,
87
+ patient::hospital,patient,,
88
+ therapy::hospital,therapy,,
89
+ imaging::hospital,radiology/imaging,,
90
+ recovery::hospital,recovery,,
91
+ laundry::common,laundry,hospital/healthcare,laundry::common
92
+ laundry::hospital,laundry/washing,common,laundry::common
93
+ lounge::common,lounge,hospital/healthcare,lounge::common
94
+ lounge::hospital,lounge,common/other,lounge::common
95
+ pharmacy::common,pharmacy,hospital/healthcare,pharmacy::common
96
+ pharmacy::hospital,pharmacy,common/other,pharmacy::common
97
+ emergency::common,emergency,hospital/healthcare,emergency::hospital
98
+ emergency::hospital,emergency,vehicle/garage,emergency::common
99
+ engineroom::firehouse,engine,,
100
+ garage::parking,garage,,
101
+ repair::automotive,repair,,
102
+ dock::common,dock,,
103
+ bulk::warehouse,bulk/pallet,fine,
104
+ fine::warehouse,fine,undefined/medium/bulk/pallet,
105
+ workshop::common,workshop,,
106
+ bay::manufacturing,bay,,
107
+ detailed::manufacturing,detailed,,
108
+ equipment::manufacturing,equipment,,
109
+ mechanical::common,electric/mechanic,,
@@ -0,0 +1,480 @@
1
+ # **************************************************************************** /
2
+ # * Copyright (c) 2008-2025, Natural Resources Canada
3
+ # * All rights reserved.
4
+ # *
5
+ # * This library is free software; you can redistribute it and/or
6
+ # * modify it under the terms of the GNU Lesser General Public
7
+ # * License as published by the Free Software Foundation; either
8
+ # * version 2.1 of the License, or (at your option) any later version.
9
+ # *
10
+ # * This library is distributed in the hope that it will be useful,
11
+ # * but WITHOUT ANY WARRANTY; without even the implied warranty of
12
+ # * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
13
+ # * Lesser General Public License for more details.
14
+ # *
15
+ # * You should have received a copy of the GNU Lesser General Public
16
+ # * License along with this library; if not, write to the Free Software
17
+ # * Foundation Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
18
+ # **************************************************************************** /
19
+
20
+ require "csv"
21
+
22
+ module BTAP
23
+ module ActivityData
24
+ ##
25
+ # @author: Denis Bourgeois
26
+ #
27
+ # BTAP module/class for general purpose 'activities' and building
28
+ # 'categories' - more abstract than NECB-specific building/space types.
29
+ #
30
+ # Consider the following: the NECB2011 designates as "Parking garage"
31
+ # (building type) what subsequent NECB editions refer to as "Storage garage".
32
+ # From the NECB2020 definitions:
33
+ #
34
+ # 'Storage garage' means a building or part thereof intended for the
35
+ # storage or parking of motor vehicles and containing no provision for
36
+ # the repair or servicing of such vehicles.
37
+ #
38
+ # This mismatch, and other related issues of a similar nature, make it
39
+ # challenging to cross-compare NECB editions, for instance. The 'exact' NECB
40
+ # labels shouldn't matter - they almost always reference the same
41
+ # building 'activity' (e.g. a facility where vehicles are parked/stored).
42
+ # BTAP should instead rely on abstract 'activity' designations, e.g.
43
+ # 'parking'. This requires module/class methods to extract specific keywords
44
+ # embedded in existing BTAP NECB building/space type datasets - see below.
45
+ #
46
+ # Once 'activity' assignments are completed (for spaces and building),
47
+ # building 'categories' are auto-assigned (e.g. "housing" vs "industry").
48
+ # For instance, multi-unit residential buildings (MURBs), university/school
49
+ # dormitories and long-term care facilities are all grouped under "housing",
50
+ # which in turn sets building-wide 'structural' options, e.g. wood-framed
51
+ # (small-scale) vs reinforced concrete flat slab & post-beam (mid- & large-
52
+ # scale) "housing". See lib/openstudio-standards/btap/structure.rb.
53
+ @@data = {bldg: {}, space: {}}
54
+
55
+ # Hard setting path for both files (temporary @todo).
56
+ @@data[:bldg ][:file ] = File.join(__dir__, "NECB_building_types.csv")
57
+ @@data[:space][:file ] = File.join(__dir__, "NECB_space_types.csv")
58
+ @@data[:bldg ][:table ] = nil
59
+ @@data[:space][:table ] = nil
60
+ @@data[:bldg ][:activity ] = {}
61
+ @@data[:space][:activity ] = {}
62
+ @@data[:bldg ][:activities] = []
63
+ @@data[:bldg ][:categories] = []
64
+
65
+ # Parse building type data on file.
66
+ if File.exist?(@@data[:bldg][:file])
67
+ table = CSV.open(@@data[:bldg][:file], headers: true).read
68
+
69
+ # 35 unique entries (rows), 6 columns per row, e.g.:
70
+ # COL1 COL2 COL3 COL4 COL5 COL6
71
+ # ______ ____ ________ _____ ________________________________ ___________
72
+ # "care, 20, housing, care, health/clinic/multi/residential, residential"
73
+ #
74
+ # COL1: BTAP building ACTIVITY e.g. "care"
75
+ # COL2: non-occupant liveload e.g. 20 kg/m2, ~1/12 of NBC min liveload
76
+ # COL3: BTAP building CATEGORY e.g. "housing"
77
+ # COL4: selected sub-string(s) e.g. "care", as in "Long-term care"
78
+ # COL5: rejected sub-string(s) e.g. "health", "multi", "residential"
79
+ # COL6: fallback (if missing) e.g. "residential"
80
+ #
81
+ # Contrary to the aforementioned 'parking' case (where fortunately there
82
+ # is an obvious one-to-one match between "Parking garage" (NECB2011) and
83
+ # "Storage garage" (NECB2020)), there is no direct match here for a
84
+ # long-term care facility when using the NECB2011. In this case, the
85
+ # fallback 'activity' is 'residential' (COL6). So in any cross-comparison
86
+ # of long-term care facilities between NECB editions, the NECB2011 variant
87
+ # would be akin to a MURB.
88
+ #
89
+ # A "long-term care" facility (e.g. NECB2020 building type, currently
90
+ # found in BTAP datasets) would be identified as belonging to activity
91
+ # 'care' by catching the substring "care" (COL4) in any of the
92
+ # NECB building types (e.g. JSON, CSV, XLSX files). Yet the same substring
93
+ # "care" is found in both NECB building types:
94
+ #
95
+ # - "Long-term care"
96
+ # - "Health-care clinic"
97
+ #
98
+ # ... rejected substrings (COL5) prune out unwanted picks. By selecting
99
+ # COL4 substrings, then rejecting COL5 substrings, there should be a
100
+ # single selected row. See NECB unit test test_necb_activities.rb.
101
+ table.each do |row|
102
+ key = row[0]
103
+
104
+ @@data[:bldg][:activity][key] = {}
105
+ @@data[:bldg][:activity][key][:liveload] = row[1].to_f
106
+ @@data[:bldg][:activity][key][:category] = row[2].to_s
107
+ @@data[:bldg][:activity][key][:includes] = row[3].to_s.split("/")
108
+ @@data[:bldg][:activity][key][:excludes] = row[4].to_s.split("/")
109
+ @@data[:bldg][:activity][key][:fallback] = row[5].to_s
110
+ end
111
+
112
+ # Keep CSV table. Ensure building activities & categories uniqueness. Add
113
+ # "common" building type, e.g. mixed use. Freeze.
114
+ @@data[:bldg][:table ] = table
115
+ @@data[:bldg][:activities] = table.by_col[0].uniq
116
+ @@data[:bldg][:categories] = table.by_col[1].uniq
117
+ @@data[:bldg][:activities] << "common"
118
+ @@data[:bldg][:activities].freeze
119
+ @@data[:bldg][:categories].freeze
120
+ else
121
+ # raise?
122
+ end
123
+
124
+ # Parse space data on file.
125
+ if File.exist?(@@data[:space][:file])
126
+ table = CSV.open(@@data[:space][:file], headers: true).read
127
+
128
+ # 108 unique rows, 4 columns per row, e.g.:
129
+ # COL1 COL2 COL3 COL4
130
+ # _____________________ ________ ____________ ___________________
131
+ # "units::care, unit, residential, units::residential"
132
+ # "exhibit::convention, exhibit, museum, "
133
+ #
134
+ # COL1: BTAP space ACTIVITY e.g. "units::care"
135
+ # COL2: selected sub-string(s) e.g. "unit"
136
+ # COL3: rejected sub-string e.g. "residential"
137
+ # COL4: fallback (if missing) e.g. "units::residential"
138
+ #
139
+ # First, BTAP space 'activity' entries are namespaced, e.g.:
140
+ # - "units": 1-word descriptor on the nature of the space 'activity'
141
+ # - "care": references a building 'activity', see @@data[:bldg]
142
+ #
143
+ # There are 2 entries for BTAP space activity "units":
144
+ # - "units::residential"
145
+ # - "units::care"
146
+ #
147
+ # The entries designate either typical residential dwelling 'units' or
148
+ # long-term care dwelling 'units'. Both are expected to offer individual
149
+ # bathroom and cooking facilities. This differs from:
150
+ # - "quarters::dorm"
151
+ # - "quarters::firehouse"
152
+ #
153
+ # ... which typically offer shared sleeping/bathroom/cooking facilities.
154
+ # Both "units" and "quarters" differ from:
155
+ # - "rooms::motel"
156
+ # - "rooms::hotel"
157
+ # - "rooms::common"
158
+ #
159
+ # ... which designate short-term, rental lodgings. All three activities
160
+ # share many features (e.g. sleeping, showers), yet each remains specific
161
+ # to an NECB space type entry (as required).
162
+ table.each do |row|
163
+ key = row[0]
164
+ str = key.split("::")
165
+
166
+ activity = str[0].to_s
167
+ bldgtype = str[1].to_s
168
+
169
+ @@data[:space][:activity][key] = {}
170
+ @@data[:space][:activity][key][:activity] = activity
171
+ @@data[:space][:activity][key][:bldgtype] = bldgtype
172
+ @@data[:space][:activity][key][:includes] = row[1].to_s.split("/")
173
+ @@data[:space][:activity][key][:excludes] = row[2].to_s.split("/")
174
+ @@data[:space][:activity][key][:fallback] = row[3].to_s
175
+ end
176
+
177
+ @@data[:space][:table] = table
178
+ else
179
+ # raise?
180
+ end
181
+
182
+ ##
183
+ # Returns BTAP Activity data.
184
+ #
185
+ # @return [Hash] BTAP Activity data
186
+ def data
187
+ @@data
188
+ end
189
+
190
+ def self.extended(base)
191
+ base.send(:include, self)
192
+ end
193
+ end
194
+
195
+ class BTAP::Activity
196
+ extend ActivityData
197
+
198
+ # @return [String] assigned or inferred building ACTIVITY (e.g. "warehouse")
199
+ attr_reader :activity
200
+
201
+ # @return [Hash] collection of space ACTIVITIES (e.g. "bulk::warehouse")
202
+ attr_reader :activities
203
+
204
+ # @return [String] building type CATEGORY (e.g. "industry")
205
+ attr_reader :category
206
+
207
+ # @return [Float] expected non-occupant liveload (e.g. 90 kg/m2)
208
+ attr_reader :liveload
209
+
210
+ # @return [Hash] logged messages
211
+ attr_reader :feedback
212
+
213
+
214
+ ##
215
+ # Initialize BTAP Activity parameters.
216
+ #
217
+ # @param model [OpenStudio::Model::Model] a model
218
+ def initialize(model = nil)
219
+ mth = "BTAP::Activity::#{__callee__}"
220
+ @feedback = {logs: []}
221
+ lgs = @feedback[:logs]
222
+ @activity = ""
223
+ @activities = {}
224
+ @category = ""
225
+
226
+ unless model.is_a?(OpenStudio::Model::Model)
227
+ lgs << "Invalid or empty OpenStudio model (#{mth})"
228
+ return
229
+ end
230
+
231
+ # Tag spaces as un/conditioned with "space_conditioning_category". For
232
+ # now, this is simply determined based on whether spaces are:
233
+ # - part of the total floor area (i.e. occupied)
234
+ # - have "attic" included in their identifiers (i.e. unconditioned)
235
+ #
236
+ # As per ASHRE 90.1, OpenStudio-Standards distinguishes between:
237
+ # - "nonresconditioned" vs
238
+ # - "resconditioned"
239
+ #
240
+ # Sticking to "nonresconditioned" - NECBs do not distinguish between "res"
241
+ # vs "non-res" (for e.g. envelope), as opposed to ASHRAE 90.1.
242
+ #
243
+ # The solution could be further refined in future BTAP versions by e.g.:
244
+ # - relying on user-defined thermostats
245
+ # - expanded to cover semi-heated and refrigerated spaces
246
+ tag = "space_conditioning_category"
247
+
248
+ model.getSpaces.each do |space|
249
+ next unless space.additionalProperties.getFeatureAsString(tag).empty?
250
+
251
+ if space.partofTotalFloorArea
252
+ space.additionalProperties.setFeature(tag, "nonresconditioned")
253
+ else
254
+ if space.nameString.downcase.include?("attic")
255
+ space.additionalProperties.setFeature(tag, "unconditioned")
256
+ else # treat all other cases as indirectly-conditioned e.g. plenums
257
+ space.additionalProperties.setFeature(tag, "nonresconditioned")
258
+ end
259
+ end
260
+ end
261
+
262
+ # Determine activities of occupied spaces in the model, then building.
263
+ @activities = self.getSpaceActivities(model)
264
+ @activity = self.getBuildingActivity(model)
265
+ @liveload = data[:bldg][:activity][@activity][:liveload]
266
+
267
+ # Assign building category.
268
+ unless @activity.empty?
269
+ @category = data[:bldg][:activity][@activity][:category]
270
+ end
271
+
272
+ true
273
+ end
274
+
275
+ ##
276
+ # Gather activities of occupied spaces in a model.
277
+ #
278
+ # @param model [OpenStudio::Model::Model] a model
279
+ #
280
+ # @return [Hash] a collection of space activities (see logs if empty)
281
+ def getSpaceActivities(model = nil)
282
+ mth = "BTAP::Activity::#{__callee__}"
283
+ cl = OpenStudio::Model::Model
284
+ return mismatch("model", model, cl, mth, DBG, {}) unless model.is_a?(cl)
285
+
286
+ activities = {}
287
+
288
+ model.getSpaces.each do |space|
289
+ next unless space.partofTotalFloorArea
290
+
291
+ # Defaulted values (if missing or invalid entries).
292
+ spacetype = nil
293
+ standards = ""
294
+ activity = ""
295
+ bldgtype = ""
296
+ fallbacks = []
297
+ candidates = []
298
+
299
+ # Recover user-set space types?
300
+ unless space.spaceType.empty?
301
+ spacetype = space.spaceType.get
302
+ stdstype = spacetype.standardsSpaceType
303
+ standards = stdstype.get.downcase unless stdstype.empty?
304
+ end
305
+
306
+ # Fetch matching BTAP data, if keywords included.
307
+ data[:space][:activity].each do |k, v|
308
+ v[:includes].each do |kword|
309
+ candidates << k if standards.include?(kword)
310
+ end
311
+ end
312
+
313
+ # Keep track of fallbacks, if applicable.
314
+ candidates.each do |candidate|
315
+ fallback = data[:space][:activity][candidate][:fallback]
316
+ fallbacks << fallback unless fallback.empty?
317
+ end
318
+
319
+ # Reject if matching excluded keywords.
320
+ data[:space][:activity].each do |k, v|
321
+ v[:excludes].each do |kword|
322
+ candidates.delete(k) if standards.include?(kword)
323
+ end
324
+ end
325
+
326
+ # Fallbacks?
327
+ if candidates.empty?
328
+ candidate = ""
329
+
330
+ fallbacks.each do |fallback|
331
+ break unless candidate.empty?
332
+
333
+ candidate = fallback if data[:space][:activity].key?(fallback)
334
+ end
335
+
336
+ candidate = data[:space][:activity].keys.first if candidate.empty?
337
+ else
338
+ candidate = candidates.first
339
+ end
340
+
341
+ entry = {}
342
+ entry[:m2 ] = space.floorArea
343
+ entry[:spacetype] = spacetype
344
+ entry[:standards] = standards
345
+ entry[:activity ] = data[:space][:activity][candidate][:activity]
346
+ entry[:bldgtype ] = data[:space][:activity][candidate][:bldgtype]
347
+
348
+ activities[space] = entry
349
+ end
350
+
351
+ activities
352
+ end
353
+
354
+ ##
355
+ # Determines general building activity, either set by user or inferred.
356
+ #
357
+ # @param model OpenStudio::Model::Model] a model
358
+ #
359
+ # @return [String] keyword describing a model's general activity
360
+ def getBuildingActivity(model = nil)
361
+ mth = "BTAP::Activity::#{__callee__}"
362
+ cl = OpenStudio::Model::Model
363
+ return mismatch("model", model, cl, mth, DBG, "") unless model.is_a?(cl)
364
+
365
+ # OPTION A: Extract building activity from user-set 'additionalProperty'.
366
+ tag = "btap_building_activity"
367
+ bldg = model.getBuilding
368
+ activity = bldg.additionalProperties.getFeatureAsString(tag)
369
+
370
+ if activity.empty?
371
+ activity = ""
372
+ else
373
+ activity = activity.get.downcase
374
+ return activity if data[:bldg][:activities].include?(activity)
375
+ end
376
+
377
+ # OPTION B: Extract building activity from user-set 'building type'.
378
+ bldgtype = model.getBuilding.standardsBuildingType
379
+
380
+ unless bldgtype.empty?
381
+ bldgtype = bldgtype.get.downcase
382
+ candidates = []
383
+ fallbacks = []
384
+
385
+ # Fetch matching BTAP data, if keywords included.
386
+ data[:bldg][:activity].each do |k, v|
387
+ v[:includes].each do |kword|
388
+ candidates << k if bldgtype.include?(kword)
389
+ end
390
+ end
391
+
392
+ # Keep track of fallbacks, if applicable.
393
+ candidates.each do |candidate|
394
+ fallback = data[:bldg][:activity][candidate][:fallback]
395
+ fallbacks << fallback unless fallback.empty?
396
+ end
397
+
398
+ # Reject if matching excluded keywords.
399
+ data[:bldg][:activity].each do |k, v|
400
+ v[:excludes].each do |kword|
401
+ candidates.delete(k) if bldgtype.include?(kword)
402
+ end
403
+ end
404
+
405
+ # Fallbacks?
406
+ if candidates.empty?
407
+ fallbacks.each do |fallback|
408
+ return fallback if data[:bldg][:activity].key?(fallback)
409
+ end
410
+ else
411
+ return candidates.first
412
+ end
413
+ end
414
+
415
+ # OPTION C: Infer building activity from distribution of spacetypes.
416
+ bldgtypes = {}
417
+
418
+ @activities.values.each do |v|
419
+ next unless v.key?(:m2)
420
+ next unless v.key?(:bldgtype)
421
+
422
+ bldgtypes[v[:bldgtype]] = 0 unless bldgtypes.include?(v[:bldgtype])
423
+ bldgtypes[v[:bldgtype]] += v[:m2]
424
+ end
425
+
426
+ activity = bldgtypes.sort.reverse.to_h.keys.first unless bldgtypes.empty?
427
+ # Many NECB space types are listed as "common". Examples include spaces
428
+ # that are educational in nature (e.g. "classroom", "teachinglabs") and
429
+ # typical office spaces (e.g. "openplan", "office"). This is odd, as NECBs
430
+ # list "school/university" and "office" as admissible building types.
431
+ # Inferring an overall building type/activity (e.g. "school"), based on
432
+ # the prevalence of space types (e.g. "classrooms") in a model, becomes
433
+ # unnecessarily challenging. A fallback solution is needed when
434
+ # predominant space types end up as "common" for a given model.
435
+ #
436
+ # One odd exception is 'audience' seating for an "auditorium", which is
437
+ # found in all NECB editions. All listed 'audience' seating space types
438
+ # are linked to a listed building type, e.g.:
439
+ # - "religious building"
440
+ # - "sports arena"
441
+ # - "motion picture theatre"
442
+ #
443
+ # ... except for "auditorium". No NECB edition holds an "auditorium"
444
+ # building type entry. For the moment, "auditorium" will be associated
445
+ # with the ubiquitous high-school or college auditorium.
446
+ if activity == "common"
447
+ activities = {}
448
+
449
+ @activities.values.each do |v|
450
+ next unless v.key?(:m2)
451
+ next unless v.key?(:activity)
452
+
453
+ activities[v[:activity]] = 0 unless activities.key?(v[:activity])
454
+ activities[v[:activity]] += v[:m2]
455
+ end
456
+
457
+ activity = case activities.sort.reverse.to_h.keys.first
458
+ when "audience" then "school"
459
+ when "sales" then "retail"
460
+ when "dining" then "restaurant"
461
+ when "cuisine" then "restaurant"
462
+ when "rooms" then "hotel"
463
+ when "recreation" then "exercise"
464
+ when "cell" then "penitentiary"
465
+ when "classroom" then "school"
466
+ when "teachinglab" then "school"
467
+ when "storage" then "warehouse"
468
+ when "laundry" then "retail"
469
+ when "lounge" then "leisure"
470
+ when "pharmacy" then "retail"
471
+ else "office"
472
+ end
473
+ end
474
+
475
+ activity = "office" if activity.empty?
476
+
477
+ activity
478
+ end
479
+ end
480
+ end