openstudio-standards 0.7.1 → 0.8.0.rc1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (362) hide show
  1. checksums.yaml +4 -4
  2. data/data/geometry/ASHRAE90120162019LargeHotel.json +58 -13
  3. data/data/geometry/ASHRAELargeHotel.json +58 -13
  4. data/data/standards/OpenStudio_Standards-ashrae_90_1-ALL-comstock(space_types).xlsx +0 -0
  5. data/data/standards/export_OpenStudio_libraries.rb +2 -2
  6. data/data/standards/manage_OpenStudio_Standards.rb +6 -6
  7. data/data/standards/openstudio_standards_duplicates_log.csv +7961 -1
  8. data/data/standards/test_performance_expected_dd_results.csv +2016 -2004
  9. data/lib/openstudio-standards/btap/fileio.rb +171 -5
  10. data/lib/openstudio-standards/constructions/create.rb +38 -4
  11. data/lib/openstudio-standards/constructions/modify.rb +10 -3
  12. data/lib/openstudio-standards/create_typical/create_typical.rb +42 -28
  13. data/lib/openstudio-standards/create_typical/space_type_information.rb +160 -0
  14. data/lib/openstudio-standards/create_typical/space_type_ratios.rb +16 -19
  15. data/lib/openstudio-standards/exterior_lighting/create.rb +454 -0
  16. data/lib/openstudio-standards/exterior_lighting/data/entryways.csv +52 -0
  17. data/lib/openstudio-standards/exterior_lighting/data/parking.csv +54 -0
  18. data/lib/openstudio-standards/exterior_lighting/data/typical_exterior_lighting.json +37 -0
  19. data/lib/openstudio-standards/exterior_lighting/information.rb +202 -0
  20. data/lib/openstudio-standards/geometry/information.rb +49 -2
  21. data/lib/openstudio-standards/hvac/components/create.rb +169 -0
  22. data/lib/openstudio-standards/hvac/components/modify.rb +42 -0
  23. data/lib/openstudio-standards/hvac/exhaust/create_exhaust_fan.rb +108 -0
  24. data/lib/openstudio-standards/hvac/exhaust/data/convert_data.rb +86 -0
  25. data/lib/openstudio-standards/hvac/exhaust/data/typical_exhaust.csv +18 -0
  26. data/lib/openstudio-standards/hvac/exhaust/data/typical_exhaust.json +89 -0
  27. data/lib/openstudio-standards/infiltration/nist_infiltration.rb +25 -13
  28. data/lib/openstudio-standards/prototypes/common/buildings/Prototype.LargeHotel.rb +0 -64
  29. data/lib/openstudio-standards/prototypes/common/buildings/Prototype.LargeOffice.rb +0 -25
  30. data/lib/openstudio-standards/prototypes/common/buildings/Prototype.MediumOffice.rb +0 -25
  31. data/lib/openstudio-standards/prototypes/common/buildings/Prototype.Warehouse.rb +1 -11
  32. data/lib/openstudio-standards/prototypes/common/objects/Prototype.AirConditionerVariableRefrigerantFlow.rb +5 -1
  33. data/lib/openstudio-standards/prototypes/common/objects/Prototype.Fan.rb +0 -7
  34. data/lib/openstudio-standards/prototypes/common/objects/Prototype.HeatExchangerAirToAirSensibleAndLatent.rb +36 -18
  35. data/lib/openstudio-standards/prototypes/common/objects/Prototype.Model.hvac.rb +1 -1
  36. data/lib/openstudio-standards/prototypes/common/objects/Prototype.Model.rb +121 -239
  37. data/lib/openstudio-standards/prototypes/common/objects/Prototype.hvac_systems.rb +179 -151
  38. data/lib/openstudio-standards/prototypes/common/objects/Prototype.refrigeration.rb +0 -466
  39. data/lib/openstudio-standards/prototypes/common/objects/Prototype.utilities.rb +18 -2
  40. data/lib/openstudio-standards/refrigeration/create_case.rb +125 -0
  41. data/lib/openstudio-standards/refrigeration/create_compressor.rb +78 -0
  42. data/lib/openstudio-standards/refrigeration/create_compressor_rack.rb +48 -0
  43. data/lib/openstudio-standards/refrigeration/create_refrigeration_system.rb +74 -0
  44. data/lib/openstudio-standards/refrigeration/create_typical_refrigeration.rb +161 -0
  45. data/lib/openstudio-standards/refrigeration/create_walkin.rb +116 -0
  46. data/lib/openstudio-standards/refrigeration/data/refrigerated_cases.csv +31 -0
  47. data/lib/openstudio-standards/refrigeration/data/refrigerated_walkins.csv +76 -0
  48. data/lib/openstudio-standards/refrigeration/data/refrigeration_compressors.csv +13 -0
  49. data/lib/openstudio-standards/refrigeration/data/typical_refrigerated_cases.csv +17 -0
  50. data/lib/openstudio-standards/refrigeration/data/typical_refrigerated_walkins.csv +53 -0
  51. data/lib/openstudio-standards/refrigeration/information.rb +130 -0
  52. data/lib/openstudio-standards/schedules/parametric.rb +1 -1
  53. data/lib/openstudio-standards/service_water_heating/create_typical.rb +299 -0
  54. data/lib/openstudio-standards/service_water_heating/create_water_heating_loop.rb +16 -14
  55. data/lib/openstudio-standards/service_water_heating/data/convert_data.rb +119 -0
  56. data/lib/openstudio-standards/service_water_heating/data/typical_water_use_equipment.csv +54 -0
  57. data/lib/openstudio-standards/service_water_heating/data/typical_water_use_equipment.json +810 -0
  58. data/lib/openstudio-standards/service_water_heating/information.rb +69 -0
  59. data/lib/openstudio-standards/sql_file/fenestration.rb +1 -1
  60. data/lib/openstudio-standards/standards/Standards.AirConditionerVariableRefrigerantFlow.rb +154 -0
  61. data/lib/openstudio-standards/standards/Standards.AirLoopHVAC.rb +35 -12
  62. data/lib/openstudio-standards/standards/Standards.CoilCoolingDXMultiSpeed.rb +110 -61
  63. data/lib/openstudio-standards/standards/Standards.CoilCoolingDXSingleSpeed.rb +128 -29
  64. data/lib/openstudio-standards/standards/Standards.CoilCoolingDXTwoSpeed.rb +103 -38
  65. data/lib/openstudio-standards/standards/Standards.CoilCoolingWaterToAirHeatPumpEquationFit.rb +1 -1
  66. data/lib/openstudio-standards/standards/Standards.CoilDX.rb +106 -5
  67. data/lib/openstudio-standards/standards/Standards.CoilHeatingGasMultiStage.rb +8 -8
  68. data/lib/openstudio-standards/standards/Standards.CoolingTower.rb +44 -17
  69. data/lib/openstudio-standards/standards/Standards.Fan.rb +32 -21
  70. data/lib/openstudio-standards/standards/Standards.FluidCooler.rb +45 -18
  71. data/lib/openstudio-standards/standards/Standards.HeatExchangerSensLat.rb +14 -9
  72. data/lib/openstudio-standards/standards/Standards.Model.rb +294 -76
  73. data/lib/openstudio-standards/standards/Standards.Motor.rb +66 -0
  74. data/lib/openstudio-standards/standards/Standards.PlanarSurface.rb +2 -1
  75. data/lib/openstudio-standards/standards/Standards.Pump.rb +34 -20
  76. data/lib/openstudio-standards/standards/Standards.ServiceWaterHeating.rb +0 -353
  77. data/lib/openstudio-standards/standards/Standards.Space.rb +3 -107
  78. data/lib/openstudio-standards/standards/Standards.SpaceType.rb +2 -57
  79. data/lib/openstudio-standards/standards/Standards.Surface.rb +11 -3
  80. data/lib/openstudio-standards/standards/Standards.ThermalZone.rb +1 -120
  81. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2004/data/ashrae_90_1_2004.computer_room_acs.json +142 -0
  82. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2004/data/ashrae_90_1_2004.economizers.json +1006 -596
  83. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2004/data/ashrae_90_1_2004.energy_recovery.json +724 -0
  84. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2004/data/ashrae_90_1_2004.ext_ltg.json +1258 -163
  85. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2004/data/ashrae_90_1_2004.motors.json +1070 -140
  86. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2004/data/ashrae_90_1_2004.spc_typ.json +33 -3374
  87. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2004/data/ashrae_90_1_2004.unitary_acs.json +1400 -340
  88. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2004/data/ashrae_90_1_2004.vrfs.json +769 -0
  89. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2007/comstock_ashrae_90_1_2007/data/comstock_ashrae_90_1_2007.spc_typ.json +2 -5338
  90. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2007/data/ashrae_90_1_2007.computer_room_acs.json +142 -0
  91. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2007/data/ashrae_90_1_2007.economizers.json +1006 -596
  92. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2007/data/ashrae_90_1_2007.energy_recovery.json +724 -0
  93. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2007/data/ashrae_90_1_2007.ext_ltg.json +1258 -163
  94. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2007/data/ashrae_90_1_2007.motors.json +1070 -140
  95. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2007/data/ashrae_90_1_2007.spc_typ.json +15 -3343
  96. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2007/data/ashrae_90_1_2007.unitary_acs.json +1840 -372
  97. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2007/data/ashrae_90_1_2007.vrfs.json +769 -0
  98. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2010/ashrae_90_1_2010.AirLoopHVAC.rb +20 -10
  99. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2010/ashrae_90_1_2010.Space.rb +0 -9
  100. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2010/comstock_ashrae_90_1_2010/data/comstock_ashrae_90_1_2010.spc_typ.json +0 -5382
  101. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2010/data/ashrae_90_1_2010.computer_room_acs.json +142 -0
  102. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2010/data/ashrae_90_1_2010.economizers.json +1006 -628
  103. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2010/data/ashrae_90_1_2010.energy_recovery.json +718 -712
  104. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2010/data/ashrae_90_1_2010.ext_ltg.json +1438 -163
  105. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2010/data/ashrae_90_1_2010.motors.json +2552 -182
  106. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2010/data/ashrae_90_1_2010.spc_typ.json +14 -3368
  107. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2010/data/ashrae_90_1_2010.unitary_acs.json +2348 -352
  108. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2010/data/ashrae_90_1_2010.vrfs.json +769 -0
  109. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2013/ashrae_90_1_2013.AirLoopHVAC.rb +47 -61
  110. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2013/ashrae_90_1_2013.Model.rb +6 -0
  111. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2013/ashrae_90_1_2013.Motor.rb +11 -0
  112. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2013/ashrae_90_1_2013.Space.rb +0 -9
  113. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2013/comstock_ashrae_90_1_2013/data/comstock_ashrae_90_1_2013.spc_typ.json +2 -5522
  114. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2013/data/ashrae_90_1_2013.computer_room_acs.json +142 -0
  115. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2013/data/ashrae_90_1_2013.economizers.json +1006 -628
  116. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2013/data/ashrae_90_1_2013.energy_recovery.json +1358 -1346
  117. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2013/data/ashrae_90_1_2013.ext_ltg.json +1438 -163
  118. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2013/data/ashrae_90_1_2013.motors.json +1359 -189
  119. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2013/data/ashrae_90_1_2013.spc_typ.json +19 -3451
  120. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2013/data/ashrae_90_1_2013.unitary_acs.json +2176 -616
  121. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2013/data/ashrae_90_1_2013.vrfs.json +616 -0
  122. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2016/ashrae_90_1_2016.AirLoopHVAC.rb +47 -61
  123. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2016/ashrae_90_1_2016.Model.rb +9 -0
  124. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2016/ashrae_90_1_2016.Motor.rb +11 -0
  125. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2016/ashrae_90_1_2016.Space.rb +0 -9
  126. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2016/comstock_ashrae_90_1_2016/data/comstock_ashrae_90_1_2016.spc_typ.json +8 -6055
  127. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2016/data/ashrae_90_1_2016.computer_room_acs.json +142 -0
  128. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2016/data/ashrae_90_1_2016.economizers.json +1006 -628
  129. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2016/data/ashrae_90_1_2016.energy_recovery.json +1188 -1424
  130. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2016/data/ashrae_90_1_2016.ext_ltg.json +1498 -163
  131. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2016/data/ashrae_90_1_2016.motors.json +1769 -189
  132. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2016/data/ashrae_90_1_2016.spc_typ.json +15 -3422
  133. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2016/data/ashrae_90_1_2016.unitary_acs.json +1807 -408
  134. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2016/data/ashrae_90_1_2016.vrfs.json +1024 -0
  135. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2019/ashrae_90_1_2019.AirLoopHVAC.rb +70 -87
  136. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2019/ashrae_90_1_2019.Model.rb +9 -0
  137. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2019/ashrae_90_1_2019.Motor.rb +11 -0
  138. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2019/ashrae_90_1_2019.Space.rb +0 -9
  139. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2019/comstock_ashrae_90_1_2019/data/comstock_ashrae_90_1_2019.spc_typ.json +8 -6080
  140. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2019/data/ashrae_90_1_2019.computer_room_acs.json +142 -0
  141. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2019/data/ashrae_90_1_2019.economizers.json +1006 -628
  142. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2019/data/ashrae_90_1_2019.energy_recovery.json +2806 -3296
  143. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2019/data/ashrae_90_1_2019.ext_ltg.json +1558 -163
  144. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2019/data/ashrae_90_1_2019.motors.json +1759 -189
  145. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2019/data/ashrae_90_1_2019.spc_typ.json +16 -3448
  146. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2019/data/ashrae_90_1_2019.unitary_acs.json +2758 -422
  147. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2019/data/ashrae_90_1_2019.vrfs.json +684 -0
  148. data/lib/openstudio-standards/standards/ashrae_90_1/data/ashrae_90_1.schedules.json +14 -3318
  149. data/lib/openstudio-standards/standards/ashrae_90_1/doe_ref_1980_2004/comstock_doe_ref_1980_2004/data/comstock_doe_ref_1980_2004.spc_typ.json +2 -4786
  150. data/lib/openstudio-standards/standards/ashrae_90_1/doe_ref_1980_2004/data/doe_ref_1980_2004.chillers.json +1 -1
  151. data/lib/openstudio-standards/standards/ashrae_90_1/doe_ref_1980_2004/data/doe_ref_1980_2004.economizers.json +953 -207
  152. data/lib/openstudio-standards/standards/ashrae_90_1/doe_ref_1980_2004/data/doe_ref_1980_2004.energy_recovery.json +724 -0
  153. data/lib/openstudio-standards/standards/ashrae_90_1/doe_ref_1980_2004/data/doe_ref_1980_2004.ext_ltg.json +5 -5
  154. data/lib/openstudio-standards/standards/ashrae_90_1/doe_ref_1980_2004/data/doe_ref_1980_2004.spc_typ.json +11 -2858
  155. data/lib/openstudio-standards/standards/ashrae_90_1/doe_ref_1980_2004/doe_ref_1980_2004.AirConditionerVariableRefrigerantFlow.rb +13 -0
  156. data/lib/openstudio-standards/standards/ashrae_90_1/doe_ref_1980_2004/doe_ref_1980_2004.Model.rb +0 -18
  157. data/lib/openstudio-standards/standards/ashrae_90_1/doe_ref_pre_1980/comstock_doe_ref_pre_1980/data/comstock_doe_ref_pre_1980.spc_typ.json +1 -4739
  158. data/lib/openstudio-standards/standards/ashrae_90_1/doe_ref_pre_1980/data/doe_ref_pre_1980.chillers.json +0 -51
  159. data/lib/openstudio-standards/standards/ashrae_90_1/doe_ref_pre_1980/data/doe_ref_pre_1980.economizers.json +953 -207
  160. data/lib/openstudio-standards/standards/ashrae_90_1/doe_ref_pre_1980/data/doe_ref_pre_1980.energy_recovery.json +724 -0
  161. data/lib/openstudio-standards/standards/ashrae_90_1/doe_ref_pre_1980/data/doe_ref_pre_1980.ext_ltg.json +5 -5
  162. data/lib/openstudio-standards/standards/ashrae_90_1/doe_ref_pre_1980/data/doe_ref_pre_1980.spc_typ.json +9 -2830
  163. data/lib/openstudio-standards/standards/ashrae_90_1/doe_ref_pre_1980/doe_ref_pre_1980.AirConditionerVariableRefrigerantFlow.rb +13 -0
  164. data/lib/openstudio-standards/standards/ashrae_90_1/doe_ref_pre_1980/doe_ref_pre_1980.Model.rb +0 -18
  165. data/lib/openstudio-standards/standards/ashrae_90_1/nrel_zne_ready_2017/data/nrel_zne_ready_2017.economizers.json +1006 -564
  166. data/lib/openstudio-standards/standards/ashrae_90_1/nrel_zne_ready_2017/data/nrel_zne_ready_2017.energy_recovery.json +1264 -0
  167. data/lib/openstudio-standards/standards/ashrae_90_1/nrel_zne_ready_2017/data/nrel_zne_ready_2017.ext_ltg.json +5 -5
  168. data/lib/openstudio-standards/standards/ashrae_90_1/nrel_zne_ready_2017/data/nrel_zne_ready_2017.spc_typ.json +0 -1079
  169. data/lib/openstudio-standards/standards/ashrae_90_1/nrel_zne_ready_2017/nrel_zne_ready_2017.AirLoopHVAC.rb +132 -288
  170. data/lib/openstudio-standards/standards/ashrae_90_1/nrel_zne_ready_2017/nrel_zne_ready_2017.HeatExchangerSensLat.rb +44 -20
  171. data/lib/openstudio-standards/standards/ashrae_90_1/nrel_zne_ready_2017/nrel_zne_ready_2017.Model.rb +11 -0
  172. data/lib/openstudio-standards/standards/ashrae_90_1/nrel_zne_ready_2017/nrel_zne_ready_2017.Space.rb +0 -8
  173. data/lib/openstudio-standards/standards/ashrae_90_1/ze_aedg_multifamily/data/ze_aedg_multifamily.economizers.json +1006 -564
  174. data/lib/openstudio-standards/standards/ashrae_90_1/ze_aedg_multifamily/data/ze_aedg_multifamily.energy_recovery.json +1264 -0
  175. data/lib/openstudio-standards/standards/ashrae_90_1/ze_aedg_multifamily/data/ze_aedg_multifamily.ext_ltg.json +5 -5
  176. data/lib/openstudio-standards/standards/ashrae_90_1/ze_aedg_multifamily/data/ze_aedg_multifamily.spc_typ.json +0 -1079
  177. data/lib/openstudio-standards/standards/ashrae_90_1/ze_aedg_multifamily/ze_aedg_multifamily.AirLoopHVAC.rb +137 -288
  178. data/lib/openstudio-standards/standards/ashrae_90_1/ze_aedg_multifamily/ze_aedg_multifamily.HeatExchangerSensLat.rb +44 -20
  179. data/lib/openstudio-standards/standards/ashrae_90_1/ze_aedg_multifamily/ze_aedg_multifamily.Model.rb +11 -0
  180. data/lib/openstudio-standards/standards/ashrae_90_1/ze_aedg_multifamily/ze_aedg_multifamily.Space.rb +0 -9
  181. data/lib/openstudio-standards/standards/ashrae_90_1_prm/ashrae_90_1_prm.AirLoopHVAC.rb +12 -10
  182. data/lib/openstudio-standards/standards/ashrae_90_1_prm/ashrae_90_1_prm.CoilCoolingDXSingleSpeed.rb +8 -6
  183. data/lib/openstudio-standards/standards/ashrae_90_1_prm/ashrae_90_1_prm.CoilCoolingDXTwoSpeed.rb +8 -6
  184. data/lib/openstudio-standards/standards/ashrae_90_1_prm/ashrae_90_1_prm.CoilDX.rb +9 -3
  185. data/lib/openstudio-standards/standards/ashrae_90_1_prm/ashrae_90_1_prm.Fan.rb +6 -40
  186. data/lib/openstudio-standards/standards/ashrae_90_1_prm/ashrae_90_1_prm.Model.rb +30 -337
  187. data/lib/openstudio-standards/standards/ashrae_90_1_prm/ashrae_90_1_prm.Space.rb +4 -5
  188. data/lib/openstudio-standards/standards/ashrae_90_1_prm/ashrae_90_1_prm.SpaceType.rb +1 -2
  189. data/lib/openstudio-standards/standards/ashrae_90_1_prm/ashrae_90_1_prm.rb +56 -3
  190. data/lib/openstudio-standards/standards/ashrae_90_1_prm/ashrae_90_1_prm_2019/ashrae_90_1_prm_2019.Model.rb +80 -0
  191. data/lib/openstudio-standards/standards/ashrae_90_1_prm/ashrae_90_1_prm_2019/ashrae_90_1_prm_2019.rb +0 -10
  192. data/lib/openstudio-standards/standards/ashrae_90_1_prm/ashrae_90_1_prm_2019/ashrae_90_1_prm_2019_WaterHeaterMixed.rb +35 -0
  193. data/lib/openstudio-standards/standards/ashrae_90_1_prm/ashrae_90_1_prm_2019/data/ashrae_90_1_prm_2019.economizers.json +550 -0
  194. data/lib/openstudio-standards/standards/ashrae_90_1_prm/ashrae_90_1_prm_2019/data/ashrae_90_1_prm_2019.energy_recovery.json +724 -0
  195. data/lib/openstudio-standards/standards/ashrae_90_1_prm/ashrae_90_1_prm_2019/data/ashrae_90_1_prm_2019.ext_ltg.json +1216 -0
  196. data/lib/openstudio-standards/standards/ashrae_90_1_prm/ashrae_90_1_prm_2019/data/ashrae_90_1_prm_2019.heat_pumps.json +5 -5
  197. data/lib/openstudio-standards/standards/ashrae_90_1_prm/ashrae_90_1_prm_2019/data/ashrae_90_1_prm_2019.motors.json +225 -245
  198. data/lib/openstudio-standards/standards/ashrae_90_1_prm/ashrae_90_1_prm_2019/data/ashrae_90_1_prm_2019.unitary_acs.json +174 -78
  199. data/lib/openstudio-standards/standards/ashrae_90_1_prm/ashrae_90_1_prm_2019/data/ashrae_90_1_prm_2019.water_heaters.json +354 -317
  200. data/lib/openstudio-standards/standards/ashrae_90_1_prm/userdata_csv/userdata_enums.rb +19 -3
  201. data/lib/openstudio-standards/standards/ashrae_90_1_prm/userdata_json/userdata_airloop_hvac.json +185 -0
  202. data/lib/openstudio-standards/standards/ashrae_90_1_prm/userdata_json/userdata_airloop_hvac_doas.json +127 -0
  203. data/lib/openstudio-standards/standards/ashrae_90_1_prm/userdata_json/userdata_building.json +121 -0
  204. data/lib/openstudio-standards/standards/ashrae_90_1_prm/userdata_json/userdata_design_specification_outdoor_air.json +49 -0
  205. data/lib/openstudio-standards/standards/ashrae_90_1_prm/userdata_json/userdata_electric_equipment.json +113 -0
  206. data/lib/openstudio-standards/standards/ashrae_90_1_prm/userdata_json/userdata_exterior_lights.json +120 -0
  207. data/lib/openstudio-standards/standards/ashrae_90_1_prm/userdata_json/userdata_space.json +388 -0
  208. data/lib/openstudio-standards/standards/ashrae_90_1_prm/userdata_json/userdata_spacetype.json +367 -0
  209. data/lib/openstudio-standards/standards/ashrae_90_1_prm/userdata_json/userdata_thermal_zone.json +56 -0
  210. data/lib/openstudio-standards/standards/ashrae_90_1_prm/userdata_json/userdata_wateruse_connections.json +37 -0
  211. data/lib/openstudio-standards/standards/ashrae_90_1_prm/userdata_json/userdata_wateruse_equipment.json +69 -0
  212. data/lib/openstudio-standards/standards/ashrae_90_1_prm/userdata_json/userdata_wateruse_equipment_definition.json +37 -0
  213. data/lib/openstudio-standards/standards/cbes/cbes_pre_1978/data/cbes_pre_1978.ext_ltg.json +5 -5
  214. data/lib/openstudio-standards/standards/cbes/cbes_t24_1978/data/cbes_t24_1978.ext_ltg.json +5 -5
  215. data/lib/openstudio-standards/standards/cbes/cbes_t24_1992/data/cbes_t24_1992.ext_ltg.json +5 -5
  216. data/lib/openstudio-standards/standards/cbes/cbes_t24_2001/data/cbes_t24_2001.ext_ltg.json +5 -5
  217. data/lib/openstudio-standards/standards/cbes/cbes_t24_2005/data/cbes_t24_2005.ext_ltg.json +5 -5
  218. data/lib/openstudio-standards/standards/cbes/cbes_t24_2008/data/cbes_t24_2008.ext_ltg.json +5 -5
  219. data/lib/openstudio-standards/standards/deer/deer_1985/comstock_deer_1985/data/comstock_deer_1985.ext_ltg.json +5 -5
  220. data/lib/openstudio-standards/standards/deer/deer_1985/data/deer_1985.ext_ltg.json +5 -5
  221. data/lib/openstudio-standards/standards/deer/deer_1996/comstock_deer_1996/data/comstock_deer_1996.ext_ltg.json +5 -5
  222. data/lib/openstudio-standards/standards/deer/deer_1996/data/deer_1996.ext_ltg.json +5 -5
  223. data/lib/openstudio-standards/standards/deer/deer_2003/comstock_deer_2003/data/comstock_deer_2003.ext_ltg.json +5 -5
  224. data/lib/openstudio-standards/standards/deer/deer_2003/data/deer_2003.ext_ltg.json +5 -5
  225. data/lib/openstudio-standards/standards/deer/deer_2007/comstock_deer_2007/data/comstock_deer_2007.ext_ltg.json +5 -5
  226. data/lib/openstudio-standards/standards/deer/deer_2007/data/deer_2007.ext_ltg.json +5 -5
  227. data/lib/openstudio-standards/standards/deer/deer_2011/comstock_deer_2011/data/comstock_deer_2011.ext_ltg.json +5 -5
  228. data/lib/openstudio-standards/standards/deer/deer_2011/data/deer_2011.ext_ltg.json +5 -5
  229. data/lib/openstudio-standards/standards/deer/deer_2014/comstock_deer_2014/data/comstock_deer_2014.ext_ltg.json +5 -5
  230. data/lib/openstudio-standards/standards/deer/deer_2014/data/deer_2014.ext_ltg.json +5 -5
  231. data/lib/openstudio-standards/standards/deer/deer_2015/comstock_deer_2015/data/comstock_deer_2015.ext_ltg.json +5 -5
  232. data/lib/openstudio-standards/standards/deer/deer_2015/data/deer_2015.ext_ltg.json +5 -5
  233. data/lib/openstudio-standards/standards/deer/deer_2017/comstock_deer_2017/data/comstock_deer_2017.ext_ltg.json +5 -5
  234. data/lib/openstudio-standards/standards/deer/deer_2017/data/deer_2017.ext_ltg.json +5 -5
  235. data/lib/openstudio-standards/standards/deer/deer_2020/comstock_deer_2020/data/comstock_deer_2020.ext_ltg.json +5 -5
  236. data/lib/openstudio-standards/standards/deer/deer_2020/data/deer_2020.ext_ltg.json +5 -5
  237. data/lib/openstudio-standards/standards/deer/deer_2025/comstock_deer_2025/data/comstock_deer_2025.ext_ltg.json +5 -5
  238. data/lib/openstudio-standards/standards/deer/deer_2025/data/deer_2025.ext_ltg.json +5 -5
  239. data/lib/openstudio-standards/standards/deer/deer_2030/comstock_deer_2030/data/comstock_deer_2030.ext_ltg.json +5 -5
  240. data/lib/openstudio-standards/standards/deer/deer_2030/data/deer_2030.ext_ltg.json +5 -5
  241. data/lib/openstudio-standards/standards/deer/deer_2035/comstock_deer_2035/data/comstock_deer_2035.ext_ltg.json +5 -5
  242. data/lib/openstudio-standards/standards/deer/deer_2035/data/deer_2035.ext_ltg.json +5 -5
  243. data/lib/openstudio-standards/standards/deer/deer_2040/comstock_deer_2040/data/comstock_deer_2040.ext_ltg.json +5 -5
  244. data/lib/openstudio-standards/standards/deer/deer_2040/data/deer_2040.ext_ltg.json +5 -5
  245. data/lib/openstudio-standards/standards/deer/deer_2045/comstock_deer_2045/data/comstock_deer_2045.ext_ltg.json +5 -5
  246. data/lib/openstudio-standards/standards/deer/deer_2045/data/deer_2045.ext_ltg.json +5 -5
  247. data/lib/openstudio-standards/standards/deer/deer_2050/comstock_deer_2050/data/comstock_deer_2050.ext_ltg.json +5 -5
  248. data/lib/openstudio-standards/standards/deer/deer_2050/data/deer_2050.ext_ltg.json +5 -5
  249. data/lib/openstudio-standards/standards/deer/deer_2055/comstock_deer_2055/data/comstock_deer_2055.ext_ltg.json +5 -5
  250. data/lib/openstudio-standards/standards/deer/deer_2055/data/deer_2055.ext_ltg.json +5 -5
  251. data/lib/openstudio-standards/standards/deer/deer_2060/comstock_deer_2060/data/comstock_deer_2060.ext_ltg.json +5 -5
  252. data/lib/openstudio-standards/standards/deer/deer_2060/data/deer_2060.ext_ltg.json +5 -5
  253. data/lib/openstudio-standards/standards/deer/deer_2065/comstock_deer_2065/data/comstock_deer_2065.ext_ltg.json +5 -5
  254. data/lib/openstudio-standards/standards/deer/deer_2065/data/deer_2065.ext_ltg.json +5 -5
  255. data/lib/openstudio-standards/standards/deer/deer_2070/comstock_deer_2070/data/comstock_deer_2070.ext_ltg.json +5 -5
  256. data/lib/openstudio-standards/standards/deer/deer_2070/data/deer_2070.ext_ltg.json +5 -5
  257. data/lib/openstudio-standards/standards/deer/deer_2075/comstock_deer_2075/data/comstock_deer_2075.ext_ltg.json +5 -5
  258. data/lib/openstudio-standards/standards/deer/deer_2075/data/deer_2075.ext_ltg.json +5 -5
  259. data/lib/openstudio-standards/standards/deer/deer_pre_1975/comstock_deer_pre_1975/data/comstock_deer_pre_1975.ext_ltg.json +5 -5
  260. data/lib/openstudio-standards/standards/deer/deer_pre_1975/data/deer_pre_1975.ext_ltg.json +5 -5
  261. data/lib/openstudio-standards/standards/necb/BTAPPRE1980/btap_pre1980.rb +10 -1
  262. data/lib/openstudio-standards/standards/necb/BTAPPRE1980/data/unitary_acs.json +20 -20
  263. data/lib/openstudio-standards/standards/necb/ECMS/hvac_systems.rb +379 -27
  264. data/lib/openstudio-standards/standards/necb/NECB2011/autozone.rb +1 -4
  265. data/lib/openstudio-standards/standards/necb/NECB2011/beps_compliance_path.rb +0 -1
  266. data/lib/openstudio-standards/standards/necb/NECB2011/data/fuel_type_sets.json +1 -1
  267. data/lib/openstudio-standards/standards/necb/NECB2011/data/unitary_acs.json +20 -20
  268. data/lib/openstudio-standards/standards/necb/NECB2011/hvac_systems.rb +34 -22
  269. data/lib/openstudio-standards/standards/necb/NECB2011/necb_2011.rb +76 -23
  270. data/lib/openstudio-standards/standards/necb/NECB2011/necb_shw_calculation.xlsx +0 -0
  271. data/lib/openstudio-standards/standards/necb/NECB2011/service_water_heating.rb +4 -5
  272. data/lib/openstudio-standards/standards/necb/NECB2011/system_fuels.rb +6 -2
  273. data/lib/openstudio-standards/standards/necb/NECB2015/data/unitary_acs.json +26 -24
  274. data/lib/openstudio-standards/standards/necb/NECB2015/hvac_systems.rb +2 -1
  275. data/lib/openstudio-standards/standards/necb/NECB2020/data/unitary_acs.json +38 -32
  276. data/lib/openstudio-standards/standards/necb/common/btap_data.rb +215 -18
  277. data/lib/openstudio-standards/standards/necb/common/btap_datapoint.rb +190 -15
  278. data/lib/openstudio-standards/standards/necb/common/national_carbon_price_sched_feb_2025.json +60 -0
  279. data/lib/openstudio-standards/standards/necb/common/utility_pricing_2025-02-20.csv +92 -0
  280. data/lib/openstudio-standards/utilities/ruleset_check.rb +204 -0
  281. data/lib/openstudio-standards/version.rb +1 -1
  282. data/lib/openstudio-standards/weather/information.rb +1 -1
  283. data/lib/openstudio-standards.rb +32 -12
  284. metadata +78 -80
  285. data/lib/openstudio-standards/prototypes/ashrae_90_1/doe_ref_1980_2004/doe_ref_1980_2004.refrigeration.rb +0 -13
  286. data/lib/openstudio-standards/prototypes/ashrae_90_1/doe_ref_pre_1980/doe_ref_pre_1980.refrigeration.rb +0 -13
  287. data/lib/openstudio-standards/prototypes/cbes/cbes.refrigeration.rb +0 -13
  288. data/lib/openstudio-standards/prototypes/common/objects/Prototype.Model.exterior_lights.rb +0 -432
  289. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2004/ashrae_90_1_2004.Space.rb +0 -11
  290. 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 +0 -169
  291. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2004/comstock_ashrae_90_1_2004/data/comstock_ashrae_90_1_2004.ref_cases.json +0 -1456
  292. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2004/comstock_ashrae_90_1_2004/data/comstock_ashrae_90_1_2004.ref_lnup.json +0 -562
  293. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2004/comstock_ashrae_90_1_2004/data/comstock_ashrae_90_1_2004.spc_typ.json +0 -20804
  294. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2007/ashrae_90_1_2007.Space.rb +0 -11
  295. 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 +0 -169
  296. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2007/comstock_ashrae_90_1_2007/data/comstock_ashrae_90_1_2007.ref_cases.json +0 -1456
  297. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2007/comstock_ashrae_90_1_2007/data/comstock_ashrae_90_1_2007.ref_lnup.json +0 -562
  298. 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 +0 -169
  299. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2010/comstock_ashrae_90_1_2010/data/comstock_ashrae_90_1_2010.ref_cases.json +0 -1456
  300. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2010/comstock_ashrae_90_1_2010/data/comstock_ashrae_90_1_2010.ref_lnup.json +0 -562
  301. 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 +0 -169
  302. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2013/comstock_ashrae_90_1_2013/data/comstock_ashrae_90_1_2013.ref_cases.json +0 -1456
  303. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2013/comstock_ashrae_90_1_2013/data/comstock_ashrae_90_1_2013.ref_lnup.json +0 -562
  304. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2016/comstock_ashrae_90_1_2016/data/comstock_ashrae_90_1_2016.ext_ltg.json +0 -169
  305. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2016/comstock_ashrae_90_1_2016/data/comstock_ashrae_90_1_2016.ref_cases.json +0 -763
  306. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2016/comstock_ashrae_90_1_2016/data/comstock_ashrae_90_1_2016.ref_lnup.json +0 -562
  307. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2019/comstock_ashrae_90_1_2019/data/comstock_ashrae_90_1_2019.ext_ltg.json +0 -169
  308. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2019/comstock_ashrae_90_1_2019/data/comstock_ashrae_90_1_2019.ref_cases.json +0 -763
  309. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2019/comstock_ashrae_90_1_2019/data/comstock_ashrae_90_1_2019.ref_lnup.json +0 -562
  310. 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 +0 -169
  311. data/lib/openstudio-standards/standards/ashrae_90_1/doe_ref_1980_2004/comstock_doe_ref_1980_2004/data/comstock_doe_ref_1980_2004.ref_cases.json +0 -1456
  312. data/lib/openstudio-standards/standards/ashrae_90_1/doe_ref_1980_2004/comstock_doe_ref_1980_2004/data/comstock_doe_ref_1980_2004.ref_lnup.json +0 -562
  313. 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 +0 -169
  314. data/lib/openstudio-standards/standards/ashrae_90_1/doe_ref_pre_1980/comstock_doe_ref_pre_1980/data/comstock_doe_ref_pre_1980.ref_cases.json +0 -1456
  315. data/lib/openstudio-standards/standards/ashrae_90_1/doe_ref_pre_1980/comstock_doe_ref_pre_1980/data/comstock_doe_ref_pre_1980.ref_lnup.json +0 -562
  316. data/lib/openstudio-standards/standards/ashrae_90_1_prm/ashrae_90_1_prm_2019/data/ashrae_90_1_prm_2019.prm_economizers.json +0 -213
  317. data/lib/openstudio-standards/standards/cbes/cbes.Space.rb +0 -11
  318. data/lib/openstudio-standards/standards/cbes/cbes_t24_2005/cbes_t24_2005.Space.rb +0 -11
  319. data/lib/openstudio-standards/standards/cbes/cbes_t24_2008/cbes_t24_2008.Space.rb +0 -11
  320. data/lib/openstudio-standards/standards/deer/deer.Space.rb +0 -20
  321. data/lib/openstudio-standards/standards/deer/deer_1985/data/deer_1985.ref_cases.json +0 -1456
  322. data/lib/openstudio-standards/standards/deer/deer_1985/data/deer_1985.ref_lnup.json +0 -562
  323. data/lib/openstudio-standards/standards/deer/deer_1996/data/deer_1996.ref_cases.json +0 -1456
  324. data/lib/openstudio-standards/standards/deer/deer_1996/data/deer_1996.ref_lnup.json +0 -562
  325. data/lib/openstudio-standards/standards/deer/deer_2003/data/deer_2003.ref_cases.json +0 -1456
  326. data/lib/openstudio-standards/standards/deer/deer_2003/data/deer_2003.ref_lnup.json +0 -562
  327. data/lib/openstudio-standards/standards/deer/deer_2007/data/deer_2007.ref_cases.json +0 -1456
  328. data/lib/openstudio-standards/standards/deer/deer_2007/data/deer_2007.ref_lnup.json +0 -562
  329. data/lib/openstudio-standards/standards/deer/deer_2011/data/deer_2011.ref_cases.json +0 -1456
  330. data/lib/openstudio-standards/standards/deer/deer_2011/data/deer_2011.ref_lnup.json +0 -562
  331. data/lib/openstudio-standards/standards/deer/deer_2014/data/deer_2014.ref_cases.json +0 -1456
  332. data/lib/openstudio-standards/standards/deer/deer_2014/data/deer_2014.ref_lnup.json +0 -562
  333. data/lib/openstudio-standards/standards/deer/deer_2015/data/deer_2015.ref_cases.json +0 -1456
  334. data/lib/openstudio-standards/standards/deer/deer_2015/data/deer_2015.ref_lnup.json +0 -562
  335. data/lib/openstudio-standards/standards/deer/deer_2017/data/deer_2017.ref_cases.json +0 -1456
  336. data/lib/openstudio-standards/standards/deer/deer_2017/data/deer_2017.ref_lnup.json +0 -562
  337. data/lib/openstudio-standards/standards/deer/deer_2020/data/deer_2020.ref_cases.json +0 -1456
  338. data/lib/openstudio-standards/standards/deer/deer_2020/data/deer_2020.ref_lnup.json +0 -562
  339. data/lib/openstudio-standards/standards/deer/deer_2025/data/deer_2025.ref_cases.json +0 -1456
  340. data/lib/openstudio-standards/standards/deer/deer_2025/data/deer_2025.ref_lnup.json +0 -562
  341. data/lib/openstudio-standards/standards/deer/deer_2030/data/deer_2030.ref_cases.json +0 -1456
  342. data/lib/openstudio-standards/standards/deer/deer_2030/data/deer_2030.ref_lnup.json +0 -562
  343. data/lib/openstudio-standards/standards/deer/deer_2035/data/deer_2035.ref_cases.json +0 -1456
  344. data/lib/openstudio-standards/standards/deer/deer_2035/data/deer_2035.ref_lnup.json +0 -562
  345. data/lib/openstudio-standards/standards/deer/deer_2040/data/deer_2040.ref_cases.json +0 -1456
  346. data/lib/openstudio-standards/standards/deer/deer_2040/data/deer_2040.ref_lnup.json +0 -562
  347. data/lib/openstudio-standards/standards/deer/deer_2045/data/deer_2045.ref_cases.json +0 -1456
  348. data/lib/openstudio-standards/standards/deer/deer_2045/data/deer_2045.ref_lnup.json +0 -562
  349. data/lib/openstudio-standards/standards/deer/deer_2050/data/deer_2050.ref_cases.json +0 -1456
  350. data/lib/openstudio-standards/standards/deer/deer_2050/data/deer_2050.ref_lnup.json +0 -562
  351. data/lib/openstudio-standards/standards/deer/deer_2055/data/deer_2055.ref_cases.json +0 -1456
  352. data/lib/openstudio-standards/standards/deer/deer_2055/data/deer_2055.ref_lnup.json +0 -562
  353. data/lib/openstudio-standards/standards/deer/deer_2060/data/deer_2060.ref_cases.json +0 -1456
  354. data/lib/openstudio-standards/standards/deer/deer_2060/data/deer_2060.ref_lnup.json +0 -562
  355. data/lib/openstudio-standards/standards/deer/deer_2065/data/deer_2065.ref_cases.json +0 -1456
  356. data/lib/openstudio-standards/standards/deer/deer_2065/data/deer_2065.ref_lnup.json +0 -562
  357. data/lib/openstudio-standards/standards/deer/deer_2070/data/deer_2070.ref_cases.json +0 -1456
  358. data/lib/openstudio-standards/standards/deer/deer_2070/data/deer_2070.ref_lnup.json +0 -562
  359. data/lib/openstudio-standards/standards/deer/deer_2075/data/deer_2075.ref_cases.json +0 -1456
  360. data/lib/openstudio-standards/standards/deer/deer_2075/data/deer_2075.ref_lnup.json +0 -562
  361. data/lib/openstudio-standards/standards/deer/deer_pre_1975/data/deer_pre_1975.ref_cases.json +0 -1456
  362. data/lib/openstudio-standards/standards/deer/deer_pre_1975/data/deer_pre_1975.ref_lnup.json +0 -562
