openstudio-standards 0.2.12.rc4 → 0.2.13.rc3

Sign up to get free protection for your applications and to get access to all the features.
Files changed (541) hide show
  1. checksums.yaml +4 -4
  2. data/data/geometry/ASHRAE90120162019HighriseApartment.json +1042 -0
  3. data/data/geometry/ASHRAE90120162019Hospital.json +199 -0
  4. data/data/geometry/ASHRAE90120162019LargeHotel.json +73 -0
  5. data/data/geometry/ASHRAE90120162019LargeOffice.json +109 -0
  6. data/data/geometry/ASHRAE90120162019SecondarySchool.json +205 -0
  7. data/data/geometry/ASHRAECourthouse.json +112 -0
  8. data/data/geometry/ASHRAECourthouse.osm +26470 -0
  9. data/data/geometry/ASHRAELargeHotel.osm +11 -1
  10. data/data/geometry/ASHRAELargeOffice.json +4 -0
  11. data/data/geometry/ASHRAESmallDataCenter.json +1 -1
  12. data/data/standards/OpenStudio_Standards-ashrae_90_1(space_types).xlsx +0 -0
  13. data/data/standards/OpenStudio_Standards-ashrae_90_1-ALL-comstock(space_types).xlsx +0 -0
  14. data/data/standards/OpenStudio_Standards-ashrae_90_1.xlsx +0 -0
  15. data/data/standards/exclude_list.csv +19 -0
  16. data/data/standards/export/ashrae_90_1/ashrae_90_1_2004/data/ashrae_90_1_2004.boilers.json +49 -0
  17. data/data/standards/export/ashrae_90_1/ashrae_90_1_2004/data/ashrae_90_1_2004.chillers.json +293 -0
  18. data/data/standards/export/ashrae_90_1/ashrae_90_1_2004/data/ashrae_90_1_2004.construction_properties.json +25426 -0
  19. data/data/standards/export/ashrae_90_1/ashrae_90_1_2004/data/ashrae_90_1_2004.construction_sets.json +1600 -0
  20. data/data/standards/export/ashrae_90_1/ashrae_90_1_2004/data/ashrae_90_1_2004.economizers.json +564 -0
  21. data/data/standards/export/ashrae_90_1/ashrae_90_1_2004/data/ashrae_90_1_2004.elevators.json +349 -0
  22. data/data/standards/export/ashrae_90_1/ashrae_90_1_2004/data/ashrae_90_1_2004.ext_ltg.json +164 -0
  23. data/data/standards/export/ashrae_90_1/ashrae_90_1_2004/data/ashrae_90_1_2004.ground_temperatures.json +10663 -0
  24. data/data/standards/export/ashrae_90_1/ashrae_90_1_2004/data/ashrae_90_1_2004.heat_pumps.json +508 -0
  25. data/data/standards/export/ashrae_90_1/ashrae_90_1_2004/data/ashrae_90_1_2004.heat_pumps_heating.json +156 -0
  26. data/data/standards/export/ashrae_90_1/ashrae_90_1_2004/data/ashrae_90_1_2004.heat_rejection.json +44 -0
  27. data/data/standards/export/ashrae_90_1/ashrae_90_1_2004/data/ashrae_90_1_2004.motors.json +184 -0
  28. data/data/standards/export/ashrae_90_1/ashrae_90_1_2004/data/ashrae_90_1_2004.prototype_inputs.json +3094 -0
  29. data/data/standards/export/ashrae_90_1/ashrae_90_1_2004/data/ashrae_90_1_2004.ref_cases.json +829 -0
  30. data/data/standards/export/ashrae_90_1/ashrae_90_1_2004/data/ashrae_90_1_2004.ref_lnup.json +562 -0
  31. data/data/standards/export/ashrae_90_1/ashrae_90_1_2004/data/ashrae_90_1_2004.refrigeration_compressors.json +52 -0
  32. data/data/standards/export/ashrae_90_1/ashrae_90_1_2004/data/ashrae_90_1_2004.refrigeration_condenser.json +220 -0
  33. data/data/standards/export/ashrae_90_1/ashrae_90_1_2004/data/ashrae_90_1_2004.refrigeration_system.json +156 -0
  34. data/data/standards/export/ashrae_90_1/ashrae_90_1_2004/data/ashrae_90_1_2004.refrigeration_walkins.json +1316 -0
  35. data/data/standards/export/ashrae_90_1/ashrae_90_1_2004/data/ashrae_90_1_2004.spc_typ.json +21446 -0
  36. data/data/standards/export/ashrae_90_1/ashrae_90_1_2004/data/ashrae_90_1_2004.unitary_acs.json +554 -0
  37. data/data/standards/export/ashrae_90_1/ashrae_90_1_2004/data/ashrae_90_1_2004.water_heaters.json +68 -0
  38. data/data/standards/export/ashrae_90_1/ashrae_90_1_2004/data/ashrae_90_1_2004.water_source_heat_pumps.json +28 -0
  39. data/data/standards/export/ashrae_90_1/ashrae_90_1_2004/data/ashrae_90_1_2004.water_source_heat_pumps_heating.json +12 -0
  40. data/data/standards/export/ashrae_90_1/ashrae_90_1_2007/data/ashrae_90_1_2007.boilers.json +49 -0
  41. data/data/standards/export/ashrae_90_1/ashrae_90_1_2007/data/ashrae_90_1_2007.chillers.json +293 -0
  42. data/data/standards/export/ashrae_90_1/ashrae_90_1_2007/data/ashrae_90_1_2007.construction_properties.json +12487 -0
  43. data/data/standards/export/ashrae_90_1/ashrae_90_1_2007/data/ashrae_90_1_2007.construction_sets.json +1600 -0
  44. data/data/standards/export/ashrae_90_1/ashrae_90_1_2007/data/ashrae_90_1_2007.economizers.json +564 -0
  45. data/data/standards/export/ashrae_90_1/ashrae_90_1_2007/data/ashrae_90_1_2007.elevators.json +349 -0
  46. data/data/standards/export/ashrae_90_1/ashrae_90_1_2007/data/ashrae_90_1_2007.ext_ltg.json +164 -0
  47. data/data/standards/export/ashrae_90_1/ashrae_90_1_2007/data/ashrae_90_1_2007.ground_temperatures.json +10663 -0
  48. data/data/standards/export/ashrae_90_1/ashrae_90_1_2007/data/ashrae_90_1_2007.heat_pumps.json +466 -0
  49. data/data/standards/export/ashrae_90_1/ashrae_90_1_2007/data/ashrae_90_1_2007.heat_pumps_heating.json +137 -0
  50. data/data/standards/export/ashrae_90_1/ashrae_90_1_2007/data/ashrae_90_1_2007.heat_rejection.json +44 -0
  51. data/data/standards/export/ashrae_90_1/ashrae_90_1_2007/data/ashrae_90_1_2007.motors.json +184 -0
  52. data/data/standards/export/ashrae_90_1/ashrae_90_1_2007/data/ashrae_90_1_2007.prototype_inputs.json +3094 -0
  53. data/data/standards/export/ashrae_90_1/ashrae_90_1_2007/data/ashrae_90_1_2007.ref_cases.json +829 -0
  54. data/data/standards/export/ashrae_90_1/ashrae_90_1_2007/data/ashrae_90_1_2007.ref_lnup.json +562 -0
  55. data/data/standards/export/ashrae_90_1/ashrae_90_1_2007/data/ashrae_90_1_2007.refrigeration_compressors.json +52 -0
  56. data/data/standards/export/ashrae_90_1/ashrae_90_1_2007/data/ashrae_90_1_2007.refrigeration_condenser.json +220 -0
  57. data/data/standards/export/ashrae_90_1/ashrae_90_1_2007/data/ashrae_90_1_2007.refrigeration_system.json +156 -0
  58. data/data/standards/export/ashrae_90_1/ashrae_90_1_2007/data/ashrae_90_1_2007.refrigeration_walkins.json +1316 -0
  59. data/data/standards/export/ashrae_90_1/ashrae_90_1_2007/data/ashrae_90_1_2007.spc_typ.json +21380 -0
  60. data/data/standards/export/ashrae_90_1/ashrae_90_1_2007/data/ashrae_90_1_2007.unitary_acs.json +554 -0
  61. data/data/standards/export/ashrae_90_1/ashrae_90_1_2007/data/ashrae_90_1_2007.water_heaters.json +68 -0
  62. data/data/standards/export/ashrae_90_1/ashrae_90_1_2007/data/ashrae_90_1_2007.water_source_heat_pumps.json +28 -0
  63. data/data/standards/export/ashrae_90_1/ashrae_90_1_2007/data/ashrae_90_1_2007.water_source_heat_pumps_heating.json +12 -0
  64. data/data/standards/export/ashrae_90_1/ashrae_90_1_2010/data/ashrae_90_1_2010.boilers.json +49 -0
  65. data/data/standards/export/ashrae_90_1/ashrae_90_1_2010/data/ashrae_90_1_2010.chillers.json +395 -0
  66. data/data/standards/export/ashrae_90_1/ashrae_90_1_2010/data/ashrae_90_1_2010.construction_properties.json +12487 -0
  67. data/data/standards/export/ashrae_90_1/ashrae_90_1_2010/data/ashrae_90_1_2010.construction_sets.json +1600 -0
  68. data/data/standards/export/ashrae_90_1/ashrae_90_1_2010/data/ashrae_90_1_2010.economizers.json +592 -0
  69. data/data/standards/export/ashrae_90_1/ashrae_90_1_2010/data/ashrae_90_1_2010.elevators.json +349 -0
  70. data/data/standards/export/ashrae_90_1/ashrae_90_1_2010/data/ashrae_90_1_2010.energy_recovery.json +550 -0
  71. data/data/standards/export/ashrae_90_1/ashrae_90_1_2010/data/ashrae_90_1_2010.ext_ltg.json +164 -0
  72. data/data/standards/export/ashrae_90_1/ashrae_90_1_2010/data/ashrae_90_1_2010.ground_temperatures.json +10663 -0
  73. data/data/standards/export/ashrae_90_1/ashrae_90_1_2010/data/ashrae_90_1_2010.heat_pumps.json +466 -0
  74. data/data/standards/export/ashrae_90_1/ashrae_90_1_2010/data/ashrae_90_1_2010.heat_pumps_heating.json +137 -0
  75. data/data/standards/export/ashrae_90_1/ashrae_90_1_2010/data/ashrae_90_1_2010.heat_rejection.json +44 -0
  76. data/data/standards/export/ashrae_90_1/ashrae_90_1_2010/data/ashrae_90_1_2010.motors.json +238 -0
  77. data/data/standards/export/ashrae_90_1/ashrae_90_1_2010/data/ashrae_90_1_2010.prototype_inputs.json +3094 -0
  78. data/data/standards/export/ashrae_90_1/ashrae_90_1_2010/data/ashrae_90_1_2010.ref_cases.json +829 -0
  79. data/data/standards/export/ashrae_90_1/ashrae_90_1_2010/data/ashrae_90_1_2010.ref_lnup.json +562 -0
  80. data/data/standards/export/ashrae_90_1/ashrae_90_1_2010/data/ashrae_90_1_2010.refrigeration_compressors.json +52 -0
  81. data/data/standards/export/ashrae_90_1/ashrae_90_1_2010/data/ashrae_90_1_2010.refrigeration_condenser.json +220 -0
  82. data/data/standards/export/ashrae_90_1/ashrae_90_1_2010/data/ashrae_90_1_2010.refrigeration_system.json +156 -0
  83. data/data/standards/export/ashrae_90_1/ashrae_90_1_2010/data/ashrae_90_1_2010.refrigeration_walkins.json +1316 -0
  84. data/data/standards/export/ashrae_90_1/ashrae_90_1_2010/data/ashrae_90_1_2010.spc_typ.json +21548 -0
  85. data/data/standards/export/ashrae_90_1/ashrae_90_1_2010/data/ashrae_90_1_2010.unitary_acs.json +554 -0
  86. data/data/standards/export/ashrae_90_1/ashrae_90_1_2010/data/ashrae_90_1_2010.water_heaters.json +68 -0
  87. data/data/standards/export/ashrae_90_1/ashrae_90_1_2010/data/ashrae_90_1_2010.water_source_heat_pumps.json +28 -0
  88. data/data/standards/export/ashrae_90_1/ashrae_90_1_2010/data/ashrae_90_1_2010.water_source_heat_pumps_heating.json +12 -0
  89. data/data/standards/export/ashrae_90_1/ashrae_90_1_2013/data/ashrae_90_1_2013.boilers.json +64 -0
  90. data/data/standards/export/ashrae_90_1/ashrae_90_1_2013/data/ashrae_90_1_2013.chillers.json +871 -0
  91. data/data/standards/export/ashrae_90_1/ashrae_90_1_2013/data/ashrae_90_1_2013.construction_properties.json +12487 -0
  92. data/data/standards/export/ashrae_90_1/ashrae_90_1_2013/data/ashrae_90_1_2013.construction_sets.json +1600 -0
  93. data/data/standards/export/ashrae_90_1/ashrae_90_1_2013/data/ashrae_90_1_2013.economizers.json +592 -0
  94. data/data/standards/export/ashrae_90_1/ashrae_90_1_2013/data/ashrae_90_1_2013.elevators.json +349 -0
  95. data/data/standards/export/ashrae_90_1/ashrae_90_1_2013/data/ashrae_90_1_2013.energy_recovery.json +1096 -0
  96. data/data/standards/export/ashrae_90_1/ashrae_90_1_2013/data/ashrae_90_1_2013.ext_ltg.json +164 -0
  97. data/data/standards/export/ashrae_90_1/ashrae_90_1_2013/data/ashrae_90_1_2013.ground_temperatures.json +10663 -0
  98. data/data/standards/export/ashrae_90_1/ashrae_90_1_2013/data/ashrae_90_1_2013.heat_pumps.json +886 -0
  99. data/data/standards/export/ashrae_90_1/ashrae_90_1_2013/data/ashrae_90_1_2013.heat_pumps_heating.json +194 -0
  100. data/data/standards/export/ashrae_90_1/ashrae_90_1_2013/data/ashrae_90_1_2013.heat_rejection.json +44 -0
  101. data/data/standards/export/ashrae_90_1/ashrae_90_1_2013/data/ashrae_90_1_2013.motors.json +247 -0
  102. data/data/standards/export/ashrae_90_1/ashrae_90_1_2013/data/ashrae_90_1_2013.prototype_inputs.json +3094 -0
  103. data/data/standards/export/ashrae_90_1/ashrae_90_1_2013/data/ashrae_90_1_2013.ref_cases.json +829 -0
  104. data/data/standards/export/ashrae_90_1/ashrae_90_1_2013/data/ashrae_90_1_2013.ref_lnup.json +562 -0
  105. data/data/standards/export/ashrae_90_1/ashrae_90_1_2013/data/ashrae_90_1_2013.refrigeration_compressors.json +52 -0
  106. data/data/standards/export/ashrae_90_1/ashrae_90_1_2013/data/ashrae_90_1_2013.refrigeration_condenser.json +220 -0
  107. data/data/standards/export/ashrae_90_1/ashrae_90_1_2013/data/ashrae_90_1_2013.refrigeration_system.json +156 -0
  108. data/data/standards/export/ashrae_90_1/ashrae_90_1_2013/data/ashrae_90_1_2013.refrigeration_walkins.json +1316 -0
  109. data/data/standards/export/ashrae_90_1/ashrae_90_1_2013/data/ashrae_90_1_2013.spc_typ.json +22079 -0
  110. data/data/standards/export/ashrae_90_1/ashrae_90_1_2013/data/ashrae_90_1_2013.unitary_acs.json +994 -0
  111. data/data/standards/export/ashrae_90_1/ashrae_90_1_2013/data/ashrae_90_1_2013.water_heaters.json +68 -0
  112. data/data/standards/export/ashrae_90_1/ashrae_90_1_2013/data/ashrae_90_1_2013.water_source_heat_pumps.json +28 -0
  113. data/data/standards/export/ashrae_90_1/ashrae_90_1_2013/data/ashrae_90_1_2013.water_source_heat_pumps_heating.json +12 -0
  114. data/data/standards/manage_OpenStudio_Standards.rb +87 -37
  115. data/data/standards/metadata_units_OpenStudio_Standards-ashrae_90_1-ALL-comstockspace_types.csv +236 -0
  116. data/data/standards/metadata_units_OpenStudio_Standards-ashrae_90_1.csv +622 -0
  117. data/data/standards/metadata_units_OpenStudio_Standards-ashrae_90_1space_types.csv +191 -0
  118. data/data/standards/openstudio_standards_duplicates_log.csv +17 -0
  119. data/data/standards/test_performance_expected_dd_results.csv +1971 -1171
  120. data/lib/openstudio-standards.rb +76 -18
  121. data/lib/openstudio-standards/btap/btap.model.rb +1 -1
  122. data/lib/openstudio-standards/btap/economics.rb +14 -11
  123. data/lib/openstudio-standards/btap/envelope.rb +185 -257
  124. data/lib/openstudio-standards/btap/fileio.rb +1 -0
  125. data/lib/openstudio-standards/btap/geometry.rb +21 -1
  126. data/lib/openstudio-standards/btap/measures.rb +12 -11
  127. data/lib/openstudio-standards/btap/schedules.rb +3 -12
  128. data/lib/openstudio-standards/hvac_sizing/Siz.AirLoopHVACUnitaryHeatPumpAirToAirMultiSpeed.rb +178 -0
  129. data/lib/openstudio-standards/hvac_sizing/Siz.CoilCoolingDXMultiSpeed.rb +8 -8
  130. data/lib/openstudio-standards/hvac_sizing/Siz.Model.rb +3 -0
  131. data/lib/openstudio-standards/prototypes/ashrae_90_1/ashrae_90_1_2004/ashrae_90_1_2004.PumpVariableSpeed.rb +28 -0
  132. data/lib/openstudio-standards/prototypes/ashrae_90_1/ashrae_90_1_2007/ashrae_90_1_2007.FanVariableVolume.rb +0 -1
  133. data/lib/openstudio-standards/prototypes/ashrae_90_1/ashrae_90_1_2007/ashrae_90_1_2007.PumpVariableSpeed.rb +28 -0
  134. data/lib/openstudio-standards/prototypes/ashrae_90_1/ashrae_90_1_2010/ashrae_90_1_2010.Model.rb +53 -2
  135. data/lib/openstudio-standards/prototypes/ashrae_90_1/ashrae_90_1_2010/ashrae_90_1_2010.PumpVariableSpeed.rb +29 -0
  136. data/lib/openstudio-standards/prototypes/ashrae_90_1/ashrae_90_1_2013/ashrae_90_1_2013.Model.rb +157 -2
  137. data/lib/openstudio-standards/prototypes/ashrae_90_1/ashrae_90_1_2013/ashrae_90_1_2013.PumpVariableSpeed.rb +29 -0
  138. data/lib/openstudio-standards/prototypes/ashrae_90_1/ashrae_90_1_2016/ashrae_90_1_2016.AirTerminalSingleDuctVAVReheat.rb +24 -0
  139. data/lib/openstudio-standards/prototypes/ashrae_90_1/ashrae_90_1_2016/ashrae_90_1_2016.FanConstantVolume.rb +32 -0
  140. data/lib/openstudio-standards/prototypes/ashrae_90_1/ashrae_90_1_2016/ashrae_90_1_2016.FanOnOff.rb +33 -0
  141. data/lib/openstudio-standards/prototypes/ashrae_90_1/ashrae_90_1_2016/ashrae_90_1_2016.FanVariableVolume.rb +32 -0
  142. data/lib/openstudio-standards/prototypes/ashrae_90_1/ashrae_90_1_2016/ashrae_90_1_2016.Model.elevators.rb +25 -0
  143. data/lib/openstudio-standards/prototypes/ashrae_90_1/ashrae_90_1_2016/ashrae_90_1_2016.Model.rb +366 -0
  144. data/lib/openstudio-standards/prototypes/ashrae_90_1/ashrae_90_1_2016/ashrae_90_1_2016.PumpVariableSpeed.rb +144 -0
  145. data/lib/openstudio-standards/prototypes/ashrae_90_1/ashrae_90_1_2016/ashrae_90_1_2016.hvac_systems.rb +11 -0
  146. data/lib/openstudio-standards/prototypes/ashrae_90_1/ashrae_90_1_2019/ashrae_90_1_2019.AirTerminalSingleDuctVAVReheat.rb +24 -0
  147. data/lib/openstudio-standards/prototypes/ashrae_90_1/ashrae_90_1_2019/ashrae_90_1_2019.FanConstantVolume.rb +32 -0
  148. data/lib/openstudio-standards/prototypes/ashrae_90_1/ashrae_90_1_2019/ashrae_90_1_2019.FanOnOff.rb +33 -0
  149. data/lib/openstudio-standards/prototypes/ashrae_90_1/ashrae_90_1_2019/ashrae_90_1_2019.FanVariableVolume.rb +32 -0
  150. data/lib/openstudio-standards/prototypes/ashrae_90_1/ashrae_90_1_2019/ashrae_90_1_2019.Model.elevators.rb +25 -0
  151. data/lib/openstudio-standards/prototypes/ashrae_90_1/ashrae_90_1_2019/ashrae_90_1_2019.Model.rb +367 -0
  152. data/lib/openstudio-standards/prototypes/ashrae_90_1/ashrae_90_1_2019/ashrae_90_1_2019.PumpVariableSpeed.rb +144 -0
  153. data/lib/openstudio-standards/prototypes/ashrae_90_1/ashrae_90_1_2019/ashrae_90_1_2019.hvac_systems.rb +11 -0
  154. data/lib/openstudio-standards/prototypes/ashrae_90_1/doe_ref_1980_2004/doe_ref_1980_2004.AirTerminalSingleDuctVAVReheat.rb +0 -1
  155. data/lib/openstudio-standards/prototypes/ashrae_90_1/doe_ref_pre_1980/doe_ref_pre_1980.AirTerminalSingleDuctVAVReheat.rb +0 -1
  156. data/lib/openstudio-standards/prototypes/ashrae_90_1/nrel_nze_ready_2017/nrel_zne_ready_2017.HeatExchangerAirToAirSensibleAndLatent.rb +1 -1
  157. data/lib/openstudio-standards/prototypes/ashrae_90_1/nrel_nze_ready_2017/nrel_zne_ready_2017.Model.rb +1 -1
  158. data/lib/openstudio-standards/prototypes/ashrae_90_1/ze_aedg_multifamily/ze_aedg_multifamily.HeatExchangerAirToAirSensibleAndLatent.rb +1 -1
  159. data/lib/openstudio-standards/prototypes/ashrae_90_1/ze_aedg_multifamily/ze_aedg_multifamily.Model.rb +1 -1
  160. data/lib/openstudio-standards/prototypes/common/buildings/Prototype.College.rb +3 -3
  161. data/lib/openstudio-standards/prototypes/common/buildings/Prototype.Courthouse.rb +74 -0
  162. data/lib/openstudio-standards/prototypes/common/buildings/Prototype.FullServiceRestaurant.rb +46 -30
  163. data/lib/openstudio-standards/prototypes/common/buildings/Prototype.HighRiseApartment.rb +23 -8
  164. data/lib/openstudio-standards/prototypes/common/buildings/Prototype.Hospital.rb +26 -15
  165. data/lib/openstudio-standards/prototypes/common/buildings/Prototype.Laboratory.rb +8 -11
  166. data/lib/openstudio-standards/prototypes/common/buildings/Prototype.LargeDataCenterHighITE.rb +54 -60
  167. data/lib/openstudio-standards/prototypes/common/buildings/Prototype.LargeDataCenterLowITE.rb +56 -60
  168. data/lib/openstudio-standards/prototypes/common/buildings/Prototype.LargeHotel.rb +38 -12
  169. data/lib/openstudio-standards/prototypes/common/buildings/Prototype.LargeOffice.rb +218 -134
  170. data/lib/openstudio-standards/prototypes/common/buildings/Prototype.LargeOfficeDetailed.rb +6 -2
  171. data/lib/openstudio-standards/prototypes/common/buildings/Prototype.MediumOffice.rb +230 -134
  172. data/lib/openstudio-standards/prototypes/common/buildings/Prototype.MediumOfficeDetailed.rb +60 -62
  173. data/lib/openstudio-standards/prototypes/common/buildings/Prototype.MidriseApartment.rb +25 -15
  174. data/lib/openstudio-standards/prototypes/common/buildings/Prototype.Outpatient.rb +34 -22
  175. data/lib/openstudio-standards/prototypes/common/buildings/Prototype.PrimarySchool.rb +31 -7
  176. data/lib/openstudio-standards/prototypes/common/buildings/Prototype.QuickServiceRestaurant.rb +43 -28
  177. data/lib/openstudio-standards/prototypes/common/buildings/Prototype.RetailStandalone.rb +48 -38
  178. data/lib/openstudio-standards/prototypes/common/buildings/Prototype.RetailStripmall.rb +9 -5
  179. data/lib/openstudio-standards/prototypes/common/buildings/Prototype.SecondarySchool.rb +575 -345
  180. data/lib/openstudio-standards/prototypes/common/buildings/Prototype.SmallDataCenterHighITE.rb +13 -19
  181. data/lib/openstudio-standards/prototypes/common/buildings/Prototype.SmallDataCenterLowITE.rb +13 -17
  182. data/lib/openstudio-standards/prototypes/common/buildings/Prototype.SmallHotel.rb +9 -5
  183. data/lib/openstudio-standards/prototypes/common/buildings/Prototype.SmallOffice.rb +79 -51
  184. data/lib/openstudio-standards/prototypes/common/buildings/Prototype.SmallOfficeDetailed.rb +60 -60
  185. data/lib/openstudio-standards/prototypes/common/buildings/Prototype.SuperMarket.rb +2 -4
  186. data/lib/openstudio-standards/prototypes/common/buildings/Prototype.SuperTallBuilding.rb +133 -120
  187. data/lib/openstudio-standards/prototypes/common/buildings/Prototype.TallBuilding.rb +124 -112
  188. data/lib/openstudio-standards/prototypes/common/buildings/Prototype.Warehouse.rb +138 -66
  189. data/lib/openstudio-standards/prototypes/common/do_not_edit_metaclasses.rb +7275 -199
  190. data/lib/openstudio-standards/prototypes/common/objects/Prototype.AirConditionerVariableRefrigerantFlow.rb +35 -35
  191. data/lib/openstudio-standards/prototypes/common/objects/Prototype.BoilerHotWater.rb +2 -2
  192. data/lib/openstudio-standards/prototypes/common/objects/Prototype.CentralAirSourceHeatPump.rb +2 -2
  193. data/lib/openstudio-standards/prototypes/common/objects/Prototype.CoilCoolingDXSingleSpeed.rb +3 -3
  194. data/lib/openstudio-standards/prototypes/common/objects/Prototype.CoilCoolingDXTwoSpeed.rb +1 -1
  195. data/lib/openstudio-standards/prototypes/common/objects/Prototype.CoilCoolingWater.rb +2 -2
  196. data/lib/openstudio-standards/prototypes/common/objects/Prototype.CoilCoolingWaterToAirHeatPumpEquationFit.rb +2 -2
  197. data/lib/openstudio-standards/prototypes/common/objects/Prototype.CoilHeatingDXSingleSpeed.rb +1 -1
  198. data/lib/openstudio-standards/prototypes/common/objects/Prototype.CoilHeatingElectric.rb +2 -2
  199. data/lib/openstudio-standards/prototypes/common/objects/Prototype.CoilHeatingWater.rb +2 -2
  200. data/lib/openstudio-standards/prototypes/common/objects/Prototype.CoilHeatingWaterToAirHeatPumpEquationFit.rb +2 -2
  201. data/lib/openstudio-standards/prototypes/common/objects/Prototype.CoolingTower.rb +1 -1
  202. data/lib/openstudio-standards/prototypes/common/objects/Prototype.Fan.rb +4 -3
  203. data/lib/openstudio-standards/prototypes/common/objects/Prototype.FanConstantVolume.rb +7 -8
  204. data/lib/openstudio-standards/prototypes/common/objects/Prototype.FanOnOff.rb +7 -8
  205. data/lib/openstudio-standards/prototypes/common/objects/Prototype.FanVariableVolume.rb +13 -14
  206. data/lib/openstudio-standards/prototypes/common/objects/Prototype.FanZoneExhaust.rb +7 -5
  207. data/lib/openstudio-standards/prototypes/common/objects/Prototype.Model.elevators.rb +4 -1
  208. data/lib/openstudio-standards/prototypes/common/objects/Prototype.Model.exterior_lights.rb +0 -1
  209. data/lib/openstudio-standards/prototypes/common/objects/Prototype.Model.hvac.rb +25 -14
  210. data/lib/openstudio-standards/prototypes/common/objects/Prototype.Model.rb +474 -89
  211. data/lib/openstudio-standards/prototypes/common/objects/Prototype.Model.swh.rb +35 -33
  212. data/lib/openstudio-standards/prototypes/common/objects/Prototype.Pump.rb +3 -0
  213. data/lib/openstudio-standards/prototypes/common/objects/Prototype.PumpVariableSpeed.rb +72 -0
  214. data/lib/openstudio-standards/prototypes/common/objects/Prototype.ServiceWaterHeating.rb +120 -120
  215. data/lib/openstudio-standards/prototypes/common/objects/Prototype.hvac_systems.rb +142 -154
  216. data/lib/openstudio-standards/prototypes/common/objects/Prototype.radiant_system_controls.rb +9 -3
  217. data/lib/openstudio-standards/prototypes/common/objects/Prototype.refrigeration.rb +11 -5
  218. data/lib/openstudio-standards/prototypes/common/objects/Prototype.utilities.rb +26 -14
  219. data/lib/openstudio-standards/prototypes/common/prototype_metaprogramming.rb +270 -247
  220. data/lib/openstudio-standards/prototypes/deer/deer.Model.rb +1 -1
  221. data/lib/openstudio-standards/refs/references.rb +5 -2
  222. data/lib/openstudio-standards/standards/Standards.AirLoopHVAC.rb +70 -51
  223. data/lib/openstudio-standards/standards/Standards.AirTerminalSingleDuctVAVReheat.rb +0 -1
  224. data/lib/openstudio-standards/standards/Standards.BoilerHotWater.rb +0 -1
  225. data/lib/openstudio-standards/standards/Standards.BuildingStory.rb +1 -0
  226. data/lib/openstudio-standards/standards/Standards.ChillerElectricEIR.rb +2 -4
  227. data/lib/openstudio-standards/standards/Standards.CoilCoolingDXMultiSpeed.rb +91 -2
  228. data/lib/openstudio-standards/standards/Standards.CoilCoolingDXSingleSpeed.rb +4 -5
  229. data/lib/openstudio-standards/standards/Standards.CoilCoolingDXTwoSpeed.rb +0 -1
  230. data/lib/openstudio-standards/standards/Standards.CoilCoolingWaterToAirHeatPumpEquationFit.rb +1 -1
  231. data/lib/openstudio-standards/standards/Standards.CoilDX.rb +30 -9
  232. data/lib/openstudio-standards/standards/Standards.CoilHeatingDXMultiSpeed.rb +2 -1
  233. data/lib/openstudio-standards/standards/Standards.CoilHeatingDXSingleSpeed.rb +3 -1
  234. data/lib/openstudio-standards/standards/Standards.CoilHeatingGas.rb +0 -3
  235. data/lib/openstudio-standards/standards/Standards.CoilHeatingGasMultiStage.rb +37 -1
  236. data/lib/openstudio-standards/standards/Standards.CoilHeatingWaterToAirHeatPumpEquationFit.rb +1 -3
  237. data/lib/openstudio-standards/standards/Standards.Construction.rb +124 -118
  238. data/lib/openstudio-standards/standards/Standards.CoolingTower.rb +0 -1
  239. data/lib/openstudio-standards/standards/Standards.CoolingTowerSingleSpeed.rb +0 -1
  240. data/lib/openstudio-standards/standards/Standards.CoolingTowerTwoSpeed.rb +0 -1
  241. data/lib/openstudio-standards/standards/Standards.CoolingTowerVariableSpeed.rb +0 -1
  242. data/lib/openstudio-standards/standards/Standards.Fan.rb +0 -1
  243. data/lib/openstudio-standards/standards/Standards.FanConstantVolume.rb +0 -1
  244. data/lib/openstudio-standards/standards/Standards.FanOnOff.rb +0 -1
  245. data/lib/openstudio-standards/standards/Standards.FanVariableVolume.rb +2 -4
  246. data/lib/openstudio-standards/standards/Standards.FanZoneExhaust.rb +0 -1
  247. data/lib/openstudio-standards/standards/Standards.FluidCooler.rb +10 -3
  248. data/lib/openstudio-standards/standards/Standards.HeaderedPumpsConstantSpeed.rb +0 -1
  249. data/lib/openstudio-standards/standards/Standards.HeaderedPumpsVariableSpeed.rb +0 -1
  250. data/lib/openstudio-standards/standards/Standards.Model.rb +305 -247
  251. data/lib/openstudio-standards/standards/Standards.PlanarSurface.rb +2 -0
  252. data/lib/openstudio-standards/standards/Standards.PlantLoop.rb +11 -9
  253. data/lib/openstudio-standards/standards/Standards.Pump.rb +0 -1
  254. data/lib/openstudio-standards/standards/Standards.PumpConstantSpeed.rb +0 -1
  255. data/lib/openstudio-standards/standards/Standards.PumpVariableSpeed.rb +0 -1
  256. data/lib/openstudio-standards/standards/Standards.ScheduleCompact.rb +0 -1
  257. data/lib/openstudio-standards/standards/Standards.ScheduleConstant.rb +0 -1
  258. data/lib/openstudio-standards/standards/Standards.ScheduleRuleset.rb +103 -121
  259. data/lib/openstudio-standards/standards/Standards.Space.rb +42 -35
  260. data/lib/openstudio-standards/standards/Standards.SpaceType.rb +9 -17
  261. data/lib/openstudio-standards/standards/Standards.SubSurface.rb +25 -27
  262. data/lib/openstudio-standards/standards/Standards.Surface.rb +97 -52
  263. data/lib/openstudio-standards/standards/Standards.ThermalZone.rb +76 -25
  264. data/lib/openstudio-standards/standards/Standards.WaterHeaterMixed.rb +6 -7
  265. data/lib/openstudio-standards/standards/Standards.ZoneHVACComponent.rb +85 -7
  266. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1.Standards.FanVariableVolume.rb +0 -1
  267. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2004/ashrae_90_1_2004.AirLoopHVAC.rb +10 -2
  268. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2004/ashrae_90_1_2004.Model.rb +2 -2
  269. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2004/comstock_ashrae_90_1_2004/data/ashrae_90_1.schedules.json +63 -99
  270. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2004/comstock_ashrae_90_1_2004/data/comstock_ashrae_90_1_2004.ext_ltg.json +7 -7
  271. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2004/data/ashrae_90_1_2004.construction_properties.json +2420 -0
  272. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2004/data/ashrae_90_1_2004.economizers.json +32 -0
  273. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2004/data/ashrae_90_1_2004.heat_rejection.json +9 -0
  274. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2004/data/ashrae_90_1_2004.prototype_inputs.json +70 -40
  275. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2004/data/ashrae_90_1_2004.spc_typ.json +105 -40
  276. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2004/data/ashrae_90_1_2004.unitary_acs.json +15 -15
  277. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2007/ashrae_90_1_2007.AirLoopHVAC.rb +5 -1
  278. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2007/comstock_ashrae_90_1_2007/data/ashrae_90_1.schedules.json +63 -99
  279. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2007/comstock_ashrae_90_1_2007/data/comstock_ashrae_90_1_2007.ext_ltg.json +7 -7
  280. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2007/data/ashrae_90_1_2007.construction_properties.json +1460 -0
  281. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2007/data/ashrae_90_1_2007.economizers.json +32 -0
  282. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2007/data/ashrae_90_1_2007.heat_rejection.json +9 -0
  283. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2007/data/ashrae_90_1_2007.prototype_inputs.json +123 -39
  284. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2007/data/ashrae_90_1_2007.spc_typ.json +104 -17
  285. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2007/data/ashrae_90_1_2007.unitary_acs.json +15 -15
  286. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2010/ashrae_90_1_2010.AirLoopHVAC.rb +32 -15
  287. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2010/ashrae_90_1_2010.Space.rb +1 -1
  288. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2010/comstock_ashrae_90_1_2010/data/ashrae_90_1.schedules.json +63 -99
  289. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2010/comstock_ashrae_90_1_2010/data/comstock_ashrae_90_1_2010.ext_ltg.json +7 -7
  290. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2010/data/ashrae_90_1_2010.construction_properties.json +1460 -0
  291. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2010/data/ashrae_90_1_2010.economizers.json +64 -0
  292. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2010/data/ashrae_90_1_2010.energy_recovery.json +52 -0
  293. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2010/data/ashrae_90_1_2010.heat_rejection.json +9 -0
  294. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2010/data/ashrae_90_1_2010.prototype_inputs.json +123 -39
  295. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2010/data/ashrae_90_1_2010.spc_typ.json +112 -25
  296. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2010/data/ashrae_90_1_2010.unitary_acs.json +5 -5
  297. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2013/ashrae_90_1_2013.AirLoopHVAC.rb +37 -14
  298. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2013/ashrae_90_1_2013.WaterHeaterMixed.rb +1 -1
  299. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2013/comstock_ashrae_90_1_2013/data/ashrae_90_1.schedules.json +63 -99
  300. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2013/comstock_ashrae_90_1_2013/data/comstock_ashrae_90_1_2013.ext_ltg.json +7 -7
  301. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2013/data/ashrae_90_1_2013.boilers.json +1 -1
  302. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2013/data/ashrae_90_1_2013.chillers.json +2 -2
  303. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2013/data/ashrae_90_1_2013.construction_properties.json +1460 -0
  304. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2013/data/ashrae_90_1_2013.economizers.json +64 -0
  305. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2013/data/ashrae_90_1_2013.energy_recovery.json +104 -0
  306. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2013/data/ashrae_90_1_2013.heat_rejection.json +9 -0
  307. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2013/data/ashrae_90_1_2013.prototype_inputs.json +125 -41
  308. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2013/data/ashrae_90_1_2013.spc_typ.json +172 -55
  309. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2013/data/ashrae_90_1_2013.unitary_acs.json +15 -15
  310. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2013/data/ashrae_90_1_2013.water_heaters.json +4 -4
  311. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2013/data/ashrae_90_1_2013.water_source_heat_pumps_heating.json +1 -1
  312. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2016/ashrae_90_1_2016.AirLoopHVAC.rb +456 -0
  313. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2016/ashrae_90_1_2016.AirTerminalSingleDuctVAVReheat.rb +24 -0
  314. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2016/ashrae_90_1_2016.CoolingTower.rb +19 -0
  315. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2016/ashrae_90_1_2016.CoolingTowerSingleSpeed.rb +5 -0
  316. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2016/ashrae_90_1_2016.CoolingTowerTwoSpeed.rb +5 -0
  317. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2016/ashrae_90_1_2016.CoolingTowerVariableSpeed.rb +16 -0
  318. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2016/ashrae_90_1_2016.FanVariableVolume.rb +37 -0
  319. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2016/ashrae_90_1_2016.Space.rb +189 -0
  320. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2016/ashrae_90_1_2016.ThermalZone.rb +57 -0
  321. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2016/ashrae_90_1_2016.ZoneHVACComponent.rb +22 -0
  322. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2016/ashrae_90_1_2016.rb +16 -0
  323. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2016/data/ashrae_90_1_2016.boilers.json +68 -0
  324. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2016/data/ashrae_90_1_2016.chillers.json +490 -0
  325. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2016/data/ashrae_90_1_2016.construction_properties.json +21244 -0
  326. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2016/data/ashrae_90_1_2016.construction_sets.json +2111 -0
  327. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2016/data/ashrae_90_1_2016.economizers.json +676 -0
  328. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2016/data/ashrae_90_1_2016.elevators.json +372 -0
  329. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2016/data/ashrae_90_1_2016.energy_recovery.json +1096 -0
  330. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2016/data/ashrae_90_1_2016.ext_ltg.json +169 -0
  331. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2016/data/ashrae_90_1_2016.heat_pumps.json +532 -0
  332. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2016/data/ashrae_90_1_2016.heat_pumps_heating.json +164 -0
  333. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2016/data/ashrae_90_1_2016.heat_rejection.json +49 -0
  334. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2016/data/ashrae_90_1_2016.motors.json +274 -0
  335. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2016/data/ashrae_90_1_2016.prototype_inputs.json +3094 -0
  336. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2016/data/ashrae_90_1_2016.ref_cases.json +854 -0
  337. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2016/data/ashrae_90_1_2016.ref_lnup.json +562 -0
  338. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2016/data/ashrae_90_1_2016.refrigeration_compressors.json +58 -0
  339. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2016/data/ashrae_90_1_2016.refrigeration_condenser.json +238 -0
  340. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2016/data/ashrae_90_1_2016.refrigeration_system.json +12 -0
  341. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2016/data/ashrae_90_1_2016.refrigeration_walkins.json +1316 -0
  342. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2016/data/ashrae_90_1_2016.spc_typ.json +23067 -0
  343. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2016/data/ashrae_90_1_2016.unitary_acs.json +648 -0
  344. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2016/data/ashrae_90_1_2016.water_heaters.json +72 -0
  345. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2016/data/ashrae_90_1_2016.water_source_heat_pumps.json +31 -0
  346. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2016/data/ashrae_90_1_2016.water_source_heat_pumps_heating.json +13 -0
  347. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2019/ashrae_90_1_2019.AirLoopHVAC.rb +456 -0
  348. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2019/ashrae_90_1_2019.AirTerminalSingleDuctVAVReheat.rb +24 -0
  349. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2019/ashrae_90_1_2019.CoolingTower.rb +19 -0
  350. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2019/ashrae_90_1_2019.CoolingTowerSingleSpeed.rb +5 -0
  351. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2019/ashrae_90_1_2019.CoolingTowerTwoSpeed.rb +5 -0
  352. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2019/ashrae_90_1_2019.CoolingTowerVariableSpeed.rb +16 -0
  353. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2019/ashrae_90_1_2019.FanVariableVolume.rb +37 -0
  354. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2019/ashrae_90_1_2019.Space.rb +189 -0
  355. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2019/ashrae_90_1_2019.ThermalZone.rb +57 -0
  356. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2019/ashrae_90_1_2019.ZoneHVACComponent.rb +22 -0
  357. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2019/ashrae_90_1_2019.rb +16 -0
  358. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2019/data/ashrae_90_1_2019.boilers.json +68 -0
  359. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2019/data/ashrae_90_1_2019.chillers.json +490 -0
  360. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2019/data/ashrae_90_1_2019.construction_properties.json +21244 -0
  361. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2019/data/ashrae_90_1_2019.construction_sets.json +2111 -0
  362. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2019/data/ashrae_90_1_2019.economizers.json +676 -0
  363. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2019/data/ashrae_90_1_2019.elevators.json +372 -0
  364. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2019/data/ashrae_90_1_2019.energy_recovery.json +1096 -0
  365. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2019/data/ashrae_90_1_2019.ext_ltg.json +169 -0
  366. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2019/data/ashrae_90_1_2019.heat_pumps.json +664 -0
  367. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2019/data/ashrae_90_1_2019.heat_pumps_heating.json +204 -0
  368. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2019/data/ashrae_90_1_2019.heat_rejection.json +49 -0
  369. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2019/data/ashrae_90_1_2019.motors.json +274 -0
  370. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2019/data/ashrae_90_1_2019.prototype_inputs.json +3094 -0
  371. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2019/data/ashrae_90_1_2019.ref_cases.json +854 -0
  372. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2019/data/ashrae_90_1_2019.ref_lnup.json +562 -0
  373. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2019/data/ashrae_90_1_2019.refrigeration_compressors.json +58 -0
  374. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2019/data/ashrae_90_1_2019.refrigeration_condenser.json +238 -0
  375. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2019/data/ashrae_90_1_2019.refrigeration_system.json +12 -0
  376. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2019/data/ashrae_90_1_2019.refrigeration_walkins.json +1316 -0
  377. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2019/data/ashrae_90_1_2019.spc_typ.json +23067 -0
  378. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2019/data/ashrae_90_1_2019.unitary_acs.json +671 -0
  379. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2019/data/ashrae_90_1_2019.water_heaters.json +72 -0
  380. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2019/data/ashrae_90_1_2019.water_source_heat_pumps.json +31 -0
  381. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2019/data/ashrae_90_1_2019.water_source_heat_pumps_heating.json +13 -0
  382. data/lib/openstudio-standards/standards/ashrae_90_1/data/ashrae_90_1.constructions.json +1662 -332
  383. data/lib/openstudio-standards/standards/ashrae_90_1/data/ashrae_90_1.fans.json +1 -1
  384. data/lib/openstudio-standards/standards/ashrae_90_1/data/ashrae_90_1.materials.json +4994 -234
  385. data/lib/openstudio-standards/standards/ashrae_90_1/data/ashrae_90_1.schedules.json +1743 -161
  386. data/lib/openstudio-standards/standards/ashrae_90_1/doe_ref_1980_2004/comstock_doe_ref_1980_2004/data/ashrae_90_1.schedules.json +63 -99
  387. data/lib/openstudio-standards/standards/ashrae_90_1/doe_ref_1980_2004/comstock_doe_ref_1980_2004/data/comstock_doe_ref_1980_2004.ext_ltg.json +11 -11
  388. data/lib/openstudio-standards/standards/ashrae_90_1/doe_ref_1980_2004/data/doe_ref_1980_2004.heat_rejection.json +9 -0
  389. data/lib/openstudio-standards/standards/ashrae_90_1/doe_ref_1980_2004/data/doe_ref_1980_2004.prototype_inputs.json +8 -8
  390. data/lib/openstudio-standards/standards/ashrae_90_1/doe_ref_1980_2004/data/doe_ref_1980_2004.spc_typ.json +5967 -2727
  391. data/lib/openstudio-standards/standards/ashrae_90_1/doe_ref_1980_2004/doe_ref_1980_2004.Model.rb +4 -4
  392. data/lib/openstudio-standards/standards/ashrae_90_1/doe_ref_pre_1980/comstock_doe_ref_pre_1980/data/ashrae_90_1.schedules.json +63 -99
  393. data/lib/openstudio-standards/standards/ashrae_90_1/doe_ref_pre_1980/comstock_doe_ref_pre_1980/data/comstock_doe_ref_pre_1980.ext_ltg.json +10 -10
  394. data/lib/openstudio-standards/standards/ashrae_90_1/doe_ref_pre_1980/data/doe_ref_pre_1980.heat_rejection.json +9 -0
  395. data/lib/openstudio-standards/standards/ashrae_90_1/doe_ref_pre_1980/data/doe_ref_pre_1980.prototype_inputs.json +7 -7
  396. data/lib/openstudio-standards/standards/ashrae_90_1/doe_ref_pre_1980/data/doe_ref_pre_1980.spc_typ.json +5920 -2700
  397. data/lib/openstudio-standards/standards/ashrae_90_1/doe_ref_pre_1980/doe_ref_pre_1980.Model.rb +4 -4
  398. data/lib/openstudio-standards/standards/ashrae_90_1/nrel_zne_ready_2017/data/nrel_zne_ready_2017.heat_rejection.json +9 -0
  399. data/lib/openstudio-standards/standards/ashrae_90_1/nrel_zne_ready_2017/data/nrel_zne_ready_2017.spc_typ.json +2011 -1112
  400. data/lib/openstudio-standards/standards/ashrae_90_1/nrel_zne_ready_2017/nrel_zne_ready_2017.AirLoopHVAC.rb +0 -1
  401. data/lib/openstudio-standards/standards/ashrae_90_1/nrel_zne_ready_2017/nrel_zne_ready_2017.Model.rb +4 -4
  402. data/lib/openstudio-standards/standards/ashrae_90_1/nrel_zne_ready_2017/nrel_zne_ready_2017.PlantLoop.rb +1 -1
  403. data/lib/openstudio-standards/standards/ashrae_90_1/nrel_zne_ready_2017/nrel_zne_ready_2017.ZoneHVACComponent.rb +1 -1
  404. data/lib/openstudio-standards/standards/ashrae_90_1/ze_aedg_multifamily/data/ze_aedg_multifamily.heat_rejection.json +9 -0
  405. data/lib/openstudio-standards/standards/ashrae_90_1/ze_aedg_multifamily/data/ze_aedg_multifamily.spc_typ.json +1946 -1106
  406. data/lib/openstudio-standards/standards/ashrae_90_1/ze_aedg_multifamily/data/ze_aedg_multifamily.water_heaters.json +2 -2
  407. data/lib/openstudio-standards/standards/ashrae_90_1/ze_aedg_multifamily/ze_aedg_multifamily.AirLoopHVAC.rb +3 -6
  408. data/lib/openstudio-standards/standards/ashrae_90_1/ze_aedg_multifamily/ze_aedg_multifamily.Model.rb +4 -4
  409. data/lib/openstudio-standards/standards/ashrae_90_1/ze_aedg_multifamily/ze_aedg_multifamily.PlantLoop.rb +1 -1
  410. data/lib/openstudio-standards/standards/ashrae_90_1/ze_aedg_multifamily/ze_aedg_multifamily.ZoneHVACComponent.rb +1 -1
  411. data/lib/openstudio-standards/standards/cbes/cbes.Model.rb +1 -3
  412. data/lib/openstudio-standards/standards/cbes/cbes.rb +1 -1
  413. data/lib/openstudio-standards/standards/deer/deer.AirLoopHVAC.rb +8 -13
  414. data/lib/openstudio-standards/standards/deer/deer.Model.rb +2 -2
  415. data/lib/openstudio-standards/standards/deer/deer.PlanarSurface.rb +2 -0
  416. data/lib/openstudio-standards/standards/deer/deer.Space.rb +1 -1
  417. data/lib/openstudio-standards/standards/deer/deer_2011/deer_2011.rb +0 -1
  418. data/lib/openstudio-standards/standards/deer/deer_2014/deer_2014.Space.rb +0 -1
  419. data/lib/openstudio-standards/standards/deer/deer_2014/deer_2014.rb +0 -1
  420. data/lib/openstudio-standards/standards/deer/deer_2015/deer_2015.Space.rb +0 -1
  421. data/lib/openstudio-standards/standards/deer/deer_2017/deer_2017.Space.rb +0 -1
  422. data/lib/openstudio-standards/standards/deer/deer_2020/deer_2020.AirLoopHVAC.rb +1 -1
  423. data/lib/openstudio-standards/standards/deer/deer_2020/deer_2020.FanVariableVolume.rb +1 -1
  424. data/lib/openstudio-standards/standards/deer/deer_2020/deer_2020.Space.rb +0 -1
  425. data/lib/openstudio-standards/standards/deer/deer_2025/deer_2025.AirLoopHVAC.rb +1 -1
  426. data/lib/openstudio-standards/standards/deer/deer_2025/deer_2025.FanVariableVolume.rb +1 -1
  427. data/lib/openstudio-standards/standards/deer/deer_2025/deer_2025.Space.rb +0 -1
  428. data/lib/openstudio-standards/standards/deer/deer_2030/deer_2030.AirLoopHVAC.rb +1 -1
  429. data/lib/openstudio-standards/standards/deer/deer_2030/deer_2030.FanVariableVolume.rb +1 -1
  430. data/lib/openstudio-standards/standards/deer/deer_2030/deer_2030.Space.rb +0 -1
  431. data/lib/openstudio-standards/standards/deer/deer_2035/deer_2035.AirLoopHVAC.rb +1 -1
  432. data/lib/openstudio-standards/standards/deer/deer_2035/deer_2035.FanVariableVolume.rb +1 -1
  433. data/lib/openstudio-standards/standards/deer/deer_2035/deer_2035.Space.rb +0 -1
  434. data/lib/openstudio-standards/standards/deer/deer_2040/deer_2040.AirLoopHVAC.rb +1 -1
  435. data/lib/openstudio-standards/standards/deer/deer_2040/deer_2040.FanVariableVolume.rb +1 -1
  436. data/lib/openstudio-standards/standards/deer/deer_2040/deer_2040.Space.rb +0 -1
  437. data/lib/openstudio-standards/standards/deer/deer_2045/deer_2045.AirLoopHVAC.rb +1 -1
  438. data/lib/openstudio-standards/standards/deer/deer_2045/deer_2045.FanVariableVolume.rb +1 -1
  439. data/lib/openstudio-standards/standards/deer/deer_2045/deer_2045.Space.rb +0 -1
  440. data/lib/openstudio-standards/standards/deer/deer_2050/deer_2050.AirLoopHVAC.rb +1 -1
  441. data/lib/openstudio-standards/standards/deer/deer_2050/deer_2050.FanVariableVolume.rb +1 -1
  442. data/lib/openstudio-standards/standards/deer/deer_2050/deer_2050.Space.rb +0 -1
  443. data/lib/openstudio-standards/standards/deer/deer_2055/deer_2055.AirLoopHVAC.rb +1 -1
  444. data/lib/openstudio-standards/standards/deer/deer_2055/deer_2055.FanVariableVolume.rb +1 -1
  445. data/lib/openstudio-standards/standards/deer/deer_2055/deer_2055.Space.rb +0 -1
  446. data/lib/openstudio-standards/standards/deer/deer_2060/deer_2060.AirLoopHVAC.rb +1 -1
  447. data/lib/openstudio-standards/standards/deer/deer_2060/deer_2060.FanVariableVolume.rb +1 -1
  448. data/lib/openstudio-standards/standards/deer/deer_2060/deer_2060.Space.rb +0 -1
  449. data/lib/openstudio-standards/standards/deer/deer_2065/deer_2065.AirLoopHVAC.rb +1 -1
  450. data/lib/openstudio-standards/standards/deer/deer_2065/deer_2065.FanVariableVolume.rb +1 -1
  451. data/lib/openstudio-standards/standards/deer/deer_2065/deer_2065.Space.rb +0 -1
  452. data/lib/openstudio-standards/standards/deer/deer_2070/deer_2070.AirLoopHVAC.rb +1 -1
  453. data/lib/openstudio-standards/standards/deer/deer_2070/deer_2070.FanVariableVolume.rb +1 -1
  454. data/lib/openstudio-standards/standards/deer/deer_2070/deer_2070.Space.rb +0 -1
  455. data/lib/openstudio-standards/standards/deer/deer_2075/deer_2075.AirLoopHVAC.rb +1 -1
  456. data/lib/openstudio-standards/standards/deer/deer_2075/deer_2075.FanVariableVolume.rb +1 -1
  457. data/lib/openstudio-standards/standards/deer/deer_2075/deer_2075.Space.rb +0 -1
  458. data/lib/openstudio-standards/standards/icc_iecc/icc_iecc_2015/icc_iecc_2015.rb +0 -1
  459. data/lib/openstudio-standards/standards/necb/BTAP1980TO2010/btap_1980to2010.rb +2 -18
  460. data/lib/openstudio-standards/standards/necb/BTAP1980TO2010/data/space_types.json +1677 -1005
  461. data/lib/openstudio-standards/standards/necb/BTAPPRE1980/btap_pre1980.rb +87 -15
  462. data/lib/openstudio-standards/standards/necb/BTAPPRE1980/building_envelope.rb +31 -19
  463. data/lib/openstudio-standards/standards/necb/BTAPPRE1980/data/curves.json +75 -0
  464. data/lib/openstudio-standards/standards/necb/BTAPPRE1980/data/heat_pumps.json +16 -16
  465. data/lib/openstudio-standards/standards/necb/BTAPPRE1980/data/space_types.json +1677 -1005
  466. data/lib/openstudio-standards/standards/necb/BTAPPRE1980/hvac_system_3_and_8_single_speed.rb +16 -2
  467. data/lib/openstudio-standards/standards/necb/BTAPPRE1980/hvac_system_4.rb +15 -0
  468. data/lib/openstudio-standards/standards/necb/BTAPPRE1980/hvac_system_6.rb +14 -0
  469. data/lib/openstudio-standards/standards/necb/ECMS/data/boiler_set.json +29 -0
  470. data/lib/openstudio-standards/standards/necb/ECMS/data/curves.json +913 -0
  471. data/lib/openstudio-standards/standards/necb/ECMS/data/equip_eff_lim.json +52 -0
  472. data/lib/openstudio-standards/standards/necb/ECMS/data/erv.json +109 -0
  473. data/lib/openstudio-standards/standards/necb/ECMS/data/furnace_set.json +23 -0
  474. data/lib/openstudio-standards/standards/necb/ECMS/data/heat_pumps.json +803 -0
  475. data/lib/openstudio-standards/standards/necb/ECMS/data/heat_pumps_heating.json +787 -0
  476. data/lib/openstudio-standards/standards/necb/ECMS/data/pv.json +112 -0
  477. data/lib/openstudio-standards/standards/necb/ECMS/data/shw_set.json +29 -0
  478. data/lib/openstudio-standards/standards/necb/ECMS/data/unitary_acs.json +50 -0
  479. data/lib/openstudio-standards/standards/necb/ECMS/ecms.rb +100 -0
  480. data/lib/openstudio-standards/standards/necb/ECMS/erv.rb +33 -0
  481. data/lib/openstudio-standards/standards/necb/ECMS/hvac_systems.rb +1729 -0
  482. data/lib/openstudio-standards/standards/necb/ECMS/nv.rb +189 -0
  483. data/lib/openstudio-standards/standards/necb/ECMS/pv_ground.rb +104 -0
  484. data/lib/openstudio-standards/standards/necb/NECB2011/autozone.rb +68 -33
  485. data/lib/openstudio-standards/standards/necb/NECB2011/beps_compliance_path.rb +24 -13
  486. data/lib/openstudio-standards/standards/necb/NECB2011/building_envelope.rb +110 -99
  487. data/lib/openstudio-standards/standards/necb/NECB2011/data/constants.json +24 -24
  488. data/lib/openstudio-standards/standards/necb/NECB2011/data/curves.json +50 -0
  489. data/lib/openstudio-standards/standards/necb/NECB2011/data/erv.json +31 -0
  490. data/lib/openstudio-standards/standards/necb/NECB2011/data/geometry/LowriseApartment.osm +39278 -0
  491. data/lib/openstudio-standards/standards/necb/NECB2011/data/led_lighting_data.json +2028 -0
  492. data/lib/openstudio-standards/standards/necb/NECB2011/data/space_types.json +1745 -1297
  493. data/lib/openstudio-standards/standards/necb/NECB2011/daylighting_control.md +70 -0
  494. data/lib/openstudio-standards/standards/necb/NECB2011/demand_controlled_ventilation.md +46 -0
  495. data/lib/openstudio-standards/standards/necb/NECB2011/hvac_system_1_multi_speed.rb +69 -107
  496. data/lib/openstudio-standards/standards/necb/NECB2011/hvac_system_1_single_speed.rb +41 -2
  497. data/lib/openstudio-standards/standards/necb/NECB2011/hvac_system_2_and_5.rb +15 -0
  498. data/lib/openstudio-standards/standards/necb/NECB2011/hvac_system_3_and_8_multi_speed.rb +139 -141
  499. data/lib/openstudio-standards/standards/necb/NECB2011/hvac_system_3_and_8_single_speed.rb +38 -2
  500. data/lib/openstudio-standards/standards/necb/NECB2011/hvac_system_4.rb +13 -0
  501. data/lib/openstudio-standards/standards/necb/NECB2011/hvac_system_6.rb +12 -0
  502. data/lib/openstudio-standards/standards/necb/NECB2011/hvac_systems.rb +492 -240
  503. data/lib/openstudio-standards/standards/necb/NECB2011/led_lighting.md +51 -0
  504. data/lib/openstudio-standards/standards/necb/NECB2011/lighting.rb +75 -9
  505. data/lib/openstudio-standards/standards/necb/NECB2011/necb_2011.rb +1229 -37
  506. data/lib/openstudio-standards/standards/necb/NECB2011/nv.md +74 -0
  507. data/lib/openstudio-standards/standards/necb/NECB2011/pv_ground.md +44 -0
  508. data/lib/openstudio-standards/standards/necb/NECB2011/qaqc/necb_qaqc.rb +11 -3
  509. data/lib/openstudio-standards/standards/necb/NECB2011/qaqc/qaqc_resources/neb_end_use_prices.csv +39 -84
  510. data/lib/openstudio-standards/standards/necb/NECB2011/service_water_heating.rb +1 -1
  511. data/lib/openstudio-standards/standards/necb/NECB2015/data/led_lighting_data.json +2883 -0
  512. data/lib/openstudio-standards/standards/necb/NECB2015/data/space_types.json +2554 -1916
  513. data/lib/openstudio-standards/standards/necb/NECB2015/necb_2015.rb +32 -1
  514. data/lib/openstudio-standards/standards/necb/NECB2017/data/led_lighting_data.json +2883 -0
  515. data/lib/openstudio-standards/standards/necb/NECB2017/data/space_types.json +2554 -1916
  516. data/lib/openstudio-standards/standards/necb/NECB2017/necb_2017.rb +29 -0
  517. data/lib/openstudio-standards/standards/oeesc/oeesc_2014/oeesc_2014.rb +0 -1
  518. data/lib/openstudio-standards/standards/standard.rb +6 -5
  519. data/lib/openstudio-standards/utilities/Add_template_field_to_json.rb +3 -3
  520. data/lib/openstudio-standards/utilities/convert_surfaces_to_adiabatic_necb_8426.rb +54 -54
  521. data/lib/openstudio-standards/utilities/generate_prototype_database.rb +2 -2
  522. data/lib/openstudio-standards/utilities/generate_space_types.rb +3 -3
  523. data/lib/openstudio-standards/utilities/logging.rb +7 -7
  524. data/lib/openstudio-standards/utilities/necb_to_epw_map.rb +14 -14
  525. data/lib/openstudio-standards/utilities/os_sim_extract.rb +25 -25
  526. data/lib/openstudio-standards/utilities/rename_surfaces.rb +10 -13
  527. data/lib/openstudio-standards/utilities/round_surf_coords.rb +18 -20
  528. data/lib/openstudio-standards/utilities/sched_create.rb +39 -41
  529. data/lib/openstudio-standards/utilities/set_mult_to_adiabatic.rb +31 -31
  530. data/lib/openstudio-standards/utilities/simulation.rb +13 -21
  531. data/lib/openstudio-standards/utilities/speacetype_map_converter.rb +10 -11
  532. data/lib/openstudio-standards/utilities/sqlfile.rb +6 -8
  533. data/lib/openstudio-standards/utilities/template_measure/measure.rb +108 -0
  534. data/lib/openstudio-standards/utilities/template_measure/measure.xml +162 -0
  535. data/lib/openstudio-standards/utilities/template_measure/resources/BTAPMeasureHelper.rb +448 -0
  536. data/lib/openstudio-standards/utilities/template_measure/tests/test.rb +160 -0
  537. data/lib/openstudio-standards/utilities/weatherData1_xlsx_to_json.rb +23 -26
  538. data/lib/openstudio-standards/version.rb +1 -1
  539. data/lib/openstudio-standards/weather/Weather.Model.rb +112 -87
  540. data/lib/openstudio-standards/weather/Weather.stat_file.rb +17 -17
  541. metadata +236 -2
