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
@@ -22,16 +22,17 @@
22
22
  require 'fileutils'
23
23
  require 'csv'
24
24
  require 'securerandom'
25
+ require 'digest'
25
26
 
26
27
 
27
28
  module BTAP
28
29
  module FileIO
29
30
 
30
- #Test Constructions Module
31
+ #Test Constructions Module
31
32
  if __FILE__ == $0
32
33
  require 'test/unit'
33
- class FileIOTests < Test::Unit::TestCase
34
-
34
+ class FileIOTests < Test::Unit::TestCase
35
+
35
36
  def setup
36
37
  end
37
38
 
@@ -1191,10 +1192,175 @@ module BTAP
1191
1192
  return new_model
1192
1193
  end
1193
1194
 
1194
- end #FileIO
1195
1195
 
1196
+ def self.clean_osm_file( file_path: ,
1197
+ output_path: )
1198
+
1199
+ def self.read_osm_file(file_path)
1200
+ data = []
1201
+ current_hash = {}
1202
+
1203
+ File.foreach(file_path) do |line|
1204
+ line.strip!
1205
+ next if line.empty?
1206
+
1207
+ if line.start_with?('OS:')
1208
+ current_hash = { type: line.split(/[;,]/).first }
1209
+ data << current_hash
1210
+ elsif line.include?('!-')
1211
+ key, value = line.split('!-').map(&:strip)
1212
+ current_hash[value] = key.chomp(',;').strip
1213
+ else
1214
+ current_hash[:id] ||= line.chomp(',;').strip
1215
+ end
1216
+ end
1217
+
1218
+ data
1219
+ end
1220
+
1221
+ def self.remove_special_characters(hash)
1222
+ hash.keys.each do |key|
1223
+ new_key = key.to_s.sub(/[;,]$/, '')
1224
+ hash[new_key] = hash.delete(key)
1225
+ end
1226
+
1227
+ hash.each do |key, value|
1228
+ next unless value.is_a?(String)
1229
+
1230
+ hash[key] = value.gsub(/[;,]$/, '')
1231
+ end
1232
+ end
1233
+
1234
+ def self.rename_handles(osm_data)
1235
+
1236
+ hash = Digest::SHA1.hexdigest("fixed_seed")
1237
+ handle_map = {}
1238
+ new_handle_index = 0
1239
+ object_type_index = 0
1240
+ last_object_type = nil
1241
+
1242
+ osm_data.each do |hash|
1243
+ if hash['Handle']
1244
+ #puts hash
1245
+ #puts "#{hash['type']} == #{last_object_type}"
1246
+ if hash['type'] != last_object_type
1247
+ last_object_type = hash['type']
1248
+ object_type_index += 1
1249
+ new_handle_index = 1
1250
+ else
1251
+ new_handle_index += 1
1252
+ end
1253
+
1254
+ # create a formatted string that is 12 charecters created with new_handle_index, but padded with 0s on the left.
1255
+ formatted_index = new_handle_index.to_s.rjust(12, '0')
1256
+ formatted_index_object_type = object_type_index.to_s.rjust(4, '0')
1257
+ new_handle = "{00000000-0000-0000-#{formatted_index_object_type}-#{formatted_index}}"
1258
+ handle_map[hash['Handle']] = new_handle
1259
+ hash['Handle'] = new_handle
1260
+ end
1261
+ end
1262
+
1263
+ osm_data.each do |hash|
1264
+ hash.each do |key, value|
1265
+ if handle_map.key?(value)
1266
+ hash[key] = handle_map[value]
1267
+ end
1268
+ end
1269
+ end
1270
+
1271
+ # Go through all hashes in osm_data and if the "Name" field value fits this pattern {9386c18d-e70a-447e-8b69-9a0a39fd8f06} replace it with an incremented value.
1272
+ name_map = {}
1273
+ new_name_index = 0
1274
+ osm_data.each do |hash|
1275
+ if hash['Name'] && hash['Name'].match?(/\{[a-fA-F0-9\-]{36}\}/)
1276
+ new_name_index += 1
1277
+ formatted_new_name_index = new_name_index.to_s.rjust(4, '0')
1278
+ new_name = "{00000000-0000-#{formatted_new_name_index}-0000-000000000000}"
1279
+ name_map[hash['Name']] = new_name
1280
+ hash['Name'] = new_name
1281
+ end
1282
+ end
1283
+
1284
+ osm_data.each do |hash|
1285
+ hash.each do |key, value|
1286
+ if name_map.key?(value)
1287
+ hash[key] = name_map[value]
1288
+ end
1289
+ end
1290
+ end
1291
+
1292
+
1293
+ end
1294
+
1295
+
1296
+
1297
+
1298
+ def self.save_osm_file(osm_data, output_path)
1299
+ File.open(output_path, 'w') do |file|
1300
+ osm_data.each do |hash|
1301
+ file.puts "#{hash["type"]},"
1302
+ hash.each do |key, value|
1303
+ next if key == "type"
1304
+ is_last_key = (hash.keys - [:type]).last == key
1305
+ if key == :id
1306
+ file.puts " #{value},"
1307
+ else
1308
+ file.puts " #{value}#{is_last_key ? ';' : ','}".ljust(42) + " !- #{key}"
1309
+ end
1310
+ end
1311
+ file.puts
1312
+ end
1313
+ end
1314
+ end
1315
+
1316
+ def self.set_all_data_time(osm_data)
1317
+ osm_data.each do |hash|
1318
+ hash.each do |key, value|
1319
+ #Check if value is in a date-time format like this "2024-10-17 01:19:35 UTC"
1320
+ if value.match?(/\d{4}-\d{2}-\d{2} \d{2}:\d{2}:\d{2} UTC/)
1321
+ hash[key] = "2024-01-01 01:00:00 UTC"
1322
+ end
1323
+ end
1324
+ end
1325
+ end
1326
+
1327
+ def self.set_all_epw_paths(osm_data)
1328
+ osm_data.each do |hash|
1329
+ hash.each do |key, value|
1330
+ #Check if value is in a epw file path format like this "USA_CA_San.Francisco.Intl.AP.724940_TMY3.epw"
1331
+ if value.match?(/.*\.epw/)
1332
+ # Get name of file without path from value
1333
+ hash[key] = File.basename(value)
1334
+ end
1335
+ end
1336
+ end
1337
+ end
1196
1338
 