@@ -388,472 +388,6 @@ class Standard
388
388
  return compressor
389
389
  end
390
390
 
391
- # Find the thermal zone that is best for adding refrigerated display cases into.
392
- # First, check for space types that typically have refrigeration.
393
- # Fall back to largest zone in the model if no typical space types are found.
394
- #
395
- # @param model [OpenStudio::Model::Model] OpenStudio model object
396
- # @return [OpenStudio::Model::ThermalZone] returns a thermal zone if found, nil if not.
397
- def model_typical_display_case_zone(model)
398
- # Ideally, look for one of the space types
399
- # that would typically have refrigeration.
400
- display_case_zone = nil
401
- display_case_zone_area_m2 = 0
402
- model.getThermalZones.each do |zone|
403
- space_type = OpenstudioStandards::ThermalZone.thermal_zone_get_space_type(zone)
404
- next if space_type.empty?
405
-
406
- space_type = space_type.get
407
- next if space_type.standardsSpaceType.empty?
408
- next if space_type.standardsBuildingType.empty?
409
-
410
- stds_spc_type = space_type.standardsSpaceType.get
411
- stds_bldg_type = space_type.standardsBuildingType.get
412
- case "#{stds_bldg_type} #{stds_spc_type}"
413
- when 'PrimarySchool Kitchen',
414
- 'SecondarySchool Kitchen',
415
- 'SuperMarket Sales',
416
- 'QuickServiceRestaurant Kitchen',
417
- 'FullServiceRestaurant Kitchen',
418
- 'LargeHotel Kitchen',
419
- 'Hospital Kitchen',
420
- 'EPr Kitchen',
421
- 'ESe Kitchen',
422
- 'Gro GrocSales',
423
- 'RFF StockRoom',
424
- 'RSD StockRoom',
425
- 'Htl Kitchen',
426
- 'Hsp Kitchen'
427
- if zone.floorArea > display_case_zone_area_m2
428
- display_case_zone = zone
429
- display_case_zone_area_m2 = zone.floorArea
430
- end
431
- end
432
- end
433
-
434
- unless display_case_zone.nil?
435
- OpenStudio.logFree(OpenStudio::Info, 'openstudio.model.Model', "Display case zone is #{display_case_zone.name}, the largest zone with a space type typical for display cases.")
436
- return display_case_zone
437
- end
438
-
439
- # If no typical space type was found,
440
- # choose the largest zone in the model.
441
- display_case_zone = nil
442
- display_case_zone_area_m2 = 0
443
- model.getThermalZones.each do |zone|
444
- if zone.floorArea > display_case_zone_area_m2
445
- display_case_zone = zone
446
- display_case_zone_area_m2 = zone.floorArea
447
- end
448
- end
449
-
450
- unless display_case_zone.nil?
451
- OpenStudio.logFree(OpenStudio::Info, 'openstudio.model.Model', "No space types typical for display cases were found, so the display cases will be placed in #{display_case_zone.name}, the largest zone.")
452
- return display_case_zone
453
- end
454
-
455
- return display_case_zone
456
- end
457
-
458
- # Find the thermal zone that is best for adding refrigerated walkins into.
459
- # First, check for space types that typically have refrigeration.
460
- # Fall back to largest zone in the model if no typical space types are found.
461
- #
462
- # @param model [OpenStudio::Model::Model] OpenStudio model object
463
- # @return [OpenStudio::Model::ThermalZone] returns a thermal zone if found, nil if not.
464
- def model_typical_walkin_zone(model)
465
- # Ideally, look for one of the space types
466
- # that would typically have refrigeration walkins.
467
- walkin_zone = nil
468
- walkin_zone_area_m2 = 0
469
- model.getThermalZones.each do |zone|
470
- space_type = OpenstudioStandards::ThermalZone.thermal_zone_get_space_type(zone)
471
- next if space_type.empty?
472
-
473
- space_type = space_type.get
474
- next if space_type.standardsSpaceType.empty?
475
- next if space_type.standardsBuildingType.empty?
476
-
477
- stds_spc_type = space_type.standardsSpaceType.get
478
- stds_bldg_type = space_type.standardsBuildingType.get
479
- case "#{stds_bldg_type} #{stds_spc_type}"
480
- when 'PrimarySchool Kitchen',
481
- 'SecondarySchool Kitchen',
482
- 'SuperMarket DryStorage',
483
- 'QuickServiceRestaurant Kitchen',
484
- 'FullServiceRestaurant Kitchen',
485
- 'LargeHotel Kitchen',
486
- 'Hospital Kitchen',
487
- 'EPr Kitchen',
488
- 'ESe Kitchen',
489
- 'Gro RefWalkInCool',
490
- 'Gro RefWalkInFreeze',
491
- 'RFF StockRoom',
492
- 'RSD StockRoom',
493
- 'Htl Kitchen',
494
- 'Hsp Kitchen'
495
- if zone.floorArea > walkin_zone_area_m2
496
- walkin_zone = zone
497
- walkin_zone_area_m2 = zone.floorArea
498
- end
499
- end
500
- end
501
-
502
- unless walkin_zone.nil?
503
- OpenStudio.logFree(OpenStudio::Info, 'openstudio.model.Model', "Walkin zone is #{walkin_zone.name}, the largest zone with a space type typical for walkins.")
504
- return walkin_zone
505
- end
506
-
507
- # If no typical space type was found,
508
- # choose the largest zone in the model.
509
- walkin_zone = nil
510
- walkin_zone_area_m2 = 0
511
- model.getThermalZones.each do |zone|
512
- if zone.floorArea > walkin_zone_area_m2
513
- walkin_zone = zone
514
- walkin_zone_area_m2 = zone.floorArea
515
- end
516
- end
517
-
518
- unless walkin_zone.nil?
519
- OpenStudio.logFree(OpenStudio::Info, 'openstudio.model.Model', "No space types typical for walkins were found, so the walkins will be placed in #{walkin_zone.name}, the largest zone.")
520
- return walkin_zone
521
- end
522
-
523
- return walkin_zone
524
- end
525
-
526
- # Add a typical refrigeration system to the model, including cases, walkins,
527
- # compressors, and condensors. For small stores, each case and walkin is served
528
- # by one compressor and one condenser. For larger stores, all medium temp cases and walkins
529
- # are served by one multi-compressor rack, and all low temp cases and walkins another.
530
- #
531
- # @param model [OpenStudio::Model::Model] OpenStudio model object
532
- # @param building_type [String] building type
533
- # @return [Boolean] returns true if successful, false if not
534
- def model_add_typical_refrigeration(model, building_type)
535
- # Define system category and scaling factor
536
- floor_area_ft2 = OpenStudio.convert(model.getBuilding.floorArea, 'm^2', 'ft^2').get
537
- case building_type
538
- when 'SuperMarket', 'Gro'
539
- if floor_area_ft2 < 35_000 # this is in m2
540
- size_category = '<35k ft2'
541
- floor_area_scaling_factor = floor_area_ft2 / 35_000
542
- elsif floor_area_ft2 < 50_000
543
- size_category = '35k - 50k ft2'
544
- floor_area_scaling_factor = floor_area_ft2 / 50_000
545
- else
546
- size_category = '>50k ft2'
547
- floor_area_scaling_factor = floor_area_ft2 / 50_000
548
- end
549
- OpenStudio.logFree(OpenStudio::Info, 'openstudio.Model.Model', "Refrigeration size category is #{size_category}, with a scaling factor of #{floor_area_scaling_factor} because the floor area is #{floor_area_ft2.round} ft2. All cases and walkins added later will subsequently be scaled by this factor.")
550
- else
551
- size_category = 'Kitchen'
552
- floor_area_scaling_factor = 1 # Do not scale kitchen systems
553
- end
554
-
555
- # Add a low and medium temperature system
556
- ['Medium Temperature', 'Low Temperature'].each do |system_type|
557
- # Find refrigeration system lineup
558
- search_criteria = {
559
- 'template' => template,
560
- 'building_type' => building_type,
561
- 'size_category' => size_category,
562
- 'system_type' => system_type
563
- }
564
- props_lineup = model_find_object(standards_data['refrigeration_system_lineup'], search_criteria)
565
- if props_lineup.nil?
566
- OpenStudio.logFree(OpenStudio::Warn, 'openstudio.Model.Model', "No refrigeration system lineup found for #{search_criteria}, no system will be added.")
567
- next
568
- end
569
- number_of_display_cases = props_lineup['number_of_display_cases']
570
- number_of_walkins = props_lineup['number_of_walkins']
571
- compressor_name = props_lineup['compressor_name']
572
- OpenStudio.logFree(OpenStudio::Info, 'openstudio.Model.Model', "Refrigeration system lineup found for #{search_criteria}: #{number_of_display_cases} display cases and #{number_of_walkins} walkins, with compressor '#{compressor_name}'.")
573
-
574
- # Find the thermal zones most suited for holding the display cases
575
- thermal_zone_case = nil
576
- if number_of_display_cases > 0
577
- thermal_zone_case = model_typical_display_case_zone(model)
578
- if thermal_zone_case.nil?
579
- OpenStudio.logFree(OpenStudio::Error, 'openstudio.model.Model', "Attempted to add #{number_of_display_cases} display cases to the model, but could find no thermal zone to put them into.")
580
- return false
581
- end
582
- end
583
-
584
- # Add display cases
585
- display_cases = []
586
- (1..number_of_display_cases).each_with_index do |display_case_number, def_start_hr_iterator|
587
- case_type = props_lineup["case_type_#{display_case_number}"]
588
-
589
- # Add the basic case
590
- ref_case = model_add_refrigeration_case(model, thermal_zone_case, case_type, size_category)
591
- return false if ref_case.nil?
592
-
593
- # Scale based on floor area
594
- ref_case.setCaseLength(ref_case.caseLength * floor_area_scaling_factor)
595
-
596
- # Find defrost and dripdown properties
597
- search_criteria = {
598
- 'template' => template,
599
- 'case_type' => case_type,
600
- 'size_category' => size_category
601
- }
602
- props_case = model_find_object(standards_data['refrigerated_cases'], search_criteria)
603
- if props_case.nil?
604
- OpenStudio.logFree(OpenStudio::Error, 'openstudio.Model.Model', "Could not find refrigerated case properties for: #{search_criteria}.")
605
- next
606
- end
607
- numb_defrosts_per_day = props_case['defrost_per_day']
608
- minutes_defrost = props_case['minutes_defrost']
609
- minutes_dripdown = props_case['minutes_dripdown']
610
- minutes_defrost = 59 if minutes_defrost > 59 # Just to make sure to remain in the same hour
611
- minutes_dripdown = 59 if minutes_dripdown > 59 # Just to make sure to remain in the same hour
612
-
613
- # Add defrost and dripdown schedules
614
- defrost_sch = OpenStudio::Model::ScheduleRuleset.new(model)
615
- defrost_sch.setName("#{ref_case.name} Defrost")
616
- defrost_sch.defaultDaySchedule.setName("#{ref_case.name} Defrost Default")
617
- dripdown_sch = OpenStudio::Model::ScheduleRuleset.new(model)
618
- dripdown_sch.setName("#{ref_case.name} Dripdown")
619
- dripdown_sch.defaultDaySchedule.setName("#{ref_case.name} Dripdown Default")
620
-
621
- # Stagger the defrosts for cases by 1 hr
622
- interval_defrost = (24 / numb_defrosts_per_day).floor # Hour interval between each defrost period
623
- if (def_start_hr_iterator + (interval_defrost * numb_defrosts_per_day)) > 23
624
- first_def_start_hr = 0 # Start over again at midnight when time reaches 23hrs
625
- else
626
- first_def_start_hr = def_start_hr_iterator
627
- end
628
-
629
- # Add the specified number of defrost periods to the daily schedule
630
- (1..numb_defrosts_per_day).each do |defrost_of_day|
631
- def_start_hr = first_def_start_hr + ((1 - defrost_of_day) * interval_defrost)
632
- defrost_sch.defaultDaySchedule.addValue(OpenStudio::Time.new(0, def_start_hr, 0, 0), 0)
633
- defrost_sch.defaultDaySchedule.addValue(OpenStudio::Time.new(0, def_start_hr, minutes_defrost.to_int, 0), 1)
634
- dripdown_sch.defaultDaySchedule.addValue(OpenStudio::Time.new(0, def_start_hr, 0, 0), 0) # Dripdown is synced with defrost
635
- dripdown_sch.defaultDaySchedule.addValue(OpenStudio::Time.new(0, def_start_hr, minutes_dripdown.to_int, 0), 1)
636
- end
637
- defrost_sch.defaultDaySchedule.addValue(OpenStudio::Time.new(0, 24, 0, 0), 0)
638
- dripdown_sch.defaultDaySchedule.addValue(OpenStudio::Time.new(0, 24, 0, 0), 0)
639
-
640
- # Assign the defrost and dripdown schedules
641
- ref_case.setCaseDefrostSchedule(defrost_sch)
642
- ref_case.setCaseDefrostDripDownSchedule(dripdown_sch)
643
-
644
- display_cases << ref_case
645
- end
646
-
647
- # Find the thermal zones most suited for holding the walkins
648
- thermal_zone_walkin = nil
649
- if number_of_walkins > 0
650
- thermal_zone_walkin = model_typical_walkin_zone(model)
651
- if thermal_zone_walkin.nil?
652
- OpenStudio.logFree(OpenStudio::Error, 'openstudio.model.Model', "Attempted to add #{number_of_walkins} walkins to the model, but could find no thermal zone to put them into.")
653
- return false
654
- end
655
- end
656
-
657
- # Add walkin cases
658
- walkins = []
659
- (1..number_of_walkins).each_with_index do |walkin_number, def_start_hr_iterator|
660
- walkin_type = props_lineup["walkin_type_#{walkin_number}"]
661
-
662
- # Add the basic walkin
663
- ref_walkin = model_add_refrigeration_walkin(model, thermal_zone_walkin, size_category, walkin_type)
664
- return false if ref_walkin.nil?
665
-
666
- # Scale based on floor area
667
- ref_walkin.setRatedTotalLightingPower(ref_walkin.ratedTotalLightingPower * floor_area_scaling_factor)
668
- ref_walkin.setRatedCoolingCoilFanPower(ref_walkin.ratedCoolingCoilFanPower * floor_area_scaling_factor)
669
- ref_walkin.setDefrostPower(ref_walkin.defrostPower.get * floor_area_scaling_factor)
670
- ref_walkin.setRatedCoilCoolingCapacity(ref_walkin.ratedCoilCoolingCapacity * floor_area_scaling_factor)
671
- ref_walkin.setZoneBoundaryTotalInsulatedSurfaceAreaFacingZone(ref_walkin.zoneBoundaryTotalInsulatedSurfaceAreaFacingZone.get * floor_area_scaling_factor)
672
- ref_walkin.setInsulatedFloorSurfaceArea(ref_walkin.insulatedFloorSurfaceArea * floor_area_scaling_factor)
673
-
674
- # Check that walkin physically fits inside the thermal zone.
675
- # If not, remove the walkin and warn.
676
- walkin_floor_area_ft2 = OpenStudio.convert(ref_walkin.insulatedFloorSurfaceArea, 'm^2', 'ft^2').get.round
677
- walkin_zone_floor_area_ft2 = OpenStudio.convert(thermal_zone_walkin.floorArea, 'm^2', 'ft^2').get.round
678
- if walkin_floor_area_ft2 > walkin_zone_floor_area_ft2
679
- OpenStudio.logFree(OpenStudio::Warn, 'openstudio.Model.Model', "Walkin #{ref_walkin.name} has an area of #{walkin_floor_area_ft2} ft^2, which is larger than the #{walkin_zone_floor_area_ft2} ft^2 zone. Walkin will be kept in the model, but considered re-sizing the zone '#{thermal_zone_walkin.name}'.")
680
- end
681
-
682
- # Find defrost and dripdown properties
683
- search_criteria = {
684
- 'template' => template,
685
- 'walkin_type' => walkin_type,
686
- 'size_category' => size_category
687
- }
688
- props_walkin = model_find_object(standards_data['refrigeration_walkins'], search_criteria)
689
- if props_walkin.nil?
690
- OpenStudio.logFree(OpenStudio::Error, 'openstudio.Model.Model', "Could not find walkin properties for: #{search_criteria}.")
691
- next
692
- end
693
- numb_defrosts_per_day = props_walkin['defrost_per_day']
694
- minutes_defrost = props_walkin['minutes_defrost']
695
- minutes_dripdown = props_walkin['minutes_dripdown']
696
- minutes_defrost = 59 if minutes_defrost > 59 # Just to make sure to remain in the same hour
697
- minutes_dripdown = 59 if minutes_dripdown > 59 # Just to make sure to remain in the same hour
698
-
699
- # Add defrost and dripdown schedules
700
- defrost_sch_walkin = OpenStudio::Model::ScheduleRuleset.new(model)
701
- defrost_sch_walkin.setName("#{ref_walkin.name} Defrost")
702
- defrost_sch_walkin.defaultDaySchedule.setName("#{ref_walkin.name} Defrost Default")
703
- dripdown_sch_walkin = OpenStudio::Model::ScheduleRuleset.new(model)
704
- dripdown_sch_walkin.setName("#{ref_walkin.name} Dripdown")
705
- dripdown_sch_walkin.defaultDaySchedule.setName("#{ref_walkin.name} Dripdown Default")
706
-
707
- # Stagger the defrosts for cases by 1 hr
708
- interval_defrost = (24 / numb_defrosts_per_day).floor # Hour interval between each defrost period
709
- if (def_start_hr_iterator + (interval_defrost * numb_defrosts_per_day)) > 23
710
- first_def_start_hr = 0 # Start over again at midnight when time reaches 23hrs
711
- else
712
- first_def_start_hr = def_start_hr_iterator
713
- end
714
-
715
- # Add the specified number of defrost periods to the daily schedule
716
- (1..numb_defrosts_per_day).each do |defrost_of_day|
717
- def_start_hr = first_def_start_hr + ((1 - defrost_of_day) * interval_defrost)
718
- defrost_sch_walkin.defaultDaySchedule.addValue(OpenStudio::Time.new(0, def_start_hr, 0, 0), 0)
719
- defrost_sch_walkin.defaultDaySchedule.addValue(OpenStudio::Time.new(0, def_start_hr, minutes_defrost.to_int, 0), 1)
720
- dripdown_sch_walkin.defaultDaySchedule.addValue(OpenStudio::Time.new(0, def_start_hr, 0, 0), 0) # Dripdown is synced with defrost
721
- dripdown_sch_walkin.defaultDaySchedule.addValue(OpenStudio::Time.new(0, def_start_hr, minutes_dripdown.to_int, 0), 1)
722
- end
723
- defrost_sch_walkin.defaultDaySchedule.addValue(OpenStudio::Time.new(0, 24, 0, 0), 0)
724
- dripdown_sch_walkin.defaultDaySchedule.addValue(OpenStudio::Time.new(0, 24, 0, 0), 0)
725
-
726
- # Assign the defrost and dripdown schedules
727
- ref_walkin.setDefrostSchedule(defrost_sch_walkin)
728
- ref_walkin.setDefrostDripDownSchedule(dripdown_sch_walkin)
729
-
730
- walkins << ref_walkin
731
- end
732
-
733
- # Divide cases and walkins into one or more refrigeration systems depending on store type
734
- # For small stores and kitchens one system with one compressor and one condenser per case is employed.
735
- # For larger stores, multiple cases and walkins are served by a rack with multiple compressors.
736
- ref_system_lineups = []
737
- case system_type
738
- when '<35k ft2', 'Kitchen'
739
- # Put each case on its own system
740
- display_cases.each do |ref_case|
741
- ref_system_lineups << { 'ref_cases' => [ref_case], 'walkins' => [] }
742
- end
743
- # Put each walkin on its own system
744
- walkins.each do |walkin|
745
- ref_system_lineups << { 'ref_cases' => [], 'walkins' => [walkin] }
746
- end
747
- else
748
- # Put all cases and walkins on one system
749
- ref_system_lineups << { 'ref_cases' => display_cases, 'walkins' => walkins }
750
- end
751
-
752
- # Find refrigeration system properties
753
- search_criteria = {
754
- 'template' => template,
755
- 'building_type' => building_type,
756
- 'size_category' => size_category,
757
- 'system_type' => system_type
758
- }
759
- props_ref_system = model_find_object(standards_data['refrigeration_system'], search_criteria)
760
- if props_ref_system.nil?
761
- OpenStudio.logFree(OpenStudio::Error, 'openstudio.Model.Model', "Could not find refrigeration system properties for: #{search_criteria}.")
762
- next
763
- end
764
-
765
- # Add refrigeration systems
766
- ref_system_lineups.each do |ref_system_lineup|
767
- # Skip if no cases or walkins are attached to the system
768
- next if ref_system_lineup['ref_cases'].empty? && ref_system_lineup['walkins'].empty?
769
-
770
- # Add refrigeration system
771
- ref_system = OpenStudio::Model::RefrigerationSystem.new(model)
772
- ref_system.setName(system_type)
773
- ref_system.setRefrigerationSystemWorkingFluidType(props_ref_system['refrigerant'])
774
- ref_system.setSuctionTemperatureControlType(props_ref_system['refrigerant'])
775
-
776
- # Sum the capacity required by all cases and walkins
777
- # and attach the cases and walkins to the system.
778
- rated_case_capacity_w = 0
779
- ref_system_lineup['ref_cases'].each do |ref_case|
780
- rated_case_capacity_w += ref_case.ratedTotalCoolingCapacityperUnitLength * ref_case.caseLength
781
- ref_system.addCase(ref_case)
782
- end
783
- ref_system_lineup['walkins'].each do |walkin|
784
- rated_case_capacity_w += walkin.ratedCoilCoolingCapacity
785
- ref_system.addWalkin(walkin)
786
- end
787
-
788
- # Find the compressor properties
789
- search_criteria = {
790
- 'template' => template,
791
- 'compressor_name' => compressor_name
792
- }
793
- props_compressor = model_find_object(standards_data['refrigeration_compressors'], search_criteria)
794
- if props_compressor.nil?
795
- OpenStudio.logFree(OpenStudio::Error, 'openstudio.Model.Model', "Could not find refrigeration compressor properties for: #{search_criteria}.")
796
- next
797
- end
798
-
799
- # Calculate the number of compressors required to meet the
800
- # combined rated capacity of all the cases
801
- # and add them to the system
802
- rated_compressor_capacity_btu_per_hr = props_compressor['rated_capacity']
803
- number_of_compressors = (rated_case_capacity_w / OpenStudio.convert(rated_compressor_capacity_btu_per_hr, 'Btu/h', 'W').get).ceil
804
- (1..number_of_compressors).each do |compressor_number|
805
- compressor = model_add_refrigeration_compressor(model, compressor_name)
806
- ref_system.addCompressor(compressor)
807
- end
808
- OpenStudio.logFree(OpenStudio::Info, 'openstudio.Model.Model', "Added #{number_of_compressors} compressors, each with a capacity of #{rated_compressor_capacity_btu_per_hr.round} Btu/hr to serve #{OpenStudio.convert(rated_case_capacity_w, 'W', 'Btu/hr').get.round} Btu/hr of case and walkin load.")
809
-
810
- # Find the condenser properties
811
- search_criteria = {
812
- 'template' => template,
813
- 'building_type' => building_type,
814
- 'system_type' => system_type,
815
- 'size_category' => size_category
816
- }
817
- props_condenser = model_find_object(standards_data['refrigeration_condenser'], search_criteria)
818
- if props_condenser.nil?
819
- OpenStudio.logFree(OpenStudio::Error, 'openstudio.Model.Model', "Could not find refrigeration condenser properties for: #{search_criteria}.")
820
- next
821
- end
822
-
823
- # Heat rejection as a function of temperature
824
- heat_rejection_curve = OpenStudio::Model::CurveLinear.new(model)
825
- heat_rejection_curve.setName('Condenser Heat Rejection Function of Temperature')
826
- heat_rejection_curve.setCoefficient1Constant(0)
827
- heat_rejection_curve.setCoefficient2x(props_condenser['heatrejectioncurve_c1'])
828
- heat_rejection_curve.setMinimumValueofx(-50)
829
- heat_rejection_curve.setMaximumValueofx(50)
830
-
831
- # Add condenser
832
- condenser = OpenStudio::Model::RefrigerationCondenserAirCooled.new(model)
833
- condenser.setRatedEffectiveTotalHeatRejectionRateCurve(heat_rejection_curve)
834
- condenser.setRatedSubcoolingTemperatureDifference(OpenStudio.convert(props_condenser['subcool_t'], 'F', 'C').get)
835
- condenser.setMinimumFanAirFlowRatio(props_condenser['min_airflow'])
836
- condenser.setRatedFanPower(props_condenser['fan_power_per_q_rejected'].to_f * rated_case_capacity_w)
837
- condenser.setCondenserFanSpeedControlType(props_condenser['fan_speed_control'])
838
- ref_system.setRefrigerationCondenser(condenser)
839
-
840
- OpenStudio.logFree(OpenStudio::Info, 'openstudio.model.Model', "Added #{system_type} refrigeration system")
841
- end
842
- end
843
-
844
- return true
845
- end
846
-
847
- # Determine the latent case credit curve to use for walkins. Defaults to values after 90.1-2007.
848
- # @todo Should probably use the model_add_refrigeration_walkin and lookups from the spreadsheet instead of hard-coded values
849
- #
850
- # @param model [OpenStudio::Model::Model] OpenStudio model object
851
- # @return [Boolean] returns true if successful, false if not
852
- def model_walkin_freezer_latent_case_credit_curve(model)
853
- latent_case_credit_curve_name = 'Single Shelf Horizontal Latent Energy Multiplier_After2004'
854
- return latent_case_credit_curve_name
855
- end
856
-
857
391
  # Adds a full commercial refrigeration rack to the model, as would be found in a supermarket