@@ -1,11 +1,83 @@
1
1
  class NECB2011
2
- def add_sys3and8_single_zone_packaged_rooftop_unit_with_baseboard_heating_multi_speed(model,
3
- zones,
4
- boiler_fueltype,
5
- heating_coil_type,
6
- baseboard_type,
7
- hw_loop)
8
- raise("System 3 multi is not working right now. Please do not invoke!!!!!")
2
+
3
+ # Some tests still require a simple way to set up a system without sizing.. so we are keeping the auto_zoner flag for this method.
4
+
5
+ def add_sys3and8_single_zone_packaged_rooftop_unit_with_baseboard_heating_multi_speed(model:,
6
+ zones:,
7
+ heating_coil_type:,
8
+ baseboard_type:,
9
+ hw_loop:,
10
+ new_auto_zoner: true)
11
+ system_data = Hash.new
12
+ system_data[:name] = 'Sys_3_PSZ'
13
+ system_data[:CentralCoolingDesignSupplyAirTemperature] = 13.0
14
+ system_data[:CentralHeatingDesignSupplyAirTemperature] = 43.0
15
+ system_data[:AllOutdoorAirinCooling] = false
16
+ system_data[:AllOutdoorAirinHeating] = false
17
+ system_data[:TypeofLoadtoSizeOn] = 'Sensible'
18
+ system_data[:MinimumSystemAirFlowRatio] = 1.0
19
+
20
+ system_data[:PreheatDesignTemperature] = 7.0
21
+ system_data[:PreheatDesignHumidityRatio] = 0.008
22
+ system_data[:PrecoolDesignTemperature] = 13.0
23
+ system_data[:PrecoolDesignHumidityRatio] = 0.008
24
+ system_data[:SizingOption] = 'NonCoincident'
25
+ system_data[:CoolingDesignAirFlowMethod] = 'DesignDay'
26
+ system_data[:CoolingDesignAirFlowRate] = 0.0
27
+ system_data[:HeatingDesignAirFlowMethod] = 'DesignDay'
28
+ system_data[:HeatingDesignAirFlowRate] = 0.0
29
+ system_data[:SystemOutdoorAirMethod] = 'ZoneSum'
30
+ system_data[:CentralCoolingDesignSupplyAirHumidityRatio] = 0.0085
31
+ system_data[:CentralHeatingDesignSupplyAirHumidityRatio] = 0.0080
32
+
33
+ #System 3 Zone data
34
+ system_data[:ZoneCoolingDesignSupplyAirTemperature] = 13.0
35
+ system_data[:ZoneHeatingDesignSupplyAirTemperature] = 43.0
36
+ system_data[:SetpointManagerSingleZoneReheatSupplyTempMin] = 13.0
37
+ system_data[:SetpointManagerSingleZoneReheatSupplyTempMax] = 43.0
38
+ system_data[:ZoneDXCoolingSizingFactor] = 1.0
39
+ system_data[:ZoneDXHeatingSizingFactor] = 1.3
40
+ system_data[:ZoneCoolingSizingFactor] = 1.1
41
+ system_data[:ZoneHeatingSizingFactor] = 1.3
42
+ system_data[:MinimumOutdoorDryBulbTemperatureforCompressorOperation] = -10.0
43
+
44
+ if new_auto_zoner == true
45
+ # Create system airloop
46
+
47
+ # Add Air Loop
48
+ air_loop = add_system_3_and_8_airloop_multi_speed(heating_coil_type,
49
+ model,
50
+ system_data,
51
+ determine_control_zone(zones))
52
+ # Add Zone equipment
53
+ zones.each do |zone| # Zone sizing temperature
54
+ sizing_zone = zone.sizingZone
55
+ sizing_zone.setZoneCoolingDesignSupplyAirTemperature(system_data[:ZoneCoolingDesignSupplyAirTemperature])
56
+ sizing_zone.setZoneHeatingDesignSupplyAirTemperature(system_data[:ZoneHeatingDesignSupplyAirTemperature])
57
+ sizing_zone.setZoneCoolingSizingFactor(system_data[:ZoneCoolingSizingFactor])
58
+ sizing_zone.setZoneHeatingSizingFactor(system_data[:ZoneHeatingSizingFactor])
59
+ add_sys3_and_8_zone_equip(air_loop,
60
+ baseboard_type,
61
+ hw_loop,
62
+ model,
63
+ zone)
64
+
65
+ end
66
+ return true
67
+ else
68
+ zones.each do |zone|
69
+ air_loop = add_system_3_and_8_airloop_multi_speed(heating_coil_type, model, system_data, zone)
70
+ add_sys3_and_8_zone_equip(air_loop,
71
+ baseboard_type,
72
+ hw_loop,
73
+ model,
74
+ zone)
75
+ end
76
+ return true
77
+ end
78
+ end
79
+
80
+ def add_system_3_and_8_airloop_multi_speed(heating_coil_type, model, system_data, control_zone)
9
81
  # System Type 3: PSZ-AC
