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
@@ -7,7 +7,8 @@ class BTAPData
7
7
 
8
8
  def initialize(model:, runner: nil, cost_result:, baseline_cost_equipment_total_cost_per_m_sq: -1.0,
9
9
  baseline_cost_utility_neb_total_cost_per_m_sq: -1.0, baseline_energy_eui_total_gj_per_m_sq: -1.0, qaqc:,
10
- npv_start_year:, npv_end_year:, npv_discount_rate:)
10
+ npv_start_year: 2022, npv_end_year: 2041, npv_discount_rate: 0.03, npv_discount_rate_carbon: 0.03, oerd_utility_pricing: nil,
11
+ utility_pricing_year: 2020)
11
12
  @model = model
12
13
  @error_warning = []
13
14
  # sets sql file.
@@ -17,6 +18,7 @@ class BTAPData
17
18
  @btap_data = {}
18
19
  @btap_results_version = 1.00
19
20
  @neb_prices_csv_file_name = File.join(__dir__, 'neb_end_use_prices.csv')
21
+ @neb_prices_csv_file_name = File.join(__dir__, 'utility_pricing_2025-02-20.csv') if oerd_utility_pricing.to_bool
20
22
  @necb_reference_runs_csv_file_name = File.join(__dir__, 'necb_reference_runs.csv')
21
23
 
22
24
  # Conditioned floor area is used so much. May as well make it a object variable.
@@ -49,7 +51,7 @@ class BTAPData
49
51
  @btap_data.merge!(service_water_heating_data)
50
52
  @btap_data.merge!(energy_eui_data(model))
51
53
  @btap_data.merge!(energy_peak_data)
52
- @btap_data.merge!(utility(model))
54
+ @btap_data.merge!(utility(model: model, utility_pricing_year: utility_pricing_year))
53
55
  @btap_data.merge!(unmet_hours(model))
54
56
  @btap_data.merge!outdoor_air_data(model)
55
57
 
@@ -87,8 +89,10 @@ class BTAPData
87
89
  phius_performance_indicators(model)
88
90
  # The below method calculates energy performance indicators (i.e. TEDI and MEUI) as per BC Energy Step Code
89
91
  bc_energy_step_code_performance_indicators
92
+ # calculates annual peak electricity cost (dollar)
93
+ annual_peak_kW_per_m_sq = oerd_electricity_cost(model: model, utility_pricing_year: utility_pricing_year, oerd_utility_pricing: oerd_utility_pricing)
90
94
  # calculate net present value
91
- net_present_value(npv_start_year, npv_end_year, npv_discount_rate) unless cost_result.nil?
95
+ net_present_value(npv_start_year: npv_start_year, npv_end_year: npv_end_year, npv_discount_rate: npv_discount_rate, npv_discount_rate_carbon: npv_discount_rate_carbon, oerd_utility_pricing: oerd_utility_pricing, annual_peak_kW_per_m_sq: annual_peak_kW_per_m_sq) unless cost_result.nil?
92
96
 
93
97
  measure_metrics(qaqc)
94
98
  @btap_data
@@ -171,35 +175,43 @@ class BTAPData
171
175
  return building_data
172
176
  end
173
177
 
174
- def net_present_value(npv_start_year, npv_end_year, npv_discount_rate)
178
+ def net_present_value(npv_start_year: 2022, npv_end_year: 2041, npv_discount_rate: 0.03, npv_discount_rate_carbon: 0.03, oerd_utility_pricing: false, annual_peak_kW_per_m_sq: nil)
175
179
 
176
180
  # Find end year in the neb data
177
181
  neb_header = CSV.read(@neb_prices_csv_file_name, headers: true).headers
178
182
  neb_header.delete_if { |item| ["building_type", "province", "fuel_type"].include?(item) } # remove "building_type", "province", "fuel_type" from neb_header in order to have only years in neb_header
183
+ neb_header.delete_if { |item| ["rate_class", "units", "references", "links"].include?(item) } if oerd_utility_pricing # remove additional headers if the OERD data is used
179
184
  neb_header.map(&:to_f) #convert years to float
180
185
  year_max = neb_header.max
181
186
 
182
187
  # Convert a string to a float
183
- if npv_start_year.instance_of?(String) && npv_start_year != 'NECB_Default' && npv_start_year != 'none'
188
+ if npv_start_year.instance_of?(String) && npv_start_year != 'NECB_Default' && npv_start_year != 'none' && !npv_start_yeay.nil?
184
189
  npv_start_year = npv_start_year.to_f
185
190
  end
186
- if npv_end_year.instance_of?(String) && npv_end_year != 'NECB_Default' && npv_end_year != 'none'
191
+ if npv_end_year.instance_of?(String) && npv_end_year != 'NECB_Default' && npv_end_year != 'none' && !npv_end_year.nil?
187
192
  npv_end_year = npv_end_year.to_f
188
193
  end