1339
+
1340
+ osm_data = read_osm_file(file_path)
1341
+ osm_data.sort_by! { |hash| [hash[:type], hash['Name'] || ''] }
1197
1342
 
1343
+ handles = osm_data.map { |hash| hash['Handle'] }.compact
1344
+ duplicates = handles.select { |e| handles.count(e) > 1 }
1345
+ raise "Duplicate handles found: #{duplicates.uniq}" if duplicates.any?
1198
1346
 
1347
+ osm_data.each { |hash| remove_special_characters(hash) }
1348
+ set_all_data_time(osm_data)
1349
+ set_all_epw_paths(osm_data)
1350
+ rename_handles(osm_data)
1351
+ save_osm_file(osm_data, output_path)
1352
+ end
1199
1353
 
1200
- end #BTAP
1354
+ def self.get_relative_path(abs_path_to_file, working_folder)
1355
+ path = Pathname.new(abs_path_to_file).relative_path_from(Pathname.new(working_folder)).to_s
1356
+ file = File.basename(abs_path_to_file)
1357
+ rel_path= File.join(path)
1358
+ # Check if file exists
1359
+ if File.file?(File.join(working_folder, rel_path))
1360
+ return rel_path
1361
+ else
1362
+ raise "File does not exist at #{File.join(working_folder, rel_path)}"
1363
+ end
1364
+ end
1365
+ end #FileIO
1366
+ end #BTAP
@@ -5,15 +5,49 @@ module OpenstudioStandards
5
5
  # Methods to create Constructions
6
6
 
7
7
  # This will create a deep copy of the construction, meaning it will clone and create new material objects as well
8
+ # This function will clone
8
9
  #
9
10
  # @param construction [OpenStudio::Model::Construction] OpenStudio Construction object object
10
11
  # @return [OpenStudio::Model::Construction] New OpenStudio Construction object
11
12
  def self.construction_deep_copy(construction)