10
82
  # This measure creates:
11
83
  # -a constant volume packaged single-zone A/C unit
@@ -18,157 +90,83 @@ class NECB2011
18
90
  # "NaturalGas","Electricity","PropaneGas","FuelOilNo1","FuelOilNo2","Coal","Diesel","Gasoline","OtherFuel1"
19
91
 
20
92
  always_on = model.alwaysOnDiscreteSchedule
93
+ air_loop = common_air_loop(model: model, system_data: system_data)
94
+ air_loop.setName("#{system_data[:name]} #{control_zone.name}")
21
95
 
22
- # TODO: Heating and cooling temperature set point schedules are set somewhere else
23
- # TODO: For now fetch the schedules and use them in setting up the heat pump system
24
- # TODO: Later on these schedules need to be passed on to this method
25
- htg_temp_sch = nil
26
- clg_temp_sch = nil
27
- zones.each do |izone|
28
- if izone.thermostat.is_initialized
29
- zone_thermostat = izone.thermostat.get
30
- if zone_thermostat.to_ThermostatSetpointDualSetpoint.is_initialized
31
- dual_thermostat = zone_thermostat.to_ThermostatSetpointDualSetpoint.get
32
- htg_temp_sch = dual_thermostat.heatingSetpointTemperatureSchedule.get
33
- clg_temp_sch = dual_thermostat.coolingSetpointTemperatureSchedule.get
34
- break
35
- end
36
- end
37
- end
96
+ # Zone sizing temperature
97
+ sizing_zone = control_zone.sizingZone
98
+ sizing_zone.setZoneCoolingDesignSupplyAirTemperature(system_data[:ZoneCoolingDesignSupplyAirTemperature])
99
+ sizing_zone.setZoneHeatingDesignSupplyAirTemperature(system_data[:ZoneHeatingDesignSupplyAirTemperature])
100
+ sizing_zone.setZoneCoolingSizingFactor(system_data[:ZoneCoolingSizingFactor])
101
+ sizing_zone.setZoneHeatingSizingFactor(system_data[:ZoneHeatingSizingFactor])
38
102
 