189
- if npv_discount_rate.instance_of?(String) && npv_discount_rate != 'NECB_Default' && npv_discount_rate != 'none'
194
+ if npv_discount_rate.instance_of?(String) && npv_discount_rate != 'NECB_Default' && npv_discount_rate != 'none' && !npv_discount_rate.nil?
190
195
  npv_discount_rate = npv_discount_rate.to_f
191
196
  end
197
+ if npv_discount_rate_carbon.instance_of?(String) && npv_discount_rate_carbon != 'NECB_Default' && npv_discount_rate_carbon != 'none' && !npv_discount_rate_carbon.nil?
198
+ npv_discount_rate_carbon = npv_discount_rate_carbon.to_f
199
+ end
200
+
192
201
 
193
202
  # Set default npv_start_year as 2022, npv_end_year as 2041, npv_discount_rate as 3%
194
- if npv_start_year == 'NECB_Default' || npv_start_year == nil || npv_start_year == 'none'
203
+ if npv_start_year == 'NECB_Default' || npv_start_year.nil? || npv_start_year == 'none'
195
204
  npv_start_year = 2022
196
205
  end
197
- if npv_end_year == 'NECB_Default' || npv_end_year == nil || npv_end_year == 'none'
206
+ if npv_end_year == 'NECB_Default' || npv_end_year.nil? || npv_end_year == 'none'
198
207
  npv_end_year = 2041
199
208
  end
200
- if npv_discount_rate == 'NECB_Default' || npv_discount_rate == nil || npv_discount_rate == 'none'
209
+ if npv_discount_rate == 'NECB_Default' || npv_discount_rate.nil? || npv_discount_rate == 'none'
201
210
  npv_discount_rate = 0.03
202
211
  end
212
+ if npv_discount_rate_carbon == 'NECB_Default' || npv_discount_rate_carbon.nil? || npv_discount_rate_carbon == 'none'
213
+ npv_discount_rate_carbon = 0.03
214
+ end
203
215
 
204
216
  # Set npv_end_year as year_max if users' input > neb's end year
205
217
  if npv_end_year > year_max.to_f
@@ -211,7 +223,7 @@ class BTAPData
211
223
  # puts "npv_discount_rate is #{npv_discount_rate}"
212
224
 
213
225
  # Get energy end-use prices (CER data from https://apps.cer-rec.gc.ca/ftrppndc/dflt.aspx?GoCTemplateCulture=en-CA)
214
- @neb_prices_csv_file_name = "#{File.dirname(__FILE__)}/neb_end_use_prices.csv"
226
+ # @neb_prices_csv_file_name = "#{File.dirname(__FILE__)}/neb_end_use_prices.csv"
215
227
 
216
228
  # Create a hash of the neb data.
217
229
  neb_data = CSV.parse(File.read(@neb_prices_csv_file_name), headers: true, converters: :numeric).map(&:to_h)
@@ -233,20 +245,36 @@ class BTAPData
233
245
  onsite_elec_generation = @btap_data['total_site_eui_gj_per_m_sq'] - @btap_data['net_site_eui_gj_per_m_sq']
234
246
  if onsite_elec_generation > 0.0
235
247
  eui_elec = @btap_data['energy_eui_electricity_gj_per_m_sq'] - onsite_elec_generation
248
+ # Calculate the saved GHG emissions from onsite electricity generatation (assume it does not emmit GHGs)
249
+ ghg_saved = get_utility_ghg_kg_per_gj(province: province_abbreviation, fuel_type: "Electricity") * onsite_elec_generation
250
+ # Convert to tonnes of ghg/m^2
251
+ ghg_elec = (@btap_data['cost_utility_ghg_electricity_kg_per_m_sq'].to_f - ghg_saved.to_f)/1000.0
236
252
  else
237
253
  eui_elec = @btap_data['energy_eui_electricity_gj_per_m_sq']
254
+ # Convert to tonnes of ghg/m^2
255
+ ghg_elec = @btap_data['cost_utility_ghg_electricity_kg_per_m_sq'].to_f/1000.0
238
256
  end
239
257
  # puts "onsite_elec_generation is #{onsite_elec_generation}"
240
258
  # puts "eui_elec is #{eui_elec}"
241
259
  row = neb_data.detect do |data|
242
260
  (data['building_type'] == building_type) && (data['province'] == province) && (data['fuel_type'] == 'Electricity')
243
261
  end
262
+ row_peak = nil
263
+ if oerd_utility_pricing && !annual_peak_kW_per_m_sq.nil?
264
+ row_peak = neb_data.detect do |data|
265
+ (data['building_type'] == building_type) && (data['province'] == province) && (data['fuel_type'] == 'Electricity Peak')
266
+ end
267
+ end
244
268
  npv_elec = 0.0
245
269
  year_index = 1.0
270
+ npv_elec_ghg = 0.0
271
+ npv_elec_peak = 0.0
246
272
  if eui_elec > 0.0
247
273
  for year in npv_start_year.to_int..npv_end_year.to_int
248
274
  # puts "year, #{year}, #{row[year.to_s]}, year_index, #{year_index}"
