openstudio-standards 0.8.4 → 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 (289) 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/{costing/common_paths.rb → common_paths.rb} +14 -11
  33. data/lib/openstudio-standards/btap/common_resources/carbon_frame.csv +35 -0
  34. data/lib/openstudio-standards/btap/common_resources/carbon_glazing.csv +35 -0
  35. data/lib/openstudio-standards/btap/common_resources/carbon_opaque.csv +164 -0
  36. data/lib/openstudio-standards/btap/common_resources/constructions_glazing.csv +121 -0
  37. data/lib/openstudio-standards/btap/common_resources/costs.csv +1897 -0
  38. data/lib/openstudio-standards/btap/{costing/common_resources → common_resources}/lighting.csv +59 -59
  39. data/lib/openstudio-standards/btap/{costing/common_resources → common_resources}/materials_hvac.csv +1019 -1032
  40. data/lib/openstudio-standards/btap/costing/btap_costing.rb +3 -7
  41. data/lib/openstudio-standards/btap/costing/costing_database_wrapper.rb +1 -5
  42. data/lib/openstudio-standards/btap/costing/daylighting_sensor_control_costing.rb +5 -4
  43. data/lib/openstudio-standards/btap/costing/dcv_costing.rb +1 -1
  44. data/lib/openstudio-standards/btap/costing/envelope_costing.rb +112 -181
  45. data/lib/openstudio-standards/btap/costing/heating_cooling_costing.rb +4 -4
  46. data/lib/openstudio-standards/btap/costing/led_lighting_costing.rb +2 -1
  47. data/lib/openstudio-standards/btap/costing/lighting_costing.rb +3 -3
  48. data/lib/openstudio-standards/btap/costing/test_list.txt +15 -17
  49. data/lib/openstudio-standards/btap/costing/test_run_all_test_locally.rb +10 -9
  50. data/lib/openstudio-standards/btap/geometry.rb +86 -6
  51. data/lib/openstudio-standards/btap/structure.rb +657 -0
  52. data/lib/openstudio-standards/create_typical/create_typical.rb +17 -33
  53. data/lib/openstudio-standards/create_typical/space_type_ratios.rb +36 -36
  54. data/lib/openstudio-standards/equipment/create_transformer.rb +104 -0
  55. data/lib/openstudio-standards/equipment/create_typical_equipment.rb +117 -0
  56. data/lib/openstudio-standards/equipment/data/electric_equipment_space_types.json +1514 -0
  57. data/lib/openstudio-standards/equipment/data/gas_equipment_space_types.json +227 -0
  58. data/lib/openstudio-standards/exterior_lighting/create.rb +22 -22
  59. data/lib/openstudio-standards/exterior_lighting/information.rb +3 -2
  60. data/lib/openstudio-standards/hvac/components/air_conditioner_vrf.rb +482 -0
  61. data/lib/openstudio-standards/hvac/components/air_terminal.rb +31 -0
  62. data/lib/openstudio-standards/hvac/components/boiler_hot_water.rb +163 -0
  63. data/lib/openstudio-standards/hvac/components/central_air_source_heat_pump.rb +220 -0
  64. data/lib/openstudio-standards/hvac/components/chiller.rb +25 -0
  65. data/lib/openstudio-standards/hvac/components/coil.rb +276 -0
  66. data/lib/openstudio-standards/hvac/components/coil_cooling_dx_multi_speed.rb +40 -0
  67. data/lib/openstudio-standards/hvac/components/coil_cooling_dx_single_speed.rb +300 -0
  68. data/lib/openstudio-standards/hvac/components/coil_cooling_dx_two_speed.rb +187 -0
  69. data/lib/openstudio-standards/hvac/components/coil_cooling_water.rb +80 -0
  70. data/lib/openstudio-standards/hvac/components/coil_cooling_water_to_air_heat_pump_equation_fit.rb +182 -0
  71. data/lib/openstudio-standards/hvac/components/coil_heating_dx_single_speed.rb +220 -0
  72. data/lib/openstudio-standards/hvac/components/coil_heating_electric.rb +56 -0
  73. data/lib/openstudio-standards/hvac/components/coil_heating_gas.rb +90 -0
  74. data/lib/openstudio-standards/hvac/components/coil_heating_gas_multi_stage.rb +33 -0
  75. data/lib/openstudio-standards/hvac/components/coil_heating_water.rb +98 -0
  76. data/lib/openstudio-standards/hvac/components/coil_heating_water_to_air_heat_pump_equation_fit.rb +147 -0
  77. data/lib/openstudio-standards/hvac/components/component.rb +39 -0
  78. data/lib/openstudio-standards/{standards/ashrae_90_1/data/ashrae_90_1.fans.json → hvac/components/data/fans.json} +6 -6
  79. data/lib/openstudio-standards/hvac/components/fan.rb +363 -0
  80. data/lib/openstudio-standards/hvac/components/heat_exchanger_air_to_air.rb +203 -0
  81. data/lib/openstudio-standards/hvac/components/pump.rb +181 -0
  82. data/lib/openstudio-standards/hvac/controls/radiant_system_controls.rb +594 -0
  83. data/lib/openstudio-standards/hvac/conversions.rb +222 -0
  84. data/lib/openstudio-standards/hvac/curves.rb +192 -0
  85. data/lib/openstudio-standards/hvac/helpers.rb +357 -0
  86. data/lib/openstudio-standards/hvac/setpoint_managers/information.rb +4 -4
  87. data/lib/openstudio-standards/interior_lighting/create_lights.rb +52 -0
  88. data/lib/openstudio-standards/interior_lighting/create_typical_interior_lighting.rb +254 -0
  89. data/lib/openstudio-standards/interior_lighting/data/convert_lighting_data.rb +249 -0
  90. data/lib/openstudio-standards/interior_lighting/data/lighting_space_types.csv +96 -0
  91. data/lib/openstudio-standards/interior_lighting/data/lighting_space_types.json +1429 -0
  92. data/lib/openstudio-standards/interior_lighting/data/lighting_technology.csv +46 -0
  93. data/lib/openstudio-standards/interior_lighting/data/lighting_technology.json +859 -0
  94. data/lib/openstudio-standards/prototypes/ashrae_90_1/ashrae_90_1_2010/ashrae_90_1_2010.AirTerminalSingleDuctVAVReheat.rb +1 -1
  95. data/lib/openstudio-standards/prototypes/ashrae_90_1/ashrae_90_1_2013/ashrae_90_1_2013.AirTerminalSingleDuctVAVReheat.rb +1 -1
  96. data/lib/openstudio-standards/prototypes/ashrae_90_1/ashrae_90_1_2016/ashrae_90_1_2016.AirTerminalSingleDuctVAVReheat.rb +1 -1
  97. data/lib/openstudio-standards/prototypes/ashrae_90_1/ashrae_90_1_2016/ashrae_90_1_2016.Model.rb +4 -4
  98. data/lib/openstudio-standards/prototypes/ashrae_90_1/ashrae_90_1_2019/ashrae_90_1_2019.AirTerminalSingleDuctVAVReheat.rb +1 -1
  99. data/lib/openstudio-standards/prototypes/ashrae_90_1/ashrae_90_1_2019/ashrae_90_1_2019.Model.rb +4 -4
  100. data/lib/openstudio-standards/prototypes/ashrae_90_1/nrel_nze_ready_2017/nrel_zne_ready_2017.AirTerminalSingleDuctVAVReheat.rb +1 -1
  101. data/lib/openstudio-standards/prototypes/ashrae_90_1/ze_aedg_multifamily/ze_aedg_multifamily.AirTerminalSingleDuctVAVReheat.rb +1 -1
  102. data/lib/openstudio-standards/prototypes/common/buildings/Prototype.HighRiseApartment.rb +6 -7
  103. data/lib/openstudio-standards/prototypes/common/buildings/Prototype.Hospital.rb +15 -15
  104. data/lib/openstudio-standards/prototypes/common/buildings/Prototype.LargeHotel.rb +4 -4
  105. data/lib/openstudio-standards/prototypes/common/buildings/Prototype.LargeOffice.rb +5 -5
  106. data/lib/openstudio-standards/prototypes/common/buildings/Prototype.MediumOffice.rb +6 -6
  107. data/lib/openstudio-standards/prototypes/common/buildings/Prototype.Outpatient.rb +7 -7
  108. data/lib/openstudio-standards/prototypes/common/buildings/Prototype.PrimarySchool.rb +4 -4
  109. data/lib/openstudio-standards/prototypes/common/buildings/Prototype.SecondarySchool.rb +6 -6
  110. data/lib/openstudio-standards/prototypes/common/buildings/Prototype.SmallOfficeDetailed.rb +5 -1
  111. data/lib/openstudio-standards/prototypes/common/data/prototype_space_type_map.json +2594 -0
  112. data/lib/openstudio-standards/prototypes/common/data/thermostat_schedule_lookup.json +2108 -0
  113. data/lib/openstudio-standards/prototypes/common/objects/Prototype.AirTerminalSingleDuctVAVReheat.rb +33 -0
  114. data/lib/openstudio-standards/prototypes/common/objects/Prototype.Fan.rb +0 -140
  115. data/lib/openstudio-standards/prototypes/common/objects/Prototype.FanConstantVolume.rb +1 -73
  116. data/lib/openstudio-standards/prototypes/common/objects/Prototype.FanOnOff.rb +1 -69
  117. data/lib/openstudio-standards/prototypes/common/objects/Prototype.FanVariableVolume.rb +0 -116
  118. data/lib/openstudio-standards/prototypes/common/objects/Prototype.FanZoneExhaust.rb +0 -61
  119. data/lib/openstudio-standards/prototypes/common/objects/Prototype.Model.hvac.rb +2 -2
  120. data/lib/openstudio-standards/prototypes/common/objects/Prototype.Model.rb +128 -13
  121. data/lib/openstudio-standards/prototypes/common/objects/Prototype.hvac_systems.rb +606 -607
  122. data/lib/openstudio-standards/prototypes/common/prototype_space_type_map.rb +41 -0
  123. data/lib/openstudio-standards/prototypes/common/space_type_equipment_map.rb +184 -0
  124. data/lib/openstudio-standards/prototypes/common/space_type_thermostat_schedule_map.rb +116 -0
  125. data/lib/openstudio-standards/qaqc/hvac.rb +12 -12
  126. data/lib/openstudio-standards/refrigeration/create_compressor.rb +2 -5
  127. data/lib/openstudio-standards/refrigeration/data/refrigeration_compressors.csv +4 -4
  128. data/lib/openstudio-standards/service_water_heating/create_water_heater.rb +1 -2
  129. data/lib/openstudio-standards/service_water_heating/create_water_use.rb +5 -5
  130. data/lib/openstudio-standards/space_type/data/level_1_space_types.json +612 -0
  131. data/lib/openstudio-standards/space_type/standards_space_type.rb +53 -0
  132. data/lib/openstudio-standards/standards/Standards.AirConditionerVariableRefrigerantFlow.rb +8 -26
  133. data/lib/openstudio-standards/standards/Standards.AirLoopHVAC.rb +13 -13
  134. data/lib/openstudio-standards/standards/Standards.AirTerminalSingleDuctVAVReheat.rb +0 -24
  135. data/lib/openstudio-standards/standards/Standards.BoilerHotWater.rb +6 -43
  136. data/lib/openstudio-standards/standards/Standards.ChillerElectricEIR.rb +7 -24
  137. data/lib/openstudio-standards/standards/Standards.CoilCoolingDXMultiSpeed.rb +19 -44
  138. data/lib/openstudio-standards/standards/Standards.CoilCoolingDXSingleSpeed.rb +25 -50
  139. data/lib/openstudio-standards/standards/Standards.CoilCoolingDXTwoSpeed.rb +25 -33
  140. data/lib/openstudio-standards/standards/Standards.CoilCoolingWaterToAirHeatPumpEquationFit.rb +9 -22
  141. data/lib/openstudio-standards/standards/Standards.CoilDX.rb +15 -157
  142. data/lib/openstudio-standards/standards/Standards.CoilHeatingDXMultiSpeed.rb +2 -2
  143. data/lib/openstudio-standards/standards/Standards.CoilHeatingDXSingleSpeed.rb +18 -105
  144. data/lib/openstudio-standards/standards/Standards.CoilHeatingGas.rb +3 -23
  145. data/lib/openstudio-standards/standards/Standards.CoilHeatingGasMultiStage.rb +0 -24
  146. data/lib/openstudio-standards/standards/Standards.CoilHeatingWaterToAirHeatPumpEquationFit.rb +2 -86
  147. data/lib/openstudio-standards/standards/Standards.FanVariableVolume.rb +0 -107
  148. data/lib/openstudio-standards/standards/Standards.Model.rb +6 -11
  149. data/lib/openstudio-standards/standards/Standards.People.rb +113 -0
  150. data/lib/openstudio-standards/standards/Standards.PlantLoop.rb +11 -11
  151. data/lib/openstudio-standards/standards/Standards.Pump.rb +2 -147
  152. data/lib/openstudio-standards/standards/Standards.PumpVariableSpeed.rb +57 -41
  153. data/lib/openstudio-standards/standards/Standards.SpaceType.rb +30 -153
  154. data/lib/openstudio-standards/standards/Standards.Ventilation.rb +74 -0
  155. data/lib/openstudio-standards/standards/Standards.ZoneHVACComponent.rb +1 -1
  156. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2004/ashrae_90_1_2004.PlantLoop.rb +4 -4
  157. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2004/data/ashrae_90_1_2004.heat_pumps_heating.json +3 -3
  158. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2004/data/ashrae_90_1_2004.spc_typ.json +37 -112
  159. 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
  160. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2007/data/ashrae_90_1_2007.heat_pumps_heating.json +3 -3
  161. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2007/data/ashrae_90_1_2007.spc_typ.json +37 -112
  162. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2010/ashrae_90_1_2010.AirTerminalSingleDuctVAVReheat.rb +1 -1
  163. 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
  164. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2010/data/ashrae_90_1_2010.heat_pumps_heating.json +6 -6
  165. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2010/data/ashrae_90_1_2010.spc_typ.json +37 -37
  166. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2013/ashrae_90_1_2013.AirTerminalSingleDuctVAVReheat.rb +1 -1
  167. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2013/ashrae_90_1_2013.BoilerHotWater.rb +1 -1
  168. 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
  169. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2013/data/ashrae_90_1_2013.heat_pumps_heating.json +6 -6
  170. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2013/data/ashrae_90_1_2013.spc_typ.json +37 -37
  171. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2016/ashrae_90_1_2016.AirTerminalSingleDuctVAVReheat.rb +1 -1
  172. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2016/ashrae_90_1_2016.BoilerHotWater.rb +1 -1
  173. 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
  174. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2016/data/ashrae_90_1_2016.heat_pumps_heating.json +6 -6
  175. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2016/data/ashrae_90_1_2016.spc_typ.json +37 -37
  176. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2019/ashrae_90_1_2019.AirLoopHVAC.rb +1 -1
  177. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2019/ashrae_90_1_2019.AirTerminalSingleDuctVAVReheat.rb +1 -1
  178. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2019/ashrae_90_1_2019.BoilerHotWater.rb +1 -1
  179. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2019/ashrae_90_1_2019.CoilHeatingGas.rb +1 -1
  180. 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
  181. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2019/data/ashrae_90_1_2019.heat_pumps_heating.json +6 -6
  182. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2019/data/ashrae_90_1_2019.spc_typ.json +37 -37
  183. data/lib/openstudio-standards/standards/ashrae_90_1/data/ashrae_90_1.curves.json +0 -200
  184. 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
  185. data/lib/openstudio-standards/standards/ashrae_90_1/doe_ref_1980_2004/data/doe_ref_1980_2004.spc_typ.json +37 -37
  186. 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
  187. data/lib/openstudio-standards/standards/ashrae_90_1/doe_ref_pre_1980/data/doe_ref_pre_1980.spc_typ.json +37 -37
  188. data/lib/openstudio-standards/standards/ashrae_90_1/nrel_zne_ready_2017/nrel_zne_ready_2017.AirTerminalSingleDuctVAVReheat.rb +1 -1
  189. data/lib/openstudio-standards/standards/ashrae_90_1/nrel_zne_ready_2017/nrel_zne_ready_2017.PlantLoop.rb +5 -5
  190. data/lib/openstudio-standards/standards/ashrae_90_1/ze_aedg_multifamily/ze_aedg_multifamily.AirTerminalSingleDuctVAVReheat.rb +1 -1
  191. data/lib/openstudio-standards/standards/ashrae_90_1/ze_aedg_multifamily/ze_aedg_multifamily.PlantLoop.rb +5 -5
  192. data/lib/openstudio-standards/standards/ashrae_90_1_prm/ashrae_90_1_prm.AirLoopHVAC.rb +1 -1
  193. data/lib/openstudio-standards/standards/ashrae_90_1_prm/ashrae_90_1_prm.ChillerElectricEIR.rb +2 -2
  194. data/lib/openstudio-standards/standards/ashrae_90_1_prm/ashrae_90_1_prm.CoilCoolingDXSingleSpeed.rb +2 -68
  195. data/lib/openstudio-standards/standards/ashrae_90_1_prm/ashrae_90_1_prm.CoilCoolingDXTwoSpeed.rb +2 -35
  196. data/lib/openstudio-standards/standards/ashrae_90_1_prm/ashrae_90_1_prm.CoilDX.rb +42 -0
  197. data/lib/openstudio-standards/standards/ashrae_90_1_prm/ashrae_90_1_prm.CoilHeatingDXSingleSpeed.rb +5 -2
  198. data/lib/openstudio-standards/standards/ashrae_90_1_prm/ashrae_90_1_prm.CoilHeatingGas.rb +2 -2
  199. data/lib/openstudio-standards/standards/ashrae_90_1_prm/ashrae_90_1_prm.PlantLoop.rb +3 -3
  200. data/lib/openstudio-standards/standards/ashrae_90_1_prm/ashrae_90_1_prm.SpaceType.rb +1 -1
  201. data/lib/openstudio-standards/standards/ashrae_90_1_prm/ashrae_90_1_prm_2019/ashrae_90_1_prm_2019.Model.rb +1 -0
  202. data/lib/openstudio-standards/standards/ashrae_90_1_prm/ashrae_90_1_prm_2019/ashrae_90_1_prm_2019_WaterHeaterMixed.rb +2 -4
  203. data/lib/openstudio-standards/standards/ashrae_90_1_prm/data/ashrae_90_1_prm.curves.json +0 -200
  204. data/lib/openstudio-standards/standards/ashrae_90_1_prm/data/ashrae_90_1_prm.fans.json +5 -5
  205. data/lib/openstudio-standards/standards/ashrae_90_1_prm/userdata_csv/ashrae_90_1_prm.UserData.rb +1 -0
  206. data/lib/openstudio-standards/standards/ashrae_90_1_prm/userdata_csv/userdata_enums.rb +0 -1
  207. data/lib/openstudio-standards/standards/cbes/data/cbes.curves.json +0 -200
  208. data/lib/openstudio-standards/standards/deer/data/deer.curves.json +0 -200
  209. data/lib/openstudio-standards/standards/necb/BTAPPRE1980/btap_pre1980.rb +19 -10
  210. data/lib/openstudio-standards/standards/necb/BTAPPRE1980/building_envelope.rb +12 -11
  211. data/lib/openstudio-standards/standards/necb/BTAPPRE1980/hvac_systems.rb +4 -4
  212. data/lib/openstudio-standards/standards/necb/ECMS/ecms.rb +1 -1
  213. data/lib/openstudio-standards/standards/necb/ECMS/hvac_systems.rb +69 -92
  214. data/lib/openstudio-standards/standards/necb/NECB2011/autozone.rb +2 -1
  215. data/lib/openstudio-standards/standards/necb/NECB2011/beps_compliance_path.rb +16 -12
  216. data/lib/openstudio-standards/standards/necb/NECB2011/building_envelope.rb +799 -46
  217. data/lib/openstudio-standards/standards/necb/NECB2011/data/chillers.json +33 -51
  218. data/lib/openstudio-standards/standards/necb/NECB2011/data/constants.json +32 -0
  219. data/lib/openstudio-standards/standards/necb/NECB2011/data/fuel_type_sets.json +18 -0
  220. data/lib/openstudio-standards/standards/necb/NECB2011/data/heat_pumps_heating.json +21 -15
  221. data/lib/openstudio-standards/standards/necb/NECB2011/hvac_namer.rb +5 -5
  222. data/lib/openstudio-standards/standards/necb/NECB2011/hvac_system_1_single_speed.rb +2 -0
  223. data/lib/openstudio-standards/standards/necb/NECB2011/hvac_systems.rb +30 -141
  224. data/lib/openstudio-standards/standards/necb/NECB2011/necb_2011.rb +233 -112
  225. data/lib/openstudio-standards/standards/necb/NECB2015/data/heat_pumps_heating.json +10 -2
  226. data/lib/openstudio-standards/standards/necb/NECB2015/hvac_systems.rb +2 -2
  227. data/lib/openstudio-standards/standards/necb/NECB2020/data/heat_pumps_heating.json +16 -6
  228. data/lib/openstudio-standards/standards/necb/NECB2020/data/unitary_acs.json +60 -61
  229. data/lib/openstudio-standards/standards/necb/NECB2020/service_water_heating.rb +30 -30
  230. data/lib/openstudio-standards/standards/necb/common/btap_analysis.rb +79 -0
  231. data/lib/openstudio-standards/standards/necb/common/btap_data.rb +16 -4
  232. data/lib/openstudio-standards/standards/necb/common/btap_datapoint.rb +65 -42
  233. data/lib/openstudio-standards/thermal_zone/{thermal_zone.rb → information.rb} +12 -45
  234. data/lib/openstudio-standards/thermal_zone/thermostat_schedules.rb +152 -0
  235. data/lib/openstudio-standards/version.rb +1 -1
  236. data/lib/openstudio-standards/weather/stat_file.rb +2 -2
  237. data/lib/openstudio-standards.rb +55 -38
  238. metadata +106 -66
  239. data/lib/openstudio-standards/btap/costing/common_resources/constructions_glazing.csv +0 -61
  240. data/lib/openstudio-standards/btap/costing/common_resources/costs.csv +0 -1904
  241. data/lib/openstudio-standards/hvac/components/create.rb +0 -169
  242. data/lib/openstudio-standards/hvac/components/modify.rb +0 -42
  243. data/lib/openstudio-standards/prototypes/common/objects/Prototype.AirConditionerVariableRefrigerantFlow.rb +0 -438
  244. data/lib/openstudio-standards/prototypes/common/objects/Prototype.BoilerHotWater.rb +0 -123
  245. data/lib/openstudio-standards/prototypes/common/objects/Prototype.CentralAirSourceHeatPump.rb +0 -216
  246. data/lib/openstudio-standards/prototypes/common/objects/Prototype.CoilCoolingDXSingleSpeed.rb +0 -273
  247. data/lib/openstudio-standards/prototypes/common/objects/Prototype.CoilCoolingDXTwoSpeed.rb +0 -159
  248. data/lib/openstudio-standards/prototypes/common/objects/Prototype.CoilCoolingWater.rb +0 -77
  249. data/lib/openstudio-standards/prototypes/common/objects/Prototype.CoilCoolingWaterToAirHeatPumpEquationFit.rb +0 -154
  250. data/lib/openstudio-standards/prototypes/common/objects/Prototype.CoilHeatingDXSingleSpeed.rb +0 -214
  251. data/lib/openstudio-standards/prototypes/common/objects/Prototype.CoilHeatingElectric.rb +0 -53
  252. data/lib/openstudio-standards/prototypes/common/objects/Prototype.CoilHeatingGas.rb +0 -72
  253. data/lib/openstudio-standards/prototypes/common/objects/Prototype.CoilHeatingWater.rb +0 -95
  254. data/lib/openstudio-standards/prototypes/common/objects/Prototype.CoilHeatingWaterToAirHeatPumpEquationFit.rb +0 -125
  255. data/lib/openstudio-standards/prototypes/common/objects/Prototype.ControllerWaterCoil.rb +0 -17
  256. data/lib/openstudio-standards/prototypes/common/objects/Prototype.Model.transformers.rb +0 -90
  257. data/lib/openstudio-standards/prototypes/common/objects/Prototype.Pump.rb +0 -4
  258. data/lib/openstudio-standards/prototypes/common/objects/Prototype.PumpVariableSpeed.rb +0 -70
  259. data/lib/openstudio-standards/prototypes/common/objects/Prototype.radiant_system_controls.rb +0 -590
  260. data/lib/openstudio-standards/prototypes/common/objects/Prototype.utilities.rb +0 -901
  261. data/lib/openstudio-standards/standards/Standards.FanConstantVolume.rb +0 -5
  262. data/lib/openstudio-standards/standards/Standards.FanOnOff.rb +0 -5
  263. data/lib/openstudio-standards/standards/Standards.FanZoneExhaust.rb +0 -5
  264. data/lib/openstudio-standards/standards/Standards.HeaderedPumpsConstantSpeed.rb +0 -5
  265. data/lib/openstudio-standards/standards/Standards.HeaderedPumpsVariableSpeed.rb +0 -55
  266. data/lib/openstudio-standards/standards/Standards.PumpConstantSpeed.rb +0 -5
  267. data/lib/openstudio-standards/standards/ashrae_90_1_prm/ashrae_90_1_prm.FanConstantVolume.rb +0 -5
  268. data/lib/openstudio-standards/standards/ashrae_90_1_prm/ashrae_90_1_prm.FanOnOff.rb +0 -5
  269. data/lib/openstudio-standards/standards/ashrae_90_1_prm/ashrae_90_1_prm.FanZoneExhaust.rb +0 -5
  270. data/lib/openstudio-standards/standards/cbes/data/cbes.fans.json +0 -328
  271. data/lib/openstudio-standards/standards/deer/data/deer.fans.json +0 -328
  272. /data/lib/openstudio-standards/btap/{costing/common_resources → common_resources}/ConstructionProperties.csv +0 -0
  273. /data/lib/openstudio-standards/btap/{costing/common_resources → common_resources}/Constructions.csv +0 -0
  274. /data/lib/openstudio-standards/btap/{costing/common_resources → common_resources}/construction_sets.csv +0 -0
  275. /data/lib/openstudio-standards/btap/{costing/common_resources → common_resources}/constructions_opaque.csv +0 -0
  276. /data/lib/openstudio-standards/btap/{costing/common_resources → common_resources}/costs_local_factors.csv +0 -0
  277. /data/lib/openstudio-standards/btap/{costing/common_resources → common_resources}/hvac_vent_ahu.csv +0 -0
  278. /data/lib/openstudio-standards/btap/{costing/common_resources → common_resources}/lighting_sets.csv +0 -0
  279. /data/lib/openstudio-standards/btap/{costing/common_resources → common_resources}/locations.csv +0 -0
  280. /data/lib/openstudio-standards/btap/{costing/common_resources → common_resources}/materials_glazing.csv +0 -0
  281. /data/lib/openstudio-standards/btap/{costing/common_resources → common_resources}/materials_lighting.csv +0 -0
  282. /data/lib/openstudio-standards/btap/{costing/common_resources → common_resources}/materials_opaque.csv +0 -0
  283. /data/lib/openstudio-standards/{prototypes → standards}/ashrae_90_1/ashrae_90_1_2004/ashrae_90_1_2004.PumpVariableSpeed.rb +0 -0
  284. /data/lib/openstudio-standards/{prototypes → standards}/ashrae_90_1/ashrae_90_1_2007/ashrae_90_1_2007.PumpVariableSpeed.rb +0 -0
  285. /data/lib/openstudio-standards/{prototypes → standards}/ashrae_90_1/ashrae_90_1_2010/ashrae_90_1_2010.PumpVariableSpeed.rb +0 -0
  286. /data/lib/openstudio-standards/{prototypes → standards}/ashrae_90_1/ashrae_90_1_2013/ashrae_90_1_2013.PumpVariableSpeed.rb +0 -0
  287. /data/lib/openstudio-standards/{prototypes → standards}/ashrae_90_1/ashrae_90_1_2016/ashrae_90_1_2016.PumpVariableSpeed.rb +0 -0
  288. /data/lib/openstudio-standards/{prototypes → standards}/ashrae_90_1/ashrae_90_1_2019/ashrae_90_1_2019.Pump.rb +0 -0
  289. /data/lib/openstudio-standards/{prototypes → standards}/ashrae_90_1/ashrae_90_1_2019/ashrae_90_1_2019.PumpVariableSpeed.rb +0 -0