39
- zones.each do |zone|
40
- air_loop = OpenStudio::Model::AirLoopHVAC.new(model)
41
-
42
- air_loop.setName("Sys_3_PSZ_#{zone.name}")
43
-
44
- # When an air_loop is constructed, its constructor creates a sizing:system object
45
- # the default sizing:system constructor makes a system:sizing object
46
- # appropriate for a multizone VAV system
47
- # this systems is a constant volume system with no VAV terminals,
48
- # and therfore needs different default settings
49
- air_loop_sizing = air_loop.sizingSystem # TODO units
50
- air_loop_sizing.setTypeofLoadtoSizeOn('Sensible')
51
- air_loop_sizing.autosizeDesignOutdoorAirFlowRate
52
- if model.version < OpenStudio::VersionString.new('2.7.0')
53
- air_loop_sizing.setMinimumSystemAirFlowRatio(1.0)
54
- else
55
- air_loop_sizing.setCentralHeatingMaximumSystemAirFlowRatio(1.0)
56
- end
57
- air_loop_sizing.setPreheatDesignTemperature(7.0)
58
- air_loop_sizing.setPreheatDesignHumidityRatio(0.008)
59
- air_loop_sizing.setPrecoolDesignTemperature(13.0)
60
- air_loop_sizing.setPrecoolDesignHumidityRatio(0.008)
61
- air_loop_sizing.setCentralCoolingDesignSupplyAirTemperature(13.0)
62
- air_loop_sizing.setCentralHeatingDesignSupplyAirTemperature(43.0)
63
- air_loop_sizing.setSizingOption('NonCoincident')
64
- air_loop_sizing.setAllOutdoorAirinCooling(false)
65
- air_loop_sizing.setAllOutdoorAirinHeating(false)
66
- air_loop_sizing.setCentralCoolingDesignSupplyAirHumidityRatio(0.0085)
67
- air_loop_sizing.setCentralHeatingDesignSupplyAirHumidityRatio(0.0080)
68
- air_loop_sizing.setCoolingDesignAirFlowMethod('DesignDay')
69
- air_loop_sizing.setCoolingDesignAirFlowRate(0.0)
70
- air_loop_sizing.setHeatingDesignAirFlowMethod('DesignDay')
71
- air_loop_sizing.setHeatingDesignAirFlowRate(0.0)
72
- air_loop_sizing.setSystemOutdoorAirMethod('ZoneSum')
73
-
74
- # Zone sizing temperature
75
- sizing_zone = zone.sizingZone
76
- sizing_zone.setZoneCoolingDesignSupplyAirTemperature(13.0)
77
- sizing_zone.setZoneHeatingDesignSupplyAirTemperature(43.0)
78
- sizing_zone.setZoneCoolingSizingFactor(1.1)
79
- sizing_zone.setZoneHeatingSizingFactor(1.3)
80
-
81
- fan = OpenStudio::Model::FanConstantVolume.new(model, always_on)
82
-
83
- staged_thermostat = OpenStudio::Model::ZoneControlThermostatStagedDualSetpoint.new(model)
84
- staged_thermostat.setHeatingTemperatureSetpointSchedule(htg_temp_sch)
85
- staged_thermostat.setNumberofHeatingStages(4)
86
- staged_thermostat.setCoolingTemperatureSetpointBaseSchedule(clg_temp_sch)
87
- staged_thermostat.setNumberofCoolingStages(4)
88
- zone.setThermostat(staged_thermostat)
89
-
90
- # Multi-stage gas heating coil
91
- if heating_coil_type == 'Gas' || heating_coil_type == 'Electric'
92
- htg_coil = OpenStudio::Model::CoilHeatingGasMultiStage.new(model)
93
- htg_stage_1 = OpenStudio::Model::CoilHeatingGasMultiStageStageData.new(model)
94
- htg_stage_2 = OpenStudio::Model::CoilHeatingGasMultiStageStageData.new(model)
95
- htg_stage_3 = OpenStudio::Model::CoilHeatingGasMultiStageStageData.new(model)
96
- htg_stage_4 = OpenStudio::Model::CoilHeatingGasMultiStageStageData.new(model)
97
- if heating_coil_type == 'Gas'
98
- supplemental_htg_coil = OpenStudio::Model::CoilHeatingGas.new(model, always_on)
99
- elsif heating_coil_type == 'Electric'
100
- supplemental_htg_coil = OpenStudio::Model::CoilHeatingElectric.new(model, always_on)
101
- htg_stage_1.setNominalCapacity(0.1)
102
- htg_stage_2.setNominalCapacity(0.2)
103
- htg_stage_3.setNominalCapacity(0.3)
104
- htg_stage_4.setNominalCapacity(0.4)
105
- end
106
-
107
- # Multi-Stage DX or Electric heating coil
108
- elsif heating_coil_type == 'DX'
109
- htg_coil = OpenStudio::Model::CoilHeatingDXMultiSpeed.new(model)
110
- htg_stage_1 = OpenStudio::Model::CoilHeatingDXMultiSpeedStageData.new(model)
111
- htg_stage_2 = OpenStudio::Model::CoilHeatingDXMultiSpeedStageData.new(model)
112
- htg_stage_3 = OpenStudio::Model::CoilHeatingDXMultiSpeedStageData.new(model)
113
- htg_stage_4 = OpenStudio::Model::CoilHeatingDXMultiSpeedStageData.new(model)
114
- supplemental_htg_coil = OpenStudio::Model::CoilHeatingElectric.new(model, always_on)
115
- sizing_zone.setZoneHeatingSizingFactor(1.3)
116
- sizing_zone.setZoneCoolingSizingFactor(1.0)
117
- else
118
- raise("#{heating_coil_type} is not a valid heating coil type.)")
119
- end
120
-
121
- # Add stages to heating coil
122
- htg_coil.addStage(htg_stage_1)
123
- htg_coil.addStage(htg_stage_2)
124
- htg_coil.addStage(htg_stage_3)
125
- htg_coil.addStage(htg_stage_4)
103
+ fan = OpenStudio::Model::FanConstantVolume.new(model, always_on)
126
104
 