249
275
  npv_elec += (eui_elec * row[year.to_s]) / (1+npv_discount_rate)**year_index
276
+ npv_elec_ghg += (ghg_elec * get_national_ghg_cost(year: year.to_i)) / (1+npv_discount_rate_carbon)**year_index
277
+ npv_elec_peak += (annual_peak_kW_per_m_sq * row_peak[year.to_s]) / (1+npv_discount_rate)**year_index unless row_peak.nil? || annual_peak_kW_per_m_sq.nil?
250
278
  year_index += 1.0
251
279
  end
252
280
  end
@@ -254,35 +282,46 @@ class BTAPData
254
282
 
255
283
  # Calculate npv of natural gas
256
284
  eui_ngas= @btap_data['energy_eui_natural_gas_gj_per_m_sq']
285
+ # Convert to tonnes of ghg/m^2
286
+ ghg_ngas = @btap_data['cost_utility_ghg_natural gas_kg_per_m_sq'].to_f/1000.0
257
287
  row = neb_data.detect do |data|
258
288
  (data['building_type'] == building_type) && (data['province'] == province) && (data['fuel_type'] == 'Natural Gas')
259
289
  end
260
290
  npv_ngas = 0.0
291
+ npv_ngas_ghg = 0.0
261
292
  year_index = 1.0
262
293
  for year in npv_start_year.to_int..npv_end_year.to_int
263
294
  npv_ngas += (eui_ngas * row[year.to_s]) / (1+npv_discount_rate)**year_index
295
+ npv_ngas_ghg += (ghg_ngas * get_national_ghg_cost(year: year.to_i)) / (1+npv_discount_rate_carbon)**year_index
264
296
  year_index += 1.0
265
297
  end
266
298
  # puts "npv_ngas is #{npv_ngas}"
267
299
 
268
300
  # Calculate npv of oil
269
301
  eui_oil= @btap_data['energy_eui_additional_fuel_gj_per_m_sq']
302
+ # Convert to tonnes of ghg/m^2
303
+ ghg_oil = @btap_data['cost_utility_ghg_oil_kg_per_m_sq'].to_f/1000.0
270
304
  row = neb_data.detect do |data|
271
305
  (data['building_type'] == building_type) && (data['province'] == province) && (data['fuel_type'] == 'Oil')
272
306
  end
273
307
  npv_oil = 0.0
308
+ npv_oil_ghg = 0.0
274
309
  year_index = 1.0
275
310
  for year in npv_start_year.to_int..npv_end_year.to_int
276
311
  npv_oil += (eui_oil * row[year.to_s]) / (1+npv_discount_rate)**year_index
312
+ npv_oil_ghg += (ghg_oil * get_national_ghg_cost(year: year.to_i)) / (1+npv_discount_rate_carbon)**year_index
277
313
  year_index += 1.0
278
314
  end
279
315
  # puts "npv_oil is #{npv_oil}"
280
316
 
281
317
  # Calculate total npv
282
318
  npv_total = @btap_data['cost_equipment_total_cost_per_m_sq'] + npv_elec + npv_ngas + npv_oil
283
-
319
+ npv_ghg_total = npv_elec_ghg + npv_ngas_ghg + npv_oil_ghg
320
+ npv_total_with_ghg_and_peak = npv_ghg_total + npv_total + npv_elec_peak
284
321
  @btap_data.merge!('npv_total_per_m_sq' => npv_total)
285
-
322
+ @btap_data.merge!('npv_carbon_pricing_per_m_sq' => npv_ghg_total)
323
+ @btap_data.merge!('npv_peak_elec_per_m_sq' => npv_elec_peak)
324
+ @btap_data.merge!('npv_with_carbon_and_peak_pricing_total_per_m_sq' => npv_total_with_ghg_and_peak)
286
325
  end
287
326
 
288
327
  def envelope(model)
@@ -515,7 +554,148 @@ class BTAPData
515
554
  return geography_data
516
555
  end
517
556
 
