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
@@ -0,0 +1,37 @@
1
+ {
2
+ "exterior_lighting": [
3
+ {
4
+ "lighting_zone": 3,
5
+ "exterior_lighting_zone_name": "All Other Areas",
6
+ "lighting_generation": "default",
7
+ "control_option": "AstronomicalClock",
8
+ "building_facade_and_landscape_automatic_shut_off": 1,
9
+ "occupancy_setback_reduction": null,
10
+ "base_site_allowance_power": 750.0,
11
+ "base_site_allowance_fraction": null,
12
+ "parking_areas_and_drives": 0.041,
13
+ "walkways_less_than_10ft_wide": 0.8,
14
+ "walkways_10ft_wide_or_greater": 0.16,
15
+ "stairways": 1.0,
16
+ "pedestrian_tunnels": 0.2,
17
+ "landscaping": 0.05,
18
+ "main_entries": 30.0,
19
+ "other_doors": 20.0,
20
+ "entry_canopies": 0.4,
21
+ "loading_docks": 0.5,
22
+ "sales_canopies": 0.8,
23
+ "outdoor_sales_open_areas": 0.5,
24
+ "outdoor_sales_street_frontage_for_vehicle_sales": 10.0,
25
+ "building_facades": 0.15,
26
+ "building_facades_alt_perim": 3.75,
27
+ "automated_teller_machines_per_location": 270.0,
28
+ "automated_teller_machines_per_machine": 90.0,
29
+ "entries_and_gates": 0.75,
30
+ "loading_areas_for_emergency_vehicles": 0.5,
31
+ "drive_through_windows_and_doors": 400.0,
32
+ "parking_near_24_hour_entrances": 800.0,
33
+ "roadway_parking": 0.0,
34
+ "notes": "Parking Areas and Drives lpd updated based on values derived from 2015 U.S. Lighting Market Characterization report."
35
+ }
36
+ ]
37
+ }
@@ -0,0 +1,202 @@
1
+ module OpenstudioStandards
2
+ # The Exterior Lighting module provides methods create, modify, and get information about model exterior lighting
3
+ module ExteriorLighting
4
+ # @!group Information
5
+
6
+ # get exterior lighting areas, distances, and counts
7
+ #
8
+ # @param model [OpenStudio::Model::Model] OpenStudio model object
9
+ # @return [Hash] hash of exterior lighting value types and building type and model specific values
10
+ def self.model_get_exterior_lighting_sizes(model)
11
+ # load parking file and convert to hash table
12
+ parking_csv = "#{__dir__}/data/parking.csv"
13
+ unless File.exist?(parking_csv)
14
+ OpenStudio.logFree(OpenStudio::Error, 'openstudio.standards.ExteriorLighting', "Unable to find file: #{parking_csv}")
15
+ return false
16
+ end
17
+ parking_tbl = CSV.table(parking_csv, encoding: 'ISO8859-1:utf-8')
18
+ parking_hsh = parking_tbl.map(&:to_hash)
19
+
20
+ # load entryways file and convert to hash table
21
+ entryways_csv = "#{__dir__}/data/entryways.csv"
22
+ unless File.exist?(entryways_csv)
23
+ OpenStudio.logFree(OpenStudio::Error, 'openstudio.standards.ExteriorLighting', "Unable to find file: #{entryways_csv}")
24
+ return false
25
+ end
26
+ entryways_tbl = CSV.table(entryways_csv, encoding: 'ISO8859-1:utf-8')
27
+ entryways_hsh = entryways_tbl.map(&:to_hash)
28
+
29
+ # get space properties from the model
30
+ space_type_hash = OpenstudioStandards::CreateTypical.model_get_space_type_information(model)
31
+
32
+ # populate building_type_hashes from space_type_hash
33
+ building_type_hashes = {}
34
+ space_type_hash.each do |space_type, hash|
35
+ # if space type standards building type already exists,
36
+ # add data to that standards building type in building_type_hashes
37
+ if building_type_hashes.key?(hash[:standards_building_type])
38
+ building_type_hashes[hash[:standards_building_type]][:effective_number_of_spaces] += hash[:effective_number_of_spaces]
39
+ building_type_hashes[hash[:standards_building_type]][:floor_area] += hash[:floor_area]
40
+ building_type_hashes[hash[:standards_building_type]][:number_of_people] += hash[:number_of_people]
41
+ building_type_hashes[hash[:standards_building_type]][:number_of_students] += hash[:number_of_students]
42
+ building_type_hashes[hash[:standards_building_type]][:number_of_units] += hash[:number_of_units]
43
+ building_type_hashes[hash[:standards_building_type]][:number_of_beds] += hash[:number_of_beds]
44
+ else
45
+ # initialize hash for this building type
46
+ building_type_hash = {}
47
+ building_type_hash[:effective_number_of_spaces] = hash[:effective_number_of_spaces]
48
+ building_type_hash[:floor_area] = hash[:floor_area]
49
+ building_type_hash[:number_of_people] = hash[:number_of_people]
50
+ building_type_hash[:number_of_students] = hash[:number_of_students]
51
+ building_type_hash[:number_of_units] = hash[:number_of_units]
52
+ building_type_hash[:number_of_beds] = hash[:number_of_beds]
53
+ building_type_hashes[hash[:standards_building_type]] = building_type_hash
54
+ end
55
+ end
56
+
57
+ # rename Office to SmallOffice, MediumOffice or LargeOffice depending on size
58
+ if building_type_hashes.key?('Office')
59
+ floor_area = building_type_hashes['Office'][:floor_area]
60
+ office_type = if floor_area < 2750
61
+ 'SmallOffice'
62
+ elsif floor_area < 25_250
63
+ 'MediumOffice'
64
+ else
65
+ 'LargeOffice'
66
+ end
67
+ building_type_hashes[office_type] = building_type_hashes.delete('Office')
68
+ end
69
+
70
+ # initialize parking areas and drives area variables
71
+ parking_area_and_drives_area = 0.0
72
+ main_entries = 0.0
73
+ other_doors = 0.0
74
+ rollup_doors = 0.0
75
+ drive_through_windows = 0.0
76
+ canopy_entry_area = 0.0
77
+ canopy_emergency_area = 0.0
78
+ ground_story_ext_wall_area = 0.0
79
+
80
+ # temporary std for model_effective_num_stories method
81
+ std = Standard.build('90.1-2013')
82
+
83
+ # calculate exterior lighting properties for each building type
84
+ building_type_hashes.each do |building_type, hash|
85
+ # calculate floor area and ground floor area in IP units
86
+ floor_area_ft2 = OpenStudio.convert(hash[:floor_area], 'm^2', 'ft^2').get
87
+ effective_num_stories = std.model_effective_num_stories(model)
88
+ ground_floor_area_ft2 = floor_area_ft2 / effective_num_stories[:above_grade]
89
+
90
+ # load parking area properties for standards building type
91
+ parking_properties = parking_hsh.select { |h| h[:building_type] == building_type }
92
+
93
+ if parking_properties.nil? || parking_properties.empty?
94
+ OpenStudio.logFree(OpenStudio::Warn, 'openstudio.prototype.ExteriorLighting', "Could not find parking data for #{building_type}. Will not add exterior parking lighting. The building type data needs to be added to the parking lighting data.")
95
+ return {}
96
+ end
97
+ parking_properties = parking_properties[0]
98
+
99
+ # calculate number of parking spots
100
+ num_spots = 0.0
101
+ if !parking_properties[:building_area_per_spot].nil?
102
+ num_spots += floor_area_ft2 / parking_properties[:building_area_per_spot].to_f
103
+ elsif !parking_properties[:units_per_spot].nil?
104
+ num_spots += hash[:number_of_units] / parking_properties[:units_per_spot].to_f
105
+ elsif !parking_properties[:students_per_spot].nil?
106
+ num_spots += hash[:number_of_students] / parking_properties[:students_per_spot].to_f
107
+ elsif !parking_properties[:beds_per_spot].nil?
108
+ num_spots += hash[:number_of_beds] / parking_properties[:beds_per_spot].to_f
109
+ end
110
+
111
+ # add to cumulative parking area
112
+ parking_area_and_drives_area += num_spots * parking_properties[:parking_area_per_spot]
113
+
114
+ # load entryways properties for standards building type
115
+ entryways_properties = entryways_hsh.select { |eh| eh[:building_type] == building_type }
116
+
117
+ if entryways_properties.nil? || entryways_properties.empty?
118
+ OpenStudio.logFree(OpenStudio::Error, 'openstudio.prototype.ExteriorLighting', "Could not find entryway data for #{building_type}.")
119
+ return {}
120
+ end
121
+ entryways_properties = entryways_properties[0]
122
+
123
+ # calculate door, window, and canopy length properties for exterior lighting
124
+ # main entries
125
+ unless entryways_properties[:entrance_doors_per_10000_ft2].nil?
126
+ main_entries += (ground_floor_area_ft2 / 10_000.0) * entryways_properties[:entrance_doors_per_10000_ft2]
127
+ end
128
+
129
+ # other doors
130
+ unless entryways_properties[:other_doors_per_10000_ft2].nil?
131
+ other_doors += (ground_floor_area_ft2 / 10_000.0) * entryways_properties[:other_doors_per_10000_ft2]
132
+ end
133
+
134
+ # rollup doors
135
+ unless entryways_properties[:rollup_doors_per_10000_ft2].nil?
136
+ rollup_doors += (ground_floor_area_ft2 / 10_000.0) / entryways_properties[:rollup_doors_per_10000_ft2].to_f
137
+ end
138
+
139
+ # drive through windows
140
+ unless entryways_properties[:floor_area_per_drive_through_window].nil?
141
+ drive_through_windows += ground_floor_area_ft2 / entryways_properties[:floor_area_per_drive_through_window].to_f
142
+ end
143
+
144
+ # entrance canopies
145
+ if !entryways_properties[:entrance_canopies].nil? && !entryways_properties[:canopy_size].nil?
146
+ canopy_entry_area += entryways_properties[:entrance_canopies] * entryways_properties[:canopy_size]
147
+ end
148
+
149
+ # emergency canopies
150
+ if !entryways_properties[:emergency_canopies].nil? && !entryways_properties[:canopy_size].nil?
151
+ canopy_emergency_area += entryways_properties[:emergency_canopies] * entryways_properties[:canopy_size]
152
+ end
153
+
154
+ # building_facades
155
+ # determine effective number of stories to find first above grade story exterior wall area
156
+ ground_story = effective_num_stories[:story_hash].keys[effective_num_stories[:below_grade]]
157
+ ground_story_ext_wall_area_m2 = effective_num_stories[:story_hash][ground_story][:ext_wall_area]
158
+ ground_story_ext_wall_area += OpenStudio.convert(ground_story_ext_wall_area_m2, 'm^2', 'ft^2').get
159
+ end
160
+
161
+ # no source for width of different entry types
162
+ main_entry_width_ft = 8.0
163
+ other_doors_width_ft = 4.0
164
+ rollup_door_width_ft = 8.0
165
+
166
+ # ensure the building has at least 1 main entry
167
+ main_entries = [1.0, main_entries].max
168
+
169
+ # populate hash
170
+ area_length_count_hash = {}
171
+ area_length_count_hash[:parking_area_and_drives_area] = parking_area_and_drives_area
172
+ area_length_count_hash[:main_entries] = main_entries * main_entry_width_ft
173
+ area_length_count_hash[:other_doors] = other_doors * other_doors_width_ft
174
+ area_length_count_hash[:rollup_doors] = rollup_doors * rollup_door_width_ft
175
+ area_length_count_hash[:drive_through_windows] = drive_through_windows
176
+ area_length_count_hash[:canopy_entry_area] = canopy_entry_area
177
+ area_length_count_hash[:canopy_emergency_area] = canopy_emergency_area
178
+ area_length_count_hash[:building_facades] = ground_story_ext_wall_area
179
+
180
+ return area_length_count_hash
181
+ end
182
+
183
+ # get exterior lighting properties by lighting generation
184
+ #
185
+ # @param lighting_generation [String] lighting generation
186
+ # @return [Hash] hash of exterior lighting properties
187
+ def self.model_get_exterior_lighting_properties(lighting_generation: 'default',
188
+ lighting_zone: 3)
189
+ # load typical exterior lighting data
190
+ data = JSON.parse(File.read("#{__dir__}/data/typical_exterior_lighting.json"))
191
+ exterior_lighting_properties = data['exterior_lighting'].select { |hash| (hash['lighting_generation'] == lighting_generation) && (hash['lighting_zone'] == lighting_zone) }[0]
192
+
193
+ # make sure lighting properties were found
194
+ if exterior_lighting_properties.nil?
195
+ OpenStudio.logFree(OpenStudio::Warn, 'openstudio.standards.ExteriorLighting', "Exterior lighting properties not found for lighting generation #{lighting_generation}, exterior lighting zone #{lighting_zone}.")
196
+ return nil
197
+ end
198
+
199
+ return exterior_lighting_properties
200
+ end
201
+ end
202
+ end
@@ -262,7 +262,7 @@ module OpenstudioStandards
262
262
  # @!group Information:Space