127
- # TODO: other fuel-fired heating coil types? (not available in OpenStudio/E+ - may need to play with efficiency to mimic other fuel types)
128
-
129
- # Set up DX cooling coil
105
+ # Setup heating and cooling coils
106
+ if(heating_coil_type == 'Gas') || (heating_coil_type == 'Electric')
130
107
  clg_coil = OpenStudio::Model::CoilCoolingDXMultiSpeed.new(model)
131
108
  clg_coil.setFuelType('Electricity')
132
109
  clg_stage_1 = OpenStudio::Model::CoilCoolingDXMultiSpeedStageData.new(model)
133
110
  clg_stage_2 = OpenStudio::Model::CoilCoolingDXMultiSpeedStageData.new(model)
134
- clg_stage_3 = OpenStudio::Model::CoilCoolingDXMultiSpeedStageData.new(model)
135
- clg_stage_4 = OpenStudio::Model::CoilCoolingDXMultiSpeedStageData.new(model)
136
111
  clg_coil.addStage(clg_stage_1)
137
112
  clg_coil.addStage(clg_stage_2)
138
- clg_coil.addStage(clg_stage_3)
139
- clg_coil.addStage(clg_stage_4)
113
+ clg_coil.setApplyPartLoadFractiontoSpeedsGreaterthan1(false)
114
+ htg_coil = OpenStudio::Model::CoilHeatingGasMultiStage.new(model)
115
+ htg_stage_1 = OpenStudio::Model::CoilHeatingGasMultiStageStageData.new(model)
116
+ htg_coil.addStage(htg_stage_1)
117
+ if heating_coil_type == 'Gas'
118
+ supplemental_htg_coil = OpenStudio::Model::CoilHeatingGas.new(model, always_on)
119
+ supplemental_htg_coil.setNominalCapacity(0.001)
120
+ elsif heating_coil_type == 'Electric'
121
+ supplemental_htg_coil = OpenStudio::Model::CoilHeatingElectric.new(model, always_on)
122
+ htg_stage_1.setNominalCapacity(0.001)
123
+ end
124
+ # Single stage DX and Electric heating
125
+ elsif(heating_coil_type == 'DX')
126
+ clg_coil = OpenStudio::Model::CoilCoolingDXSingleSpeed.new(model)
127
+ clg_coil.setMinimumOutdoorDryBulbTemperatureforCompressorOperation(system_data[:MinimumOutdoorDryBulbTemperatureforCompressorOperation])
128
+ htg_coil = OpenStudio::Model::CoilHeatingDXSingleSpeed.new(model)
129
+ supplemental_htg_coil = OpenStudio::Model::CoilHeatingElectric.new(model, always_on)
130
+ else
131
+ raise("#{heating_coil_type} is not a valid heating coil type.)")
132
+ end
140
133
 
141
- # oa_controller
142
- oa_controller = OpenStudio::Model::ControllerOutdoorAir.new(model)
143
- oa_controller.autosizeMinimumOutdoorAirFlowRate
134
+ # oa_controller
135
+ oa_controller = OpenStudio::Model::ControllerOutdoorAir.new(model)
136
+ oa_controller.autosizeMinimumOutdoorAirFlowRate
144
137
 
145
- # oa_system
146
- oa_system = OpenStudio::Model::AirLoopHVACOutdoorAirSystem.new(model, oa_controller)
138
+ # oa_system
139
+ oa_system = OpenStudio::Model::AirLoopHVACOutdoorAirSystem.new(model, oa_controller)
147
140
 
148
- # Add the components to the air loop
149
- # in order from closest to zone to furthest from zone
150
- supply_inlet_node = air_loop.supplyInletNode
141
+ # Add the components to the air loop
142
+ # in order from closest to zone to furthest from zone
143
+ supply_inlet_node = air_loop.supplyInletNode
151
144
 
145
+ if(heating_coil_type == "Gas") || (heating_coil_type == "Electric")
152
146
  air_to_air_heatpump = OpenStudio::Model::AirLoopHVACUnitaryHeatPumpAirToAirMultiSpeed.new(model, fan, htg_coil, clg_coil, supplemental_htg_coil)
153
- air_to_air_heatpump.setName("#{zone.name} ASHP")
154
- air_to_air_heatpump.setControllingZoneorThermostatLocation(zone)
155
- air_to_air_heatpump.setSupplyAirFanOperatingModeSchedule(always_on)
156
- air_to_air_heatpump.addToNode(supply_inlet_node)
157
- air_to_air_heatpump.setNumberofSpeedsforHeating(4)
158
- air_to_air_heatpump.setNumberofSpeedsforCooling(4)
159
-
160
- oa_system.addToNode(supply_inlet_node)
147
+ air_to_air_heatpump.setControllingZoneorThermostatLocation(control_zone)
148
+ air_to_air_heatpump.setNumberofSpeedsforHeating(1)
149
+ air_to_air_heatpump.setNumberofSpeedsforCooling(2)
150
+ air_to_air_heatpump.setMinimumOutdoorDryBulbTemperatureforCompressorOperation(system_data[:MinimumOutdoorDryBulbTemperatureforCompressorOperation])
151
+ elsif(heating_coil_type == 'DX')
152
+ air_to_air_heatpump = OpenStudio::Model::AirLoopHVACUnitaryHeatPumpAirToAir.new(model, always_on, fan, htg_coil, clg_coil, supplemental_htg_coil)
153
+ air_to_air_heatpump.setControllingZone(zone)
154
+ end
155
+ air_to_air_heatpump.setName("#{control_zone.name} ASHP")
156
+ air_to_air_heatpump.setSupplyAirFanOperatingModeSchedule(always_on)
157
+ air_to_air_heatpump.addToNode(supply_inlet_node)
161
158
 
162
- # Create a diffuser and attach the zone/diffuser pair to the air loop
163
- # diffuser = OpenStudio::Model::AirTerminalSingleDuctUncontrolled.new(model,always_on)
164
- diffuser = OpenStudio::Model::AirTerminalSingleDuctUncontrolled.new(model, always_on)
165
- air_loop.addBranchForZone(zone, diffuser.to_StraightComponent)
159
+ oa_system.addToNode(supply_inlet_node)
166
160
 
167
- add_zone_baseboards(baseboard_type: baseboard_type, hw_loop: hw_loop, model: model, zone: zone)
168
- end # zone loop
161
+ # Add a setpoint manager single zone reheat to control the
162
+ # supply air temperature based on the needs of this zone
163
+ setpoint_mgr_single_zone_reheat = OpenStudio::Model::SetpointManagerSingleZoneReheat.new(model)
164
+ setpoint_mgr_single_zone_reheat.setControlZone(control_zone)
165
+ setpoint_mgr_single_zone_reheat.setMinimumSupplyAirTemperature(system_data[:SetpointManagerSingleZoneReheatSupplyTempMin])
166
+ setpoint_mgr_single_zone_reheat.setMaximumSupplyAirTemperature(system_data[:SetpointManagerSingleZoneReheatSupplyTempMax])
167
+ setpoint_mgr_single_zone_reheat.addToNode(air_loop.supplyOutletNode)
169
168
 
170
- return true
169
+ return air_loop
171
170
  end
172
171
 
173
- # end add_sys3_single_zone_packaged_rooftop_unit_with_baseboard_heating_multi_speed
174
172
  end
@@ -1,5 +1,29 @@
1
1
  class NECB2011
2
2
 
3
+ def add_sys3and8_single_zone_packaged_rooftop_unit_with_baseboard_heating(model:,
4
+ zones:,
5
+ heating_coil_type:,
6
+ baseboard_type:,
7
+ hw_loop:,
8
+ new_auto_zoner: true,
9
+ multispeed: false)
10
+ if multispeed
11
+ add_sys3and8_single_zone_packaged_rooftop_unit_with_baseboard_heating_multi_speed(model: model,
12
+ zones: zones,
13
+ heating_coil_type: heating_coil_type,
14
+ baseboard_type: baseboard_type,
15
+ hw_loop: hw_loop,
16
+ new_auto_zoner: new_auto_zoner)
17
+ else
18
+ add_sys3and8_single_zone_packaged_rooftop_unit_with_baseboard_heating_single_speed(model: model,
19
+ zones: zones,
20
+ heating_coil_type: heating_coil_type,
21
+ baseboard_type: baseboard_type,
22
+ hw_loop: hw_loop,
23
+ new_auto_zoner: new_auto_zoner)
24
+ end
25
+ end
26
+
3
27
  # Some tests still require a simple way to set up a system without sizing.. so we are keeping the auto_zoner flag for this method.
4
28
  #
5
29
  def add_sys3and8_single_zone_packaged_rooftop_unit_with_baseboard_heating_single_speed(model:,
@@ -67,7 +91,6 @@ class NECB2011
67
91
  zone)
68
92
 
69
93
  end
70
- return true
71
94
  else
72
95
  zones.each do |zone|
73
96
  air_loop = add_system_3_and_8_airloop(heating_coil_type, model, system_data, zone)
@@ -77,8 +100,20 @@ class NECB2011
77
100
  model,
78
101
  zone)
79
102
  end
80
- return true
81
103
  end
104
+ sys_name_pars = {}
105
+ sys_name_pars["sys_hr"] = "none"
106
+ sys_name_pars["sys_clg"] = "dx"
107
+ sys_name_pars["sys_htg"] = heating_coil_type
108
+ sys_name_pars["sys_sf"] = "cv"
109
+ sys_name_pars["zone_htg"] = baseboard_type
110
+ sys_name_pars["zone_clg"] = "none"
111
+ sys_name_pars["sys_rf"] = "none"
112
+ assign_base_sys_name(air_loop,
113
+ sys_abbr: "sys_3",
114
+ sys_oa: "mixed",
115
+ sys_name_pars: sys_name_pars)
116
+ return true
82
117
  end
83
118
 
84
119
 
@@ -127,6 +162,7 @@ class NECB2011
127
162
 
128
163
  # Set up DX coil with NECB performance curve characteristics;
129
164
  clg_coil = OpenStudio::Model::CoilCoolingDXSingleSpeed.new(model)
165
+ clg_coil.setName("CoilCoolingDXSingleSpeed_dx")
130
166
 
131
167
  # oa_controller
132
168
  oa_controller = OpenStudio::Model::ControllerOutdoorAir.new(model)
@@ -86,6 +86,7 @@ class NECB2011
86
86
  # Set up DX coil with NECB performance curve characteristics;
87
87
 
88
88
  clg_coil = self.add_onespeed_DX_coil(model, always_on)
89
+ clg_coil.setName("CoilCoolingDXSingleSpeed_dx")
89
90
 
90
91
  # oa_controller
91
92
  oa_controller = OpenStudio::Model::ControllerOutdoorAir.new(model)
@@ -141,6 +142,18 @@ class NECB2011
141
142
  model: model,
142
143
  zone: zone)
143
144
  end # zone loop
145
+ sys_name_pars = {}
146
+ sys_name_pars["sys_hr"] = "none"
147
+ sys_name_pars["sys_clg"] = "dx"
148
+ sys_name_pars["sys_htg"] = heating_coil_type
149
+ sys_name_pars["sys_sf"] = "cv"
150
+ sys_name_pars["zone_htg"] = baseboard_type
151
+ sys_name_pars["zone_clg"] = "none"
152
+ sys_name_pars["sys_rf"] = "none"
153
+ assign_base_sys_name(air_loop,
154
+ sys_abbr: "sys_4",
155
+ sys_oa: "mixed",
156
+ sys_name_pars: sys_name_pars)
144
157
 
145
158
  return true
146
159
  end
@@ -133,6 +133,18 @@ class NECB2011
133
133
  baseboard_type: baseboard_type,
134
134
  hw_loop: hw_loop)
135
135
  end
136
+ sys_name_pars = {}
137
+ sys_name_pars["sys_hr"] = "none"
138
+ sys_name_pars["sys_htg"] = heating_coil_type
139
+ sys_name_pars["sys_clg"] = "Chilled Water"
140
+ sys_name_pars["sys_sf"] = "vv"
141
+ sys_name_pars["zone_htg"] = baseboard_type
142
+ sys_name_pars["zone_clg"] = "none"
143
+ sys_name_pars["sys_rf"] = "vv"
144
+ assign_base_sys_name(air_loop,
145
+ sys_abbr: "sys_6",
146
+ sys_oa: "mixed",
147
+ sys_name_pars: sys_name_pars)
136
148
  end
137
149
  end # next story
138
150
 
@@ -295,6 +295,7 @@ class NECB2011
295
295
  end
296
296
 
297
297
  # Create an ERV
298
+
298
299
  erv = OpenStudio::Model::HeatExchangerAirToAirSensibleAndLatent.new(air_loop_hvac.model)
299
300
  erv.setName("#{air_loop_hvac.name} ERV")
300
301
  erv.setSensibleEffectivenessat100HeatingAirFlow(0.5)
@@ -367,6 +368,35 @@ class NECB2011
367
368
  return true
368
369
  end
369
370
 
