openstudio-standards 0.7.1 → 0.8.0.rc2

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 (363) 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 +22 -21
  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.CentralAirSourceHeatPump.rb +1 -1
  34. data/lib/openstudio-standards/prototypes/common/objects/Prototype.Fan.rb +0 -7
  35. data/lib/openstudio-standards/prototypes/common/objects/Prototype.HeatExchangerAirToAirSensibleAndLatent.rb +36 -18
  36. data/lib/openstudio-standards/prototypes/common/objects/Prototype.Model.hvac.rb +1 -1
  37. data/lib/openstudio-standards/prototypes/common/objects/Prototype.Model.rb +121 -239
  38. data/lib/openstudio-standards/prototypes/common/objects/Prototype.hvac_systems.rb +179 -151
  39. data/lib/openstudio-standards/prototypes/common/objects/Prototype.refrigeration.rb +0 -466
  40. data/lib/openstudio-standards/prototypes/common/objects/Prototype.utilities.rb +18 -2
  41. data/lib/openstudio-standards/refrigeration/create_case.rb +125 -0
  42. data/lib/openstudio-standards/refrigeration/create_compressor.rb +78 -0
  43. data/lib/openstudio-standards/refrigeration/create_compressor_rack.rb +48 -0
  44. data/lib/openstudio-standards/refrigeration/create_refrigeration_system.rb +74 -0
  45. data/lib/openstudio-standards/refrigeration/create_typical_refrigeration.rb +161 -0
  46. data/lib/openstudio-standards/refrigeration/create_walkin.rb +116 -0
  47. data/lib/openstudio-standards/refrigeration/data/refrigerated_cases.csv +31 -0
  48. data/lib/openstudio-standards/refrigeration/data/refrigerated_walkins.csv +76 -0
  49. data/lib/openstudio-standards/refrigeration/data/refrigeration_compressors.csv +13 -0
  50. data/lib/openstudio-standards/refrigeration/data/typical_refrigerated_cases.csv +17 -0
  51. data/lib/openstudio-standards/refrigeration/data/typical_refrigerated_walkins.csv +53 -0
  52. data/lib/openstudio-standards/refrigeration/information.rb +130 -0
  53. data/lib/openstudio-standards/schedules/parametric.rb +1 -1
  54. data/lib/openstudio-standards/service_water_heating/create_typical.rb +299 -0
  55. data/lib/openstudio-standards/service_water_heating/create_water_heating_loop.rb +16 -14
  56. data/lib/openstudio-standards/service_water_heating/data/convert_data.rb +119 -0
  57. data/lib/openstudio-standards/service_water_heating/data/typical_water_use_equipment.csv +54 -0
  58. data/lib/openstudio-standards/service_water_heating/data/typical_water_use_equipment.json +810 -0
  59. data/lib/openstudio-standards/service_water_heating/information.rb +69 -0
  60. data/lib/openstudio-standards/sql_file/fenestration.rb +1 -1
  61. data/lib/openstudio-standards/standards/Standards.AirConditionerVariableRefrigerantFlow.rb +154 -0
  62. data/lib/openstudio-standards/standards/Standards.AirLoopHVAC.rb +35 -12
  63. data/lib/openstudio-standards/standards/Standards.CoilCoolingDXMultiSpeed.rb +110 -61
  64. data/lib/openstudio-standards/standards/Standards.CoilCoolingDXSingleSpeed.rb +128 -29
  65. data/lib/openstudio-standards/standards/Standards.CoilCoolingDXTwoSpeed.rb +103 -38
  66. data/lib/openstudio-standards/standards/Standards.CoilCoolingWaterToAirHeatPumpEquationFit.rb +1 -1
  67. data/lib/openstudio-standards/standards/Standards.CoilDX.rb +106 -5
  68. data/lib/openstudio-standards/standards/Standards.CoilHeatingGasMultiStage.rb +8 -8
  69. data/lib/openstudio-standards/standards/Standards.CoolingTower.rb +44 -17
  70. data/lib/openstudio-standards/standards/Standards.Fan.rb +32 -21
  71. data/lib/openstudio-standards/standards/Standards.FluidCooler.rb +45 -18
  72. data/lib/openstudio-standards/standards/Standards.HeatExchangerSensLat.rb +14 -9
  73. data/lib/openstudio-standards/standards/Standards.Model.rb +294 -76
  74. data/lib/openstudio-standards/standards/Standards.Motor.rb +66 -0
  75. data/lib/openstudio-standards/standards/Standards.PlanarSurface.rb +2 -1
  76. data/lib/openstudio-standards/standards/Standards.Pump.rb +34 -20
  77. data/lib/openstudio-standards/standards/Standards.ServiceWaterHeating.rb +0 -353
  78. data/lib/openstudio-standards/standards/Standards.Space.rb +3 -107
  79. data/lib/openstudio-standards/standards/Standards.SpaceType.rb +2 -57
  80. data/lib/openstudio-standards/standards/Standards.Surface.rb +11 -3
  81. data/lib/openstudio-standards/standards/Standards.ThermalZone.rb +1 -120
  82. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2004/data/ashrae_90_1_2004.computer_room_acs.json +142 -0
  83. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2004/data/ashrae_90_1_2004.economizers.json +1006 -596
  84. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2004/data/ashrae_90_1_2004.energy_recovery.json +724 -0
  85. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2004/data/ashrae_90_1_2004.ext_ltg.json +1258 -163
  86. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2004/data/ashrae_90_1_2004.motors.json +1070 -140
  87. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2004/data/ashrae_90_1_2004.spc_typ.json +33 -3374
  88. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2004/data/ashrae_90_1_2004.unitary_acs.json +1400 -340
  89. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2004/data/ashrae_90_1_2004.vrfs.json +769 -0
  90. 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
  91. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2007/data/ashrae_90_1_2007.computer_room_acs.json +142 -0
  92. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2007/data/ashrae_90_1_2007.economizers.json +1006 -596
  93. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2007/data/ashrae_90_1_2007.energy_recovery.json +724 -0
  94. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2007/data/ashrae_90_1_2007.ext_ltg.json +1258 -163
  95. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2007/data/ashrae_90_1_2007.motors.json +1070 -140
  96. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2007/data/ashrae_90_1_2007.spc_typ.json +15 -3343
  97. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2007/data/ashrae_90_1_2007.unitary_acs.json +1840 -372
  98. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2007/data/ashrae_90_1_2007.vrfs.json +769 -0
  99. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2010/ashrae_90_1_2010.AirLoopHVAC.rb +20 -10
  100. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2010/ashrae_90_1_2010.Space.rb +0 -9
  101. 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
  102. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2010/data/ashrae_90_1_2010.computer_room_acs.json +142 -0
  103. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2010/data/ashrae_90_1_2010.economizers.json +1006 -628
  104. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2010/data/ashrae_90_1_2010.energy_recovery.json +718 -712
  105. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2010/data/ashrae_90_1_2010.ext_ltg.json +1438 -163
  106. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2010/data/ashrae_90_1_2010.motors.json +2552 -182
  107. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2010/data/ashrae_90_1_2010.spc_typ.json +14 -3368
  108. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2010/data/ashrae_90_1_2010.unitary_acs.json +2348 -352
  109. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2010/data/ashrae_90_1_2010.vrfs.json +769 -0
  110. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2013/ashrae_90_1_2013.AirLoopHVAC.rb +47 -61
  111. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2013/ashrae_90_1_2013.Model.rb +6 -0
  112. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2013/ashrae_90_1_2013.Motor.rb +11 -0
  113. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2013/ashrae_90_1_2013.Space.rb +0 -9
  114. 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
  115. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2013/data/ashrae_90_1_2013.computer_room_acs.json +142 -0
  116. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2013/data/ashrae_90_1_2013.economizers.json +1006 -628
  117. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2013/data/ashrae_90_1_2013.energy_recovery.json +1358 -1346
  118. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2013/data/ashrae_90_1_2013.ext_ltg.json +1438 -163
  119. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2013/data/ashrae_90_1_2013.motors.json +1359 -189
  120. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2013/data/ashrae_90_1_2013.spc_typ.json +19 -3451
  121. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2013/data/ashrae_90_1_2013.unitary_acs.json +2176 -616
  122. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2013/data/ashrae_90_1_2013.vrfs.json +616 -0
  123. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2016/ashrae_90_1_2016.AirLoopHVAC.rb +47 -61
  124. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2016/ashrae_90_1_2016.Model.rb +9 -0
  125. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2016/ashrae_90_1_2016.Motor.rb +11 -0
  126. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2016/ashrae_90_1_2016.Space.rb +0 -9
  127. 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
  128. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2016/data/ashrae_90_1_2016.computer_room_acs.json +142 -0
  129. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2016/data/ashrae_90_1_2016.economizers.json +1006 -628
  130. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2016/data/ashrae_90_1_2016.energy_recovery.json +1188 -1424
  131. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2016/data/ashrae_90_1_2016.ext_ltg.json +1498 -163
  132. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2016/data/ashrae_90_1_2016.motors.json +1769 -189
  133. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2016/data/ashrae_90_1_2016.spc_typ.json +15 -3422
  134. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2016/data/ashrae_90_1_2016.unitary_acs.json +1807 -408
  135. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2016/data/ashrae_90_1_2016.vrfs.json +1024 -0
  136. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2019/ashrae_90_1_2019.AirLoopHVAC.rb +70 -87
  137. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2019/ashrae_90_1_2019.Model.rb +9 -0
  138. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2019/ashrae_90_1_2019.Motor.rb +11 -0
  139. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2019/ashrae_90_1_2019.Space.rb +0 -9
  140. 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
  141. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2019/data/ashrae_90_1_2019.computer_room_acs.json +142 -0
  142. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2019/data/ashrae_90_1_2019.economizers.json +1006 -628
  143. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2019/data/ashrae_90_1_2019.energy_recovery.json +2806 -3296
  144. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2019/data/ashrae_90_1_2019.ext_ltg.json +1558 -163
  145. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2019/data/ashrae_90_1_2019.motors.json +1759 -189
  146. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2019/data/ashrae_90_1_2019.spc_typ.json +16 -3448
  147. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2019/data/ashrae_90_1_2019.unitary_acs.json +2758 -422
  148. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2019/data/ashrae_90_1_2019.vrfs.json +684 -0
  149. data/lib/openstudio-standards/standards/ashrae_90_1/data/ashrae_90_1.schedules.json +14 -3318
  150. 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
  151. data/lib/openstudio-standards/standards/ashrae_90_1/doe_ref_1980_2004/data/doe_ref_1980_2004.chillers.json +1 -1
  152. data/lib/openstudio-standards/standards/ashrae_90_1/doe_ref_1980_2004/data/doe_ref_1980_2004.economizers.json +953 -207
  153. data/lib/openstudio-standards/standards/ashrae_90_1/doe_ref_1980_2004/data/doe_ref_1980_2004.energy_recovery.json +724 -0
  154. data/lib/openstudio-standards/standards/ashrae_90_1/doe_ref_1980_2004/data/doe_ref_1980_2004.ext_ltg.json +5 -5
  155. data/lib/openstudio-standards/standards/ashrae_90_1/doe_ref_1980_2004/data/doe_ref_1980_2004.spc_typ.json +11 -2858
  156. data/lib/openstudio-standards/standards/ashrae_90_1/doe_ref_1980_2004/doe_ref_1980_2004.AirConditionerVariableRefrigerantFlow.rb +13 -0
  157. data/lib/openstudio-standards/standards/ashrae_90_1/doe_ref_1980_2004/doe_ref_1980_2004.Model.rb +0 -18
  158. 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
  159. data/lib/openstudio-standards/standards/ashrae_90_1/doe_ref_pre_1980/data/doe_ref_pre_1980.chillers.json +0 -51
  160. data/lib/openstudio-standards/standards/ashrae_90_1/doe_ref_pre_1980/data/doe_ref_pre_1980.economizers.json +953 -207
  161. data/lib/openstudio-standards/standards/ashrae_90_1/doe_ref_pre_1980/data/doe_ref_pre_1980.energy_recovery.json +724 -0
  162. data/lib/openstudio-standards/standards/ashrae_90_1/doe_ref_pre_1980/data/doe_ref_pre_1980.ext_ltg.json +5 -5
  163. data/lib/openstudio-standards/standards/ashrae_90_1/doe_ref_pre_1980/data/doe_ref_pre_1980.spc_typ.json +9 -2830
  164. data/lib/openstudio-standards/standards/ashrae_90_1/doe_ref_pre_1980/doe_ref_pre_1980.AirConditionerVariableRefrigerantFlow.rb +13 -0
  165. data/lib/openstudio-standards/standards/ashrae_90_1/doe_ref_pre_1980/doe_ref_pre_1980.Model.rb +0 -18
  166. data/lib/openstudio-standards/standards/ashrae_90_1/nrel_zne_ready_2017/data/nrel_zne_ready_2017.economizers.json +1006 -564
  167. data/lib/openstudio-standards/standards/ashrae_90_1/nrel_zne_ready_2017/data/nrel_zne_ready_2017.energy_recovery.json +1264 -0
  168. data/lib/openstudio-standards/standards/ashrae_90_1/nrel_zne_ready_2017/data/nrel_zne_ready_2017.ext_ltg.json +5 -5
  169. data/lib/openstudio-standards/standards/ashrae_90_1/nrel_zne_ready_2017/data/nrel_zne_ready_2017.spc_typ.json +0 -1079
  170. data/lib/openstudio-standards/standards/ashrae_90_1/nrel_zne_ready_2017/nrel_zne_ready_2017.AirLoopHVAC.rb +132 -288
  171. data/lib/openstudio-standards/standards/ashrae_90_1/nrel_zne_ready_2017/nrel_zne_ready_2017.HeatExchangerSensLat.rb +44 -20
  172. data/lib/openstudio-standards/standards/ashrae_90_1/nrel_zne_ready_2017/nrel_zne_ready_2017.Model.rb +11 -0
  173. data/lib/openstudio-standards/standards/ashrae_90_1/nrel_zne_ready_2017/nrel_zne_ready_2017.Space.rb +0 -8
  174. data/lib/openstudio-standards/standards/ashrae_90_1/ze_aedg_multifamily/data/ze_aedg_multifamily.economizers.json +1006 -564
  175. data/lib/openstudio-standards/standards/ashrae_90_1/ze_aedg_multifamily/data/ze_aedg_multifamily.energy_recovery.json +1264 -0
  176. data/lib/openstudio-standards/standards/ashrae_90_1/ze_aedg_multifamily/data/ze_aedg_multifamily.ext_ltg.json +5 -5
  177. data/lib/openstudio-standards/standards/ashrae_90_1/ze_aedg_multifamily/data/ze_aedg_multifamily.spc_typ.json +0 -1079
  178. data/lib/openstudio-standards/standards/ashrae_90_1/ze_aedg_multifamily/ze_aedg_multifamily.AirLoopHVAC.rb +137 -288
  179. data/lib/openstudio-standards/standards/ashrae_90_1/ze_aedg_multifamily/ze_aedg_multifamily.HeatExchangerSensLat.rb +44 -20
  180. data/lib/openstudio-standards/standards/ashrae_90_1/ze_aedg_multifamily/ze_aedg_multifamily.Model.rb +11 -0
  181. data/lib/openstudio-standards/standards/ashrae_90_1/ze_aedg_multifamily/ze_aedg_multifamily.Space.rb +0 -9
  182. data/lib/openstudio-standards/standards/ashrae_90_1_prm/ashrae_90_1_prm.AirLoopHVAC.rb +12 -10
  183. data/lib/openstudio-standards/standards/ashrae_90_1_prm/ashrae_90_1_prm.CoilCoolingDXSingleSpeed.rb +8 -6
  184. data/lib/openstudio-standards/standards/ashrae_90_1_prm/ashrae_90_1_prm.CoilCoolingDXTwoSpeed.rb +8 -6
  185. data/lib/openstudio-standards/standards/ashrae_90_1_prm/ashrae_90_1_prm.CoilDX.rb +9 -3
  186. data/lib/openstudio-standards/standards/ashrae_90_1_prm/ashrae_90_1_prm.Fan.rb +6 -40
  187. data/lib/openstudio-standards/standards/ashrae_90_1_prm/ashrae_90_1_prm.Model.rb +30 -337
  188. data/lib/openstudio-standards/standards/ashrae_90_1_prm/ashrae_90_1_prm.Space.rb +4 -5
  189. data/lib/openstudio-standards/standards/ashrae_90_1_prm/ashrae_90_1_prm.SpaceType.rb +1 -2
  190. data/lib/openstudio-standards/standards/ashrae_90_1_prm/ashrae_90_1_prm.rb +56 -3
  191. data/lib/openstudio-standards/standards/ashrae_90_1_prm/ashrae_90_1_prm_2019/ashrae_90_1_prm_2019.Model.rb +80 -0
  192. data/lib/openstudio-standards/standards/ashrae_90_1_prm/ashrae_90_1_prm_2019/ashrae_90_1_prm_2019.rb +0 -10
  193. data/lib/openstudio-standards/standards/ashrae_90_1_prm/ashrae_90_1_prm_2019/ashrae_90_1_prm_2019_WaterHeaterMixed.rb +35 -0
  194. data/lib/openstudio-standards/standards/ashrae_90_1_prm/ashrae_90_1_prm_2019/data/ashrae_90_1_prm_2019.economizers.json +550 -0
  195. 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
  196. 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
  197. 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
  198. data/lib/openstudio-standards/standards/ashrae_90_1_prm/ashrae_90_1_prm_2019/data/ashrae_90_1_prm_2019.motors.json +225 -245
  199. 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
  200. 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
  201. data/lib/openstudio-standards/standards/ashrae_90_1_prm/userdata_csv/userdata_enums.rb +19 -3
  202. data/lib/openstudio-standards/standards/ashrae_90_1_prm/userdata_json/userdata_airloop_hvac.json +185 -0
  203. data/lib/openstudio-standards/standards/ashrae_90_1_prm/userdata_json/userdata_airloop_hvac_doas.json +127 -0
  204. data/lib/openstudio-standards/standards/ashrae_90_1_prm/userdata_json/userdata_building.json +121 -0
  205. data/lib/openstudio-standards/standards/ashrae_90_1_prm/userdata_json/userdata_design_specification_outdoor_air.json +49 -0
  206. data/lib/openstudio-standards/standards/ashrae_90_1_prm/userdata_json/userdata_electric_equipment.json +113 -0
  207. data/lib/openstudio-standards/standards/ashrae_90_1_prm/userdata_json/userdata_exterior_lights.json +120 -0
  208. data/lib/openstudio-standards/standards/ashrae_90_1_prm/userdata_json/userdata_space.json +388 -0
  209. data/lib/openstudio-standards/standards/ashrae_90_1_prm/userdata_json/userdata_spacetype.json +367 -0
  210. data/lib/openstudio-standards/standards/ashrae_90_1_prm/userdata_json/userdata_thermal_zone.json +56 -0
  211. data/lib/openstudio-standards/standards/ashrae_90_1_prm/userdata_json/userdata_wateruse_connections.json +37 -0
  212. data/lib/openstudio-standards/standards/ashrae_90_1_prm/userdata_json/userdata_wateruse_equipment.json +69 -0
  213. data/lib/openstudio-standards/standards/ashrae_90_1_prm/userdata_json/userdata_wateruse_equipment_definition.json +37 -0
  214. data/lib/openstudio-standards/standards/cbes/cbes_pre_1978/data/cbes_pre_1978.ext_ltg.json +5 -5
  215. data/lib/openstudio-standards/standards/cbes/cbes_t24_1978/data/cbes_t24_1978.ext_ltg.json +5 -5
  216. data/lib/openstudio-standards/standards/cbes/cbes_t24_1992/data/cbes_t24_1992.ext_ltg.json +5 -5
  217. data/lib/openstudio-standards/standards/cbes/cbes_t24_2001/data/cbes_t24_2001.ext_ltg.json +5 -5
  218. data/lib/openstudio-standards/standards/cbes/cbes_t24_2005/data/cbes_t24_2005.ext_ltg.json +5 -5
  219. data/lib/openstudio-standards/standards/cbes/cbes_t24_2008/data/cbes_t24_2008.ext_ltg.json +5 -5
  220. data/lib/openstudio-standards/standards/deer/deer_1985/comstock_deer_1985/data/comstock_deer_1985.ext_ltg.json +5 -5
  221. data/lib/openstudio-standards/standards/deer/deer_1985/data/deer_1985.ext_ltg.json +5 -5
  222. data/lib/openstudio-standards/standards/deer/deer_1996/comstock_deer_1996/data/comstock_deer_1996.ext_ltg.json +5 -5
  223. data/lib/openstudio-standards/standards/deer/deer_1996/data/deer_1996.ext_ltg.json +5 -5
  224. data/lib/openstudio-standards/standards/deer/deer_2003/comstock_deer_2003/data/comstock_deer_2003.ext_ltg.json +5 -5
  225. data/lib/openstudio-standards/standards/deer/deer_2003/data/deer_2003.ext_ltg.json +5 -5
  226. data/lib/openstudio-standards/standards/deer/deer_2007/comstock_deer_2007/data/comstock_deer_2007.ext_ltg.json +5 -5
  227. data/lib/openstudio-standards/standards/deer/deer_2007/data/deer_2007.ext_ltg.json +5 -5
  228. data/lib/openstudio-standards/standards/deer/deer_2011/comstock_deer_2011/data/comstock_deer_2011.ext_ltg.json +5 -5
  229. data/lib/openstudio-standards/standards/deer/deer_2011/data/deer_2011.ext_ltg.json +5 -5
  230. data/lib/openstudio-standards/standards/deer/deer_2014/comstock_deer_2014/data/comstock_deer_2014.ext_ltg.json +5 -5
  231. data/lib/openstudio-standards/standards/deer/deer_2014/data/deer_2014.ext_ltg.json +5 -5
  232. data/lib/openstudio-standards/standards/deer/deer_2015/comstock_deer_2015/data/comstock_deer_2015.ext_ltg.json +5 -5
  233. data/lib/openstudio-standards/standards/deer/deer_2015/data/deer_2015.ext_ltg.json +5 -5
  234. data/lib/openstudio-standards/standards/deer/deer_2017/comstock_deer_2017/data/comstock_deer_2017.ext_ltg.json +5 -5
  235. data/lib/openstudio-standards/standards/deer/deer_2017/data/deer_2017.ext_ltg.json +5 -5
  236. data/lib/openstudio-standards/standards/deer/deer_2020/comstock_deer_2020/data/comstock_deer_2020.ext_ltg.json +5 -5
  237. data/lib/openstudio-standards/standards/deer/deer_2020/data/deer_2020.ext_ltg.json +5 -5
  238. data/lib/openstudio-standards/standards/deer/deer_2025/comstock_deer_2025/data/comstock_deer_2025.ext_ltg.json +5 -5
  239. data/lib/openstudio-standards/standards/deer/deer_2025/data/deer_2025.ext_ltg.json +5 -5
  240. data/lib/openstudio-standards/standards/deer/deer_2030/comstock_deer_2030/data/comstock_deer_2030.ext_ltg.json +5 -5
  241. data/lib/openstudio-standards/standards/deer/deer_2030/data/deer_2030.ext_ltg.json +5 -5
  242. data/lib/openstudio-standards/standards/deer/deer_2035/comstock_deer_2035/data/comstock_deer_2035.ext_ltg.json +5 -5
  243. data/lib/openstudio-standards/standards/deer/deer_2035/data/deer_2035.ext_ltg.json +5 -5
  244. data/lib/openstudio-standards/standards/deer/deer_2040/comstock_deer_2040/data/comstock_deer_2040.ext_ltg.json +5 -5
  245. data/lib/openstudio-standards/standards/deer/deer_2040/data/deer_2040.ext_ltg.json +5 -5
  246. data/lib/openstudio-standards/standards/deer/deer_2045/comstock_deer_2045/data/comstock_deer_2045.ext_ltg.json +5 -5
  247. data/lib/openstudio-standards/standards/deer/deer_2045/data/deer_2045.ext_ltg.json +5 -5
  248. data/lib/openstudio-standards/standards/deer/deer_2050/comstock_deer_2050/data/comstock_deer_2050.ext_ltg.json +5 -5
  249. data/lib/openstudio-standards/standards/deer/deer_2050/data/deer_2050.ext_ltg.json +5 -5
  250. data/lib/openstudio-standards/standards/deer/deer_2055/comstock_deer_2055/data/comstock_deer_2055.ext_ltg.json +5 -5
  251. data/lib/openstudio-standards/standards/deer/deer_2055/data/deer_2055.ext_ltg.json +5 -5
  252. data/lib/openstudio-standards/standards/deer/deer_2060/comstock_deer_2060/data/comstock_deer_2060.ext_ltg.json +5 -5
  253. data/lib/openstudio-standards/standards/deer/deer_2060/data/deer_2060.ext_ltg.json +5 -5
  254. data/lib/openstudio-standards/standards/deer/deer_2065/comstock_deer_2065/data/comstock_deer_2065.ext_ltg.json +5 -5
  255. data/lib/openstudio-standards/standards/deer/deer_2065/data/deer_2065.ext_ltg.json +5 -5
  256. data/lib/openstudio-standards/standards/deer/deer_2070/comstock_deer_2070/data/comstock_deer_2070.ext_ltg.json +5 -5
  257. data/lib/openstudio-standards/standards/deer/deer_2070/data/deer_2070.ext_ltg.json +5 -5
  258. data/lib/openstudio-standards/standards/deer/deer_2075/comstock_deer_2075/data/comstock_deer_2075.ext_ltg.json +5 -5
  259. data/lib/openstudio-standards/standards/deer/deer_2075/data/deer_2075.ext_ltg.json +5 -5
  260. data/lib/openstudio-standards/standards/deer/deer_pre_1975/comstock_deer_pre_1975/data/comstock_deer_pre_1975.ext_ltg.json +5 -5
  261. data/lib/openstudio-standards/standards/deer/deer_pre_1975/data/deer_pre_1975.ext_ltg.json +5 -5
  262. data/lib/openstudio-standards/standards/necb/BTAPPRE1980/btap_pre1980.rb +10 -1
  263. data/lib/openstudio-standards/standards/necb/BTAPPRE1980/data/unitary_acs.json +20 -20
  264. data/lib/openstudio-standards/standards/necb/ECMS/hvac_systems.rb +379 -27
  265. data/lib/openstudio-standards/standards/necb/NECB2011/autozone.rb +1 -4
  266. data/lib/openstudio-standards/standards/necb/NECB2011/beps_compliance_path.rb +0 -1
  267. data/lib/openstudio-standards/standards/necb/NECB2011/data/fuel_type_sets.json +1 -1
  268. data/lib/openstudio-standards/standards/necb/NECB2011/data/unitary_acs.json +20 -20
  269. data/lib/openstudio-standards/standards/necb/NECB2011/hvac_systems.rb +34 -22
  270. data/lib/openstudio-standards/standards/necb/NECB2011/necb_2011.rb +76 -23
  271. data/lib/openstudio-standards/standards/necb/NECB2011/necb_shw_calculation.xlsx +0 -0
  272. data/lib/openstudio-standards/standards/necb/NECB2011/service_water_heating.rb +4 -5
  273. data/lib/openstudio-standards/standards/necb/NECB2011/system_fuels.rb +6 -2
  274. data/lib/openstudio-standards/standards/necb/NECB2015/data/unitary_acs.json +26 -24
  275. data/lib/openstudio-standards/standards/necb/NECB2015/hvac_systems.rb +2 -1
  276. data/lib/openstudio-standards/standards/necb/NECB2020/data/unitary_acs.json +38 -32
  277. data/lib/openstudio-standards/standards/necb/common/btap_data.rb +215 -18
  278. data/lib/openstudio-standards/standards/necb/common/btap_datapoint.rb +190 -15
  279. data/lib/openstudio-standards/standards/necb/common/national_carbon_price_sched_feb_2025.json +60 -0
  280. data/lib/openstudio-standards/standards/necb/common/utility_pricing_2025-02-20.csv +92 -0
  281. data/lib/openstudio-standards/utilities/ruleset_check.rb +204 -0
  282. data/lib/openstudio-standards/version.rb +1 -1
  283. data/lib/openstudio-standards/weather/information.rb +1 -1
  284. data/lib/openstudio-standards.rb +32 -12
  285. metadata +78 -80
  286. data/lib/openstudio-standards/prototypes/ashrae_90_1/doe_ref_1980_2004/doe_ref_1980_2004.refrigeration.rb +0 -13
  287. data/lib/openstudio-standards/prototypes/ashrae_90_1/doe_ref_pre_1980/doe_ref_pre_1980.refrigeration.rb +0 -13
  288. data/lib/openstudio-standards/prototypes/cbes/cbes.refrigeration.rb +0 -13
  289. data/lib/openstudio-standards/prototypes/common/objects/Prototype.Model.exterior_lights.rb +0 -432
  290. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2004/ashrae_90_1_2004.Space.rb +0 -11
  291. 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
  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_cases.json +0 -1456
  293. 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
  294. 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
  295. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2007/ashrae_90_1_2007.Space.rb +0 -11
  296. 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
  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_cases.json +0 -1456
  298. 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
  299. 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
  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_cases.json +0 -1456
  301. 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
  302. 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
  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_cases.json +0 -1456
  304. 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
  305. 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
  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_cases.json +0 -763
  307. 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
  308. 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
  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_cases.json +0 -763
  310. 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
  311. 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
  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_cases.json +0 -1456
  313. 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
  314. 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
  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_cases.json +0 -1456
  316. 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
  317. 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
  318. data/lib/openstudio-standards/standards/cbes/cbes.Space.rb +0 -11
  319. data/lib/openstudio-standards/standards/cbes/cbes_t24_2005/cbes_t24_2005.Space.rb +0 -11
  320. data/lib/openstudio-standards/standards/cbes/cbes_t24_2008/cbes_t24_2008.Space.rb +0 -11
  321. data/lib/openstudio-standards/standards/deer/deer.Space.rb +0 -20
  322. data/lib/openstudio-standards/standards/deer/deer_1985/data/deer_1985.ref_cases.json +0 -1456
  323. data/lib/openstudio-standards/standards/deer/deer_1985/data/deer_1985.ref_lnup.json +0 -562
  324. data/lib/openstudio-standards/standards/deer/deer_1996/data/deer_1996.ref_cases.json +0 -1456
  325. data/lib/openstudio-standards/standards/deer/deer_1996/data/deer_1996.ref_lnup.json +0 -562
  326. data/lib/openstudio-standards/standards/deer/deer_2003/data/deer_2003.ref_cases.json +0 -1456
  327. data/lib/openstudio-standards/standards/deer/deer_2003/data/deer_2003.ref_lnup.json +0 -562
  328. data/lib/openstudio-standards/standards/deer/deer_2007/data/deer_2007.ref_cases.json +0 -1456
  329. data/lib/openstudio-standards/standards/deer/deer_2007/data/deer_2007.ref_lnup.json +0 -562
  330. data/lib/openstudio-standards/standards/deer/deer_2011/data/deer_2011.ref_cases.json +0 -1456
  331. data/lib/openstudio-standards/standards/deer/deer_2011/data/deer_2011.ref_lnup.json +0 -562
  332. data/lib/openstudio-standards/standards/deer/deer_2014/data/deer_2014.ref_cases.json +0 -1456
  333. data/lib/openstudio-standards/standards/deer/deer_2014/data/deer_2014.ref_lnup.json +0 -562
  334. data/lib/openstudio-standards/standards/deer/deer_2015/data/deer_2015.ref_cases.json +0 -1456
  335. data/lib/openstudio-standards/standards/deer/deer_2015/data/deer_2015.ref_lnup.json +0 -562
  336. data/lib/openstudio-standards/standards/deer/deer_2017/data/deer_2017.ref_cases.json +0 -1456
  337. data/lib/openstudio-standards/standards/deer/deer_2017/data/deer_2017.ref_lnup.json +0 -562
  338. data/lib/openstudio-standards/standards/deer/deer_2020/data/deer_2020.ref_cases.json +0 -1456
  339. data/lib/openstudio-standards/standards/deer/deer_2020/data/deer_2020.ref_lnup.json +0 -562
  340. data/lib/openstudio-standards/standards/deer/deer_2025/data/deer_2025.ref_cases.json +0 -1456
  341. data/lib/openstudio-standards/standards/deer/deer_2025/data/deer_2025.ref_lnup.json +0 -562
  342. data/lib/openstudio-standards/standards/deer/deer_2030/data/deer_2030.ref_cases.json +0 -1456
  343. data/lib/openstudio-standards/standards/deer/deer_2030/data/deer_2030.ref_lnup.json +0 -562
  344. data/lib/openstudio-standards/standards/deer/deer_2035/data/deer_2035.ref_cases.json +0 -1456
  345. data/lib/openstudio-standards/standards/deer/deer_2035/data/deer_2035.ref_lnup.json +0 -562
  346. data/lib/openstudio-standards/standards/deer/deer_2040/data/deer_2040.ref_cases.json +0 -1456
  347. data/lib/openstudio-standards/standards/deer/deer_2040/data/deer_2040.ref_lnup.json +0 -562
  348. data/lib/openstudio-standards/standards/deer/deer_2045/data/deer_2045.ref_cases.json +0 -1456
  349. data/lib/openstudio-standards/standards/deer/deer_2045/data/deer_2045.ref_lnup.json +0 -562
  350. data/lib/openstudio-standards/standards/deer/deer_2050/data/deer_2050.ref_cases.json +0 -1456
  351. data/lib/openstudio-standards/standards/deer/deer_2050/data/deer_2050.ref_lnup.json +0 -562
  352. data/lib/openstudio-standards/standards/deer/deer_2055/data/deer_2055.ref_cases.json +0 -1456
  353. data/lib/openstudio-standards/standards/deer/deer_2055/data/deer_2055.ref_lnup.json +0 -562
  354. data/lib/openstudio-standards/standards/deer/deer_2060/data/deer_2060.ref_cases.json +0 -1456
  355. data/lib/openstudio-standards/standards/deer/deer_2060/data/deer_2060.ref_lnup.json +0 -562
  356. data/lib/openstudio-standards/standards/deer/deer_2065/data/deer_2065.ref_cases.json +0 -1456
  357. data/lib/openstudio-standards/standards/deer/deer_2065/data/deer_2065.ref_lnup.json +0 -562
  358. data/lib/openstudio-standards/standards/deer/deer_2070/data/deer_2070.ref_cases.json +0 -1456
  359. data/lib/openstudio-standards/standards/deer/deer_2070/data/deer_2070.ref_lnup.json +0 -562
  360. data/lib/openstudio-standards/standards/deer/deer_2075/data/deer_2075.ref_cases.json +0 -1456
  361. data/lib/openstudio-standards/standards/deer/deer_2075/data/deer_2075.ref_lnup.json +0 -562
  362. data/lib/openstudio-standards/standards/deer/deer_pre_1975/data/deer_pre_1975.ref_cases.json +0 -1456
  363. 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