518
- def utility(model)
557
+ ### The 'annual_peak_electricity_cost_dollar' function calculates annual peak electricity cost (dollar)
558
+ ### for OEE-Electrification project using the OERD's electricity rates for commercial buildings
559
+ ### that Danielle Krauel of OEE provided to CE-O
560
+ def oerd_electricity_cost(model:, utility_pricing_year: 2020, oerd_utility_pricing: false)
561
+ unless oerd_utility_pricing
562
+ @btap_data.merge!('cost_utility_oerd_electricity_peak_annual_cost_per_m_sq' => 0.00) unless oerd_utility_pricing
563
+ @btap_data.merge!('cost_utility_oerd_electricity_energy_annual_cost_per_m_sq' => 0.00) unless oerd_utility_pricing
564
+ return 0.00
565
+ end
566
+
567
+ #===================================================================================================================
568
+ ### OERD's electricity rates for commercial buildings
569
+ neb_data = CSV.parse(File.read(@neb_prices_csv_file_name), headers: true, converters: :numeric).map(&:to_h)
570
+ #===================================================================================================================
571
+ #===================================================================================================================
572
+ #===================================================================================================================
573
+ #===================================================================================================================
574
+ #===================================================================================================================
575
+ ##################### Calculate annual electricity peak cost using OERD's electricity rate #########################
576
+ #===================================================================================================================
577
+ #===================================================================================================================
578
+ ### Find index for hourly data of 'ElectricityNet:Facility' (J)
579
+ query = "
580
+ SELECT ReportDataDictionaryIndex
581
+ FROM ReportDataDictionary
582
+ WHERE Name=='ElectricityNet:Facility' AND ReportingFrequency == 'Hourly' AND Units == 'J'
583
+ "
584
+ index_timestep_electricity = model.sqlFile.get.execAndReturnVectorOfInt(query).get[0]
585
+ number_of_timesteps_per_hour = 1
586
+ puts "Trying hourly ElectricityNet:Facility"
587
+
588
+ ### Find index for timestep data of 'Electricity:Facility' (J) if 'ElectricityNet:Facility' data is not available
589
+ if index_timestep_electricity.nil?
590
+ query = "
591
+ SELECT ReportDataDictionaryIndex
592
+ FROM ReportDataDictionary
593
+ WHERE Name=='Electricity:Facility' AND ReportingFrequency == 'Zone Timestep' AND Units == 'J'
594
+ "
595
+ index_timestep_electricity = model.sqlFile.get.execAndReturnVectorOfInt(query).get[0]
596
+ number_of_timesteps_per_hour = model.getTimestep.numberOfTimestepsPerHour
597
+ puts "Trying timestep Electricity:Facility"
598
+ end
599
+
600
+ ### Find index for hourly data of 'Electricity:Facility' (J) if timestep data is not available
601
+ if index_timestep_electricity.nil?
602
+ query = "
603
+ SELECT ReportDataDictionaryIndex
604
+ FROM ReportDataDictionary
605
+ WHERE Name=='Electricity:Facility' AND ReportingFrequency == 'Hourly' AND Units == 'J'
606
+ "
607
+ index_timestep_electricity = model.sqlFile.get.execAndReturnVectorOfInt(query).get[0]
608
+ number_of_timesteps_per_hour = 1
609
+ puts "Trying hourly Electricity:Facility"
610
+ end
611
+
612
+ if index_timestep_electricity.nil?
613
+ puts "No hourly or timestep data available. Peak data not available"
614
+ @btap_data.merge!('cost_utility_oerd_electricity_peak_annual_cost_per_m_sq' => 0.00) unless oerd_utility_pricing
615
+ @btap_data.merge!('cost_utility_oerd_electricity_energy_annual_cost_per_m_sq' => 0.00) unless oerd_utility_pricing
616
+ return 0.00
617
+ end
618
+ ### Get number of timesteps from the model
619
+ timestep_second = 3600 / number_of_timesteps_per_hour
620
+ #===================================================================================================================
621
+ ### Calculate number of timesteps of the whole year, and create dates/times for the whole year
622
+ number_of_timesteps_of_year = 365 * 24 * number_of_timesteps_per_hour
623
+ timesteps_of_year = []
624
+ d = Time.new(2006, 1, 1, 0)
625
+ (0...number_of_timesteps_of_year).each do |increment|
626
+ timesteps_of_year << (d + (60 * 60 / number_of_timesteps_per_hour) * increment).strftime('%Y-%m-%d %H:%M')
627
+ end
628
+ #===================================================================================================================
629
+
630
+ #===================================================================================================================
631
+ ### Get timestep output for Electricity:Facility output.
632
+ query = "
633
+ Select VariableValue
634
+ FROM ReportVariableData
635
+ WHERE
636
+ ReportVariableDataDictionaryIndex = #{index_timestep_electricity}
637
+ "
638
+ timestep_values = model.sqlFile.get.execAndReturnVectorOfDouble(query).get
639
+ #===================================================================================================================
640
+ ### Calculate electricity peak (J) for each month of the year
641
+ # Find month of each timestep
642
+ keys_month = timesteps_of_year.map{ |timestep| DateTime.parse(timestep).to_date.month }
643
+ # Create a hash where its keys are months and values for eahc month are electricity energy use (J) of all timesteps for that month
644
+ hash_months_electricity = keys_month.zip(timestep_values).group_by(&:first).map{|key, value| [key, value.map(&:last)]}.to_h
645
+ # Find maximum of electricity energy use (J) among all timesteps for each month of the year
646
+ monthly_peak_J = hash_months_electricity.map { |key, value| [key, value.max()] }.to_h
647
+ #===================================================================================================================
648
+ ### Convert J to kW of maximum electricity energy use (J)
649
+ monthly_peak_kW = monthly_peak_J.map { |key, value| [key, value * 0.001 / timestep_second] }.to_h
650
+ ### Normalize by building floor area
651
+ annual_peak_kW_per_m_sq = monthly_peak_kW.values.sum / @btap_data['bldg_conditioned_floor_area_m_sq'].to_f
652
+ #===================================================================================================================
653
+ ### Get province of the model and find its peak electricity price from the utility_pricing_2025-02-20.csv
654
+ province = @btap_data['location_state_province_region']
655
+ # Find which province the proposed building is located in
656
+ building_type = 'Commercial'
657
+ geography_data = climate_data
658
+ province_abbreviation = geography_data['location_state_province_region']
659
+ province = @standards_data['province_map'][province_abbreviation]
660
+ row_peak = neb_data.detect do |data|
661
+ (data['building_type'] == building_type) && (data['province'] == province) && (data['fuel_type'] == 'Electricity Peak')
662
+ end
663
+ province_dollar_kW_month = row_peak[utility_pricing_year.to_i.to_s]
664
+ #===================================================================================================================
665
+ ### Calculate cost of peak electricity for each month
666
+ monthly_peak_cost = monthly_peak_kW.map { |key, value| [key, value * province_dollar_kW_month] }.to_h
667
+ #===================================================================================================================
668
+ ### Calculate cost of peak electricity for the whole year in dollar
669
+ annual_peak_cost_dollar = monthly_peak_cost.values.sum
670
+ #===================================================================================================================
671
+ ### Calculate cost of peak electricity for the whole year in dollar normalized by floor area
672
+ annual_peak_cost_dollar_per_m_sq = annual_peak_cost_dollar / @btap_data['bldg_conditioned_floor_area_m_sq']
673
+ #===================================================================================================================
674
+ ### Merge the calculated value to @btap_data
675
+ @btap_data.merge!('cost_utility_oerd_electricity_peak_annual_cost_per_m_sq' => annual_peak_cost_dollar_per_m_sq.round(2))
676
+ #===================================================================================================================
677
+ #===================================================================================================================
678
+ #===================================================================================================================
679
+ #===================================================================================================================
680
+ #===================================================================================================================
681
+ ################### Calculate annual electricity energy use cost using OERD's electricity rate #####################
682
+ #===================================================================================================================
683
+ ### Get province of the model and find its peak electricity price from the pricing_2025-02-20.csv
684
+ row_elec = neb_data.detect do |data|
685
+ (data['building_type'] == building_type) && (data['province'] == province) && (data['fuel_type'] == 'Electricity')
686
+ end
687
+ province_dollar_kWh = row_elec[utility_pricing_year.to_i.to_s]
688
+ #===================================================================================================================
689
+ # Calculate cost of energy electricity for the whole year in dollar normalized by floor area
690
+ annual_energy_cost_dollar_per_m_sq = @btap_data['energy_eui_electricity_gj_per_m_sq'] * 277.778 * province_dollar_kWh
691
+ #===================================================================================================================
692
+ ### Merge the calculated value to @btap_data
693
+ @btap_data.merge!('cost_utility_oerd_electricity_energy_annual_cost_per_m_sq' => annual_energy_cost_dollar_per_m_sq.round(2))
694
+ #===================================================================================================================
695
+ return annual_peak_kW_per_m_sq
696
+ end
697
+
698
+ def utility(model:, utility_pricing_year: 2020)
519
699
  economics_data = {}