371
+ # Sets the minimum effectiveness of the heat exchanger per
372
+ # the standard.
373
+ def heat_exchanger_air_to_air_sensible_and_latent_apply_efficiency(heat_exchanger_air_to_air_sensible_and_latent, erv_name = nil)
374
+ # Assumed to be sensible and latent at all flow
375
+ # This will now get data of the erv from the json file instead of hardcoding it. Defaults to NECB2011 erv we have been using.
376
+ erv_name = 'NECB_Default' if erv_name.nil?
377
+ erv_info = @standards_data['tables']['erv']['table'].detect { |item| item['erv_name'] == erv_name }
378
+ raise("Could not find #{erv_name} in #{self.class.name} class' erv.json file or it's parents. The available ervs are #{@standards_data['tables']['erv']['table'].map{|item| item['erv_name']}}") if erv_info.nil?
379
+
380
+ heat_exchanger_air_to_air_sensible_and_latent.setHeatExchangerType(erv_info['HeatExchangerType'])
381
+ heat_exchanger_air_to_air_sensible_and_latent.setSensibleEffectivenessat100HeatingAirFlow(erv_info['SensibleEffectivenessat100HeatingAirFlow'])
382
+ heat_exchanger_air_to_air_sensible_and_latent.setLatentEffectivenessat100HeatingAirFlow(erv_info['LatentEffectivenessat100HeatingAirFlow'])
383
+ heat_exchanger_air_to_air_sensible_and_latent.setSensibleEffectivenessat75HeatingAirFlow(erv_info['SensibleEffectivenessat75HeatingAirFlow'])
384
+ heat_exchanger_air_to_air_sensible_and_latent.setLatentEffectivenessat75HeatingAirFlow(erv_info['LatentEffectivenessat75HeatingAirFlow'])
385
+ heat_exchanger_air_to_air_sensible_and_latent.setSensibleEffectivenessat100CoolingAirFlow(erv_info['SensibleEffectivenessat100CoolingAirFlow'])
386
+ heat_exchanger_air_to_air_sensible_and_latent.setLatentEffectivenessat100CoolingAirFlow(erv_info['LatentEffectivenessat100CoolingAirFlow'])
387
+ heat_exchanger_air_to_air_sensible_and_latent.setSensibleEffectivenessat75CoolingAirFlow(erv_info['SensibleEffectivenessat75CoolingAirFlow'])
388
+ heat_exchanger_air_to_air_sensible_and_latent.setLatentEffectivenessat75CoolingAirFlow(erv_info['LatentEffectivenessat75CoolingAirFlow'])
389
+ heat_exchanger_air_to_air_sensible_and_latent.setSupplyAirOutletTemperatureControl(erv_info['SupplyAirOutletTemperatureControl'])
390
+ heat_exchanger_air_to_air_sensible_and_latent.setFrostControlType(erv_info['FrostControlType'])
391
+ heat_exchanger_air_to_air_sensible_and_latent.setEconomizerLockout(erv_info['EconomizerLockout'])
392
+ heat_exchanger_air_to_air_sensible_and_latent.setThresholdTemperature(erv_info['ThresholdTemperature'])
393
+ heat_exchanger_air_to_air_sensible_and_latent.setInitialDefrostTimeFraction(erv_info['InitialDefrostTimeFraction'])
394
+ update_sys_name(heat_exchanger_air_to_air_sensible_and_latent.airLoopHVAC.get,sys_hr: "erv")
395
+
396
+ return true
397
+ end
398
+
399
+
370
400
  # Determine if demand control ventilation (DCV) is
371
401
  # required for this air loop.
372
402
  #
@@ -798,300 +828,426 @@ class NECB2011
798
828
  # @return [Bool] true if successful, false if not
799
829
  def coil_cooling_dx_multi_speed_apply_efficiency_and_curves(coil_cooling_dx_multi_speed, sql_db_vars_map)
800
830
  successfully_set_all_properties = true
831
+ model = coil_cooling_dx_multi_speed.model
832
+ multi_speed_heat_pump = coil_cooling_dx_multi_speed.containingHVACComponent.get.to_AirLoopHVACUnitaryHeatPumpAirToAirMultiSpeed.get
833
+ airloop = multi_speed_heat_pump.airLoopHVAC.get
801
834
 
802
- # Define the criteria to find the chiller properties
803
- # in the hvac standards data set.
804
- search_criteria = {}
805
- cooling_type = coil_cooling_dx_multi_speed.condenserType
806
- search_criteria['cooling_type'] = cooling_type
807
-
808
- # TODO: Standards - add split system vs single package to model
809
- # For now, assume single package as default
810
- sub_category = 'Single Package'
811
-
812
- # Determine the heating type if unitary or zone hvac
813
- heat_pump = false
814
- heating_type = nil
815
- containing_comp = nil
816
- if coil_cooling_dx_multi_speed.airLoopHVAC.empty?
817
- if coil_cooling_dx_multi_speed.containingHVACComponent.is_initialized
818
- containing_comp = coil_cooling_dx_multi_speed.containingHVACComponent.get
819
- if containing_comp.to_AirLoopHVACUnitaryHeatPumpAirToAirMultiSpeed.is_initialized
820
- htg_coil = containing_comp.to_AirLoopHVACUnitaryHeatPumpAirToAirMultiSpeed.get.heatingCoil
821
- if htg_coil.to_CoilHeatingDXMultiSpeed.is_initialized
822
- heat_pump = true
823
- heating_type = 'Electric Resistance or None'
824
- elsif htg_coil.to_CoilHeatingGasMultiStage.is_initialized
825
- heating_type = 'All Other'
826
- end
827
- end # TODO: Add other unitary systems
828
- elsif coil_cooling_dx_multi_speed.containingZoneHVACComponent.is_initialized
829
- containing_comp = coil_cooling_dx_multi_speed.containingZoneHVACComponent.get
830
- if containing_comp.to_ZoneHVACPackagedTerminalAirConditioner.is_initialized
831
- sub_category = 'PTAC'
832
- htg_coil = containing_comp.to_ZoneHVACPackagedTerminalAirConditioner.get.heatingCoil
833
- if htg_coil.to_CoilHeatingElectric.is_initialized
834
- heating_type = 'Electric Resistance or None'
835
- elsif htg_coil.to_CoilHeatingWater.is_initialized || htg_coil.to_CoilHeatingGas.is_initialized || htg_col.to_CoilHeatingGasMultiStage
836
- heating_type = 'All Other'
837
- end
838
- end # TODO: Add other zone hvac systems
839
- end
840
- end
841
-
842
- # Add the heating type to the search criteria
843
- unless heating_type.nil?
844
- search_criteria['heating_type'] = heating_type
845
- end
835
+ # Define the criteria to find the properties in the hvac standards data set
836
+ search_criteria = coil_dx_find_search_criteria(coil_cooling_dx_multi_speed)
837
+ capacity_w = coil_cooling_dx_multi_speed_find_capacity(coil_cooling_dx_multi_speed)
846
838
 
847
- search_criteria['subcategory'] = sub_category
848
-
849
- # Get the coil capacity
850
- capacity_w = nil
851
- clg_stages = stages
852
- if clg_stages.last.grossRatedTotalCoolingCapacity.is_initialized
853
- capacity_w = clg_stages.last.grossRatedTotalCoolingCapacity.get
854
- elsif coil_cooling_dx_multi_speed.autosizedSpeed4GrossRatedTotalCoolingCapacity.is_initialized
855
- capacity_w = coil_cooling_dx_multi_speed.autosizedSpeed4GrossRatedTotalCoolingCapacity.get
856
- else
857
- OpenStudio.logFree(OpenStudio::Warn, 'openstudio.standards.CoilCoolingDXMultiSpeed', "For #{coil_cooling_dx_multi_speed.name} capacity is not available, cannot apply efficiency standard.")
858
- successfully_set_all_properties = false
859
- return successfully_set_all_properties
839
+ # Find design outside air flow rate and flow fraction
840
+ controller_oa = nil
841
+ if airloop.airLoopHVACOutdoorAirSystem.is_initialized
842
+ oa_system = airloop.airLoopHVACOutdoorAirSystem.get
843
+ controller_oa = oa_system.getControllerOutdoorAir
860
844
  end
861
-
862
- # Volume flow rate
863
- flow_rate4 = nil
864
- if clg_stages.last.ratedAirFlowRate.is_initialized
865
- flow_rate4 = clg_stages.last.ratedAirFlowRate.get
866
- elsif coil_cooling_dx_multi_speed.autosizedSpeed4RatedAirFlowRate.is_initialized
867
- flow_rate4 = coil_cooling_dx_multi_speed.autosizedSpeed4RatedAirFlowRate.get
845
+ min_oa_flow_rate, oaf = 0.0,0.0
846
+ if controller_oa
847
+ min_oa_flow_rate = nil
848
+ if controller_oa.minimumOutdoorAirFlowRate.is_initialized
849
+ min_oa_flow_rate = controller_oa.minimumOutdoorAirFlowRate.get
850
+ elsif controller_oa.autosizedMinimumOutdoorAirFlowRate.is_initialized
851
+ min_oa_flow_rate = controller_oa.autosizedMinimumOutdoorAirFlowRate.get
852
+ end
853
+ if min_oa_flow_rate then oaf = min_oa_flow_rate.to_f / airloop.autosizedDesignSupplyAirFlowRate.to_f end
868
854
  end
869
855
 
870
- # Set number of stages
856
+ # Find required capacity of each stage and total number of stages based on NECB rules
857
+ # This implementation is limited to 4 stages only. The capacity of stages 1-3 is set to
858
+ # 66 kW as stipulated by NECB. The capacity of the 4th stage is then allowed to exceed 66 kW
859
+ # up to the design capacity.
871
860
  stage_cap = []
872
861
  num_stages = (capacity_w / (66.0 * 1000.0) + 0.5).round
873
- num_stages = [num_stages, 4].min
874
- if num_stages == 1
862
+ max_cap = 66.0 * 1000.0 * num_stages
863
+ final_num_stages = num_stages
864
+ case num_stages
865
+ when 1
875
866
  stage_cap[0] = capacity_w / 2.0
876
867
  stage_cap[1] = 2.0 * stage_cap[0]
877
- stage_cap[2] = stage_cap[1] + 0.1
878
- stage_cap[3] = stage_cap[2] + 0.1
868
+ final_num_stages = 2
879
869
  else
880
870
  stage_cap[0] = 66.0 * 1000.0
881
871
  stage_cap[1] = 2.0 * stage_cap[0]
882
- if num_stages == 2
883
- stage_cap[2] = stage_cap[1] + 0.1
884
- stage_cap[3] = stage_cap[2] + 0.1
885
- elsif num_stages == 3
872
+ case num_stages
873
+ when 2
874
+ when 3
886
875
  stage_cap[2] = 3.0 * stage_cap[0]
887
- stage_cap[3] = stage_cap[2] + 0.1
888
- elsif num_stages == 4
876
+ else
877
+ final_num_stages = 4
889
878
  stage_cap[2] = 3.0 * stage_cap[0]
890
- stage_cap[3] = 4.0 * stage_cap[0]
879
+ stage_cap[3] = max_cap
891
880
  end
892
881
  end
893
- # set capacities, flow rates, and sensible heat ratio for stages
894
- (0..3).each do |istage|
895
- clg_stages[istage].setGrossRatedTotalCoolingCapacity(stage_cap[istage])
896
- clg_stages[istage].setRatedAirFlowRate(flow_rate4 * stage_cap[istage] / capacity_w)
882
+
883
+ # Set final number of cooling stages and create missing stages if needed
884
+ for istage in 2..final_num_stages-1
885
+ new_clg_stage = OpenStudio::Model::CoilCoolingDXMultiSpeedStageData.new(model)
886
+ coil_cooling_dx_multi_speed.addStage(new_clg_stage)
887
+ end
888
+ multi_speed_heat_pump.setNumberofSpeedsforCooling(final_num_stages)
889
+
890
+ # Set final capacities for each of the stages. The flow rate for each of the stages
891
+ # is maintained above the outside air flow rate
892
+ coil_cooling_dx_multi_speed.stages[0].setGrossRatedTotalCoolingCapacity(stage_cap[0])
893
+ coil_cooling_dx_multi_speed.stages[1].setGrossRatedTotalCoolingCapacity(stage_cap[1])
894
+ case coil_cooling_dx_multi_speed.stages.size
895
+ when 2
896
+ if (oaf > 0.5) then multi_speed_heat_pump.setSpeed1SupplyAirFlowRateDuringCoolingOperation(min_oa_flow_rate) end
897
+ when 3
898
+ coil_cooling_dx_multi_speed.stages[2].setGrossRatedTotalCoolingCapacity(stage_cap[2])
899
+ if (oaf > 0.333) && (oaf <= 0.666)
900
+ multi_speed_heat_pump.setSpeed1SupplyAirFlowRateDuringCoolingOperation(min_oa_flow_rate)
901
+ elsif (oaf > 0.666)
902
+ multi_speed_heat_pump.setSpeed1SupplyAirFlowRateDuringCoolingOperation(min_oa_flow_rate)
903
+ multi_speed_heat_pump.setSpeed2SupplyAirFlowRateDuringCoolingOperation(min_oa_flow_rate)
904
+ end
905
+ when 4
906
+ coil_cooling_dx_multi_speed.stages[2].setGrossRatedTotalCoolingCapacity(stage_cap[2])
907
+ coil_cooling_dx_multi_speed.stages[3].setGrossRatedTotalCoolingCapacity(stage_cap[3])
908
+ if (oaf > 0.25) && (oaf <= 0.5)
909
+ multi_speed_heat_pump.setSpeed1SupplyAirFlowRateDuringCoolingOperation(min_oa_flow_rate)
910
+ elsif (oaf > 0.5) && (oaf <= 0.75)
911
+ multi_speed_heat_pump.setSpeed1SupplyAirFlowRateDuringCoolingOperation(min_oa_flow_rate)
912
+ multi_speed_heat_pump.setSpeed2SupplyAirFlowRateDuringCoolingOperation(min_oa_flow_rate)
913
+ elsif (oaf > 0.75)
914
+ multi_speed_heat_pump.setSpeed1SupplyAirFlowRateDuringCoolingOperation(min_oa_flow_rate)
915
+ multi_speed_heat_pump.setSpeed2SupplyAirFlowRateDuringCoolingOperation(min_oa_flow_rate)
916
+ multi_speed_heat_pump.setSpeed3SupplyAirFlowRateDuringCoolingOperation(min_oa_flow_rate)
917
+ end
897
918
  end
898
919
 
899
- # Convert capacity to Btu/hr
900
- capacity_btu_per_hr = OpenStudio.convert(capacity_w, 'W', 'Btu/hr').get
901
- capacity_kbtu_per_hr = OpenStudio.convert(capacity_w, 'W', 'kBtu/hr').get
920
+ capacity_btu_per_hr = OpenStudio.convert(stage_cap.last, 'W', 'Btu/hr').get
921
+ capacity_kbtu_per_hr = OpenStudio.convert(stage_cap.last, 'W', 'kBtu/hr').get
902
922
 
903
923
  # Lookup efficiencies depending on whether it is a unitary AC or a heat pump
904
924
  ac_props = nil
905
- heat_pump_table = @standards_data['heat_pumps']
906
- unitary_acs_table = @standards_data['unitary_acs']
907
- ac_props = if heat_pump == true
908
- model_find_object(heat_pump_table, search_criteria, capacity_btu_per_hr, Date.today)
925
+ ac_props = if coil_dx_heat_pump?(coil_cooling_dx_multi_speed)
926
+ model_find_object(standards_data['heat_pumps'], search_criteria, capacity_btu_per_hr, Date.today)
909
927
  else
910
- model_find_object(unitary_acs_table, search_criteria, capacity_btu_per_hr, Date.today)
928
+ model_find_object(standards_data['unitary_acs'], search_criteria, capacity_btu_per_hr, Date.today)
911
929
  end
912
930
 
913
931
  # Check to make sure properties were found
914
932
  if ac_props.nil?
915
933
  OpenStudio.logFree(OpenStudio::Warn, 'openstudio.standards.CoilCoolingDXMultiSpeed', "For #{coil_cooling_dx_multi_speed.name}, cannot find efficiency info, cannot apply efficiency standard.")
916
934
  successfully_set_all_properties = false
917
- return successfully_set_all_properties
935
+ return sql_db_vars_map
918
936
  end
919
937
 
938
+ # get clg stages
939
+ clg_stages = coil_cooling_dx_multi_speed.stages
940
+
920
941
  # Make the COOL-CAP-FT curve
921
- cool_cap_ft = model_add_curve(model, ac_props['cool_cap_ft'], standards)
942
+ cool_cap_ft = model_add_curve(model, ac_props['cool_cap_ft'])
922
943
  if cool_cap_ft
923
- clg_stages.each do |stage|
944
+ clg_stages.sort.each do |stage|
924
945
  stage.setTotalCoolingCapacityFunctionofTemperatureCurve(cool_cap_ft)
925
946
  end
926
947
  else
927
948
  OpenStudio.logFree(OpenStudio::Warn, 'openstudio.standards.CoilCoolingDXMultiSpeed', "For #{coil_cooling_dx_multi_speed.name}, cannot find cool_cap_ft curve, will not be set.")
928
949
  successfully_set_all_properties = false
950
+ return sql_db_vars_map
929
951
  end
930
952
 
931
953
  # Make the COOL-CAP-FFLOW curve
932
- cool_cap_fflow = model_add_curve(model, ac_props['cool_cap_fflow'], standards)
954
+ cool_cap_fflow = model_add_curve(model, ac_props['cool_cap_fflow'])
933
955
  if cool_cap_fflow
934
- clg_stages.each do |stage|
956
+ clg_stages.sort.each do |stage|
935
957
  stage.setTotalCoolingCapacityFunctionofFlowFractionCurve(cool_cap_fflow)
936
958
  end
937
959
  else
938
960
  OpenStudio.logFree(OpenStudio::Warn, 'openstudio.standards.CoilCoolingDXMultiSpeed', "For #{coil_cooling_dx_multi_speed.name}, cannot find cool_cap_fflow curve, will not be set.")
939
961
  successfully_set_all_properties = false
962
+ return sql_db_vars_map
940
963
  end
941
964
 
942
965
  # Make the COOL-EIR-FT curve
943
- cool_eir_ft = model_add_curve(model, ac_props['cool_eir_ft'], standards)
966
+ cool_eir_ft = model_add_curve(model, ac_props['cool_eir_ft'])
944
967
  if cool_eir_ft
945
- clg_stages.each do |stage|
968
+ clg_stages.sort.each do |stage|
946
969
  stage.setEnergyInputRatioFunctionofTemperatureCurve(cool_eir_ft)
947
970
  end
948
971
  else
949
972
  OpenStudio.logFree(OpenStudio::Warn, 'openstudio.standards.CoilCoolingDXMultiSpeed', "For #{coil_cooling_dx_multi_speed.name}, cannot find cool_eir_ft curve, will not be set.")
950
973
  successfully_set_all_properties = false
974
+ return sql_db_vars_map
951
975
  end
952
976
 
953
977
  # Make the COOL-EIR-FFLOW curve
954
- cool_eir_fflow = model_add_curve(model, ac_props['cool_eir_fflow'], standards)
978
+ cool_eir_fflow = model_add_curve(model, ac_props['cool_eir_fflow'])
955
979
  if cool_eir_fflow
956
- clg_stages.each do |stage|
980
+ clg_stages.sort.each do |stage|
957
981
  stage.setEnergyInputRatioFunctionofFlowFractionCurve(cool_eir_fflow)
958
982
  end
959
983
  else
960
984
  OpenStudio.logFree(OpenStudio::Warn, 'openstudio.standards.CoilCoolingDXMultiSpeed', "For #{coil_cooling_dx_multi_speed.name}, cannot find cool_eir_fflow curve, will not be set.")