263
263
 
264
264
  # Calculate the space envelope area.
265
- # According to the 90.1 definition, building envelope include:
265
+ # According to the 90.1 definition, the building envelope includes:
266
266
  # 1. "the elements of a building that separate conditioned spaces from the exterior"
267
267
  # 2. "the elements of a building that separate conditioned space from unconditioned
268
268
  # space or that enclose semiheated spaces through which thermal energy may be
@@ -912,7 +912,7 @@ module OpenstudioStandards
912
912
  model.getBuildingStorys.sort.each do |story|
913
913
  z = OpenstudioStandards::Geometry.building_story_get_minimum_height(story)
914
914
  if (minimum_height - z).abs < tolerance
915
- OpenStudio.logFree(OpenStudio::Debug, 'openstudio.standards.Model', "The story with a min z value of #{minimum_height.round(2)} is #{story.name}.")
915
+ OpenStudio.logFree(OpenStudio::Debug, 'openstudio.standards.Geometry.Information', "The story with a min z value of #{minimum_height.round(2)} is #{story.name}.")
916
916
  matched_story = story
917
917
  end
918
918
  end
@@ -1172,6 +1172,53 @@ module OpenstudioStandards
1172
1172
  return perimeter
1173
1173
  end
1174
1174
 
1175
+
1176
+ # Calculate the model envelope area.
1177
+ # According to the 90.1 definition, the building envelope includes:
1178
+ # 1. "the elements of a building that separate conditioned spaces from the exterior"
1179
+ # 2. "the elements of a building that separate conditioned space from unconditioned
1180
+ # space or that enclose semiheated spaces through which thermal energy may be
1181
+ # transferred to or from the exterior, to or from unconditioned spaces or to or
1182
+ # from conditioned spaces."
1183
+ #
1184
+ # Outside boundary conditions currently supported:
1185
+ # - Adiabatic
1186
+ # - Surface
1187
+ # - Outdoors
1188
+ # - Foundation
1189
+ # - Ground
1190
+ # - GroundFCfactorMethod
1191
+ # - OtherSideCoefficients
1192
+ # - OtherSideConditionsModel
1193
+ # - GroundSlabPreprocessorAverage
1194
+ # - GroundSlabPreprocessorCore
1195
+ # - GroundSlabPreprocessorPerimeter
1196
+ # - GroundBasementPreprocessorAverageWall
1197
+ # - GroundBasementPreprocessorAverageFloor
1198
+ # - GroundBasementPreprocessorUpperWall
1199
+ # - GroundBasementPreprocessorLowerWall
1200
+ #
1201
+ # Surface type currently supported:
1202
+ # - Floor
1203
+ # - Wall
1204
+ # - RoofCeiling
1205
+ #
1206
+ # @param model [OpenStudio::Model::Model] OpenStudio model object
1207
+ # @param multiplier [Boolean] account for space multipliers
1208
+ # @return [Double] area in m^2
1209
+ def self.model_get_envelope_area(model, multiplier: true)
1210
+ building_envelope_area_m2 = 0
1211
+ model.getSpaces.each do |space|
1212
+ building_envelope_area_m2 += OpenstudioStandards::Geometry.space_get_envelope_area(space)
1213
+ end
1214
+ if building_envelope_area_m2 < 0.01
1215
+ OpenStudio.logFree(OpenStudio::Warn, 'openstudio.standards.Geometry.Information', 'Calculated building envelope area is 0 m2')
1216
+ return 0.0
1217
+ end
1218
+
1219
+ return building_envelope_area_m2
1220
+ end
1221
+
1175
1222
  # @!endgroup Information:Model