12
- new_construction = construction.clone.to_Construction.get
13
- (0..new_construction.layers.length - 1).each do |layer_number|
14
- cloned_layer = new_construction.getLayer(layer_number).clone.to_Material.get
15
- new_construction.setLayer(layer_number, cloned_layer)
13
+ cons_obj_type = construction.iddObjectType.valueName.to_s
14
+ case cons_obj_type
15
+ when 'OS_Construction_FfactorGroundFloor'
16
+ new_construction = construction.clone.to_FFactorGroundFloorConstruction.get
17
+ f_const = construction.to_FFactorGroundFloorConstruction.get
18
+ new_construction.setFFactor(f_const.fFactor)
19
+ new_construction.setArea(f_const.area)
20
+ new_construction.setPerimeterExposed(f_const.perimeterExposed)
21
+ when 'OS_Construction_CfactorUndergroundWall'
22
+ c_const = construction.to_CFactorUndergroundWallConstruction.get
23
+ new_construction = c_const.clone.to_CFactorUndergroundWallConstruction.get
24
+ new_construction.setCFactor(c_const.cFactor)
25
+ new_construction.setHeight(c_const.height)
26
+ when 'OS_Construction_AirBoundary'
27
+ a_const = construction.to_ConstructionAirBoundary.get
28
+ new_construction = a_const.clone.to_ConstructionAirBoundary.get
29
+ new_construction.setAirExchangeMethod(a_const.airExchangeMethod)
30
+ new_construction.setSimpleMixingAirChangesPerHour(a_const.simpleMixingAirChangesPerHour)
31
+ new_construction.setSimpleMixingSchedule(a_const.simpleMixingSchedule)
32
+ else
33
+ # Layer by layer construction
34
+ if cons_obj_type == 'OS_Construction_InternalSource'
35
+ new_construction = construction.clone.to_ConstructionWithInternalSource.get
36
+ i_const = construction.to_ConstructionWithInternalSource.get
37
+ new_construction.setSourcePresentAfterLayerNumber(i_const.sourcePresentAfterLayerNumber)
38
+ new_construction.setTemperatureCalculationRequestedAfterLayerNumber(i_const.temperatureCalculationRequestedAfterLayerNumber)
39
+ new_construction.setDimensionsForTheCTFCalculation(i_const.dimensionsForTheCTFCalculation)
40
+ new_construction.setTubeSpacing(i_const.tubeSpacing)
41
+ new_construction.setTwoDimensionalTemperatureCalculationPosition(i_const.twoDimensionalTemperatureCalculationPosition)
42
+ else
43
+ new_construction = construction.clone.to_Construction.get
44
+ end
45
+ (0..new_construction.layers.length - 1).each do |layer_number|
46
+ cloned_layer = new_construction.getLayer(layer_number).clone.to_Material.get
47
+ new_construction.setLayer(layer_number, cloned_layer)
48
+ end
16
49
  end
50
+
17
51
  return new_construction
18
52
  end
19
53
 
@@ -336,11 +336,18 @@ module OpenstudioStandards
336
336
  return false
337
337
  end
338
338
 
339
- # Change construction name
340
- construction.setName("#{construction.name}_#{surface.name}_#{target_f_factor_ip}")
341
-
342
339
  # Set properties
343
340
  f_factor_si = target_f_factor_ip * OpenStudio.convert(1.0, 'Btu/ft*h*R', 'W/m*K').get
341
+
342
+ # Exception alert on tiny piece of outdoor ground floors in a space
343
+ # data is taken out from Eplus - Area / Perimeter > (R_concrete + R_film_in + R_film_out) * Ffactor
344
+ # where R_concrete = 0.15 / 1.95, R_film_in = 0.135, R_film_out = 0.03
345
+ unless area / perimeter >= ((0.15 / 1.95) + 0.135 + 0.03) * f_factor_si
346
+ OpenStudio.logFree(OpenStudio::Warn, 'OpenstudioStandards::Construction', 'The calculated area to exposed perimeter ratio is smaller than the threshold set in EnergyPlus.')
347
+ return false
348
+ end
349
+ # Change construction name
350
+ construction.setName("#{construction.name}_#{surface.name}_#{target_f_factor_ip}")
344
351
  construction.setFFactor(f_factor_si)
345
352
  construction.setArea(area)
346
353
  construction.setPerimeterExposed(perimeter)
@@ -20,7 +20,7 @@ module OpenstudioStandards
20
20
  # @param cooling_fuel [String] The primary HVAC cooling fuel type
21
21
  # Options are 'Electricity', 'DistrictCooling', 'DistrictAmbient'
22
22
  # @param kitchen_makeup [String] Source of makeup air for kitchen exhaust