961
985
  successfully_set_all_properties = false
986
+ return sql_db_vars_map
962
987
  end
963
988
 
964
989
  # Make the COOL-PLF-FPLR curve
965
- cool_plf_fplr = model_add_curve(model, ac_props['cool_plf_fplr'], standards)
990
+ cool_plf_fplr = model_add_curve(model, ac_props['cool_plf_fplr'])
966
991
  if cool_plf_fplr
967
- clg_stages.each do |stage|
992
+ clg_stages.sort.each do |stage|
968
993
  stage.setPartLoadFractionCorrelationCurve(cool_plf_fplr)
969
994
  end
970
995
  else
971
996
  OpenStudio.logFree(OpenStudio::Warn, 'openstudio.standards.CoilCoolingDXMultiSpeed', "For #{coil_cooling_dx_multi_speed.name}, cannot find cool_plf_fplr curve, will not be set.")
972
997
  successfully_set_all_properties = false
998
+ return sql_db_vars_map
973
999
  end
974
1000
 
975
- # Get the minimum efficiency standards
976
- cop = nil
977
-
978
- if coil_dx_subcategory(coil_cooling_dx_multi_speed) == 'PTAC'
979
- ptac_eer_coeff_1 = ac_props['ptac_eer_coefficient_1']
980
- ptac_eer_coeff_2 = ac_props['ptac_eer_coefficient_2']
981
- capacity_btu_per_hr = 7000 if capacity_btu_per_hr < 7000
982
- capacity_btu_per_hr = 15_000 if capacity_btu_per_hr > 15_000
983
- ptac_eer = ptac_eer_coeff_1 + (ptac_eer_coeff_2 * capacity_btu_per_hr)
984
- cop = eer_to_cop(ptac_eer)
985
- # self.setName("#{self.name} #{capacity_kbtu_per_hr.round}kBtu/hr #{ptac_eer}EER")
986
- new_comp_name = "#{coil_cooling_dx_multi_speed.name} #{capacity_kbtu_per_hr.round}kBtu/hr #{ptac_eer}EER"
987
- OpenStudio.logFree(OpenStudio::Info, 'openstudio.standards.CoilCoolingDXMultiSpeed', "For #{template}: #{coil_cooling_dx_multi_speed.name}: #{cooling_type} #{heating_type} #{subcategory} Capacity = #{capacity_kbtu_per_hr.round}kBtu/hr; EER = #{ptac_eer}")
988
- end
989
-
990
- # If specified as SEER
991
- unless ac_props['minimum_seasonal_energy_efficiency_ratio'].nil?
992
- min_seer = ac_props['minimum_seasonal_energy_efficiency_ratio']
993
- cop = seer_to_cop(min_seer)
994
- new_comp_name = "#{coil_cooling_dx_multi_speed.name} #{capacity_kbtu_per_hr.round}kBtu/hr #{min_seer}SEER"
995
- # self.setName("#{self.name} #{capacity_kbtu_per_hr.round}kBtu/hr #{min_seer}SEER")
996
- OpenStudio.logFree(OpenStudio::Info, 'openstudio.standards.CoilCoolingDXMultiSpeed', "For #{template}: #{coil_cooling_dx_multi_speed.name}: #{cooling_type} #{heating_type} #{subcategory} Capacity = #{capacity_kbtu_per_hr.round}kBtu/hr; SEER = #{min_seer}")
997
- end
998
-
999
- # If specified as EER
1000
- unless ac_props['minimum_energy_efficiency_ratio'].nil?
1001
- min_eer = ac_props['minimum_energy_efficiency_ratio']
1002
- cop = eer_to_cop(min_eer)
1003
- new_comp_name = "#{coil_cooling_dx_multi_speed.name} #{capacity_kbtu_per_hr.round}kBtu/hr #{min_eer}EER"
1004
- OpenStudio.logFree(OpenStudio::Info, 'openstudio.standards.CoilCoolingDXMultiSpeed', "For #{template}: #{coil_cooling_dx_multi_speed.name}: #{cooling_type} #{heating_type} #{subcategory} Capacity = #{capacity_kbtu_per_hr.round}kBtu/hr; EER = #{min_eer}")
1005
- end
1006
-
1007
- # if specified as SEER (heat pump)
1008
- unless ac_props['minimum_seasonal_efficiency'].nil?
1009
- min_seer = ac_props['minimum_seasonal_efficiency']
1010
- cop = seer_to_cop(min_seer)
1011
- new_comp_name = "#{coil_cooling_dx_multi_speed.name} #{capacity_kbtu_per_hr.round}kBtu/hr #{min_seer}SEER"
1012
- # self.setName("#{self.name} #{capacity_kbtu_per_hr.round}kBtu/hr #{min_seer}SEER")
1013
- OpenStudio.logFree(OpenStudio::Info, 'openstudio.standards.CoilCoolingDXMultiSpeed', "For #{template}: #{coil_cooling_dx_multi_speed.name}: #{cooling_type} #{heating_type} #{subcategory} Capacity = #{capacity_kbtu_per_hr.round}kBtu/hr; SEER = #{min_seer}")
1014
- end
1015
-
1016
- # If specified as EER (heat pump)
1017
- unless ac_props['minimum_full_load_efficiency'].nil?
1018
- min_eer = ac_props['minimum_full_load_efficiency']
1019
- cop = eer_to_cop(min_eer)
1020
- new_comp_name = "#{coil_cooling_dx_multi_speed.name} #{capacity_kbtu_per_hr.round}kBtu/hr #{min_eer}EER"
1021
- OpenStudio.logFree(OpenStudio::Info, 'openstudio.standards.CoilCoolingDXMultiSpeed', "For #{template}: #{coil_cooling_dx_multi_speed.name}: #{cooling_type} #{heating_type} #{subcategory} Capacity = #{capacity_kbtu_per_hr.round}kBtu/hr; EER = #{min_eer}")
1022
- end
1023
-
1024
- sql_db_vars_map[new_comp_name] = name.to_s
1025
- coil_cooling_dx_multi_speed.setName(new_comp_name)
1026
-
1027
- # Set the efficiency values
1028
-
1001
+ # Set the COP values
1002
+ cop, new_comp_name = coil_cooling_dx_multi_speed_standard_minimum_cop(coil_cooling_dx_multi_speed)
1029
1003
  unless cop.nil?
1030
- clg_stages.each do |istage|
1004
+ clg_stages.sort.each do |istage|
1031
1005
  istage.setGrossRatedCoolingCOP(cop)
1032
1006
  end
1033
1007
  end
1008
+ sql_db_vars_map[new_comp_name] = coil_cooling_dx_multi_speed.name.to_s
1009
+ coil_cooling_dx_multi_speed.setName(new_comp_name)
1010
+
1011
+ # It was found that the heat pump OS object doesn't respond to the call to turn on from the
1012
+ # system availability manager night cycle. This EMS script is then implemented to check the status
1013
+ # of the system availability manager night cycle and force the heat pump to turn on when needed. The
1014
+ # heat pump is still turned on when its availability schedule calls for it.
1015
+ create_ems_to_turn_on_AirLoopHVACUnitaryHeatPumpAirToAirMultiSpeed_for_night_cycle(multi_speed_heat_pump)
1034
1016
 
1035
1017
  return sql_db_vars_map
1018
+
1019
+ end
1020
+
1021
+ # Create EMS to turn on "AirLoopHVACUnitaryHeatPumpAirToAirMultiSpeed" in response to a call
1022
+ # from the night cycle availability manager of the air loop. It was found that this object
1023
+ # doesn't respond properly to this call from the night cycle
1024
+ def create_ems_to_turn_on_AirLoopHVACUnitaryHeatPumpAirToAirMultiSpeed_for_night_cycle(multi_speed_heat_pump)
1025
+ model = multi_speed_heat_pump.model
1026
+ avail_manager_name = nil
1027
+ if multi_speed_heat_pump.airLoopHVAC.is_initialized
1028
+ if not multi_speed_heat_pump.airLoopHVAC.get.availabilityManagers.empty?
1029
+ avail_manager_name = multi_speed_heat_pump.airLoopHVAC.get.availabilityManagers[0].name.to_s
1030
+ end
1031
+ end
1032
+ if avail_manager_name
1033
+ avail_manager_out_var_name = "Availability Manager Night Cycle Control Status"
1034
+ avail_manager_out_var = OpenStudio::Model::OutputVariable.new(avail_manager_out_var_name, model)
1035
+ avail_manager_out_var.setKeyValue(avail_manager_name)
1036
+ avail_manager_out_var.setReportingFrequency("Timestep")
1037
+ night_cycle_sensor = OpenStudio::Model::EnergyManagementSystemSensor.new(model, avail_manager_out_var)
1038
+ heat_pump_avail_sch = nil
1039
+ if multi_speed_heat_pump.availabilitySchedule.is_initialized
1040
+ heat_pump_avail_sch = multi_speed_heat_pump.availabilitySchedule.get
1041
+ elsif multi_speed_heat_pump.airLoopHVAC.get.availabilitySchedule.is_initialized
1042
+ heat_pump_avail_sch = multi_speed_heat_pump.airLoopHVAC.get.availabilitySchedule.get
1043
+ else
1044
+ heat_pump_avail_sch = OpenStudio::Model::ScheduleConstant.new(model)
1045
+ heat_pump_avail_sch.setValue(1.0)
1046
+ end
1047
+ heat_pump_avail_sch_var = OpenStudio::Model::OutputVariable.new("Schedule Value", model)
1048
+ heat_pump_avail_sch_var.setKeyValue(heat_pump_avail_sch.name.to_s)
1049
+ heat_pump_avail_sch_sensor = OpenStudio::Model::EnergyManagementSystemSensor.new(model, heat_pump_avail_sch_var)
1050
+ updated_heat_pump_avail_sch = OpenStudio::Model::ScheduleConstant.new(model)
1051
+ multi_speed_heat_pump.setAvailabilitySchedule(updated_heat_pump_avail_sch)
1052
+ heat_pump_avail_sch_actuator = OpenStudio::Model::EnergyManagementSystemActuator.new(updated_heat_pump_avail_sch, "Schedule:Constant", "Schedule Value")
1053
+ heat_pump_avail_sch_prog = OpenStudio::Model::EnergyManagementSystemProgram.new(model)
1054
+ heat_pump_avail_sch_prog.setName("#{multi_speed_heat_pump.name.to_s.gsub(/[ +-.]/,'_')} Availability Schedule Program by Line")
1055
+ heat_pump_avail_sch_prog_body = <<-EMS
1056
+ IF #{heat_pump_avail_sch_sensor.handle} > 0.0
1057
+ SET #{heat_pump_avail_sch_actuator.handle} = #{heat_pump_avail_sch_sensor.handle}
1058
+ ELSEIF #{night_cycle_sensor.handle} == 2.0
1059
+ SET #{heat_pump_avail_sch_actuator.handle} = 1.0
1060
+ ELSE
1061
+ SET #{heat_pump_avail_sch_actuator.handle} = 0.0
1062
+ ENDIF
1063
+ EMS
1064
+ heat_pump_avail_sch_prog.setBody(heat_pump_avail_sch_prog_body)
1065
+ pcm = OpenStudio::Model::EnergyManagementSystemProgramCallingManager.new(model)
1066
+ pcm.setName("#{heat_pump_avail_sch_prog.name.to_s.gsub(/[ +-.]/,'_')} Calling Manager")
1067
+ pcm.setCallingPoint('InsideHVACSystemIterationLoop')
1068
+ pcm.addProgram(heat_pump_avail_sch_prog)
1069
+ end
1036
1070
  end
1037
1071
 
1038
1072
  # Applies the standard efficiency ratings and typical performance curves to this object.
1039
1073
  #
1040
1074
  # @return [Bool] true if successful, false if not
1041
- def coil_heating_gas_multi_stage_apply_efficiency_and_curves(coil_heating_gas_multi_stage, standards)
1075
+ def coil_heating_gas_multi_stage_apply_efficiency_and_curves(coil_heating_gas_multi_stage)
1042
1076
  successfully_set_all_properties = true
1077
+ model = coil_heating_gas_multi_stage.model
1078
+
1079
+ # get multi speed heat pump and air loop
1080
+ multi_speed_heat_pump = nil
1081
+ multi_speed_heat_pumps = model.getAirLoopHVACUnitaryHeatPumpAirToAirMultiSpeeds
1082
+ multi_speed_heat_pumps.sort.each do |iheat_pump|
1083
+ htg_coil = iheat_pump.heatingCoil
1084
+ if htg_coil.name.to_s.strip == coil_heating_gas_multi_stage.name.to_s.strip
1085
+ multi_speed_heat_pump = iheat_pump
1086
+ break
1087
+ end
1088
+ end
1089
+ airloop = multi_speed_heat_pump.airLoopHVAC.get
1043
1090
 
1044
- # Get the coil capacity
1045
- capacity_w = nil
1046
- htg_stages = stages
1047
- if htg_stages.last.nominalCapacity.is_initialized
1048
- capacity_w = htg_stages.last.nominalCapacity.get
1049
- elsif coil_heating_gas_multi_stage.autosizedStage4NominalCapacity.is_initialized
1050
- capacity_w = coil_heating_gas_multi_stage.autosizedStage4NominalCapacity.get
1051
- else
1052
- OpenStudio.logFree(OpenStudio::Warn, 'openstudio.standards.CoilCoolingDXMultiSpeed', "For #{coil_heating_gas_multi_stage.name} capacity is not available, cannot apply efficiency standard.")
1053
- successfully_set_all_properties = false
1054
- return successfully_set_all_properties
1091
+ # Define the criteria to find the properties in the hvac standards data set.
1092
+ search_criteria = coil_heating_gas_multi_stage_find_search_criteria(coil_heating_gas_multi_stage)
1093
+ fuel_type = search_criteria["fuel_type"]
1094
+ capacity_w = coil_heating_gas_multi_stage_find_capacity(coil_heating_gas_multi_stage)
1095
+
1096
+ # Find system design outside air flow rate and fraction
1097
+ controller_oa = nil
1098
+ if airloop.airLoopHVACOutdoorAirSystem.is_initialized
1099
+ oa_system = airloop.airLoopHVACOutdoorAirSystem.get
1100
+ controller_oa = oa_system.getControllerOutdoorAir
1101
+ end
1102
+ min_oa_flow_rate, oaf = 0.0,0.0
1103
+ if controller_oa
1104
+ min_oa_flow_rate = nil
1105
+ if controller_oa.minimumOutdoorAirFlowRate.is_initialized
1106
+ min_oa_flow_rate = controller_oa.minimumOutdoorAirFlowRate.get
1107
+ elsif controller_oa.autosizedMinimumOutdoorAirFlowRate.is_initialized
1108
+ min_oa_flow_rate = controller_oa.autosizedMinimumOutdoorAirFlowRate.get
1109
+ end
1110
+ if min_oa_flow_rate then oaf = min_oa_flow_rate.to_f / airloop.autosizedDesignSupplyAirFlowRate.to_f end
1055
1111
  end
1056
1112
 
1057
- # Set number of stages
1113
+ # Find capacities of each of the stages and the total number of stages required based on NECB rules.
1114
+ # This implementation is limited to 4 stages. The capacity of stages 1-3 is set to 66 kW as stipulated
1115
+ # by NECB. The capacity of the 4th stage can exceed 66 kW up to the design capacity.
1116
+ htg_stages = coil_heating_gas_multi_stage.stages
1058
1117
  num_stages = (capacity_w / (66.0 * 1000.0) + 0.5).round
1059
- num_stages = [num_stages, 4].min
1118
+ max_cap = 66.0 * 1000.0 * num_stages
1060
1119
  stage_cap = []
1061
- if num_stages == 1
1062
- stage_cap[0] = capacity_w / 2.0
1063
- stage_cap[1] = 2.0 * stage_cap[0]
1064
- stage_cap[2] = stage_cap[1] + 0.1
1065
- stage_cap[3] = stage_cap[2] + 0.1
1120
+ final_num_stages = num_stages
1121
+ if capacity_w == 0.001
1122
+ final_num_stages = 1
1123
+ stage_cap[0] = capacity_w
1066
1124
  else