@@ -0,0 +1,220 @@
1
+ module OpenstudioStandards
2
+ # The HVAC module provides methods create, modify, and get information about HVAC systems in the model
3
+ module HVAC
4
+ # @!group Component:CentralAirSourceHeatPump
5
+ # Methods to create central air source heat pumps
6
+
7
+ # Create CentralAirSourceHeatPump object using PlantComponentUserDefined
8
+ #
9
+ # @param model [OpenStudio::Model::Model] OpenStudio model object
10
+ # @param hot_water_loop [<OpenStudio::Model::PlantLoop>] a hot water loop served by the central air source heat pump
11
+ # @param name [String] the name of the central air source heat pump, or nil in which case it will be defaulted
12
+ # @param cop [Double] air source heat pump rated cop
13
+ # @return [OpenStudio::Model::PlantComponentUserDefined] a plant component representing the air source heat pump
14
+ # @todo update curve to better calculate based on the rated cop
15
+ # @todo refactor to use the new EnergyPlus central air source heat pump object when it becomes available
16
+ # set hot_water_loop to an optional keyword argument, and add input keyword arguments for other characteristics
17
+ def self.create_central_air_source_heat_pump(model,
18
+ hot_water_loop,
19
+ name: nil,
20
+ cop: 3.65)
21
+
22
+ # create the PlantComponentUserDefined object as a proxy for the Central Air Source Heat Pump
23
+ plant_comp = OpenStudio::Model::PlantComponentUserDefined.new(model)
24
+ if name.nil?
25
+ if hot_water_loop.nil?
26
+ name = 'Central Air Source Heat Pump'
27
+ else
28
+ name = "#{hot_water_loop.name} Central Air Source Heat Pump"
29
+ end
30
+ end
31
+
32
+ # change equipment name for EMS validity
33
+ plant_comp.setName(OpenstudioStandards::HVAC.ems_friendly_name(name))
34
+
35
+ # set plant component properties
36
+ plant_comp.setPlantLoadingMode('MeetsLoadWithNominalCapacityHiOutLimit')
37
+ plant_comp.setPlantLoopFlowRequestMode('NeedsFlowIfLoopOn')
38
+
39
+ # plant design volume flow rate internal variable
40
+ vdot_des_int_var = OpenStudio::Model::EnergyManagementSystemInternalVariable.new(model, 'Plant Design Volume Flow Rate')
41
+ vdot_des_int_var.setName("#{plant_comp.name}_Vdot_Des_Int_Var")
42
+ vdot_des_int_var.setInternalDataIndexKeyName(hot_water_loop.handle.to_s)
43
+
44
+ # inlet temperature internal variable
45
+ tin_int_var = OpenStudio::Model::EnergyManagementSystemInternalVariable.new(model, 'Inlet Temperature for Plant Connection 1')
46
+ tin_int_var.setName("#{plant_comp.name}_Tin_Int_Var")
47
+ tin_int_var.setInternalDataIndexKeyName(plant_comp.handle.to_s)
48
+
49
+ # inlet mass flow rate internal variable
50
+ mdot_int_var = OpenStudio::Model::EnergyManagementSystemInternalVariable.new(model, 'Inlet Mass Flow Rate for Plant Connection 1')
51
+ mdot_int_var.setName("#{plant_comp.name}_Mdot_Int_Var")
52
+ mdot_int_var.setInternalDataIndexKeyName(plant_comp.handle.to_s)
53
+
54
+ # inlet specific heat internal variable
55
+ cp_int_var = OpenStudio::Model::EnergyManagementSystemInternalVariable.new(model, 'Inlet Specific Heat for Plant Connection 1')
56
+ cp_int_var.setName("#{plant_comp.name}_Cp_Int_Var")
57
+ cp_int_var.setInternalDataIndexKeyName(plant_comp.handle.to_s)
58
+
59
+ # inlet density internal variable
60
+ rho_int_var = OpenStudio::Model::EnergyManagementSystemInternalVariable.new(model, 'Inlet Density for Plant Connection 1')
61
+ rho_int_var.setName("#{plant_comp.name}_rho_Int_Var")
62
+ rho_int_var.setInternalDataIndexKeyName(plant_comp.handle.to_s)
63
+
64
+ # load request internal variable
65
+ load_int_var = OpenStudio::Model::EnergyManagementSystemInternalVariable.new(model, 'Load Request for Plant Connection 1')
66
+ load_int_var.setName("#{plant_comp.name}_Load_Int_Var")
67
+ load_int_var.setInternalDataIndexKeyName(plant_comp.handle.to_s)
68
+
69
+ # supply outlet node setpoint temperature sensor
70
+ setpt_mgr_sch_sen = OpenStudio::Model::EnergyManagementSystemSensor.new(model, 'Schedule Value')
71
+ setpt_mgr_sch_sen.setName("#{plant_comp.name}_Setpt_Mgr_Temp_Sen")
72
+ hot_water_loop.supplyOutletNode.setpointManagers.each do |m|
73
+ if m.to_SetpointManagerScheduled.is_initialized
74
+ setpt_mgr_sch_sen.setKeyName(m.to_SetpointManagerScheduled.get.schedule.name.to_s)
75
+ end
76
+ end
77
+
78
+ # outdoor air drybulb temperature sensor
79
+ oa_dbt_sen = OpenStudio::Model::EnergyManagementSystemSensor.new(model, 'Site Outdoor Air Drybulb Temperature')
80
+ oa_dbt_sen.setName("#{plant_comp.name}_OA_DBT_Sen")
81
+ oa_dbt_sen.setKeyName('Environment')
82
+
83
+ # minimum mass flow rate actuator
84
+ mdot_min_act = plant_comp.minimumMassFlowRateActuator.get
85
+ mdot_min_act.setName("#{plant_comp.name}_Mdot_Min_Act")
86
+
87
+ # maximum mass flow rate actuator
88
+ mdot_max_act = plant_comp.maximumMassFlowRateActuator.get
89
+ mdot_max_act.setName("#{plant_comp.name}_Mdot_Max_Act")
90
+
91
+ # design flow rate actuator
92
+ vdot_des_act = plant_comp.designVolumeFlowRateActuator.get
93
+ vdot_des_act.setName("#{plant_comp.name}_Vdot_Des_Act")
94
+
95
+ # minimum loading capacity actuator
96
+ cap_min_act = plant_comp.minimumLoadingCapacityActuator.get
97
+ cap_min_act.setName("#{plant_comp.name}_Cap_Min_Act")
98
+
99
+ # maximum loading capacity actuator
100
+ cap_max_act = plant_comp.maximumLoadingCapacityActuator.get
101
+ cap_max_act.setName("#{plant_comp.name}_Cap_Max_Act")
102
+
103
+ # optimal loading capacity actuator
104
+ cap_opt_act = plant_comp.optimalLoadingCapacityActuator.get
105
+ cap_opt_act.setName("#{plant_comp.name}_Cap_Opt_Act")
106
+
107
+ # outlet temperature actuator
108
+ tout_act = plant_comp.outletTemperatureActuator.get
109
+ tout_act.setName("#{plant_comp.name}_Tout_Act")
110
+
111
+ # mass flow rate actuator
112
+ mdot_req_act = plant_comp.massFlowRateActuator.get
113
+ mdot_req_act.setName("#{plant_comp.name}_Mdot_Req_Act")
114
+
115
+ # heat pump COP curve
116
+ constant_coeff = 1.932 + (cop - 3.65)
117
+ hp_cop_curve = OpenStudio::Model::CurveQuadratic.new(model)
118
+ hp_cop_curve.setCoefficient1Constant(constant_coeff)
119
+ hp_cop_curve.setCoefficient2x(0.227674286)
120
+ hp_cop_curve.setCoefficient3xPOW2(-0.007313143)
121
+ hp_cop_curve.setMinimumValueofx(1.67)
122
+ hp_cop_curve.setMaximumValueofx(12.78)
123
+ hp_cop_curve.setInputUnitTypeforX('Temperature')
124
+ hp_cop_curve.setOutputUnitType('Dimensionless')
125
+
126
+ # heat pump COP curve index variable
127
+ hp_cop_curve_idx_var = OpenStudio::Model::EnergyManagementSystemCurveOrTableIndexVariable.new(model, hp_cop_curve)
128
+
129
+ # high outlet temperature limit actuator
130
+ tout_max_act = OpenStudio::Model::EnergyManagementSystemActuator.new(plant_comp, 'Plant Connection 1', 'High Outlet Temperature Limit')
131
+ tout_max_act.setName("#{plant_comp.name}_Tout_Max_Act")
132
+
133
+ # init program
134
+ init_pgrm = plant_comp.plantInitializationProgram.get
135
+ init_pgrm.setName("#{plant_comp.name}_Init_Pgrm")
136
+ init_pgrm_body = <<-EMS
137
+ SET Loop_Exit_Temp = #{hot_water_loop.sizingPlant.designLoopExitTemperature}
138
+ SET Loop_Delta_Temp = #{hot_water_loop.sizingPlant.loopDesignTemperatureDifference}
139
+ SET Cp = @CPHW Loop_Exit_Temp
140
+ SET rho = @RhoH2O Loop_Exit_Temp
141
+ SET #{vdot_des_act.handle} = #{vdot_des_int_var.handle}
142
+ SET #{mdot_min_act.handle} = 0
143
+ SET Mdot_Max = #{vdot_des_int_var.handle} * rho
144
+ SET #{mdot_max_act.handle} = Mdot_Max
145
+ SET Cap = Mdot_Max * Cp * Loop_Delta_Temp
146
+ SET #{cap_min_act.handle} = 0
147
+ SET #{cap_max_act.handle} = Cap
148
+ SET #{cap_opt_act.handle} = 1 * Cap
149
+ EMS
150
+ init_pgrm.setBody(init_pgrm_body)
151
+
152
+ # sim program
153
+ sim_pgrm = plant_comp.plantSimulationProgram.get
154
+ sim_pgrm.setName("#{plant_comp.name}_Sim_Pgrm")
155
+ sim_pgrm_body = <<-EMS
156
+ SET tmp = #{load_int_var.handle}
157
+ SET tmp = #{tin_int_var.handle}
158
+ SET tmp = #{mdot_int_var.handle}
159
+ SET #{tout_max_act.handle} = 75.0
160
+ IF #{load_int_var.handle} == 0
161
+ SET #{tout_act.handle} = #{tin_int_var.handle}
162
+ SET #{mdot_req_act.handle} = 0
163
+ SET Elec = 0
164
+ RETURN
165
+ ENDIF
166
+ IF #{load_int_var.handle} >= #{cap_max_act.handle}
167
+ SET Qdot = #{cap_max_act.handle}
168
+ SET Mdot = #{mdot_max_act.handle}
169
+ SET #{mdot_req_act.handle} = Mdot
170
+ SET #{tout_act.handle} = (Qdot / (Mdot * #{cp_int_var.handle})) + #{tin_int_var.handle}
171
+ IF #{tout_act.handle} > #{tout_max_act.handle}
172
+ SET #{tout_act.handle} = #{tout_max_act.handle}
173
+ SET Qdot = Mdot * #{cp_int_var.handle} * (#{tout_act.handle} - #{tin_int_var.handle})
174
+ ENDIF
175
+ ELSE
176
+ SET Qdot = #{load_int_var.handle}
177
+ SET #{tout_act.handle} = #{setpt_mgr_sch_sen.handle}
178
+ SET Mdot = Qdot / (#{cp_int_var.handle} * (#{tout_act.handle} - #{tin_int_var.handle}))
179
+ SET #{mdot_req_act.handle} = Mdot
180
+ ENDIF
181
+ SET Tdb = #{oa_dbt_sen.handle}
182
+ SET COP = @CurveValue #{hp_cop_curve_idx_var.handle} Tdb
183
+ SET EIR = 1 / COP
184
+ SET Pwr = Qdot * EIR
185
+ SET Elec = Pwr * SystemTimestep * 3600
186
+ EMS
187
+ sim_pgrm.setBody(sim_pgrm_body)
188
+
189
+ # init program calling manager
190
+ init_mgr = plant_comp.plantInitializationProgramCallingManager.get
191
+ init_mgr.setName("#{plant_comp.name}_Init_Pgrm_Mgr")
192
+
193
+ # sim program calling manager
194
+ sim_mgr = plant_comp.plantSimulationProgramCallingManager.get
195
+ sim_mgr.setName("#{plant_comp.name}_Sim_Pgrm_Mgr")
196
+
197
+ # metered output variable
198
+ elec_mtr_out_var = OpenStudio::Model::EnergyManagementSystemMeteredOutputVariable.new(model, "#{plant_comp.name} Electricity Consumption")
199
+ elec_mtr_out_var.setName("#{plant_comp.name} Electricity Consumption")
200
+ elec_mtr_out_var.setEMSVariableName('Elec')
201
+ elec_mtr_out_var.setUpdateFrequency('SystemTimestep')
202
+ elec_mtr_out_var.setString(4, sim_pgrm.handle.to_s)
203
+ elec_mtr_out_var.setResourceType('Electricity')
204
+ elec_mtr_out_var.setGroupType('HVAC')
205
+ elec_mtr_out_var.setEndUseCategory('Heating')
206
+ elec_mtr_out_var.setEndUseSubcategory('')
207
+ elec_mtr_out_var.setUnits('J')
208
+
209
+ # add to supply side of hot water loop if specified
210
+ hot_water_loop&.addSupplyBranchForComponent(plant_comp)
211
+
212
+ # add operation scheme
213
+ htg_op_scheme = OpenStudio::Model::PlantEquipmentOperationHeatingLoad.new(model)
214
+ htg_op_scheme.addEquipment(1000000000.0, plant_comp)
215
+ hot_water_loop.setPlantEquipmentOperationHeatingLoad(htg_op_scheme)
216
+
217
+ return plant_comp
218
+ end
219
+ end
220
+ end
@@ -0,0 +1,25 @@
1
+ module OpenstudioStandards
2
+ # The HVAC module provides methods create, modify, and get information about HVAC systems in the model
3
+ module HVAC
4
+ # @!group Component:Chiller
5
+ # Methods to create, modify, and get information about chillers
6
+
7
+ # Return the capacity in W of a ChillerElectricEIR
8
+ #
9
+ # @param chiller_electric_eir [OpenStudio::Model::ChillerElectricEIR] chiller object
10
+ # @return [Double] capacity in W
11
+ def self.chiller_electric_get_capacity(chiller_electric_eir)
12
+ capacity_w = nil
13
+ if chiller_electric_eir.referenceCapacity.is_initialized
14
+ capacity_w = chiller_electric_eir.referenceCapacity.get
15
+ elsif chiller_electric_eir.autosizedReferenceCapacity.is_initialized
16
+ capacity_w = chiller_electric_eir.autosizedReferenceCapacity.get
17
+ else
18
+ OpenStudio.logFree(OpenStudio::Warn, 'openstudio.standards.HVAC.chiller', "For #{chiller_electric_eir.name} capacity is not available.")
19
+ return capacity_w
20
+ end
21
+
22
+ return capacity_w
23
+ end
24
+ end
25
+ end
@@ -0,0 +1,276 @@
1
+ module OpenstudioStandards
2
+ # The HVAC module provides methods create, modify, and get information about HVAC systems in the model
3
+ module HVAC
4
+ # @!group Component:Coil
5
+ # Methods to create, modify, and get information about HVAC coil objects
6
+
7
+ # Finds the subcategory. Possible choices are:
8
+ # Single Package, Split System, PTAC, or PTHP
9
+ #
10
+ # @param coil_dx [OpenStudio::Model::StraightComponent] coil cooling object, allowable types:
11
+ # CoilCoolingDXSingleSpeed, CoilCoolingDXTwoSpeed, CoilCoolingDXMultiSpeed
12
+ # @return [String] the coil_dx_subcategory(coil_dx)
13
+ # @todo Add add split system vs single package to model object
14
+ def self.coil_dx_subcategory(coil_dx)
15
+ sub_category = 'Single Package'
16
+
17
+ # Fallback to the name, mainly for library export
18
+ if coil_dx.name.get.to_s.include?('Single Package')
19
+ sub_category = 'Single Package'
20
+ elsif coil_dx.name.get.to_s.include?('Split System') ||
21
+ coil_dx.name.get.to_s.include?('Central Air Source HP')
22
+ sub_category = 'Split System'
23
+ elsif coil_dx.name.get.to_s.include?('Minisplit HP')
24
+ sub_category = 'Minisplit System'
25
+ elsif coil_dx.name.get.to_s.include?('CRAC')
26
+ sub_category = 'CRAC'
27
+ end
28
+
29
+ if coil_dx.airLoopHVAC.empty? && coil_dx.containingZoneHVACComponent.is_initialized
30
+ containing_comp = coil_dx.containingZoneHVACComponent.get
31
+ # PTHP
32
+ if containing_comp.to_ZoneHVACPackagedTerminalHeatPump.is_initialized
33
+ sub_category = 'PTHP'
34
+ end
35
+ # @todo Add other zone hvac systems
36
+ end
37
+
38
+ return sub_category
39
+ end
40
+
41
+ # Determine if it is a heat pump
42
+ #
43
+ # @param coil_dx [OpenStudio::Model::StraightComponent] coil cooling object, allowable types:
44
+ # CoilCoolingDXSingleSpeed, CoilCoolingDXTwoSpeed, CoilCoolingDXMultiSpeed
45
+ # @return [Boolean] returns true if it is a heat pump, false if not
46
+ def self.coil_dx_heat_pump?(coil_dx)
47
+ heat_pump = false
48
+
49
+ if coil_dx.airLoopHVAC.empty?
50
+ if coil_dx.containingHVACComponent.is_initialized
51
+ containing_comp = coil_dx.containingHVACComponent.get
52
+ if containing_comp.to_AirLoopHVACUnitarySystem.is_initialized
53
+ htg_coil = containing_comp.to_AirLoopHVACUnitarySystem.get.heatingCoil
54
+ unless htg_coil.empty?
55
+ heat_pump = ['OS_Coil_Heating_DX_SingleSpeed',
56
+ 'OS_Coil_Heating_DX_MultiSpeed',
57
+ 'OS_Coil_Heating_DX_VariableSpeed',
58
+ 'OS_Coil_Heating_WaterToAirHeatPump_EquationFit'].include?(htg_coil.get.iddObjectType.valueName.to_s)
59
+ end
60
+ elsif containing_comp.to_AirLoopHVACUnitaryHeatPumpAirToAir.is_initialized
61
+ heat_pump = true
62
+ elsif containing_comp.to_AirLoopHVACUnitaryHeatPumpAirToAirMultiSpeed.is_initialized
63
+ htg_coil = containing_comp.to_AirLoopHVACUnitaryHeatPumpAirToAirMultiSpeed.get.heatingCoil
64
+ if htg_coil.to_CoilHeatingDXMultiSpeed.is_initialized then heat_pump = true end
65
+ end
66
+ elsif coil_dx.containingZoneHVACComponent.is_initialized
67
+ containing_comp = coil_dx.containingZoneHVACComponent.get
68
+ # PTHP
69
+ if containing_comp.to_ZoneHVACPackagedTerminalHeatPump.is_initialized
70
+ heat_pump = true
71
+ end
72
+ # @todo Add other zone hvac systems
73
+ end
74
+ else
75
+ if !coil_dx.airLoopHVAC.get.supplyComponents('OS:Coil:Heating:DX:SingleSpeed'.to_IddObjectType).empty? ||
76
+ !coil_dx.airLoopHVAC.get.supplyComponents('OS:Coil:Heating:DX:MultiSpeed'.to_IddObjectType).empty? ||
77
+ !coil_dx.airLoopHVAC.get.supplyComponents('OS:Coil:Heating:DX:VariableSpeed'.to_IddObjectType).empty?
78
+ heat_pump = true
79
+ end
80
+ end
81
+
82
+ return heat_pump
83
+ end
84
+
85
+ # Determine the heating type for a dx cooling coil. Possible choices are: 'Electric Resistance or None', 'All Other'.
86
+ #
87
+ # @param coil_dx [OpenStudio::Model::StraightComponent] coil cooling object, allowable types:
88
+ # CoilCoolingDXSingleSpeed, CoilCoolingDXTwoSpeed, CoilCoolingDXMultiSpeed
89
+ # @return [String] the heating type
90
+ def self.coil_dx_heating_type(coil_dx)
91
+ htg_type = nil
92
+
93
+ # If Unitary or Zone HVAC (could be a unitary system on an air loop)
94
+ if coil_dx.airLoopHVAC.empty?
95
+ if coil_dx.containingHVACComponent.is_initialized
96
+ containing_comp = coil_dx.containingHVACComponent.get
97
+ if containing_comp.to_AirLoopHVACUnitaryHeatPumpAirToAir.is_initialized
98
+ htg_type = 'Electric Resistance or None'
99
+ elsif containing_comp.to_AirLoopHVACUnitarySystem.is_initialized
100
+ htg_coil = containing_comp.to_AirLoopHVACUnitarySystem.get.heatingCoil
101
+ if containing_comp.name.to_s.include? 'Minisplit'
102
+ htg_type = 'All Other'
103
+ elsif htg_coil.is_initialized
104
+ htg_coil = htg_coil.get
105
+ if htg_coil.to_CoilHeatingElectric.is_initialized || htg_coil.to_CoilHeatingDXMultiSpeed.is_initialized
106
+ htg_type = 'Electric Resistance or None'
107
+ elsif htg_coil.to_CoilHeatingGas.is_initialized || htg_coil.to_CoilHeatingGasMultiStage.is_initialized || htg_coil.to_CoilHeatingWater.is_initialized
108
+ htg_type = 'All Other'
109
+ end
110
+ else
111
+ htg_type = 'Electric Resistance or None'
112
+ end
113
+ elsif containing_comp.to_AirLoopHVACUnitaryHeatPumpAirToAirMultiSpeed.is_initialized
114
+ htg_coil = containing_comp.to_AirLoopHVACUnitaryHeatPumpAirToAirMultiSpeed.get.heatingCoil
115
+ supp_htg_coil = containing_comp.to_AirLoopHVACUnitaryHeatPumpAirToAirMultiSpeed.get.supplementalHeatingCoil
116
+ if htg_coil.to_CoilHeatingDXMultiSpeed.is_initialized || supp_htg_coil.to_CoilHeatingElectric.is_initialized
117
+ htg_type = 'Electric Resistance or None'
118
+ elsif htg_coil.to_CoilHeatingGas.is_initialized || htg_coil.to_CoilHeatingGasMultiStage.is_initialized || htg_coil.to_CoilHeatingWater.is_initialized
119
+ htg_type = 'All Other'
120
+ end
121
+ end
122
+ # @todo Add other unitary systems
123
+ elsif coil_dx.containingZoneHVACComponent.is_initialized
124
+ containing_comp = coil_dx.containingZoneHVACComponent.get
125
+ # PTAC
126
+ if containing_comp.to_ZoneHVACPackagedTerminalAirConditioner.is_initialized
127
+ htg_coil = containing_comp.to_ZoneHVACPackagedTerminalAirConditioner.get.heatingCoil
128
+ if htg_coil.to_CoilHeatingElectric.is_initialized
129
+ htg_type = 'Electric Resistance or None'
130
+ elsif htg_coil.to_CoilHeatingGas.is_initialized || htg_coil.to_CoilHeatingGasMultiStage.is_initialized || htg_coil.to_CoilHeatingWater.is_initialized
131
+ htg_type = 'All Other'
132
+ end
133
+ # PTHP
134
+ elsif containing_comp.to_ZoneHVACPackagedTerminalHeatPump.is_initialized
135
+ htg_type = 'Electric Resistance or None'
136
+ end
137
+ # @todo Add other zone hvac systems
138
+ end
139
+ end
140
+
141
+ # If on an AirLoop
142
+ if coil_dx.airLoopHVAC.is_initialized
143
+ air_loop = coil_dx.airLoopHVAC.get
144
+ htg_type = if !air_loop.supplyComponents('OS:Coil:Heating:Gas'.to_IddObjectType).empty?
145
+ 'All Other'
146
+ elsif !air_loop.supplyComponents('OS:Coil:Heating:Water'.to_IddObjectType).empty?
147
+ 'All Other'
148
+ elsif !air_loop.supplyComponents('OS:Coil:Heating:DX:SingleSpeed'.to_IddObjectType).empty?
149
+ 'All Other'
150
+ elsif !air_loop.supplyComponents('OS:Coil:Heating:DX:MultiSpeed'.to_IddObjectType).empty?
151
+ 'All Other'
152
+ elsif !air_loop.supplyComponents('OS:Coil:Heating:DX:VariableSpeed'.to_IddObjectType).empty?
153
+ 'All Other'
154
+ elsif !air_loop.supplyComponents('OS:Coil:Heating:Gas:MultiStage'.to_IddObjectType).empty?
155
+ 'All Other'
156
+ elsif !air_loop.supplyComponents('OS:Coil:Heating:Desuperheater'.to_IddObjectType).empty?
157
+ 'All Other'
158
+ elsif !air_loop.supplyComponents('OS:Coil:Heating:WaterToAirHeatPump:EquationFit'.to_IddObjectType).empty?
159
+ 'All Other'
160
+ elsif !air_loop.supplyComponents('OS:Coil:Heating:Electric'.to_IddObjectType).empty?
161
+ 'Electric Resistance or None'
162
+ else
163
+ 'Electric Resistance or None'
164
+ end
165
+ end
166
+
167
+ return htg_type
168
+ end
169
+
170
+ # Return the cooling capacity of the DX cooling coil paired with the heating coil
171
+ #
172
+ # @param coil_heating [OpenStudio::Model::CoilHeatingDXSingleSpeed, OpenStudio::Model::CoilHeatingWaterToAirHeatPumpEquationFit] coil heating object
173
+ # @return [Double] capacity in W to be used for find object
174
+ def self.coil_heating_get_paired_coil_cooling_capacity(coil_heating)
175
+ capacity_w = nil
176
+
177
+ # Get the paired cooling coil
178
+ clg_coil = nil
179
+
180
+ # Unitary and zone equipment
181
+ if coil_heating.airLoopHVAC.empty?
182
+ if coil_heating.containingHVACComponent.is_initialized
183
+ containing_comp = coil_heating.containingHVACComponent.get
184
+ if containing_comp.to_AirLoopHVACUnitaryHeatPumpAirToAir.is_initialized
185
+ clg_coil = containing_comp.to_AirLoopHVACUnitaryHeatPumpAirToAir.get.coolingCoil
186
+ elsif containing_comp.to_AirLoopHVACUnitarySystem.is_initialized
187
+ unitary = containing_comp.to_AirLoopHVACUnitarySystem.get
188
+ if unitary.coolingCoil.is_initialized
189
+ clg_coil = unitary.coolingCoil.get
190
+ end
191
+ end
192
+ # @todo Add other unitary systems
193
+ elsif coil_heating.containingZoneHVACComponent.is_initialized
194
+ containing_comp = coil_heating.containingZoneHVACComponent.get
195
+ # PTHP
196
+ if containing_comp.to_ZoneHVACPackagedTerminalHeatPump.is_initialized
197
+ pthp = containing_comp.to_ZoneHVACPackagedTerminalHeatPump.get
198
+ clg_coil = containing_comp.to_ZoneHVACPackagedTerminalHeatPump.get.coolingCoil
199
+ end
200
+ end
201
+ end
202
+
203
+ # On AirLoop directly
204
+ if coil_heating.airLoopHVAC.is_initialized
205
+ air_loop = coil_heating.airLoopHVAC.get
206
+
207
+ # Check for the presence of any other type of cooling coil
208
+ clg_types = ['OS:Coil:Cooling:DX:SingleSpeed',
209
+ 'OS:Coil:Cooling:DX:TwoSpeed',
210
+ 'OS:Coil:Cooling:DX:MultiSpeed']
211
+ clg_types.each do |ct|
212
+ coils = air_loop.supplyComponents(ct.to_IddObjectType)
213
+ next if coils.empty?
214
+
215
+ clg_coil = coils[0].to_StraightComponent.get
216
+ # Stop on first DX cooling coil found
217
+ break
218
+ end
219
+ end
220
+
221
+ # If no paired cooling coil was found, throw an error and fall back to the heating capacity
222
+ if clg_coil.nil?
223
+ OpenStudio.logFree(OpenStudio::Warn, 'openstudio.standards.HVAC.coil', "For #{coil_heating.name}, the paired DX cooling coil could not be found to determine capacity. Using the coil's heating capacity instead, which will incorrectly select efficiency levels for most standards.")
224
+
225
+ if coil_heating.to_CoilHeatingDXSingleSpeed.is_initialized
226
+ coil_heating = coil_heating.to_CoilHeatingDXSingleSpeed.get
227
+ capacity_w = OpenstudioStandards::HVAC.coil_heating_dx_single_speed_get_capacity(coil_heating)
228
+ elsif coil_heating.to_CoilHeatingWaterToAirHeatPumpEquationFit.is_initialized
229
+ coil_heating = coil_heating.to_CoilHeatingWaterToAirHeatPumpEquationFit.get
230
+ capacity_w = OpenstudioStandards::HVAC.coil_heating_water_to_air_heat_pump_equation_fit_get_capacity(coil_heating)
231
+ elsif coil_heating.to_CoilHeatingGas.is_initialized
232
+ coil_heating = coil_heating.to_CoilHeatingGas.get
233
+ capacity_w = OpenstudioStandards::HVAC.coil_heating_gas_get_capacity(coil_heating)
234
+ elsif coil_heating.to_CoilHeatingGasMultiStage.is_initialized
235
+ coil_heating = coil_heating.to_CoilHeatingGasMultiStage.get
236
+ capacity_w = OpenstudioStandards::HVAC.coil_heating_gas_multi_stage_get_capacity(coil_heating)
237
+ else
238
+ # If the coil is not a supported coil type, we cannot determine the capacity
239
+ OpenStudio.logFree(OpenStudio::Warn, 'openstudio.standards.HVAC.coil', "For #{coil_heating.name}, the coil is not a supported coil type and cannot determine capacity.")
240
+ return nil
241
+ end
242
+
243
+ # return nil if no capacity is available
244
+ if capacity_w.nil?
245
+ OpenStudio.logFree(OpenStudio::Warn, 'openstudio.standards.HVAC.coil', "For #{coil_heating.name} capacity is not available.")
246
+ return nil
247
+ end
248
+
249
+ return capacity_w
250
+ end
251
+
252
+ multiplier = 1.0
253
+ if ['PTAC', 'PTHP'].include?(OpenstudioStandards::HVAC.coil_dx_subcategory(clg_coil))
254
+ thermal_zone = OpenstudioStandards::HVAC.hvac_component_get_thermal_zone(clg_coil)
255
+ multiplier = thermal_zone.multiplier if !thermal_zone.nil?
256
+ end
257
+
258
+ # If a coil was found, cast to the correct type
259
+ if clg_coil.to_CoilCoolingDXSingleSpeed.is_initialized
260
+ clg_coil = clg_coil.to_CoilCoolingDXSingleSpeed.get
261
+ capacity_w = OpenstudioStandards::HVAC.coil_cooling_dx_single_speed_get_capacity(clg_coil, multiplier: multiplier)
262
+ elsif clg_coil.to_CoilCoolingDXTwoSpeed.is_initialized
263
+ clg_coil = clg_coil.to_CoilCoolingDXTwoSpeed.get
264
+ capacity_w = OpenstudioStandards::HVAC.coil_cooling_dx_two_speed_get_capacity(clg_coil, multiplier: multiplier)
265
+ elsif clg_coil.to_CoilCoolingDXMultiSpeed.is_initialized
266
+ clg_coil = clg_coil.to_CoilCoolingDXMultiSpeed.get
267
+ capacity_w = OpenstudioStandards::HVAC.coil_cooling_dx_multi_speed_get_capacity(clg_coil, multiplier: multiplier)
268
+ elsif clg_coil.to_CoilCoolingWaterToAirHeatPumpEquationFit.is_initialized
269
+ clg_coil = clg_coil.to_CoilCoolingWaterToAirHeatPumpEquationFit.get
270
+ capacity_w = OpenstudioStandards::HVAC.coil_cooling_water_to_air_heat_pump_get_capacity(clg_coil, multiplier: multiplier)
271
+ end
272
+
273
+ return capacity_w
274
+ end
275
+ end
276
+ end
@@ -0,0 +1,40 @@
1
+ module OpenstudioStandards
2
+ # The HVAC module provides methods create, modify, and get information about HVAC systems in the model
3
+ module HVAC
4
+ # @!group Component:Coil
5
+ # Methods to create, modify, and get information about HVAC coil objects
6
+
7
+ # Return the capacity in W of a CoilCoolingDXMultiSpeed
8
+ #
9
+ #
10
+ # @param coil_cooling_dx_multi_speed [OpenStudio::Model::CoilCoolingDXMultiSpeed] coil cooling dx multi speed object
11
+ # @param multiplier [Double] zone multiplier, if applicable
12
+ # @return [Double] capacity in W
13
+ def self.coil_cooling_dx_multi_speed_get_capacity(coil_cooling_dx_multi_speed, multiplier: nil)
14
+ capacity_w = nil
15
+ clg_stages = coil_cooling_dx_multi_speed.stages
16
+ if clg_stages.last.grossRatedTotalCoolingCapacity.is_initialized
17
+ capacity_w = clg_stages.last.grossRatedTotalCoolingCapacity.get
18
+ elsif (clg_stages.size == 1) && coil_cooling_dx_multi_speed.stages[0].autosizedSpeedRatedTotalCoolingCapacity.is_initialized
19
+ capacity_w = coil_cooling_dx_multi_speed.stages[0].autosizedSpeedRatedTotalCoolingCapacity.get
20
+ elsif (clg_stages.size == 2) && coil_cooling_dx_multi_speed.stages[1].autosizedGrossRatedTotalCoolingCapacity.is_initialized
21
+ capacity_w = coil_cooling_dx_multi_speed.stages[1].autosizedGrossRatedTotalCoolingCapacity.get
22
+ elsif (clg_stages.size == 3) && coil_cooling_dx_multi_speed.stages[2].autosizedGrossRatedTotalCoolingCapacity.is_initialized
23
+ capacity_w = coil_cooling_dx_multi_speed.stages[2].autosizedSpeedRatedTotalCoolingCapacity.get
24
+ elsif (clg_stages.size == 4) && coil_cooling_dx_multi_speed.stages[3].autosizedGrossRatedTotalCoolingCapacity.is_initialized
25
+ capacity_w = coil_cooling_dx_multi_speed.stages[3].autosizedGrossRatedTotalCoolingCapacity.get
26
+ else
27
+ OpenStudio.logFree(OpenStudio::Warn, 'openstudio.standards.HVAC.coil_cooling_dx_multi_speed', "For #{coil_cooling_dx_multi_speed.name} capacity is not available.")
28
+ return capacity_w
29
+ end
30
+
31
+ if !multiplier.nil? && multiplier > 1
32
+ total_cap = capacity_w
33
+ capacity_w /= multiplier
34
+ OpenStudio.logFree(OpenStudio::Info, 'openstudio.standards.HVAC.coil_cooling_dx_multi_speed', "For #{coil_cooling_dx_multi_speed.name}, total capacity of #{OpenStudio.convert(total_cap, 'W', 'kBtu/hr').get.round(2)}kBTU/hr was divided by the zone multiplier of #{multiplier} to give #{capacity_kbtu_per_hr = OpenStudio.convert(capacity_w, 'W', 'kBtu/hr').get.round(2)}kBTU/hr.")
35
+ end
36
+
37
+ return capacity_w
38
+ end
39
+ end
40
+ end