23
- # Options are 'None', 'Largest Zone', 'Adjacent'
23
+ # Options are 'None', 'Adjacent'
24
24
  # @param exterior_lighting_zone [String] The exterior lighting zone for exterior lighting allowance.
25
25
  # Options are '0 - Undeveloped Areas Parks', '1 - Developed Areas Parks', '2 - Neighborhood', '3 - All Other Areas', '4 - High Activity'
26
26
  # @param add_constructions [Boolean] Create and apply default construction set
@@ -28,6 +28,7 @@ module OpenstudioStandards
28
28
  # Options are 'Inferred', 'Mass', 'Metal Building', 'WoodFramed', 'SteelFramed'
29
29
  # @param add_space_type_loads [Boolean] Populate existing standards space types in the model with internal loads
30
30
  # @param add_daylighting_controls [Boolean] Add daylighting controls
31
+ # @param add_infiltration [Boolean] Adds infiltration to the model based on cosntruction
31
32
  # @param add_elevators [Boolean] Apply elevators directly to a space in the model instead of to a space type
32
33
  # @param add_internal_mass [Boolean] Add internal mass to each space
33
34
  # @param add_exterior_lights [Boolean] Add exterior lightings objects to parking, canopies, and facades
@@ -36,6 +37,7 @@ module OpenstudioStandards
36
37
  # @param add_swh [Boolean] Add service water heating supply and demand objects
37
38
  # @param add_thermostat [Boolean] Add thermostats to thermal zones based on the standards space type
38
39
  # @param add_refrigeration [Boolean] Add refrigerated cases and walkin refrigeration
40
+ # @param refrigeration_template [String] The refrigeration technology level, either 'old', 'new', or 'advanced'
39
41
  # @param modify_wkdy_op_hrs [Boolean] Modify the default weekday hours of operation
40
42
  # @param wkdy_op_hrs_start_time [Double] Weekday operating hours start time. Enter as a fractional value, e.g. 5:15pm is 17.25. Only used if modify_wkdy_op_hrs is true.
41
43
  # @param wkdy_op_hrs_duration [Double] Weekday operating hours duration from start time. Enter as a fractional value, e.g. 5:15pm is 17.25. Only used if modify_wkdy_op_hrs is true.
@@ -66,6 +68,7 @@ module OpenstudioStandards
66
68
  wall_construction_type: 'Inferred',
67
69
  add_space_type_loads: true,
68
70
  add_daylighting_controls: true,
71
+ add_infiltration: true,
69
72
  add_elevators: true,
70
73
  add_internal_mass: true,
71
74
  add_exterior_lights: true,
@@ -74,6 +77,7 @@ module OpenstudioStandards
74
77
  add_swh: true,
75
78
  add_thermostat: true,
76
79
  add_refrigeration: true,
80
+ refrigeration_template: 'new',
77
81
  modify_wkdy_op_hrs: false,
78
82
  wkdy_op_hrs_start_time: 8.0,
79
83
  wkdy_op_hrs_duration: 8.0,
@@ -225,8 +229,7 @@ module OpenstudioStandards
225
229
  end
226
230
 
227
231
  model.getSpaceTypes.sort.each do |space_type|
228
- # Don't add infiltration here; will be added later in the script
229
- test = standard.space_type_apply_internal_loads(space_type, true, true, true, true, true, false)
232
+ test = standard.space_type_apply_internal_loads(space_type, true, true, true, true, true)
230
233
  if test == false
231
234
  OpenStudio.logFree(OpenStudio::Warn, 'openstudio.standards.CreateTypical', "Could not add loads for #{space_type.name}. Not expected for #{template}")
232
235
  next
@@ -234,7 +237,7 @@ module OpenstudioStandards
234
237
 
235
238
  # apply internal load schedules
236
239
  # the last bool test it to make thermostat schedules. They are now added in HVAC section instead of here
237
- standard.space_type_apply_internal_load_schedules(space_type, true, true, true, true, true, true, false)
240
+ standard.space_type_apply_internal_load_schedules(space_type, true, true, true, true, true, false)
238
241
 
239
242
  # extend space type name to include the template. Consider this as well for load defs
240
243
  space_type.setName("#{space_type.name} - #{template}")
@@ -399,15 +402,22 @@ module OpenstudioStandards
399
402
  surface.setOutsideBoundaryCondition('Adiabatic')