1067
- stage_cap[0] = 66.0 * 1000.0
1068
- stage_cap[1] = 2.0 * stage_cap[0]
1069
- if num_stages == 2
1070
- stage_cap[2] = stage_cap[1] + 0.1
1071
- stage_cap[3] = stage_cap[2] + 0.1
1072
- elsif num_stages == 3
1073
- stage_cap[2] = 3.0 * stage_cap[0]
1074
- stage_cap[3] = stage_cap[2] + 0.1
1075
- elsif num_stages == 4
1076
- stage_cap[2] = 3.0 * stage_cap[0]
1077
- stage_cap[3] = 4.0 * stage_cap[0]
1125
+ case num_stages
1126
+ when 1
1127
+ stage_cap[0] = capacity_w / 2.0
1128
+ stage_cap[1] = 2.0 * stage_cap[0]
1129
+ final_num_stages = 2
1130
+ else
1131
+ stage_cap[0] = 66.0 * 1000.0
1132
+ stage_cap[1] = 2.0 * stage_cap[0]
1133
+ case num_stages
1134
+ when 2
1135
+ when 3
1136
+ stage_cap[2] = 3.0 * stage_cap[0]
1137
+ else
1138
+ final_num_stages = 4
1139
+ stage_cap[2] = 3.0 * stage_cap[0]
1140
+ stage_cap[3] = max_cap
1141
+ end
1142
+ end
1143
+ end
1144
+
1145
+ # Set final number of stages and create missing stages if needed
1146
+ for istage in 1..final_num_stages-1
1147
+ new_htg_stage = OpenStudio::Model::CoilHeatingGasMultiStageStageData.new(model)
1148
+ coil_heating_gas_multi_stage.addStage(new_htg_stage)
1149
+ end
1150
+ multi_speed_heat_pump.setNumberofSpeedsforHeating(final_num_stages)
1151
+
1152
+ # Set final capacities for each of the stages. The air flow rate for each of the stages
1153
+ # is maintained above the outside air flow rate
1154
+ coil_heating_gas_multi_stage.stages[0].setNominalCapacity(stage_cap[0])
1155
+ case coil_heating_gas_multi_stage.stages.size
1156
+ when 2
1157
+ coil_heating_gas_multi_stage.stages[1].setNominalCapacity(stage_cap[1])
1158
+ if (oaf > 0.5) then multi_speed_heat_pump.setSpeed1SupplyAirFlowRateDuringHeatingOperation(min_oa_flow_rate) end
1159
+ when 3
1160
+ coil_heating_gas_multi_stage.stages[1].setNominalCapacity(stage_cap[1])
1161
+ coil_heating_gas_multi_stage.stages[2].setNominalCapacity(stage_cap[2])
1162
+ if (oaf > 0.333) && (oaf <= 0.666)
1163
+ multi_speed_heat_pump.setSpeed1SupplyAirFlowRateDuringHeatingOperation(min_oa_flow_rate)
1164
+ elsif (oaf > 0.666)
1165
+ multi_speed_heat_pump.setSpeed1SupplyAirFlowRateDuringHeatingOperation(min_oa_flow_rate)
1166
+ multi_speed_heat_pump.setSpeed2SupplyAirFlowRateDuringHeatingOperation(min_oa_flow_rate)
1167
+ end
1168
+ when 4
1169
+ coil_heating_gas_multi_stage.stages[1].setNominalCapacity(stage_cap[1])
1170
+ coil_heating_gas_multi_stage.stages[2].setNominalCapacity(stage_cap[2])
1171
+ coil_heating_gas_multi_stage.stages[3].setNominalCapacity(stage_cap[3])
1172
+ if (oaf > 0.25) && (oaf <= 0.5)
1173
+ multi_speed_heat_pump.setSpeed1SupplyAirFlowRateDuringHeatingOperation(min_oa_flow_rate)
1174
+ elsif (oaf > 0.5) && (oaf <= 0.75)
1175
+ multi_speed_heat_pump.setSpeed1SupplyAirFlowRateDuringHeatingOperation(min_oa_flow_rate)
1176
+ multi_speed_heat_pump.setSpeed2SupplyAirFlowRateDuringHeatingOperation(min_oa_flow_rate)
1177
+ elsif (oaf > 0.75)
1178
+ multi_speed_heat_pump.setSpeed1SupplyAirFlowRateDuringHeatingOperation(min_oa_flow_rate)
1179
+ multi_speed_heat_pump.setSpeed2SupplyAirFlowRateDuringHeatingOperation(min_oa_flow_rate)
1180
+ multi_speed_heat_pump.setSpeed3SupplyAirFlowRateDuringHeatingOperation(min_oa_flow_rate)
1078
1181
  end
1079
1182
  end
1080
- # set capacities, flow rates, and sensible heat ratio for stages
1081
- (0..3).each do |istage|
1082
- htg_stages[istage].setNominalCapacity(stage_cap[istage])
1183
+
1184
+ # Convert capacity to Btu/hr
1185
+ capacity_btu_per_hr = OpenStudio.convert(stage_cap.last, 'W', 'Btu/hr').get
1186
+ capacity_kbtu_per_hr = OpenStudio.convert(stage_cap.last, 'W', 'kBtu/hr').get
1187
+
1188
+ # Lookup efficiencies
1189
+ heater_props = nil
1190
+ heater_props = model_find_object(standards_data['furnaces'], search_criteria, capacity_btu_per_hr, Date.today)
1191
+
1192
+ # Check to make sure properties were found
1193
+ if heater_props.nil?
1194
+ OpenStudio.logFree(OpenStudio::Warn, 'openstudio.standards.CoilHeatingGasMultiSpeed', "For #{coil_heating_gas_multi_stage.name}, cannot find efficiency info, cannot apply efficiency standard.")
1195
+ successfully_set_all_properties = false
1196
+ return successfully_set_all_properties
1083
1197
  end
1084
- # PLF vs PLR curve
1085
- furnace_plffplr_curve_name = 'FURNACE-EFFPLR-NECB2011'
1086
1198
 
1087
- # plf vs plr curve for furnace
1088
- furnace_plffplr_curve = model_add_curve(coil_heating_gas_multi_stage.model, furnace_plffplr_curve_name, standards)
1089
- if furnace_plffplr_curve
1090
- coil_heating_gas_multi_stage.setPartLoadFractionCorrelationCurve(furnace_plffplr_curve)
1199
+ # Make the EFFPLR curve
1200
+ efffplr = model_add_curve(coil_heating_gas_multi_stage.model, heater_props['efffplr'])
1201
+ if efffplr
1202
+ coil_heating_gas_multi_stage.setPartLoadFractionCorrelationCurve(efffplr)
1091
1203
  else
1092
- OpenStudio.logFree(OpenStudio::Warn, 'openstudio.standards.CoilHeatingGasMultiStage', "For #{coil_heating_gas_multi_stage.name}, cannot find plffplr curve, will not be set.")
1204
+ OpenStudio.logFree(OpenStudio::Warn, 'openstudio.standards.CoilHeatingGasMultiStage', "For #{coil_heating_gas_multi_stage.name}, cannot find efffplr curve, will not be set.")
1093
1205
  successfully_set_all_properties = false
1206
+ return successfully_set_all_properties
1094
1207
  end
1208
+
1209
+ # Get the minimum efficiency standards
1210
+ thermal_eff = nil
1211
+
1212
+ # If specified as AFUE
1213
+ unless heater_props['minimum_annual_fuel_utilization_efficiency'].nil?
1214
+ min_afue = heater_props['minimum_annual_fuel_utilization_efficiency']
1215
+ thermal_eff = afue_to_thermal_eff(min_afue)
1216
+ new_comp_name = "#{coil_heating_gas_multi_stage.name} #{capacity_kbtu_per_hr.round}kBtu/hr #{min_afue} AFUE"
1217
+ OpenStudio.logFree(OpenStudio::Info, 'openstudio.standards.CoilHeatingGasMultiStage', "For #{template}: #{coil_heating_gas_multi_stage.name}: #{fuel_type} Capacity = #{capacity_kbtu_per_hr.round}kBtu/hr; AFUE = #{min_afue}")
1218
+ end
1219
+
1220
+ # If specified as thermal efficiency
1221
+ unless heater_props['minimum_thermal_efficiency'].nil?
1222
+ thermal_eff = heater_props['minimum_thermal_efficiency']
1223
+ new_comp_name = "#{coil_heating_gas_multi_stage.name} #{capacity_kbtu_per_hr.round}kBtu/hr #{thermal_eff} Thermal Eff"
1224
+ OpenStudio.logFree(OpenStudio::Info, 'openstudio.standards.CoilHeatingGasMultiStage', "For #{template}: #{coil_heating_gas_multi_stage.name}: #{fuel_type} Capacity = #{capacity_kbtu_per_hr.round}kBtu/hr; Thermal Efficiency = #{thermal_eff}")
1225
+ end
1226
+
1227
+ # If specified as combustion efficiency
1228
+ unless heater_props['minimum_combustion_efficiency'].nil?
1229
+ min_comb_eff = heater_props['minimum_combustion_efficiency']
1230
+ thermal_eff = combustion_eff_to_thermal_eff(min_comb_eff)
1231
+ new_comp_name = "#{coil_heating_gas_multi_stage.name} #{capacity_kbtu_per_hr.round}kBtu/hr #{min_comb_eff} Combustion Eff"
1232
+ OpenStudio.logFree(OpenStudio::Info, 'openstudio.standards.BoilerHotWater', "For #{template}: #{coil_heating_gas_multi_stage.name}: #{fuel_type} Capacity = #{capacity_kbtu_per_hr.round}kBtu/hr; Combustion Efficiency = #{min_comb_eff}")
1233
+ end
1234
+ coil_heating_gas_multi_stage.setName(new_comp_name)
1235
+
1236
+ # Set the name
1237
+ coil_heating_gas_multi_stage.setName(new_comp_name)
1238
+
1239
+ # Get heating stages
1240
+ htg_stages = coil_heating_gas_multi_stage.stages
1241
+
1242
+ # Set the efficiency values
1243
+ unless thermal_eff.nil?
1244
+ htg_stages.sort.each do |stage|
1245
+ stage.setGasBurnerEfficiency(thermal_eff)
1246
+ end
1247
+ end
1248
+
1249
+ return successfully_set_all_properties
1250
+
1095
1251
  end
1096
1252
 
1097
1253
  # Determines the baseline fan impeller efficiency
@@ -1139,7 +1295,7 @@ class NECB2011
1139
1295
  # Assuming all fan motors are 4-pole ODP
1140
1296
  motor_use = 'FAN'
1141
1297
  motor_type = ''
1142
- if fan.class.name == 'OpenStudio::Model::FanConstantVolume'
1298
+ if (fan.class.name == 'OpenStudio::Model::FanConstantVolume') || (fan.class.name == 'OpenStudio::Model::FanOnOff')
1143
1299
  motor_type = 'CONSTANT'
1144
1300
  elsif fan.class.name == 'OpenStudio::Model::FanVariableVolume'
1145
1301
  # Is this a return or supply fan
@@ -1305,6 +1461,15 @@ class NECB2011
1305
1461
  return true
1306
1462
  end
1307
1463
 
1464
+ # Determine and set type of part load control type for heating and chilled
1465
+ # water variable speed pumps
1466
+ #
1467
+ # @param pump [OpenStudio::Model::PumpVariableSpeed] OpenStudio pump object
1468
+ # @return [Boolean] Returns true if applicable, false otherwise
1469
+ def pump_variable_speed_control_type(pump)
1470
+ return false
1471
+ end
1472
+
1308
1473
  # Sets the fan pressure rise based on the Prototype buildings inputs
1309
1474
  # which are governed by the flow rate coming through the fan
1310
1475
  # and whether the fan lives inside a unit heater, PTAC, etc.
@@ -1560,51 +1725,7 @@ class NECB2011
1560
1725
 
1561
1726
  return clg_tower
1562
1727
  end
1563
-
1564
-
1565
- # Creates thermal zones to contain each space, as defined for each building in the
1566
- # system_to_space_map inside the Prototype.building_name
1567
- # e.g. (Prototype.secondary_school.rb) file.
1568
- #
1569
- # @param (see #add_constructions)
1570
- # @return [Bool] returns true if successful, false if not
1571
- def model_create_thermal_zones(model,
1572
- space_multiplier_map = nil)
1573
- OpenStudio.logFree(OpenStudio::Info, 'openstudio.model.Model', 'Started creating thermal zones')
1574
- space_multiplier_map = {} if space_multiplier_map.nil?
1575
-
1576
- # Remove any Thermal zones assigned
1577
- model.getThermalZones.each(&:remove)
1578
-
1579
- # Create a thermal zone for each space in the self
1580
- model.getSpaces.sort.each do |space|
1581
- zone = OpenStudio::Model::ThermalZone.new(model)
1582
- zone.setName("#{space.name} ZN")
1583
- unless space_multiplier_map[space.name.to_s].nil? || (space_multiplier_map[space.name.to_s] == 1)
1584
- zone.setMultiplier(space_multiplier_map[space.name.to_s])
1585
- end
1586
- space.setThermalZone(zone)
1587
-
1588
- # Skip thermostat for spaces with no space type
1589
- next if space.spaceType.empty?
1590
-
1591
- # Add a thermostat
1592
- space_type_name = space.spaceType.get.name.get
1593
- thermostat_name = space_type_name + ' Thermostat'
1594
- thermostat = model.getThermostatSetpointDualSetpointByName(thermostat_name)
1595
- if thermostat.empty?
1596
- OpenStudio.logFree(OpenStudio::Error, 'openstudio.model.Model', "Thermostat #{thermostat_name} not found for space name: #{space.name}")
1597
- else
1598
- thermostat_clone = thermostat.get.clone(model).to_ThermostatSetpointDualSetpoint.get
1599
- zone.setThermostatSetpointDualSetpoint(thermostat_clone)
1600
- # Set Ideal loads to thermal zone for sizing for NECB needs. We need this for sizing.
1601
- ideal_loads = OpenStudio::Model::ZoneHVACIdealLoadsAirSystem.new(model)
1602
- ideal_loads.addToThermalZone(zone)
1603
- end
1604
- end
1605
-
1606
- OpenStudio.logFree(OpenStudio::Info, 'openstudio.model.Model', 'Finished creating thermal zones')
1607
- end
1728
+
1608
1729
 
1609
1730
  # This method cycles through the spaces in a thermal zone and then sorts them by story. The method then cycles
1610
1731
  # through the spaces on a story and then calculates the centroid of the spaces in the thermal zone on that floor. The
@@ -1932,5 +2053,136 @@ class NECB2011
1932
2053
  return clg_availability_sch, htg_availability_sch
1933
2054
  end
1934
2055
 
2056
+ # Method to set the base system name based on the following syntax:
2057
+ # |sys_abbr|sys_oa|sh>?|sc>?|ssf>?|zh>?|zc>?|srf>?|
2058
+ # "sys_abbr" designates the NECB system type ("sys_1, sys_2, ... sys_6")
2059
+ # "sys_oa": "mixed" or "doas"
2060
+ # "sys_name_pars" is a hash for the remaining system name parts for heat recovery,
2061
+ # heating, cooling, supply fan, zone heating, zone cooling, and return fan
2062
+ def assign_base_sys_name(airloop,sys_abbr:,sys_oa:,sys_name_pars:)
2063
+ sys_name = "#{sys_abbr}|#{sys_oa}|"
2064
+
2065
+ sys_name_pars.each do |key,value|
2066
+ case key.downcase
2067
+ when "sys_hr"
2068
+ case value.downcase
2069
+ when "none"
2070
+ sys_name += "shr>none"
2071
+ end
2072
+
2073
+ when "sys_htg"
2074
+ case value.downcase
2075
+ when "none"
2076
+ sys_name += "sh>none"
2077
+ when "electric"
2078
+ sys_name += "sh>c-e"
2079
+ when "hot water"
2080
+ sys_name += "sh>c-hw"
2081
+ when "gas"
2082
+ sys_name += "sh>c-g"
2083
+ when "dx"
2084
+ sys_name += "sh>ashp"
2085
+ end
2086
+
2087
+ when "sys_clg"
2088
+ case value.downcase
2089
+ when "none"
2090
+ sys_name += "sc>none"
2091
+ when "chilled water"
2092
+ sys_name += "sc>c-chw"
2093
+ when "dx"
2094
+ sys_name += "sc>dx"
2095
+ sys_name += "sc>ashp" if sys_name_pars["sys_htg"] == "dx"
2096
+ end
2097
+
2098
+ when "sys_sf"
2099
+ case value.downcase
2100
+ when "none"
2101
+ sys_name += "ssf>none"
2102
+ when "cv"
2103
+ sys_name += "ssf>cv"
2104
+ when "vv"
2105
+ sys_name += "ssf>vv"
2106
+ end
2107
+
2108
+ when "zone_htg"
2109
+ case value.downcase
2110
+ when "none"
2111
+ sys_name += "zh>none"
2112
+ when "electric"
2113
+ sys_name += "zh>b-e"
2114
+ when "hot water"
2115
+ sys_name += "zh>b-hw"
2116
+ when "tpfc"
2117
+ sys_name += "zh>fpfc"
2118
+ when "fpfc"
2119
+ sys_name += "zh>tpfc"
2120
+ end
2121
+
2122
+ when "zone_clg"
2123
+ case value.downcase
2124
+ when "none"
2125
+ sys_name += "zc>none"
2126
+ when "tpfc"
2127
+ sys_name += "zc>tpfc"
2128
+ when "fpfc"
2129
+ sys_name += "zc>fpfc"
2130
+ when "ptac"
2131
+ sys_name += "zc>ptac"
2132
+ end
2133
+
2134
+ when "sys_rf"
2135
+ case value.downcase
2136
+ when "none"
2137
+ sys_name += "srf>none"
2138
+ when "cv"
2139
+ sys_name += "srf>cv"
2140
+ when "vv"
2141
+ sys_name += "srf>vv"
2142
+ end
2143
+ end
2144
+ sys_name += "|"
2145
+ end
2146
+
2147
+ airloop.setName(sys_name)
2148
+ end
2149
+
2150
+ # Method to update the base system name based on the inputs provided.
2151
+ # Only the parts of the name with string inputs are updated
2152
+ def update_sys_name(airloop,
2153
+ sys_abbr: nil,
2154
+ sys_oa: nil,
2155
+ sys_hr: nil,
2156
+ sys_htg: nil,
2157
+ sys_clg: nil,
2158
+ sys_sf: nil,
2159
+ zone_htg: nil,
2160
+ zone_clg: nil,
2161
+ sys_rf: nil)
2162
+ name_parts = airloop.name.to_s.split("|").select {|part| !part.empty?}
2163
+ if sys_abbr.is_a? String then name_parts[0] = sys_abbr end
2164
+ if sys_oa.is_a? String then name_parts[1] = sys_oa end
2165
+ for i in 0..name_parts.size-1
2166
+ if (name_parts[i].include? "shr>") && (sys_hr.is_a? String)
2167
+ name_parts[i] = "shr>#{sys_hr}"
2168
+ elsif (name_parts[i].include? "sh>") && (sys_htg.is_a? String)
2169
+ name_parts[i] = "sh>#{sys_htg}"
2170
+ elsif (name_parts[i].include? "sc>") && (sys_clg.is_a? String)
2171
+ name_parts[i] = "sc>#{sys_clg}"
2172
+ elsif (name_parts[i].include? "ssf") && (sys_sf.is_a? String)
2173
+ name_parts[i] = "ssf>#{sys_sf}"
2174
+ elsif (name_parts[i].include? "zh>") && (zone_htg.is_a? String)
2175
+ name_parts[i] = "zh>#{zone_htg}"
2176
+ elsif (name_parts[i].include? "zc>") && (zone_clg.is_a? String)
2177
+ name_parts[i] = "zc>#{zone_clg}"
2178
+ elsif (name_parts[i].include? "srf>") && (sys_rf.is_a? String)
2179
+ name_parts[i] = "srf>#{sys_rf}"
2180
+ end
2181
+ end
2182
+ sys_name = ""
2183
+ name_parts.each {|part| sys_name += "#{part}|"}
2184
+ sys_name = sys_name.chop if (Integer(name_parts.last.strip) rescue false)
1935
2185
 
2186
+ airloop.setName(sys_name)
2187
+ end
1936
2188
  end