520
700
  building_type = 'Commercial'
521
701
  province = @standards_data['province_map'][model.getWeatherFile.stateProvinceRegion]
@@ -538,12 +718,14 @@ class BTAPData
538
718
  neb_data = CSV.parse(File.read(@neb_prices_csv_file_name), headers: true, converters: :numeric).map(&:to_h)
539
719
 
540
720
  neb_eplus_fuel_map.each do |neb_fuel, ep_fuel|
721
+ next if neb_fuel.to_s.downcase == 'electricity peak'
541
722
  row = neb_data.detect do |data|
542
- (data['building_type'] == building_type) &&
543
- (data['province'] == province) &&
544
- (data['fuel_type'] == neb_fuel)
723
+ (data['building_type'].to_s == building_type) &&
724
+ (data['province'].to_s == province) &&
725
+ (data['fuel_type'].to_s == neb_fuel)
545
726
  end
546
- neb_fuel_cost = row['2021']
727
+ utility_pricing_year_s = utility_pricing_year.to_i.to_s
728
+ neb_fuel_cost = row[utility_pricing_year_s]
547
729
  fuel_consumption_gj = 0.0
548
730
  sql_command = "SELECT Value FROM tabulardatawithstrings
549
731
  WHERE ReportName='EnergyMeters'
@@ -2282,4 +2464,19 @@ class BTAPData
2282
2464
  end
2283
2465
  # def phius_metrics(model)
2284
2466
  end
2467
+
2468
+ def get_national_ghg_cost(year:)
2469
+ raise "Nil year submitted for national ghg cost" if year.nil?
2470
+ year = year.to_i
2471
+ if year < 2019
2472
+ price = 0.0
2473
+ elsif (year >= 2019) && (year <= 2030)
2474
+ ghg_price_data = @standards_data["tables"]["canada_national_carbon_pricing"]["table"]
2475
+ year_price = ghg_price_data.detect { |item| (item["year"].to_i == year) }
2476
+ price = year_price["price_per_tonne"].to_f
2477
+ elsif (year > 2030)
2478
+ price = 170.0
2479
+ end
2480
+ return price.to_f
2481
+ end
2285
2482
  end