400
403
  end
401
404
 
402
- # modify the infiltration rates
405
+
406
+ # set ground temperatures from DOE prototype buildings
407
+ OpenstudioStandards::Weather.model_set_ground_temperatures(model, climate_zone: climate_zone)
408
+ end
409
+
410
+ # add infiltration
411
+ if add_infiltration
403
412
  if remove_objects
404
413
  model.getSpaceInfiltrationDesignFlowRates.each(&:remove)
405
414
  end
406
- standard.model_apply_infiltration_standard(model)
407
- standard.model_modify_infiltration_coefficients(model, primary_bldg_type, climate_zone)
408
415
 
409
- # set ground temperatures from DOE prototype buildings
410
- OpenstudioStandards::Weather.model_set_ground_temperatures(model, climate_zone: climate_zone)
416
+ # use NIST method for determining infiltration
417
+ # this sets a default always on; schedules are adjusted later if HVAC is added
418
+ OpenstudioStandards::Infiltration.model_set_nist_infiltration(model,
419
+ airtightness_value: standard.default_airtightness,
420
+ air_barrier: standard.default_air_barrier)
411
421
  end
412
422
 
413
423
  # add elevators (returns ElectricEquipment object)
@@ -448,9 +458,11 @@ module OpenstudioStandards
448
458
  ext_light.remove
449
459
  end
450
460
  end
451
-
452
- exterior_lights = standard.model_add_typical_exterior_lights(model, exterior_lighting_zone.chars[0].to_i, onsite_parking_fraction)
453
- exterior_lights.each do |k, v|
461
+ exterior_lights = OpenstudioStandards::ExteriorLighting.model_create_typical_exterior_lighting(model,
462
+ lighting_generation: 'default',
463
+ lighting_zone: exterior_lighting_zone.chars[0].to_i,
464
+ onsite_parking_fraction: onsite_parking_fraction)
465
+ exterior_lights.each do |v|
454
466
  OpenStudio.logFree(OpenStudio::Info, 'openstudio.standards.CreateTypical', "Adding Exterior Lights named #{v.exteriorLightsDefinition.name} with design level of #{v.exteriorLightsDefinition.designLevel} * #{OpenStudio.toNeatString(v.multiplier, 0, true)}.")
455
467
  end
456
468
  end
@@ -463,17 +475,10 @@ module OpenstudioStandards
463
475
  model.getFanZoneExhausts.each(&:remove)
464
476
  end
465
477
 
466
- zone_exhaust_fans = standard.model_add_exhaust(model, kitchen_makeup) # second argument is strategy for finding makeup zones for exhaust zones
467
- zone_exhaust_fans.each do |k, v|
468
- max_flow_rate_ip = OpenStudio.convert(k.maximumFlowRate.get, 'm^3/s', 'cfm').get
469
- if v.key?(:zone_mixing)
470
- zone_mixing = v[:zone_mixing]
471
- mixing_source_zone_name = zone_mixing.sourceZone.get.name
472
- mixing_design_flow_rate_ip = OpenStudio.convert(zone_mixing.designFlowRate.get, 'm^3/s', 'cfm').get
473
- OpenStudio.logFree(OpenStudio::Info, 'openstudio.standards.CreateTypical', "Adding #{OpenStudio.toNeatString(max_flow_rate_ip, 0, true)} (cfm) of exhaust to #{k.thermalZone.get.name}, with #{OpenStudio.toNeatString(mixing_design_flow_rate_ip, 0, true)} (cfm) of makeup air from #{mixing_source_zone_name}")
474
- else
475
- OpenStudio.logFree(OpenStudio::Info, 'openstudio.standards.CreateTypical', "Adding #{OpenStudio.toNeatString(max_flow_rate_ip, 0, true)} (cfm) of exhaust to #{k.thermalZone.get.name}")
476
- end
478
+ zone_exhaust_fans = standard.model_add_exhaust(model, makeup_source: kitchen_makeup)
479
+ zone_exhaust_fans.each do |zone_exhaust_fan|
480
+ max_flow_rate_ip = OpenStudio.convert(zone_exhaust_fan.maximumFlowRate.get, 'm^3/s', 'cfm').get
481
+ OpenStudio.logFree(OpenStudio::Info, 'openstudio.standards.CreateTypical', "Adding #{OpenStudio.toNeatString(max_flow_rate_ip, 0, true)} (cfm) of exhaust to #{zone_exhaust_fan.thermalZone.get.name}")
477
482
  end