858
392
  # @todo Move refrigeration compressors to spreadsheet
859
393
  #
@@ -321,7 +321,7 @@ class Standard
321
321
  return cop
322
322
  end
323
323
 
324
- # Convert from EER to COP
324
+ # Convert from EER to COP (no fan)
325
325
  # @ref [References::USDOEPrototypeBuildings] If capacity is not supplied, use DOE Prototype Building method.
326
326
  # @ref [References::ASHRAE9012013] If capacity is supplied, use the 90.1-2013 method
327
327
  #
@@ -345,7 +345,7 @@ class Standard
345
345
  return cop
346
346
  end
347
347
 
348
- # Convert from COP to EER
348
+ # Convert from COP (no fan) to EER
349
349
  # @ref [References::USDOEPrototypeBuildings]
350
350
  #
351
351
  # @param cop [Double] COP
@@ -367,6 +367,22 @@ class Standard
367
367
  return eer
368
368
  end
369
369
 
370
+ # Convert from IEER to COP (no fan)
371
+ #
372
+ # @note IEER is a weighted-average efficiency metrics at different load percentages, operataional and environemental conditions
373
+ # @note IEER should be modeled by using performance curves that match a targeted efficiency values
374
+ # @note This method estimates what a reasonable full load rated EER would be for a targeted IEER value
375
+ # @note The regression used in this method is based on a survey of over 1,000 rated AHRI units with IEER ranging from 11.8 to 25.6
376
+ # @todo Implement methods to handle IEER modeling
377
+ #
378
+ # @param ieer [Double] Energy Efficiency Ratio (EER)
379
+ # @return [Double] Coefficient of Performance (COP)
380
+ def ieer_to_cop_no_fan(ieer)
381
+ eer = 0.0183 * ieer * ieer - 0.4552 * ieer + 13.21
382
+
383
+ return eer_to_cop_no_fan(eer)
384
+ end
385
+
370
386
  # Convert from EER to COP