@@ -84,6 +84,7 @@ class BTAPDatapoint
84
84
  @npv_start_year = @options[:npv_start_year]
85
85
  @npv_end_year = @options[:npv_end_year]
86
86
  @npv_discount_rate = @options[:npv_discount_rate]
87
+ @npv_discount_rate_carbon = @options[:npv_discount_rate_carbon]
87
88
 
88
89
  # Save configuration to temp folder.
89
90
  File.open(File.join(@dp_temp_folder, 'run_options.yml'), 'w') { |file| file.write(@options.to_yaml) }
@@ -93,6 +94,10 @@ class BTAPDatapoint
93
94
  @options[:template] = 'NECB2011' if @options[:algorithm_type] == 'osm_batch'
94
95
  @standard = Standard.build(@options[:template])
95
96
 
97
+ # Set use the convert_arg_to_bool method from the standard class to set the @oerd_utility_pricing_flag
98
+ @oerd_utility_pricing = @standard.convert_arg_to_bool(variable: @options[:oerd_utility_pricing], default: false)
99
+ @utility_pricing_year = @standard.convert_arg_to_f(variable: @options[:utility_pricing_year], default: 2020)
100
+
96
101
  # This allows you to select the skeleton model from our built in starting points. You can add a custom file as
97
102
  # it will search the libary first,.
98
103
  # model = load_osm(@options[:building_type]) # loads skeleton file from path.
@@ -178,11 +183,13 @@ class BTAPDatapoint
178
183
  tbd_option: @options[:tbd_option],
179
184
  necb_hdd: @options[:necb_hdd],
180
185
  boiler_fuel: @options[:boiler_fuel],
181
- boiler_cap_ratio: @options[:boiler_cap_ratio]
186
+ boiler_cap_ratio: @options[:boiler_cap_ratio],
187
+ swh_fuel: @options[:swh_fuel],
188
+ oerd_utility_pricing: @oerd_utility_pricing
182
189
  )
183
190
  end
184
191
 
185
- # Save model to to disk.
192
+ # Save model to disk.
186
193
  puts "saving model to #{File.join(@dp_temp_folder, 'output.osm')}"
187
194
  BTAP::FileIO.save_osm(model, File.join(@dp_temp_folder, 'output.osm'))
188
195
 
@@ -252,7 +259,10 @@ class BTAPDatapoint
252
259
  qaqc: @qaqc,
253
260
  npv_start_year: @npv_start_year,
254
261
  npv_end_year: @npv_end_year,
255
- npv_discount_rate: @npv_discount_rate).btap_data
262
+ npv_discount_rate: @npv_discount_rate,
263
+ npv_discount_rate_carbon: @npv_discount_rate_carbon,
264
+ oerd_utility_pricing: @oerd_utility_pricing,
265
+ utility_pricing_year: @utility_pricing_year).btap_data
256
266
 
257
267
  # Write Files
258
268
  File.open(File.join(@dp_temp_folder, 'btap_data.json'), 'w') { |f| f.write(JSON.pretty_generate(@btap_data.sort.to_h, allow_nan: true)) }
@@ -263,6 +273,9 @@ class BTAPDatapoint
263
273
 
264
274
  #output hourly data
265
275
  self.output_hourly_data(model,@dp_temp_folder, @options[:datapoint_id])
276
+
277
+ # Output timestep data
278
+ self.output_timestep_data(model,@dp_temp_folder, @options[:datapoint_id])
266
279
  end
267
280
  rescue StandardError => bang
268
281
  puts "Error occured: #{bang}"
@@ -361,8 +374,7 @@ class BTAPDatapoint
361
374
  return exit_code
362
375
  end
363
376
 
364
-
365
- def output_hourly_data(model, output_folder,datapoint_id)
377
+ def output_hourly_data(model, output_folder, datapoint_id)
366
378
  osm_path = File.join(output_folder, "run_dir/in.osm")
367
379
  sql_path = File.join(output_folder, "run_dir/run/eplusout.sql")
368
380
  csv_output = File.join(output_folder, "hourly.csv")
@@ -373,20 +385,18 @@ class BTAPDatapoint
373
385
  hours_of_year << (d + (60 * 60) * increment).strftime('%Y-%m-%d %H:%M')
374
386
  end
375
387
 
376
-
377
388
  array_of_hashes = []
378
389
 
379
-
380
- #Find hourly outputs available for this datapoint.
390
+ # Find hourly outputs available for this datapoint.
381
391
  query = "
382
392
  SELECT ReportDataDictionaryIndex
383
393
  FROM ReportDataDictionary
384
394
  WHERE ReportingFrequency == 'Hourly'