478
483
  end
479
484
 
@@ -504,7 +509,7 @@ module OpenstudioStandards
504
509
  end
505
510
  end
506
511
 
507
- typical_swh = standard.model_add_typical_swh(model, water_heater_fuel: service_water_heating_fuel)
512
+ typical_swh = OpenstudioStandards::ServiceWaterHeating.create_typical_service_water_heating(model, water_heating_fuel: service_water_heating_fuel)
508
513
  midrise_swh_loops = []
509
514
  stripmall_swh_loops = []
510
515
  typical_swh.each do |loop|
@@ -551,10 +556,14 @@ module OpenstudioStandards
551
556
  # remove refrigeration equipment
552
557
  if remove_objects
553
558
  model.getRefrigerationSystems.each(&:remove)
559
+ model.getRefrigerationCases.each(&:remove)
560
+ model.getRefrigerationWalkIns.each(&:remove)
561
+ model.getRefrigerationCompressorRacks.each(&:remove)
562
+ model.getRefrigerationCompressors.each(&:remove)
554
563
  end
555
564
 
556
565
  # Add refrigerated cases and walkins
557
- standard.model_add_typical_refrigeration(model, primary_bldg_type)
566
+ OpenstudioStandards::Refrigeration.create_typical_refrigeration(model, template: refrigeration_template)
558
567
  end
559
568
 
560
569
  # @todo add slab modeling and slab insulation
@@ -575,7 +584,7 @@ module OpenstudioStandards
575
584
  next if standard.space_type_get_standards_data(space_type).empty?
576
585
 
577
586
  # the last bool test it to make thermostat schedules. They are added to the model but not assigned
578
- standard.space_type_apply_internal_load_schedules(space_type, false, false, false, false, false, false, true)
587
+ standard.space_type_apply_internal_load_schedules(space_type, false, false, false, false, false, true)
579
588
 
580
589
  # identify thermal thermostat and apply to zones (apply_internal_load_schedules names )
581
590
  model.getThermostatSetpointDualSetpoints.sort.each do |thermostat|
@@ -803,6 +812,11 @@ module OpenstudioStandards
803
812
  # Apply the HVAC efficiency standard
804
813
  standard.model_apply_hvac_efficiency_standard(model, climate_zone)
805
814
  end
815
+
816
+ # adjust infiltration schedules
817
+ if add_infiltration
818
+ OpenstudioStandards::Infiltration.model_set_nist_infiltration_schedules(model)
819
+ end
806
820
  end
807
821
 
808
822
  # set unmet hours tolerance
@@ -919,13 +933,13 @@ module OpenstudioStandards
919
933
  space_types_new << space_type
920
934
 
921
935
  # add internal loads (the nil check isn't necessary, but I will keep it in as a warning instad of an error)
922
- test = standard.space_type_apply_internal_loads(space_type, true, true, true, true, true, true)
936
+ test = standard.space_type_apply_internal_loads(space_type, true, true, true, true, true)
923
937
  if test.nil?
924
938
  OpenStudio.logFree(OpenStudio::Warn, 'openstudio.standards.CreateTypical', "Could not add loads for #{space_type.name}. Not expected for #{template} #{lookup_building_type}")
925
939
  end
926
940
 
927
941
  # the last bool test it to make thermostat schedules. They are added to the model but not assigned
928
- standard.space_type_apply_internal_load_schedules(space_type, true, true, true, true, true, true, true)
942
+ standard.space_type_apply_internal_load_schedules(space_type, true, true, true, true, true, true)
929
943
 
930
944
  # assign colors
931
945
  standard.space_type_apply_rendering_color(space_type)