371
387
  #
372
388
  # @param eer [Double] Energy Efficiency Ratio (EER)
@@ -0,0 +1,125 @@
1
+ module OpenstudioStandards
2
+ # The Refrigeration module provides methods to create, modify, and get information about refrigeration
3
+ module Refrigeration
4
+ # @!group Create Case
5
+ # Methods to add refrigerated cases
6
+
7
+ # Adds a refrigerated case to the model.
8
+ #
9
+ # @param model [OpenStudio::Model::Model] OpenStudio model object
10
+ # @param template [String] Technology or standards level, either 'old', 'new', or 'advanced'
11
+ # @param case_type [String] The case type. See refrigeration_cases data for valid options under case_name.
12
+ # @param case_length [String] The case length in meters.
13
+ # @param thermal_zone [OpenStudio::Model::ThermalZone] Thermal zone with the case. If nil, will look up from the model.
14
+ # @return [OpenStudio::Model::RefrigerationCase] the refrigeration case
15
+ def self.create_case(model,
16
+ template: 'new',
17
+ case_type: 'Vertical Open - All',
18
+ case_length: nil,
19
+ thermal_zone: nil)
20
+ # get thermal zone if not provided
21
+ if thermal_zone.nil?
22
+ # Find the thermal zones most suited for holding the display cases
23
+ thermal_zone = OpenstudioStandards::Refrigeration.refrigeration_case_zone(model)
24
+ if thermal_zone.nil?
25
+ OpenStudio.logFree(OpenStudio::Error, 'openstudio.standards.Refrigeration', 'Attempted to add display cases to the model, but could find no thermal zone to put them into.')
26
+ return nil
27
+ end
28
+ end
29
+
30
+ # load refrigeration cases data
31
+ cases_csv = "#{__dir__}/data/refrigerated_cases.csv"
32
+ unless File.exist?(cases_csv)
33
+ OpenStudio.logFree(OpenStudio::Error, 'openstudio.standards.Refrigeration', "Unable to find file: #{cases_csv}")
34
+ return nil
35
+ end
36
+ cases_tbl = CSV.table(cases_csv, encoding: 'ISO8859-1:utf-8')
37
+ cases_hsh = cases_tbl.map(&:to_hash)
38
+
39
+ # get case properties
40
+ case_properties = cases_hsh.select { |r| (r[:template] == template) && (r[:case_name] == case_type) }[0]
41
+
42
+ if case_properties.nil?
43
+ OpenStudio.logFree(OpenStudio::Error, 'openstudio.standards.Refrigeration', "Unable to find case data for template #{template} case type #{case_type}.")
44
+ return nil
45
+ end
46
+
47
+ # add case
48
+ ref_case = OpenStudio::Model::RefrigerationCase.new(model, model.alwaysOnDiscreteSchedule)
49
+ ref_case.setName(case_type)
50
+ case_length_m = case_length.nil? ? case_properties[:unit_length] : case_length
51
+ ref_case.setCaseLength(case_length_m)
52
+ ref_case.setRatedTotalCoolingCapacityperUnitLength(case_properties[:rated_capacity])
53
+ ref_case.setCaseOperatingTemperature(case_properties[:case_operating_temperature])
54
+ ref_case.setDesignEvaporatorTemperatureorBrineInletTemperature(case_properties[:evaporator_temperature])
55
+ ref_case.setRatedLatentHeatRatio(case_properties[:rated_latent_heat_ratio])
56
+ ref_case.setRatedRuntimeFraction(case_properties[:rated_runtime_fraction])
57
+ ref_case.setLatentCaseCreditCurveType(case_properties[:latent_case_credit_curve_type])
58
+ # TODO: replace once curves are standardized
59
+ std = Standard.build('90.1-2013')
60
+ latent_case_credit_curve = std.model_add_curve(model, case_properties[:latent_case_credit_curve_name])
61
+ ref_case.setLatentCaseCreditCurve(latent_case_credit_curve)
62
+ ref_case.setStandardCaseFanPowerperUnitLength(case_properties[:fan_power])
63
+ ref_case.setOperatingCaseFanPowerperUnitLength(case_properties[:fan_power])
64
+ ref_case.setStandardCaseLightingPowerperUnitLength(case_properties[:lighting_power])
65
+ ref_case.setInstalledCaseLightingPowerperUnitLength(case_properties[:lighting_power])
66
+ ref_case.setCaseLightingSchedule(model.alwaysOnDiscreteSchedule)
67
+ ref_case.setFractionofLightingEnergytoCase(case_properties[:fraction_of_lighting_energy_to_case]) unless case_properties[:fraction_of_lighting_energy_to_case].nil?
68
+ ref_case.setCaseAntiSweatHeaterPowerperUnitLength(case_properties[:anti_sweat_power]) unless case_properties[:anti_sweat_power].nil?
69
+ ref_case.setMinimumAntiSweatHeaterPowerperUnitLength(0.0)
70
+ ref_case.setHumidityatZeroAntiSweatHeaterEnergy(0.0)
71
+ ref_case.setAntiSweatHeaterControlType(case_properties[:anti_sweat_heater_control_type])
72
+ ref_case.setFractionofAntiSweatHeaterEnergytoCase(case_properties[:fraction_of_anti_sweat_heater_energy_to_cases]) unless case_properties[:fraction_of_anti_sweat_heater_energy_to_cases].nil?
73
+ ref_case.setCaseDefrostPowerperUnitLength(case_properties[:defrost_power]) unless case_properties[:defrost_power].nil?
74
+ ref_case.setCaseDefrostType(case_properties[:defrost_type])
75
+ ref_case.setDefrostEnergyCorrectionCurveType(case_properties[:defrost_energy_correction_curve_type]) unless case_properties[:defrost_energy_correction_curve_type].nil?
76
+ unless case_properties[:defrost_energy_correction_curve_name].nil?
77
+ # TODO: replace once curves are standardized
78
+ defrost_correction_curve_name = std.model_add_curve(model, case_properties[:defrost_energy_correction_curve_name])
79
+ ref_case.setDefrostEnergyCorrectionCurve(defrost_correction_curve_name)
80
+ end
81
+ ref_case.setUnderCaseHVACReturnAirFraction(0.0)
82
+ ref_case.resetRefrigeratedCaseRestockingSchedule
83
+ ref_case.setAvailabilitySchedule(model.alwaysOnDiscreteSchedule)
84
+ ref_case.setThermalZone(thermal_zone)
85
+ ref_case.setRatedAmbientTemperature(OpenStudio.convert(75.0, 'F', 'C').get)
86
+
87
+ # place holders for schedules until data provided from ORNL
88
+ i = 0
89
+ # Defrost schedule
90
+ defrost_sch = OpenStudio::Model::ScheduleRuleset.new(model)
91
+ defrost_sch.setName("#{ref_case.name} Defrost")
92
+ defrost_sch.defaultDaySchedule.setName("#{ref_case.name} Defrost Default")
93
+ defrost_sch.defaultDaySchedule.addValue(OpenStudio::Time.new(0, i, 0, 0), 0)
94
+ defrost_sch.defaultDaySchedule.addValue(OpenStudio::Time.new(0, i, 59, 0), 1)
95
+ defrost_sch.defaultDaySchedule.addValue(OpenStudio::Time.new(0, 24, 0, 0), 0)
96
+
97
+ # Dripdown schedule
98
+ dripdown_sch = OpenStudio::Model::ScheduleRuleset.new(model)
99
+ dripdown_sch.setName("#{ref_case.name} Defrost")
100
+ dripdown_sch.defaultDaySchedule.setName("#{ref_case.name} Defrost Default")
101
+ dripdown_sch.defaultDaySchedule.addValue(OpenStudio::Time.new(0, i, 0, 0), 0)
102
+ dripdown_sch.defaultDaySchedule.addValue(OpenStudio::Time.new(0, i, 59, 0), 1)
103
+ dripdown_sch.defaultDaySchedule.addValue(OpenStudio::Time.new(0, 24, 0, 0), 0)
104
+
105
+ # Case Credit Schedule
106
+ case_credit_sch = OpenStudio::Model::ScheduleRuleset.new(model)
107
+ case_credit_sch.setName("#{ref_case.name} Case Credit")
108
+ case_credit_sch.defaultDaySchedule.setName("#{ref_case.name} Case Credit Default")
109
+ case_credit_sch.defaultDaySchedule.addValue(OpenStudio::Time.new(0, 7, 0, 0), 0.2)
110
+ case_credit_sch.defaultDaySchedule.addValue(OpenStudio::Time.new(0, 21, 0, 0), 0.4)
111
+ case_credit_sch.defaultDaySchedule.addValue(OpenStudio::Time.new(0, 24, 0, 0), 0.2)
112
+ ref_case.setCaseDefrostSchedule(defrost_sch)
113
+ ref_case.setCaseDefrostDripDownSchedule(dripdown_sch)
114
+ ref_case.setCaseCreditFractionSchedule(case_credit_sch)
115
+
116
+ # reporting
117
+ length_ft = OpenStudio.convert(ref_case.caseLength, 'm', 'ft').get
118
+ cooling_capacity_w = ref_case.caseLength * ref_case.ratedTotalCoolingCapacityperUnitLength
119
+ cooling_capacity_btu_per_hr = OpenStudio.convert(cooling_capacity_w, 'W', 'Btu/hr').get
120
+ OpenStudio.logFree(OpenStudio::Info, 'openstudio.standards.Refrigeration', "Added #{length_ft.round} ft display case called #{case_type} with a cooling capacity of #{cooling_capacity_btu_per_hr.round} Btu/hr to #{thermal_zone&.name}.")
121
+
122
+ return ref_case
123
+ end
124
+ end
125
+ end