385
395
  "
386
- # Get hourly data for each output.
396
+ # Get hourly data for each output.
387
397
  model.sqlFile.get.execAndReturnVectorOfInt(query).get.each do |rdd_index|
388
398
 
389
- #Get Name
399
+ # Get Name
390
400
  query = "
391
401
  SELECT Name
392
402
  FROM ReportDataDictionary
@@ -394,7 +404,7 @@ class BTAPDatapoint
394
404
  "
395
405
  name = model.sqlFile.get.execAndReturnFirstString(query).get
396
406
 
397
- #Get KeyValue
407
+ # Get KeyValue
398
408
  query = "
399
409
  SELECT KeyValue
400
410
  FROM ReportDataDictionary
@@ -411,7 +421,7 @@ class BTAPDatapoint
411
421
  key_value = ""
412
422
  end
413
423
 
414
- #Get Units
424
+ # Get Units
415
425
  query = "
416
426
  SELECT Units
417
427
  FROM ReportDataDictionary
@@ -419,7 +429,7 @@ class BTAPDatapoint
419
429
  "
420
430
  units = model.sqlFile.get.execAndReturnFirstString(query).get
421
431
 
422
- #Get hourly data
432
+ # Get hourly data
423
433
  query = "
424
434
  Select Value
425
435
  FROM ReportData
@@ -430,7 +440,7 @@ class BTAPDatapoint
430
440
 
431
441
  hourly_hash = Hash[hours_of_year.zip(hourly_values)]
432
442
 
433
- data_hash = {"datapoint_id": datapoint_id, "Name": name, "KeyValue": key_value, "Units": units}.merge(hourly_hash)
443
+ data_hash = { "datapoint_id": datapoint_id, "Name": name, "KeyValue": key_value, "Units": units }.merge(hourly_hash)
434
444
  array_of_hashes << data_hash
435
445
  end
436
446
 
@@ -443,4 +453,169 @@ class BTAPDatapoint
443
453
  end
444
454
  end
445
455
  end