@@ -0,0 +1,160 @@
1
+ module OpenstudioStandards
2
+ # The CreateTypical module provides methods to create and modify an entire building energy model of a typical building
3
+ module CreateTypical
4
+ # @!group Space Type Information
5
+ # Assigns information like number of units, number of beds, number of students, etc. to spaces in the model. Some methods that add exterior lighting or elevators require this information
6
+
7
+ # Assign information like number of units, number of beds, number of students, etc. to spaces in the model.
8
+ #
9
+ # @param model [OpenStudio::Model::Model] OpenStudio model object
10
+ # @param assign_properties_to_spaces [Boolean] Assign properties to Space objects
11
+ # @return [Hash] A hash of space properties
12
+ def self.model_get_space_information(model, assign_properties_to_spaces: true)
13
+ spaces_hash = {}
14
+
15
+ model.getSpaces.sort.each do |space|
16
+ space_type = space.spaceType.is_initialized ? space.spaceType.get : nil
17
+ next if space_type.nil?
18
+
19
+ # skip space if not part of floor area
20
+ next unless space.partofTotalFloorArea
21
+
22
+ standards_building_type = space_type.standardsBuildingType.is_initialized ? space_type.standardsBuildingType.get : nil
23
+ standards_space_type = space_type.standardsSpaceType.is_initialized ? space_type.standardsSpaceType.get : nil
24
+ next if standards_space_type.nil?
25
+
26
+ effective_number_of_spaces = space.multiplier
27
+ floor_area = space.floorArea * space.multiplier
28
+ number_of_people = space.numberOfPeople * space.multiplier
29
+
30
+ # determine number of units
31
+ number_of_units = 0
32
+ case standards_space_type
33
+ when 'GuestRoom', 'GuestRm', 'GuestRmOcc', 'GuestRmUnOcc', 'GuestRoom123Occ', 'GuestRoom123Vac', 'GuestRoom4Occ', 'GuestRoom4Vac', 'PatientRoom', 'PatRoom'
34
+ average_unit_size = OpenStudio.convert(350.0, 'ft^2', 'm^2').get
35
+ average_unit_size = OpenStudio.convert(280.0, 'ft^2', 'm^2').get if standards_building_type == 'LargeHotel'
36
+ number_of_units = floor_area / average_unit_size
37
+ when 'Apartment', 'ResBedroom', 'ResLiving'
38
+ average_unit_size = OpenStudio.convert(950.0, 'ft^2', 'm^2').get
39
+ number_of_units = floor_area / average_unit_size
40
+ when 'Strip mall - type 1', 'Strip mall - type 2', 'Strip mall - type 3'
41
+ average_unit_size = OpenStudio.convert(2250.0, 'ft^2', 'm^2').get
42
+ number_of_units = floor_area / average_unit_size
43
+ end
44
+
45
+ # determine number of beds
46
+ number_of_beds = 0
47
+ case standards_space_type
48
+ when 'PatientRoom', 'PatRoom', 'HspSurgOutptLab', 'HspNursing', 'ICU_PatRm', 'ICU_Open'
49
+ number_of_beds = number_of_people
50
+ end
51
+
52
+ # determine number of students
53
+ number_of_students = 0
54
+ case standards_space_type
55
+ when 'Classroom'
56
+ # assume 1 teacher
57
+ number_of_students = number_of_people - 1.0
58
+ end
59
+
60
+ # populate space hash
61
+ spaces_hash[space] = {}
62
+ spaces_hash[space][:standards_building_type] = standards_building_type
63
+ spaces_hash[space][:standards_space_type] = standards_space_type
64
+ spaces_hash[space][:effective_number_of_spaces] = effective_number_of_spaces
65
+ spaces_hash[space][:floor_area] = floor_area
66
+ spaces_hash[space][:number_of_people] = number_of_people
67
+ spaces_hash[space][:number_of_units] = number_of_units
68
+ spaces_hash[space][:number_of_beds] = number_of_beds
69
+ spaces_hash[space][:number_of_students] = number_of_students
70
+
71
+ if assign_properties_to_spaces
72
+ space.additionalProperties.setFeature('number_of_units', number_of_units)
73
+ space.additionalProperties.setFeature('number_of_beds', number_of_beds)
74
+ space.additionalProperties.setFeature('number_of_students', number_of_students)
75
+ end
76
+ end
77
+
78
+ return spaces_hash
79
+ end
80
+
81
+ # Assign information like number of units, number of beds, number of students, etc. to space types in the model.
82
+ #
83
+ # @param model [OpenStudio::Model::Model] OpenStudio model object
84
+ # @param assign_properties_to_space_types [Boolean] Aggregate and assign properties to SpaceType objects
85
+ # @return [Hash] A hash of space type properties
86
+ def self.model_get_space_type_information(model, assign_properties_to_space_types: true)
87
+ space_properties = OpenstudioStandards::CreateTypical.model_get_space_information(model, assign_properties_to_spaces: false)
88
+
89
+ space_type_hash = {}
90
+ model.getSpaceTypes.sort.each do |space_type|
91
+ standards_building_type = space_type.standardsBuildingType.is_initialized ? space_type.standardsBuildingType.get : nil
92
+ standards_space_type = space_type.standardsSpaceType.is_initialized ? space_type.standardsSpaceType.get : nil
93
+ next if standards_space_type.nil?
94
+
95
+ effective_number_of_spaces = 0
96
+ floor_area = 0.0
97
+ number_of_people = 0
98
+ number_of_units = 0
99
+ number_of_beds = 0
100
+ number_of_students = 0
101
+ space_type.spaces.sort.each do |space|
102
+ # skip space if not part of floor area
103
+ next unless space.partofTotalFloorArea
104
+
105
+ effective_number_of_spaces += space_properties[space][:effective_number_of_spaces]
106
+ floor_area += space_properties[space][:floor_area]
107
+ number_of_people += space_properties[space][:number_of_people]
108
+ number_of_units += space_properties[space][:number_of_units]
109
+ number_of_beds += space_properties[space][:number_of_beds]
110
+ number_of_students += space_properties[space][:number_of_students]
111
+ end
112
+
113
+ space_type_hash[space_type] = {}
114
+ space_type_hash[space_type][:standards_building_type] = standards_building_type
115
+ space_type_hash[space_type][:standards_space_type] = standards_space_type
116
+ space_type_hash[space_type][:effective_number_of_spaces] = effective_number_of_spaces
117
+ space_type_hash[space_type][:floor_area] = floor_area
118
+ space_type_hash[space_type][:number_of_people] = number_of_people
119
+ space_type_hash[space_type][:number_of_units] = number_of_units
120
+ space_type_hash[space_type][:number_of_beds] = number_of_beds
121
+ space_type_hash[space_type][:number_of_students] = number_of_students
122
+
123
+ if assign_properties_to_space_types
124
+ space_type.additionalProperties.setFeature('number_of_units', number_of_units)
125
+ space_type.additionalProperties.setFeature('number_of_beds', number_of_beds)
126
+ space_type.additionalProperties.setFeature('number_of_students', number_of_students)
127
+ end
128
+ end
129
+
130
+ return space_type_hash
131
+ end
132
+
133
+ # Assign information like number of units, number of beds, number of students, etc. to the building object in the model.
134
+ #
135
+ # @param model [OpenStudio::Model::Model] OpenStudio model object
136
+ # @param assign_properties_to_building [Boolean] Aggregate and assign properties to the Building object
137
+ # @return [Hash] A hash of building properties
138
+ def self.model_get_building_information(model, assign_properties_to_building: true)
139
+ space_type_properties = OpenstudioStandards::CreateTypical.model_get_space_type_information(model, assign_properties_to_space_types: false)
140
+
141
+ building = model.getBuilding
142
+ building_hash = {}
143
+ building_hash[:standards_building_type] = building.standardsBuildingType.is_initialized ? building.standardsBuildingType.get : nil
144
+ building_hash[:effective_number_of_spaces] = space_type_properties.values.sum { |v| v[:effective_number_of_spaces] || 0 }
145
+ building_hash[:floor_area] = space_type_properties.values.sum { |v| v[:floor_area] || 0 }
146
+ building_hash[:number_of_people] = space_type_properties.values.sum { |v| v[:number_of_people] || 0 }
147
+ building_hash[:number_of_units] = space_type_properties.values.sum { |v| v[:number_of_units] || 0 }
148
+ building_hash[:number_of_beds] = space_type_properties.values.sum { |v| v[:number_of_beds] || 0 }
149
+ building_hash[:number_of_students] = space_type_properties.values.sum { |v| v[:number_of_students] || 0 }
150
+
151
+ if assign_properties_to_building
152
+ building.additionalProperties.setFeature('number_of_units', building_hash[:number_of_units])
153
+ building.additionalProperties.setFeature('number_of_beds', building_hash[:number_of_beds])
154
+ building.additionalProperties.setFeature('number_of_students', building_hash[:number_of_students])
155
+ end
156
+
157
+ return building_hash
158
+ end
159
+ end
160
+ end