1176
1223
  end
1177
1224
  end
@@ -0,0 +1,169 @@
1
+ module OpenstudioStandards
2
+ # The HVAC module provides methods create, modify, and get information about HVAC systems in the model
3
+ module HVAC
4
+ # @!group Component:Create
5
+ # Methods to create HVAC component objects
6
+
7
+ # creates HeatExchangerAirToAirSensibleAndLatent object with user-input effectiveness values
8
+ #
9
+ # @param model [<OpenStudio::Model::Model>] OpenStudio model
10
+ # @param name [String]
11
+ # @param type [String] Heat Exchanger Type. One of 'Plate', 'Rotary'
12
+ # @param economizer_lockout [Boolean] whether hx is locked out during economizing
13
+ # @param supply_air_outlet_temperature_control [Boolean]
14
+ # @param frost_control_type [String] HX frost control type. One of 'None', 'ExhaustAirRecirculation', 'ExhaustOnly', 'MinimumExhaustTemperature'
15
+ # @param nominal_electric_power [Float] Nominal electric power
16
+ # @param sensible_heating_100_eff [Float]
17
+ # @param sensible_heating_75_eff [Float]
18
+ # @param latent_heating_100_eff [Float]
19
+ # @param latent_heating_75_eff [Float]
20
+ # @param sensible_cooling_100_eff [Float]
21
+ # @param sensible_cooling_75_eff [Float]
22
+ # @param latent_cooling_100_eff [Float]
23
+ # @param latent_cooling_75_eff [Float]
24
+ # @return [<OpenStudio::Model::HeatExchangerAirToAirSensibleAndLatent>]
25
+ def self.create_hx_air_to_air_sensible_and_latent(model,
26
+ name: nil,
27
+ type: nil,
28
+ economizer_lockout: nil,
29
+ supply_air_outlet_temperature_control: nil,
30
+ frost_control_type: nil,
31
+ nominal_electric_power: nil,
32
+ sensible_heating_100_eff: nil,
33
+ sensible_heating_75_eff: nil,
34
+ latent_heating_100_eff: nil,
35
+ latent_heating_75_eff: nil,
36
+ sensible_cooling_100_eff: nil,
37
+ sensible_cooling_75_eff: nil,
38
+ latent_cooling_100_eff: nil,
39
+ latent_cooling_75_eff: nil)
40
+
41
+ hx = OpenStudio::Model::HeatExchangerAirToAirSensibleAndLatent.new(model)
42
+ hx.setName(name) unless name.nil?
43
+
44
+ unless type.nil?
45
+ if OpenStudio::Model::HeatExchangerAirToAirSensibleAndLatent.heatExchangerTypeValues.include?(type)
46
+ hx.setHeatExchangerType(type)
47
+ else
48
+ OpenStudio.logFree(OpenStudio::Warn, 'openstudio.model.Hvac', "Entered heat exchanger type #{type} not a valid type value. Enter one of #{OpenStudio::Model::HeatExchangerAirToAirSensibleAndLatent.heatExchangerTypeValues}")
49
+ end
50
+ end
51
+
52
+ unless frost_control_type.nil?
53
+ if OpenStudio::Model::HeatExchangerAirToAirSensibleAndLatent.frostControlTypeValues.include?(frost_control_type)
54
+ hx.setFrostControlType(frost_control_type)
55
+ else
56
+ OpenStudio.logFree(OpenStudio::Warn, 'openstudio.model.Hvac', "Entered heat exchanger frost control type #{frost_control_type} not a valid type value. Enter one of #{OpenStudio::Model::HeatExchangerAirToAirSensibleAndLatent.frostControlTypeValues}")
57
+ end
58
+ end
59
+
60
+ hx.setEconomizerLockout(economizer_lockout) unless economizer_lockout.nil?
61
+ hx.setSupplyAirOutletTemperatureControl(supply_air_outlet_temperature_control) unless supply_air_outlet_temperature_control.nil?
62
+ hx.setNominalElectricPower(nominal_electric_power) unless nominal_electric_power.nil?
63
+
64
+ if model.version < OpenStudio::VersionString.new('3.8.0')
65
+ hx.setSensibleEffectivenessat100HeatingAirFlow(sensible_heating_100_eff) unless sensible_heating_100_eff.nil?
66
+ hx.setSensibleEffectivenessat75HeatingAirFlow(sensible_heating_75_eff) unless sensible_heating_75_eff.nil?
67
+ hx.setLatentEffectivenessat100HeatingAirFlow(latent_heating_100_eff) unless latent_heating_100_eff.nil?
68
+ hx.setLatentEffectivenessat75HeatingAirFlow(latent_heating_75_eff) unless latent_heating_75_eff.nil?
69
+ hx.setSensibleEffectivenessat100CoolingAirFlow(sensible_cooling_100_eff) unless sensible_cooling_100_eff.nil?
70
+ hx.setSensibleEffectivenessat75CoolingAirFlow(sensible_cooling_75_eff) unless sensible_cooling_75_eff.nil?
71
+ hx.setLatentEffectivenessat100CoolingAirFlow(latent_cooling_100_eff) unless latent_cooling_100_eff.nil?
72
+ hx.setLatentEffectivenessat75CoolingAirFlow(latent_cooling_75_eff) unless latent_cooling_75_eff.nil?
73
+ else
74
+ effectiveness_inputs = Hash.new { |hash, key| hash[key] = {} }
75
+ effectiveness_inputs['Sensible Heating'][0.75] = sensible_heating_75_eff.to_f unless sensible_heating_75_eff.nil?
76
+ effectiveness_inputs['Sensible Heating'][1.0] = sensible_heating_100_eff.to_f unless sensible_heating_100_eff.nil?
77
+ effectiveness_inputs['Latent Heating'][0.75] = latent_heating_75_eff.to_f unless latent_heating_75_eff.nil?
78
+ effectiveness_inputs['Latent Heating'][1.0] = latent_heating_100_eff.to_f unless latent_heating_100_eff.nil?
79
+ effectiveness_inputs['Sensible Cooling'][0.75] = sensible_cooling_75_eff.to_f unless sensible_cooling_75_eff.nil?
80
+ effectiveness_inputs['Sensible Cooling'][1.0] = sensible_cooling_100_eff.to_f unless sensible_cooling_100_eff.nil?
81
+ effectiveness_inputs['Latent Cooling'][0.75] = latent_cooling_75_eff.to_f unless latent_cooling_75_eff.nil?
82
+ effectiveness_inputs['Latent Cooling'][1.0] = latent_cooling_100_eff.to_f unless latent_cooling_100_eff.nil?
83
+
84
+ if effectiveness_inputs.values.all?(&:empty?)
85
+ OpenStudio.logFree(OpenStudio::Info, 'openstudio.model.Hvac', 'Creating HX with historical effectiveness curves')
86
+ defaults = true
87
+ else
88
+ defaults = false
89
+ end
90
+
91
+ OpenstudioStandards::HVAC.heat_exchanger_air_to_air_set_effectiveness_values(hx, defaults: defaults, values: effectiveness_inputs)
92
+ end
93
+
94
+ return hx
95
+ end
96
+
97
+ # creates LookupTable objects to define effectiveness of HeatExchangerAirToAirSensibleAndLatent objects
98
+ #
99
+ # @param hx [<OpenStudio::Model::HeatExchangerAirToAirSensibleAndLatent>] OpenStudio HX object to update
100
+ # @param type [String] type of curve to create. one of 'Sensible Heating', 'Latent Heating, 'Sensible Cooling', 'Latent Cooling'
101
+ # @param values_hash [Hash{Float=>Float}] user_input flow decimal fraction => effectiveness decimal fraction pairs, e.g. {0.75 => 0.81, 1.0 => 0.76}
102
+ # @return [<OpenStudio::Model::TableLookup>] lookup table object
103
+ def self.create_hx_effectiveness_table(hx, type, values_hash)
104
+ # validate inputs
105
+ types = ['Sensible Heating', 'Latent Heating', 'Sensible Cooling', 'Latent Cooling']
106
+ unless types.include? type
107
+ OpenStudio.logFree(OpenStudio::Error, 'openstudio.model.Hvac', "#{__method__} requires effectiveness type as one of #{types}")
108
+ return false
109
+ end
110
+
111
+ def self.validate_effectiveness_hash(values_hash)
112
+ values_hash.all? do |key, value|
113
+ key.is_a?(Float) && value.is_a?(Float) && key.between?(0.0, 1.0) && value.between?(0.0, 1.0)
114
+ end
115
+ end
116
+
117
+ if !validate_effectiveness_hash(values_hash)
118
+ OpenStudio.logFree(OpenStudio::Error, 'openstudio.model.Hvac', "#{__method__} require values_hash to have keys and values between 0.0 and 1.0: #{values_hash}")
119
+ return false
120
+ end
121
+
122
+ # look for existing curve
123
+ type_a = type.split
124
+ method_name = "#{type_a[0].downcase}Effectivenessof#{type_a[1]}AirFlowCurve"
125
+
126
+ # use existing independent variable object if found and matches inputs
127
+ iv = nil
128
+ table = OpenStudio::Model::OptionalTableLookup.new
129
+ if hx.send(method_name).is_initialized
130
+ table = hx.send(method_name).get.to_TableLookup
131
+ curve = table.get
132
+ iv_existing = curve.independentVariables.first
133
+ if values_hash.keys.sort == iv_existing.values.sort
134
+ iv = iv_existing
135
+ end
136
+ end
137
+
138
+ # otherwise create new independent variable
139
+ if iv.nil?
140
+ iv = OpenStudio::Model::TableIndependentVariable.new(hx.model)
141
+ iv.setName("#{hx.name.get}_#{type.gsub(' ', '')}_IndependentVariable")
142
+ iv.setInterpolationMethod('Linear')
143
+ iv.setExtrapolationMethod('Linear')
144
+ iv.setMinimumValue(0.0)
145
+ iv.setMaximumValue(10.0)
146
+ iv.setUnitType('Dimensionless')
147
+ values_hash.keys.sort.each { |k| iv.addValue(k) }
148
+ end
149
+
150
+ # create new lookup table
151
+ t = OpenStudio::Model::TableLookup.new(hx.model)
152
+ t.setName("#{hx.name.get}_#{type.gsub(/ible|ent|ing|\s/, '')}Eff")
153
+ t.addIndependentVariable(iv)
154
+ t.setNormalizationMethod('DivisorOnly')
155
+ t.setMinimumOutput(0.0)
156
+ t.setMaximumOutput(10.0)
157
+ t.setOutputUnitType('Dimensionless')
158
+ values = values_hash.sort.map { |a| a[1] }
159
+ # protect against setting normalization divisor to zero for zero effectiveness
160
+ values[-1].zero? ? t.setNormalizationDivisor(1) : t.setNormalizationDivisor(values[-1])
161
+ values.each { |v| t.addOutputValue(v) }
162
+
163
+ # remove curve if found
164
+ table.get.remove if table.is_initialized
165
+
166
+ return t
167
+ end
168
+ end
169
+ end
@@ -0,0 +1,42 @@
1
+ module OpenstudioStandards
2
+ # The HVAC module provides methods create, modify, and get information about HVAC systems in the model
3
+ module HVAC
4
+ # @!group Component:Modify
5
+ # Methods to modify HVAC Component objects
6
+
7
+ # Applies historical default or user-input effectiveness values to a HeatExchanger:AirToAir:SensibleAndLatent object
8
+ #
9
+ # @param hx [<OpenStudio::Model::HeatExchangerAirToAirSensibleAndLatent>] OpenStudio HX object to update
10
+ # @param defaults [Boolean] flag to apply historical default curves
11
+ # @param values [Hash{String=>Hash{Float=>Float}}] user-input effectiveness values, where keys are one of
12
+ # 'Sensible Heating', 'Latent Heating, 'Sensible Cooling', 'Latent Cooling'
13
+ # and value is a hash of {flow decimal fraction => effectivess decimal fraction}, e.g. {0.75 => 0.81, 1.0 => 0.76}
14
+ # @return [<OpenStudio::Model::HeatExchangerAirToAirSensibleAndLatent>] modified OpenStudio HX object
15
+ def self.heat_exchanger_air_to_air_set_effectiveness_values(hx, defaults: false, values: nil)
16
+ if defaults
17
+ hx.assignHistoricalEffectivenessCurves
18
+ if values.nil?
19
+ return hx
20
+ end
21
+ elsif values.nil?
22
+ OpenStudio.logFree(OpenStudio::Warn, 'openstudio.model.Hvac', "#{__method__} called with defaults=false and no values provided. #{hx.name.get} will not be modified")
23
+ return hx
24
+ end
25
+
26
+ values.each do |type, values_hash|
27
+ # ensure values_hash has one value at 100% flow
28
+ unless values_hash.key?(1.0)
29
+ OpenStudio.logFree(OpenStudio::Error, 'openstudio.model.Hvac', "Effectiveness Values for #{type} do not include 100% flow effectivenss. Cannot set effectiveness curves")
30
+ return false
31
+ end
32
+
33
+ lookup_table = OpenstudioStandards::HVAC.create_hx_effectiveness_table(hx, type, values_hash)
34
+ type_a = type.split
35
+ hx.send("set#{type_a[0]}Effectivenessat100#{type_a[1]}AirFlow", values_hash[1.0])
36
+ hx.send("set#{type_a[0]}Effectivenessof#{type_a[1]}AirFlowCurve", lookup_table)
37
+ end
38
+
39
+ return hx
40
+ end
41
+ end
42
+ end
@@ -0,0 +1,108 @@
1
+ module OpenstudioStandards
2
+ # The HVAC module provides methods create, modify, and get information about HVAC systems in the model
3
+ module HVAC
4
+ # @!group Exhaust
5
+ # Methods to create exhaust fans
6
+
7
+ # Create and add an exhaust fan to a thermal zone.
8
+ #
9
+ # @param exhaust_zone [OpenStudio::Model::ThermalZone] The zone with the exhaust fan
10
+ # @param make_up_air_source_zone [OpenStudio::Model::ThermalZone] An optional source zone for make-up air
11
+ # @param make_up_air_fraction [Double] The fraction of make-up sourced from make_up_air_source_zone
12
+ # @return [OpenStudio::Model::FanZoneExhaust] The created exhaust fan
13
+ def self.create_exhaust_fan(exhaust_zone,
14
+ make_up_air_source_zone: nil,
15
+ make_up_air_fraction: 0.5)
16
+ # load exhaust fan data
17
+ data = JSON.parse(File.read("#{__dir__}/data/typical_exhaust.json"), symbolize_names: true)
18
+
19
+ # loop through spaces to get standards space information
20
+ space_type_hash = {}
21
+ exhaust_zone.spaces.each do |space|
22
+ next unless space.spaceType.is_initialized
23
+ next unless space.partofTotalFloorArea
24
+
25
+ space_type = space.spaceType.get
26
+ if space_type_hash.key?(space_type)
27
+ space_type_hash[space_type][:floor_area_m2] += space.floorArea * space.multiplier
28
+ else
29
+ next unless space_type.standardsBuildingType.is_initialized
30
+ next unless space_type.standardsSpaceType.is_initialized
31
+
32
+
33
+ standards_space_type = space_type.standardsSpaceType.get
34
+ standards_building_type = space_type.standardsBuildingType.get
35
+
36
+ exhaust_fan_properties = data[:space_types].select { |hash| (hash[:space_type] == standards_space_type) && (hash[:building_type] == standards_building_type) }
37
+
38
+ # skip spaces with no exhaust fan information defined
39
+ next if exhaust_fan_properties.empty?
40
+
41
+ exhaust_fan_properties = exhaust_fan_properties[0]
42
+
43
+ space_type_hash[space_type] = {}
44
+ space_type_hash[space_type][:floor_area_m2] = space.floorArea * space.multiplier
45
+ space_type_hash[space_type][:exhaust_cfm_per_area_ft2] = exhaust_fan_properties[:exhaust_per_area]
46
+ end
47
+ end
48
+
49
+ # total exhaust
50
+ exhaust_m3_per_s = 0.0
51
+ space_type_hash.each do |space_type, fields|
52
+ floor_area_ft2 = OpenStudio.convert(fields[:floor_area_m2], 'm^2', 'ft^2').get
53
+ cfm = fields[:exhaust_cfm_per_area_ft2].to_f * floor_area_ft2.to_f
54
+ exhaust_m3_per_s += OpenStudio.convert(cfm, 'cfm', 'm^3/s').get
55
+ end
56
+
57
+ if exhaust_m3_per_s.zero?
58
+ OpenStudio.logFree(OpenStudio::Warn, 'openstudio.standards.HVAC.create_exhaust_fan', "Calculated zero flow rate for thermal zone #{exhaust_zone.name}. No exhaust fan added.")
59
+ return nil
60
+ end
61
+
62
+ # placeholders for exhaust schedules
63
+ # @todo get the building HVAC schedule
64
+ exhaust_availability_schedule = exhaust_zone.model.alwaysOnDiscreteSchedule
65
+ exhaust_flow_fraction_schedule = exhaust_zone.model.alwaysOnDiscreteSchedule
66
+
67
+ # add exhaust fan
68
+ zone_exhaust_fan = OpenStudio::Model::FanZoneExhaust.new(exhaust_zone.model)
69
+ zone_exhaust_fan.setName("#{exhaust_zone.name} Exhaust Fan")
70
+ zone_exhaust_fan.setAvailabilitySchedule(exhaust_availability_schedule)
71
+ zone_exhaust_fan.setFlowFractionSchedule(exhaust_flow_fraction_schedule)
72
+ zone_exhaust_fan.setMaximumFlowRate(exhaust_m3_per_s)
73
+ zone_exhaust_fan.setEndUseSubcategory('Zone Exhaust Fans')
74
+ zone_exhaust_fan.addToThermalZone(exhaust_zone)
75
+
76
+ # add objects to account for makeup air
77
+ unless make_up_air_source_zone.nil?
78
+ # add balanced exhaust schedule to zone_exhaust_fan
79
+ balanced_exhaust_schedule = OpenstudioStandards::Schedules.create_constant_schedule_ruleset(make_up_air_source_zone.model, make_up_air_fraction,
80
+ name: "#{exhaust_zone.name} Balanced Exhaust Fraction Schedule",
81
+ schedule_type_limit: 'Fraction')
82
+ zone_exhaust_fan.setBalancedExhaustFractionSchedule(balanced_exhaust_schedule)
83
+
84
+ # use max value of balanced exhaust fraction schedule for maximum flow rate
85
+ max_sch_val = OpenstudioStandards::Schedules.schedule_get_min_max(balanced_exhaust_schedule)['max']
86
+ transfer_air_m3_per_s = exhaust_m3_per_s * max_sch_val
87
+
88
+ # add dummy exhaust fan to account for loss of transfer air
89
+ transfer_air_source_zone_exhaust = OpenStudio::Model::FanZoneExhaust.new(exhaust_zone.model)
90
+ transfer_air_source_zone_exhaust.setName("#{exhaust_zone.name} Transfer Air Source")
91
+ transfer_air_source_zone_exhaust.setAvailabilitySchedule(exhaust_availability_schedule)
92
+ transfer_air_source_zone_exhaust.setMaximumFlowRate(transfer_air_m3_per_s)
93
+ transfer_air_source_zone_exhaust.setFanEfficiency(1.0)
94
+ transfer_air_source_zone_exhaust.setPressureRise(0.0)
95
+ transfer_air_source_zone_exhaust.setEndUseSubcategory('Zone Exhaust Fans')
96
+ transfer_air_source_zone_exhaust.addToThermalZone(make_up_air_source_zone)
97
+
98
+ # add zone mixing
99
+ zone_mixing = OpenStudio::Model::ZoneMixing.new(exhaust_zone)
100
+ zone_mixing.setSchedule(exhaust_flow_fraction_schedule)
101
+ zone_mixing.setSourceZone(make_up_air_source_zone)
102
+ zone_mixing.setDesignFlowRate(transfer_air_m3_per_s)
103
+ end
104
+
105
+ return zone_exhaust_fan
106
+ end
107
+ end
108
+ end