446
- end
456
+ #=====================================================================================================================
457
+ def output_timestep_data(model, output_folder,datapoint_id)
458
+ osm_path = File.join(output_folder, "run_dir/in.osm")
459
+ sql_path = File.join(output_folder, "run_dir/run/eplusout.sql")
460
+ csv_output = File.join(output_folder, "timestep.csv")
461
+ #===================================================================================================================
462
+ # Get number of timesteps from the model
463
+ number_of_timesteps_per_hour = model.getTimestep.numberOfTimestepsPerHour
464
+ #===================================================================================================================
465
+ # Calculate number of timesteps of the whole year
466
+ number_of_timesteps_of_year = 365 * 24 * number_of_timesteps_per_hour
467
+
468
+ timesteps_of_year = []
469
+ d = Time.new(2006, 1, 1, 0)
470
+ (0...number_of_timesteps_of_year).each do |increment|
471
+ timesteps_of_year << (d + (60 * 60 / number_of_timesteps_per_hour) * increment).strftime('%Y-%m-%d %H:%M')
472
+ end
473
+ timesteps_index = Array(0..number_of_timesteps_of_year-1)
474
+ #===================================================================================================================
475
+ # Create a hash with indices ('timesteps_index') as keys and timesteps as values ('timesteps_of_year')
476
+ # Note from Sara Gilani: 'I had to do this, as when I used 'timesteps_of_year' as keys to create all hashes below
477
+ # (e.g. timestep_hash_datapoint_id, timestep_hash_name, timestep_hash_key_value, ...),
478
+ # it did not create the right number of timesteps for the whole year'
479
+ timesteps_of_year_with_index = Hash[timesteps_index.zip(timesteps_of_year)]
480
+ #===================================================================================================================
481
+ array_of_hashes = []
482
+ array_of_hashes_transposed = []
483
+ #===================================================================================================================
484
+ # Find timestep outputs available for this datapoint.
485
+ query = "
486
+ SELECT ReportDataDictionaryIndex
487
+ FROM ReportDataDictionary
488
+ WHERE ReportingFrequency == 'Zone Timestep'
489
+ "
490
+ #===================================================================================================================
491
+ # Get timestep data for each output.
492
+ model.sqlFile.get.execAndReturnVectorOfInt(query).get.each do |rdd_index|
493
+ #=================================================================================================================
494
+ # Get Name
495
+ query = "
496
+ SELECT Name
497
+ FROM ReportDataDictionary
498
+ WHERE ReportDataDictionaryIndex == #{rdd_index}
499
+ "
500
+ name = model.sqlFile.get.execAndReturnFirstString(query).get
501
+ #=================================================================================================================
502
+ # Get KeyValue
503
+ query = "
504
+ SELECT KeyValue
505
+ FROM ReportDataDictionary
506
+ WHERE ReportDataDictionaryIndex == #{rdd_index}
507
+ "
508
+ #=================================================================================================================
509
+ # In some cases KeyValue has a value and sometimes it does not. In some cases KeyValue is null. If the command
510
+ # below is run and KeyValue is null then the command fails and returns an error. The fix below assumes that if
511
+ # the command below fails it is because KeyValue is null. In that case the "key_value" variable is set to a
512
+ # blank.
513
+ begin
514
+ key_value = model.sqlFile.get.execAndReturnFirstString(query).get
515
+ rescue StandardError => bang
516
+ key_value = ""
517
+ end
518
+ #=================================================================================================================
519
+ # Get Units
520
+ query = "
521
+ SELECT Units
522
+ FROM ReportDataDictionary
523
+ WHERE ReportDataDictionaryIndex == #{rdd_index}
524
+ "
525
+ units = model.sqlFile.get.execAndReturnFirstString(query).get
526
+ #=================================================================================================================
527
+ # Get timestep data
528
+ query = "
529
+ Select VariableValue
530
+ FROM ReportVariableData
531
+ WHERE
532
+ ReportVariableDataDictionaryIndex = #{rdd_index}
533
+ "
534
+ timestep_values = model.sqlFile.get.execAndReturnVectorOfDouble(query).get
535
+
536
+ timestep_hash = Hash[timesteps_index.zip(timestep_values)]
537
+
538
+ data_hash = { "datapoint_id": datapoint_id, "Name": name, "KeyValue": key_value, "Units": units }.merge(timestep_hash)
539
+
540
+ array_of_hashes << data_hash
541
+
542
+ #=================================================================================================================
543
+ # Create a hash of data for having timesteps as rows instead of columns that is used for hourly outputs START
544
+ number_of_timesteps = timesteps_of_year.length()
545
+
546
+ array = [datapoint_id]
547
+ array_datapoint_id = array.zip(*[array]*number_of_timesteps).flatten
548
+ timestep_hash_datapoint_id = Hash[timesteps_index.zip(array_datapoint_id)]
549
+
550
+ array = [name]
551
+ array_name = array.zip(*[array]*number_of_timesteps).flatten
552
+ timestep_hash_name = Hash[timesteps_index.zip(array_name)]
553
+
554
+ array = [key_value]
555
+ array_key_value = array.zip(*[array]*number_of_timesteps).flatten
556
+ timestep_hash_key_value = Hash[timesteps_index.zip(array_key_value)]
557
+
558
+ array = [units]
559
+ array_units = array.zip(*[array]*number_of_timesteps).flatten
560
+ timestep_hash_units = Hash[timesteps_index.zip(array_units)]
561
+
562
+ timestep_hash_values = Hash[timesteps_index.zip(timestep_values)]
563
+
564
+ data_hash_transposed = Hash.new
565
+ timestep_hash_values.keys.each do |key|
566
+ data_hash_transposed[key] = [
567
+ timesteps_of_year_with_index[key],
568
+ timestep_hash_datapoint_id[key],
569
+ timestep_hash_name[key],
570
+ timestep_hash_key_value[key],
571
+ timestep_hash_units[key],
572
+ timestep_hash_values[key]
573
+ ]
574
+ end
575
+
576
+ array_of_hashes_transposed << data_hash_transposed
577
+ # Create a hash of data for having timesteps as rows instead of columns that is used for hourly outputs END
578
+ #=================================================================================================================
579
+
580
+ end #model.sqlFile.get.execAndReturnVectorOfInt(query).get.each do |rdd_index|
581
+ #===================================================================================================================
582
+ # # This csv file has timesteps as the first row
583
+ # CSV.open(csv_output, "wb") do |csv|
584
+ # unless array_of_hashes.empty?
585
+ # csv << array_of_hashes.first.keys # adds the attributes name on the first line
586
+ # array_of_hashes.each do |hash|
587
+ # csv << hash.values
588
+ # end
589
+ # end
590
+ # end
591
+ #===================================================================================================================
592
+ # This csv file has timesteps as the first column
593
+ header = ['Index', 'Timestep', 'datapoint_id', 'Name', 'KeyValue', 'Units', 'Value']
594
+ CSV.open(csv_output, "wb") do |csv|
595
+ csv << header
596
+ array_of_hashes_transposed.each do |hash|
597
+ hash.keys().each do |index|
598
+ row_index = index
599
+ row_timestep = hash[index][0]
600
+ row_datapoint_id = hash[index][1]
601
+ row_name = hash[index][2]
602
+ row_key_value = hash[index][3]
603
+ row_units = hash[index][4]
604
+ row_value = hash[index][5]
605
+
606
+ row = CSV::Row.new(header,[])
607
+ row['Index'] = row_index
608
+ row['Timestep'] = row_timestep
609
+ row['datapoint_id'] = row_datapoint_id
610
+ row['Name'] = row_name
611
+ row['KeyValue'] = row_key_value
612
+ row['Units'] = row_units
613
+ row['Value'] = row_value
614
+ csv << row
615
+ end
616
+ end
617
+ end
618
+ #===================================================================================================================
619
+ end #output_timestep_data
620
+ #=====================================================================================================================
621
+ end