openstudio-standards 0.8.3 → 0.8.5.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 (330) hide show
  1. checksums.yaml +4 -4
  2. data/data/geometry/ASHRAECollege.osm +30 -30
  3. data/data/geometry/ASHRAECourthouse.osm +22 -22
  4. data/data/geometry/ASHRAESmallOfficeDetailed.osm +2 -2
  5. data/data/geometry/DEER_Asm.osm +1 -1
  6. data/data/geometry/DEER_ECC.osm +1 -1
  7. data/data/geometry/DEER_EPr.osm +1 -1
  8. data/data/geometry/DEER_ERC.osm +1 -1
  9. data/data/geometry/DEER_ESe.osm +1 -1
  10. data/data/geometry/DEER_EUn.osm +1 -1
  11. data/data/geometry/DEER_Hsp.osm +1 -1
  12. data/data/geometry/DEER_Htl.osm +1 -1
  13. data/data/geometry/DEER_MBT.osm +1 -1
  14. data/data/geometry/DEER_MFm.osm +1 -1
  15. data/data/geometry/DEER_Nrs.osm +1 -1
  16. data/data/geometry/DEER_OfL.osm +1 -1
  17. data/data/geometry/DEER_OfS.osm +1 -1
  18. data/data/geometry/DEER_RFF.osm +1 -1
  19. data/data/geometry/DEER_RSD.osm +1 -1
  20. data/data/geometry/DEER_Rt3.osm +1 -1
  21. data/data/geometry/DEER_RtS.osm +1 -1
  22. data/data/standards/export_OpenStudio_libraries.rb +2 -3
  23. data/data/standards/test_performance_expected_dd_results.csv +42 -42
  24. data/lib/openstudio-standards/btap/NECB_building_types.csv +35 -0
  25. data/lib/openstudio-standards/btap/NECB_space_types.csv +109 -0
  26. data/lib/openstudio-standards/btap/activity.rb +480 -0
  27. data/lib/openstudio-standards/btap/attributes.rb +166 -0
  28. data/lib/openstudio-standards/btap/bridging.rb +561 -1402
  29. data/lib/openstudio-standards/btap/btap.rb +4 -2
  30. data/lib/openstudio-standards/btap/btap_test_helper.rb +86 -0
  31. data/lib/openstudio-standards/btap/carbon/btap_carbon.rb +177 -0
  32. data/lib/openstudio-standards/btap/common_paths.rb +81 -0
  33. data/lib/openstudio-standards/btap/common_resources/ConstructionProperties.csv +52 -0
  34. data/lib/openstudio-standards/btap/common_resources/Constructions.csv +37 -0
  35. data/lib/openstudio-standards/btap/common_resources/carbon_frame.csv +35 -0
  36. data/lib/openstudio-standards/btap/common_resources/carbon_glazing.csv +35 -0
  37. data/lib/openstudio-standards/btap/common_resources/carbon_opaque.csv +164 -0
  38. data/lib/openstudio-standards/btap/common_resources/construction_sets.csv +1270 -0
  39. data/lib/openstudio-standards/btap/common_resources/constructions_glazing.csv +121 -0
  40. data/lib/openstudio-standards/btap/common_resources/constructions_opaque.csv +2256 -0
  41. data/lib/openstudio-standards/btap/common_resources/costs.csv +1897 -0
  42. data/lib/openstudio-standards/btap/common_resources/costs_local_factors.csv +2315 -0
  43. data/lib/openstudio-standards/btap/common_resources/hvac_vent_ahu.csv +925 -0
  44. data/lib/openstudio-standards/btap/common_resources/lighting.csv +364 -0
  45. data/lib/openstudio-standards/btap/common_resources/lighting_sets.csv +2667 -0
  46. data/lib/openstudio-standards/btap/common_resources/locations.csv +75 -0
  47. data/lib/openstudio-standards/btap/common_resources/materials_glazing.csv +35 -0
  48. data/lib/openstudio-standards/btap/common_resources/materials_hvac.csv +1686 -0
  49. data/lib/openstudio-standards/btap/common_resources/materials_lighting.csv +267 -0
  50. data/lib/openstudio-standards/btap/common_resources/materials_opaque.csv +164 -0
  51. data/lib/openstudio-standards/btap/costing/README.md +502 -0
  52. data/lib/openstudio-standards/btap/costing/btap_costing.rb +469 -0
  53. data/lib/openstudio-standards/btap/costing/btap_measure_helper.rb +359 -0
  54. data/lib/openstudio-standards/btap/costing/btap_workflow.rb +117 -0
  55. data/lib/openstudio-standards/btap/costing/copy_test_results_files_to_expected_results.rb +11 -0
  56. data/lib/openstudio-standards/btap/costing/cost_building_from_file.rb +136 -0
  57. data/lib/openstudio-standards/btap/costing/costing_database_wrapper.rb +173 -0
  58. data/lib/openstudio-standards/btap/costing/daylighting_sensor_control_costing.rb +354 -0
  59. data/lib/openstudio-standards/btap/costing/dcv_costing.rb +314 -0
  60. data/lib/openstudio-standards/btap/costing/dummy.epw +8768 -0
  61. data/lib/openstudio-standards/btap/costing/dummy.osm +5320 -0
  62. data/lib/openstudio-standards/btap/costing/envelope_costing.rb +215 -0
  63. data/lib/openstudio-standards/btap/costing/heating_cooling_costing.rb +2584 -0
  64. data/lib/openstudio-standards/btap/costing/led_lighting_costing.rb +156 -0
  65. data/lib/openstudio-standards/btap/costing/lighting_costing.rb +209 -0
  66. data/lib/openstudio-standards/btap/costing/mech_sizing.json +502 -0
  67. data/lib/openstudio-standards/btap/costing/neb_end_use_prices.csv +42 -0
  68. data/lib/openstudio-standards/btap/costing/necb_2011_spacetype_info.csv +225 -0
  69. data/lib/openstudio-standards/btap/costing/necb_reference_runs.csv +28705 -0
  70. data/lib/openstudio-standards/btap/costing/nv_costing.rb +547 -0
  71. data/lib/openstudio-standards/btap/costing/parallel_tests.rb +92 -0
  72. data/lib/openstudio-standards/btap/costing/pv_ground_costing.rb +687 -0
  73. data/lib/openstudio-standards/btap/costing/shw_costing.rb +705 -0
  74. data/lib/openstudio-standards/btap/costing/test_list.txt +15 -0
  75. data/lib/openstudio-standards/btap/costing/test_run_all_test_locally.rb +27 -0
  76. data/lib/openstudio-standards/btap/costing/test_run_costing_tests.rb +80 -0
  77. data/lib/openstudio-standards/btap/costing/ventilation_costing.rb +2616 -0
  78. data/lib/openstudio-standards/btap/geometry.rb +86 -6
  79. data/lib/openstudio-standards/btap/structure.rb +657 -0
  80. data/lib/openstudio-standards/constructions/modify.rb +2 -1
  81. data/lib/openstudio-standards/create_typical/create_typical.rb +17 -33
  82. data/lib/openstudio-standards/create_typical/space_type_ratios.rb +36 -36
  83. data/lib/openstudio-standards/equipment/create_transformer.rb +104 -0
  84. data/lib/openstudio-standards/equipment/create_typical_equipment.rb +117 -0
  85. data/lib/openstudio-standards/equipment/data/electric_equipment_space_types.json +1514 -0
  86. data/lib/openstudio-standards/equipment/data/gas_equipment_space_types.json +227 -0
  87. data/lib/openstudio-standards/exterior_lighting/create.rb +22 -22
  88. data/lib/openstudio-standards/exterior_lighting/information.rb +3 -2
  89. data/lib/openstudio-standards/hvac/components/air_conditioner_vrf.rb +482 -0
  90. data/lib/openstudio-standards/hvac/components/air_terminal.rb +31 -0
  91. data/lib/openstudio-standards/hvac/components/boiler_hot_water.rb +163 -0
  92. data/lib/openstudio-standards/hvac/components/central_air_source_heat_pump.rb +220 -0
  93. data/lib/openstudio-standards/hvac/components/chiller.rb +25 -0
  94. data/lib/openstudio-standards/hvac/components/coil.rb +276 -0
  95. data/lib/openstudio-standards/hvac/components/coil_cooling_dx_multi_speed.rb +40 -0
  96. data/lib/openstudio-standards/hvac/components/coil_cooling_dx_single_speed.rb +300 -0
  97. data/lib/openstudio-standards/hvac/components/coil_cooling_dx_two_speed.rb +187 -0
  98. data/lib/openstudio-standards/hvac/components/coil_cooling_water.rb +80 -0
  99. data/lib/openstudio-standards/hvac/components/coil_cooling_water_to_air_heat_pump_equation_fit.rb +182 -0
  100. data/lib/openstudio-standards/hvac/components/coil_heating_dx_single_speed.rb +220 -0
  101. data/lib/openstudio-standards/hvac/components/coil_heating_electric.rb +56 -0
  102. data/lib/openstudio-standards/hvac/components/coil_heating_gas.rb +90 -0
  103. data/lib/openstudio-standards/hvac/components/coil_heating_gas_multi_stage.rb +33 -0
  104. data/lib/openstudio-standards/hvac/components/coil_heating_water.rb +98 -0
  105. data/lib/openstudio-standards/hvac/components/coil_heating_water_to_air_heat_pump_equation_fit.rb +147 -0
  106. data/lib/openstudio-standards/hvac/components/component.rb +39 -0
  107. data/lib/openstudio-standards/{standards/ashrae_90_1/data/ashrae_90_1.fans.json → hvac/components/data/fans.json} +6 -6
  108. data/lib/openstudio-standards/hvac/components/fan.rb +363 -0
  109. data/lib/openstudio-standards/hvac/components/heat_exchanger_air_to_air.rb +203 -0
  110. data/lib/openstudio-standards/hvac/components/pump.rb +181 -0
  111. data/lib/openstudio-standards/hvac/controls/radiant_system_controls.rb +594 -0
  112. data/lib/openstudio-standards/hvac/conversions.rb +222 -0
  113. data/lib/openstudio-standards/hvac/curves.rb +192 -0
  114. data/lib/openstudio-standards/hvac/helpers.rb +357 -0
  115. data/lib/openstudio-standards/hvac/setpoint_managers/information.rb +4 -4
  116. data/lib/openstudio-standards/interior_lighting/create_lights.rb +52 -0
  117. data/lib/openstudio-standards/interior_lighting/create_typical_interior_lighting.rb +254 -0
  118. data/lib/openstudio-standards/interior_lighting/data/convert_lighting_data.rb +249 -0
  119. data/lib/openstudio-standards/interior_lighting/data/lighting_space_types.csv +96 -0
  120. data/lib/openstudio-standards/interior_lighting/data/lighting_space_types.json +1429 -0
  121. data/lib/openstudio-standards/interior_lighting/data/lighting_technology.csv +46 -0
  122. data/lib/openstudio-standards/interior_lighting/data/lighting_technology.json +859 -0
  123. data/lib/openstudio-standards/prototypes/ashrae_90_1/ashrae_90_1_2010/ashrae_90_1_2010.AirTerminalSingleDuctVAVReheat.rb +1 -1
  124. data/lib/openstudio-standards/prototypes/ashrae_90_1/ashrae_90_1_2013/ashrae_90_1_2013.AirTerminalSingleDuctVAVReheat.rb +1 -1
  125. data/lib/openstudio-standards/prototypes/ashrae_90_1/ashrae_90_1_2016/ashrae_90_1_2016.AirTerminalSingleDuctVAVReheat.rb +1 -1
  126. data/lib/openstudio-standards/prototypes/ashrae_90_1/ashrae_90_1_2016/ashrae_90_1_2016.Model.rb +4 -4
  127. data/lib/openstudio-standards/prototypes/ashrae_90_1/ashrae_90_1_2019/ashrae_90_1_2019.AirTerminalSingleDuctVAVReheat.rb +1 -1
  128. data/lib/openstudio-standards/prototypes/ashrae_90_1/ashrae_90_1_2019/ashrae_90_1_2019.Model.rb +4 -4
  129. data/lib/openstudio-standards/prototypes/ashrae_90_1/nrel_nze_ready_2017/nrel_zne_ready_2017.AirTerminalSingleDuctVAVReheat.rb +1 -1
  130. data/lib/openstudio-standards/prototypes/ashrae_90_1/ze_aedg_multifamily/ze_aedg_multifamily.AirTerminalSingleDuctVAVReheat.rb +1 -1
  131. data/lib/openstudio-standards/prototypes/common/buildings/Prototype.HighRiseApartment.rb +6 -7
  132. data/lib/openstudio-standards/prototypes/common/buildings/Prototype.Hospital.rb +15 -15
  133. data/lib/openstudio-standards/prototypes/common/buildings/Prototype.LargeHotel.rb +4 -4
  134. data/lib/openstudio-standards/prototypes/common/buildings/Prototype.LargeOffice.rb +5 -5
  135. data/lib/openstudio-standards/prototypes/common/buildings/Prototype.MediumOffice.rb +6 -6
  136. data/lib/openstudio-standards/prototypes/common/buildings/Prototype.Outpatient.rb +7 -7
  137. data/lib/openstudio-standards/prototypes/common/buildings/Prototype.PrimarySchool.rb +4 -4
  138. data/lib/openstudio-standards/prototypes/common/buildings/Prototype.SecondarySchool.rb +6 -6
  139. data/lib/openstudio-standards/prototypes/common/buildings/Prototype.SmallOfficeDetailed.rb +5 -1
  140. data/lib/openstudio-standards/prototypes/common/data/prototype_space_type_map.json +2594 -0
  141. data/lib/openstudio-standards/prototypes/common/data/thermostat_schedule_lookup.json +2108 -0
  142. data/lib/openstudio-standards/prototypes/common/objects/Prototype.AirTerminalSingleDuctVAVReheat.rb +33 -0
  143. data/lib/openstudio-standards/prototypes/common/objects/Prototype.Fan.rb +0 -140
  144. data/lib/openstudio-standards/prototypes/common/objects/Prototype.FanConstantVolume.rb +1 -73
  145. data/lib/openstudio-standards/prototypes/common/objects/Prototype.FanOnOff.rb +1 -69
  146. data/lib/openstudio-standards/prototypes/common/objects/Prototype.FanVariableVolume.rb +0 -116
  147. data/lib/openstudio-standards/prototypes/common/objects/Prototype.FanZoneExhaust.rb +0 -61
  148. data/lib/openstudio-standards/prototypes/common/objects/Prototype.Model.hvac.rb +2 -2
  149. data/lib/openstudio-standards/prototypes/common/objects/Prototype.Model.rb +128 -13
  150. data/lib/openstudio-standards/prototypes/common/objects/Prototype.hvac_systems.rb +606 -607
  151. data/lib/openstudio-standards/prototypes/common/prototype_space_type_map.rb +41 -0
  152. data/lib/openstudio-standards/prototypes/common/space_type_equipment_map.rb +184 -0
  153. data/lib/openstudio-standards/prototypes/common/space_type_thermostat_schedule_map.rb +116 -0
  154. data/lib/openstudio-standards/qaqc/hvac.rb +12 -12
  155. data/lib/openstudio-standards/refrigeration/create_compressor.rb +2 -5
  156. data/lib/openstudio-standards/refrigeration/data/refrigeration_compressors.csv +4 -4
  157. data/lib/openstudio-standards/service_water_heating/create_water_heater.rb +1 -2
  158. data/lib/openstudio-standards/service_water_heating/create_water_use.rb +5 -5
  159. data/lib/openstudio-standards/space_type/data/level_1_space_types.json +612 -0
  160. data/lib/openstudio-standards/space_type/standards_space_type.rb +53 -0
  161. data/lib/openstudio-standards/standards/Standards.AirConditionerVariableRefrigerantFlow.rb +8 -26
  162. data/lib/openstudio-standards/standards/Standards.AirLoopHVAC.rb +13 -13
  163. data/lib/openstudio-standards/standards/Standards.AirTerminalSingleDuctVAVReheat.rb +0 -24
  164. data/lib/openstudio-standards/standards/Standards.BoilerHotWater.rb +6 -43
  165. data/lib/openstudio-standards/standards/Standards.ChillerElectricEIR.rb +7 -24
  166. data/lib/openstudio-standards/standards/Standards.CoilCoolingDXMultiSpeed.rb +19 -44
  167. data/lib/openstudio-standards/standards/Standards.CoilCoolingDXSingleSpeed.rb +25 -50
  168. data/lib/openstudio-standards/standards/Standards.CoilCoolingDXTwoSpeed.rb +25 -33
  169. data/lib/openstudio-standards/standards/Standards.CoilCoolingWaterToAirHeatPumpEquationFit.rb +9 -22
  170. data/lib/openstudio-standards/standards/Standards.CoilDX.rb +15 -157
  171. data/lib/openstudio-standards/standards/Standards.CoilHeatingDXMultiSpeed.rb +2 -2
  172. data/lib/openstudio-standards/standards/Standards.CoilHeatingDXSingleSpeed.rb +18 -105
  173. data/lib/openstudio-standards/standards/Standards.CoilHeatingGas.rb +3 -23
  174. data/lib/openstudio-standards/standards/Standards.CoilHeatingGasMultiStage.rb +0 -24
  175. data/lib/openstudio-standards/standards/Standards.CoilHeatingWaterToAirHeatPumpEquationFit.rb +2 -86
  176. data/lib/openstudio-standards/standards/Standards.FanVariableVolume.rb +0 -107
  177. data/lib/openstudio-standards/standards/Standards.Model.rb +45 -20
  178. data/lib/openstudio-standards/standards/Standards.People.rb +113 -0
  179. data/lib/openstudio-standards/standards/Standards.PlantLoop.rb +11 -11
  180. data/lib/openstudio-standards/standards/Standards.Pump.rb +2 -147
  181. data/lib/openstudio-standards/standards/Standards.PumpVariableSpeed.rb +57 -41
  182. data/lib/openstudio-standards/standards/Standards.SpaceType.rb +30 -153
  183. data/lib/openstudio-standards/standards/Standards.Ventilation.rb +74 -0
  184. data/lib/openstudio-standards/standards/Standards.ZoneHVACComponent.rb +1 -1
  185. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2004/ashrae_90_1_2004.PlantLoop.rb +4 -4
  186. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2004/data/ashrae_90_1_2004.heat_pumps_heating.json +3 -3
  187. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2004/data/ashrae_90_1_2004.spc_typ.json +37 -112
  188. 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 +37 -102
  189. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2007/data/ashrae_90_1_2007.heat_pumps_heating.json +3 -3
  190. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2007/data/ashrae_90_1_2007.spc_typ.json +37 -112
  191. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2010/ashrae_90_1_2010.AirTerminalSingleDuctVAVReheat.rb +1 -1
  192. 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 +37 -37
  193. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2010/data/ashrae_90_1_2010.heat_pumps_heating.json +6 -6
  194. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2010/data/ashrae_90_1_2010.spc_typ.json +37 -37
  195. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2013/ashrae_90_1_2013.AirTerminalSingleDuctVAVReheat.rb +1 -1
  196. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2013/ashrae_90_1_2013.BoilerHotWater.rb +1 -1
  197. 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 +37 -102
  198. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2013/data/ashrae_90_1_2013.heat_pumps_heating.json +6 -6
  199. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2013/data/ashrae_90_1_2013.spc_typ.json +37 -37
  200. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2016/ashrae_90_1_2016.AirTerminalSingleDuctVAVReheat.rb +1 -1
  201. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2016/ashrae_90_1_2016.BoilerHotWater.rb +1 -1
  202. 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 +45 -109
  203. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2016/data/ashrae_90_1_2016.heat_pumps_heating.json +6 -6
  204. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2016/data/ashrae_90_1_2016.spc_typ.json +37 -37
  205. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2019/ashrae_90_1_2019.AirLoopHVAC.rb +1 -1
  206. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2019/ashrae_90_1_2019.AirTerminalSingleDuctVAVReheat.rb +1 -1
  207. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2019/ashrae_90_1_2019.BoilerHotWater.rb +1 -1
  208. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2019/ashrae_90_1_2019.CoilHeatingGas.rb +1 -1
  209. 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 +45 -109
  210. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2019/data/ashrae_90_1_2019.heat_pumps_heating.json +6 -6
  211. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2019/data/ashrae_90_1_2019.spc_typ.json +37 -37
  212. data/lib/openstudio-standards/standards/ashrae_90_1/data/ashrae_90_1.curves.json +0 -200
  213. 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 +37 -37
  214. data/lib/openstudio-standards/standards/ashrae_90_1/doe_ref_1980_2004/data/doe_ref_1980_2004.spc_typ.json +37 -37
  215. 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 +37 -37
  216. data/lib/openstudio-standards/standards/ashrae_90_1/doe_ref_pre_1980/data/doe_ref_pre_1980.spc_typ.json +37 -37
  217. data/lib/openstudio-standards/standards/ashrae_90_1/nrel_zne_ready_2017/nrel_zne_ready_2017.AirTerminalSingleDuctVAVReheat.rb +1 -1
  218. data/lib/openstudio-standards/standards/ashrae_90_1/nrel_zne_ready_2017/nrel_zne_ready_2017.PlantLoop.rb +5 -5
  219. data/lib/openstudio-standards/standards/ashrae_90_1/ze_aedg_multifamily/ze_aedg_multifamily.AirTerminalSingleDuctVAVReheat.rb +1 -1
  220. data/lib/openstudio-standards/standards/ashrae_90_1/ze_aedg_multifamily/ze_aedg_multifamily.PlantLoop.rb +5 -5
  221. data/lib/openstudio-standards/standards/ashrae_90_1_prm/ashrae_90_1_prm.AirLoopHVAC.rb +1 -1
  222. data/lib/openstudio-standards/standards/ashrae_90_1_prm/ashrae_90_1_prm.ChillerElectricEIR.rb +2 -2
  223. data/lib/openstudio-standards/standards/ashrae_90_1_prm/ashrae_90_1_prm.CoilCoolingDXSingleSpeed.rb +2 -68
  224. data/lib/openstudio-standards/standards/ashrae_90_1_prm/ashrae_90_1_prm.CoilCoolingDXTwoSpeed.rb +2 -35
  225. data/lib/openstudio-standards/standards/ashrae_90_1_prm/ashrae_90_1_prm.CoilDX.rb +42 -0
  226. data/lib/openstudio-standards/standards/ashrae_90_1_prm/ashrae_90_1_prm.CoilHeatingDXSingleSpeed.rb +5 -2
  227. data/lib/openstudio-standards/standards/ashrae_90_1_prm/ashrae_90_1_prm.CoilHeatingGas.rb +2 -2
  228. data/lib/openstudio-standards/standards/ashrae_90_1_prm/ashrae_90_1_prm.Model.rb +2 -2
  229. data/lib/openstudio-standards/standards/ashrae_90_1_prm/ashrae_90_1_prm.PlantLoop.rb +3 -3
  230. data/lib/openstudio-standards/standards/ashrae_90_1_prm/ashrae_90_1_prm.SpaceType.rb +1 -1
  231. data/lib/openstudio-standards/standards/ashrae_90_1_prm/ashrae_90_1_prm_2019/ashrae_90_1_prm_2019.Model.rb +1 -0
  232. data/lib/openstudio-standards/standards/ashrae_90_1_prm/ashrae_90_1_prm_2019/ashrae_90_1_prm_2019_WaterHeaterMixed.rb +2 -4
  233. data/lib/openstudio-standards/standards/ashrae_90_1_prm/data/ashrae_90_1_prm.curves.json +0 -200
  234. data/lib/openstudio-standards/standards/ashrae_90_1_prm/data/ashrae_90_1_prm.fans.json +5 -5
  235. data/lib/openstudio-standards/standards/ashrae_90_1_prm/userdata_csv/ashrae_90_1_prm.UserData.rb +7 -1
  236. data/lib/openstudio-standards/standards/ashrae_90_1_prm/userdata_csv/userdata_enums.rb +0 -1
  237. data/lib/openstudio-standards/standards/cbes/data/cbes.curves.json +0 -200
  238. data/lib/openstudio-standards/standards/deer/data/deer.curves.json +0 -200
  239. data/lib/openstudio-standards/standards/necb/BTAPPRE1980/btap_pre1980.rb +21 -37
  240. data/lib/openstudio-standards/standards/necb/BTAPPRE1980/building_envelope.rb +12 -11
  241. data/lib/openstudio-standards/standards/necb/BTAPPRE1980/hvac_system_3_and_8_single_speed.rb +68 -27
  242. data/lib/openstudio-standards/standards/necb/BTAPPRE1980/hvac_system_4.rb +64 -25
  243. data/lib/openstudio-standards/standards/necb/BTAPPRE1980/hvac_system_6.rb +9 -14
  244. data/lib/openstudio-standards/standards/necb/BTAPPRE1980/hvac_systems.rb +4 -4
  245. data/lib/openstudio-standards/standards/necb/ECMS/ecms.rb +1 -1
  246. data/lib/openstudio-standards/standards/necb/ECMS/hvac_systems.rb +115 -112
  247. data/lib/openstudio-standards/standards/necb/NECB2011/autozone.rb +637 -249
  248. data/lib/openstudio-standards/standards/necb/NECB2011/beps_compliance_path.rb +16 -12
  249. data/lib/openstudio-standards/standards/necb/NECB2011/building_envelope.rb +799 -46
  250. data/lib/openstudio-standards/standards/necb/NECB2011/data/chillers.json +33 -51
  251. data/lib/openstudio-standards/standards/necb/NECB2011/data/constants.json +75 -7
  252. data/lib/openstudio-standards/standards/necb/NECB2011/data/fuel_type_sets.json +25 -1
  253. data/lib/openstudio-standards/standards/necb/NECB2011/data/geometry/HighriseApartmentMult.osm +14272 -0
  254. data/lib/openstudio-standards/standards/necb/NECB2011/data/heat_pumps_heating.json +21 -15
  255. data/lib/openstudio-standards/standards/necb/NECB2011/data/necb_2015_table_c1.json +1 -1
  256. data/lib/openstudio-standards/standards/necb/NECB2011/data/space_types.json +437 -437
  257. data/lib/openstudio-standards/standards/necb/NECB2011/data/systems.json +516 -0
  258. data/lib/openstudio-standards/standards/necb/NECB2011/data/systems_including_sys5.json +588 -0
  259. data/lib/openstudio-standards/standards/necb/NECB2011/hvac_namer.rb +489 -0
  260. data/lib/openstudio-standards/standards/necb/NECB2011/hvac_system_1_single_speed.rb +18 -6
  261. data/lib/openstudio-standards/standards/necb/NECB2011/hvac_system_2_and_5.rb +48 -5
  262. data/lib/openstudio-standards/standards/necb/NECB2011/hvac_system_3_and_8_multi_speed.rb +2 -2
  263. data/lib/openstudio-standards/standards/necb/NECB2011/hvac_system_3_and_8_single_speed.rb +35 -27
  264. data/lib/openstudio-standards/standards/necb/NECB2011/hvac_system_4.rb +34 -23
  265. data/lib/openstudio-standards/standards/necb/NECB2011/hvac_system_6.rb +8 -6
  266. data/lib/openstudio-standards/standards/necb/NECB2011/hvac_systems.rb +68 -150
  267. data/lib/openstudio-standards/standards/necb/NECB2011/necb_2011.rb +444 -134
  268. data/lib/openstudio-standards/standards/necb/NECB2011/system_fuels.rb +61 -1
  269. data/lib/openstudio-standards/standards/necb/NECB2015/data/heat_pumps_heating.json +10 -2
  270. data/lib/openstudio-standards/standards/necb/NECB2015/data/space_types.json +636 -636
  271. data/lib/openstudio-standards/standards/necb/NECB2015/data/unitary_acs.json +38 -38
  272. data/lib/openstudio-standards/standards/necb/NECB2015/hvac_systems.rb +17 -8
  273. data/lib/openstudio-standards/standards/necb/NECB2017/data/space_types.json +636 -636
  274. data/lib/openstudio-standards/standards/necb/NECB2020/data/chillers.json +71 -71
  275. data/lib/openstudio-standards/standards/necb/NECB2020/data/heat_pumps_heating.json +16 -6
  276. data/lib/openstudio-standards/standards/necb/NECB2020/data/unitary_acs.json +60 -61
  277. data/lib/openstudio-standards/standards/necb/NECB2020/service_water_heating.rb +30 -30
  278. data/lib/openstudio-standards/standards/necb/README.md +343 -0
  279. data/lib/openstudio-standards/standards/necb/common/btap_analysis.rb +79 -0
  280. data/lib/openstudio-standards/standards/necb/common/btap_data.rb +206 -32
  281. data/lib/openstudio-standards/standards/necb/common/btap_datapoint.rb +75 -43
  282. data/lib/openstudio-standards/standards/necb/common/eccc_electric_grid_intensity_20250311.csv +14 -0
  283. data/lib/openstudio-standards/standards/necb/common/nir_gas_grid_intensity_20250311.csv +14 -0
  284. data/lib/openstudio-standards/standards/necb/common/system_types.yaml +0 -0
  285. data/lib/openstudio-standards/thermal_zone/{thermal_zone.rb → information.rb} +12 -45
  286. data/lib/openstudio-standards/thermal_zone/thermostat_schedules.rb +152 -0
  287. data/lib/openstudio-standards/utilities/logging.rb +18 -14
  288. data/lib/openstudio-standards/version.rb +1 -1
  289. data/lib/openstudio-standards/weather/modify.rb +2 -2
  290. data/lib/openstudio-standards/weather/stat_file.rb +2 -2
  291. data/lib/openstudio-standards.rb +67 -38
  292. metadata +141 -50
  293. data/lib/openstudio-standards/hvac/components/create.rb +0 -169
  294. data/lib/openstudio-standards/hvac/components/modify.rb +0 -42
  295. data/lib/openstudio-standards/prototypes/common/objects/Prototype.AirConditionerVariableRefrigerantFlow.rb +0 -438
  296. data/lib/openstudio-standards/prototypes/common/objects/Prototype.BoilerHotWater.rb +0 -123
  297. data/lib/openstudio-standards/prototypes/common/objects/Prototype.CentralAirSourceHeatPump.rb +0 -216
  298. data/lib/openstudio-standards/prototypes/common/objects/Prototype.CoilCoolingDXSingleSpeed.rb +0 -273
  299. data/lib/openstudio-standards/prototypes/common/objects/Prototype.CoilCoolingDXTwoSpeed.rb +0 -159
  300. data/lib/openstudio-standards/prototypes/common/objects/Prototype.CoilCoolingWater.rb +0 -77
  301. data/lib/openstudio-standards/prototypes/common/objects/Prototype.CoilCoolingWaterToAirHeatPumpEquationFit.rb +0 -154
  302. data/lib/openstudio-standards/prototypes/common/objects/Prototype.CoilHeatingDXSingleSpeed.rb +0 -214
  303. data/lib/openstudio-standards/prototypes/common/objects/Prototype.CoilHeatingElectric.rb +0 -53
  304. data/lib/openstudio-standards/prototypes/common/objects/Prototype.CoilHeatingGas.rb +0 -72
  305. data/lib/openstudio-standards/prototypes/common/objects/Prototype.CoilHeatingWater.rb +0 -95
  306. data/lib/openstudio-standards/prototypes/common/objects/Prototype.CoilHeatingWaterToAirHeatPumpEquationFit.rb +0 -125
  307. data/lib/openstudio-standards/prototypes/common/objects/Prototype.ControllerWaterCoil.rb +0 -17
  308. data/lib/openstudio-standards/prototypes/common/objects/Prototype.Model.transformers.rb +0 -90
  309. data/lib/openstudio-standards/prototypes/common/objects/Prototype.Pump.rb +0 -4
  310. data/lib/openstudio-standards/prototypes/common/objects/Prototype.PumpVariableSpeed.rb +0 -70
  311. data/lib/openstudio-standards/prototypes/common/objects/Prototype.radiant_system_controls.rb +0 -590
  312. data/lib/openstudio-standards/prototypes/common/objects/Prototype.utilities.rb +0 -901
  313. data/lib/openstudio-standards/standards/Standards.FanConstantVolume.rb +0 -5
  314. data/lib/openstudio-standards/standards/Standards.FanOnOff.rb +0 -5
  315. data/lib/openstudio-standards/standards/Standards.FanZoneExhaust.rb +0 -5
  316. data/lib/openstudio-standards/standards/Standards.HeaderedPumpsConstantSpeed.rb +0 -5
  317. data/lib/openstudio-standards/standards/Standards.HeaderedPumpsVariableSpeed.rb +0 -55
  318. data/lib/openstudio-standards/standards/Standards.PumpConstantSpeed.rb +0 -5
  319. data/lib/openstudio-standards/standards/ashrae_90_1_prm/ashrae_90_1_prm.FanConstantVolume.rb +0 -5
  320. data/lib/openstudio-standards/standards/ashrae_90_1_prm/ashrae_90_1_prm.FanOnOff.rb +0 -5
  321. data/lib/openstudio-standards/standards/ashrae_90_1_prm/ashrae_90_1_prm.FanZoneExhaust.rb +0 -5
  322. data/lib/openstudio-standards/standards/cbes/data/cbes.fans.json +0 -328
  323. data/lib/openstudio-standards/standards/deer/data/deer.fans.json +0 -328
  324. /data/lib/openstudio-standards/{prototypes → standards}/ashrae_90_1/ashrae_90_1_2004/ashrae_90_1_2004.PumpVariableSpeed.rb +0 -0
  325. /data/lib/openstudio-standards/{prototypes → standards}/ashrae_90_1/ashrae_90_1_2007/ashrae_90_1_2007.PumpVariableSpeed.rb +0 -0
  326. /data/lib/openstudio-standards/{prototypes → standards}/ashrae_90_1/ashrae_90_1_2010/ashrae_90_1_2010.PumpVariableSpeed.rb +0 -0
  327. /data/lib/openstudio-standards/{prototypes → standards}/ashrae_90_1/ashrae_90_1_2013/ashrae_90_1_2013.PumpVariableSpeed.rb +0 -0
  328. /data/lib/openstudio-standards/{prototypes → standards}/ashrae_90_1/ashrae_90_1_2016/ashrae_90_1_2016.PumpVariableSpeed.rb +0 -0
  329. /data/lib/openstudio-standards/{prototypes → standards}/ashrae_90_1/ashrae_90_1_2019/ashrae_90_1_2019.Pump.rb +0 -0
  330. /data/lib/openstudio-standards/{prototypes → standards}/ashrae_90_1/ashrae_90_1_2019/ashrae_90_1_2019.PumpVariableSpeed.rb +0 -0
@@ -0,0 +1,359 @@
1
+ module BTAPMeasureHelper
2
+ ###################Helper functions
3
+
4
+ # define the arguments that the user will input
5
+ def arguments(model)
6
+ args = OpenStudio::Measure::OSArgumentVector.new
7
+
8
+ if true == @use_json_package
9
+ #Set up package version of input.
10
+ json_default = {}
11
+ @measure_interface_detailed.each do |argument|
12
+ json_default[argument['name']] = argument["default_value"]
13
+ end
14
+ default = JSON.pretty_generate(json_default)
15
+ arg = OpenStudio::Ruleset::OSArgument.makeStringArgument('json_input', true)
16
+ arg.setDisplayName('Contains a json version of the input as a single package.')
17
+ arg.setDefaultValue(default)
18
+ args << arg
19
+ else
20
+ # Conductances for all surfaces and subsurfaces.
21
+ @measure_interface_detailed.each do |argument|
22
+ arg = nil
23
+ statement = nil
24
+ case argument['type']
25
+ when "String"
26
+ arg = OpenStudio::Ruleset::OSArgument.makeStringArgument(argument['name'], argument['is_required'])
27
+ arg.setDisplayName(argument['display_name'])
28
+ arg.setDefaultValue(argument['default_value'].to_s)
29
+
30
+ when "Double"
31
+ arg = OpenStudio::Ruleset::OSArgument.makeDoubleArgument(argument['name'], argument['is_required'])
32
+ arg.setDisplayName("#{argument['display_name']}")
33
+ arg.setDefaultValue("#{argument['default_value']}".to_f)
34
+
35
+ when "Choice"
36
+ arg = OpenStudio::Measure::OSArgument.makeChoiceArgument(argument['name'], argument['choices'], argument['is_required'])
37
+ arg.setDisplayName(argument['display_name'])
38
+ arg.setDefaultValue(argument['default_value'].to_s)
39
+ puts arg.defaultValueAsString
40
+
41
+ when "Bool"
42
+ arg = OpenStudio::Measure::OSArgument.makeBoolArgument(argument['name'], argument['is_required'])
43
+ arg.setDisplayName(argument['display_name'])
44
+ arg.setDefaultValue(argument['default_value'])
45
+
46
+
47
+ when "StringDouble"
48
+ if @use_string_double == false
49
+ arg = OpenStudio::Ruleset::OSArgument.makeDoubleArgument(argument['name'], argument['is_required'])
50
+ arg.setDefaultValue(argument['default_value'].to_f)
51
+ else
52
+ arg = OpenStudio::Ruleset::OSArgument.makeStringArgument(argument['name'], argument['is_required'])
53
+ arg.setDefaultValue(argument['default_value'].to_s)
54
+ end
55
+ arg.setDisplayName(argument['display_name'])
56
+ end
57
+ args << arg
58
+ end
59
+ end
60
+ return args
61
+ end
62
+
63
+ #returns a hash of the user inputs for you to use in your measure.
64
+ def get_hash_of_arguments(user_arguments, runner)
65
+ values = {}
66
+ if @use_json_package
67
+ return JSON.parse(runner.getStringArgumentValue('json_input', user_arguments))
68
+ else
69
+
70
+ @measure_interface_detailed.each do |argument|
71
+
72
+ case argument['type']
73
+ when "String", "Choice"
74
+ values[argument['name']] = runner.getStringArgumentValue(argument['name'], user_arguments)
75
+ when "Double"
76
+ values[argument['name']] = runner.getDoubleArgumentValue(argument['name'], user_arguments)
77
+ when "Bool"
78
+ values[argument['name']] = runner.getBoolArgumentValue(argument['name'], user_arguments)
79
+ when "StringDouble"
80
+ value = nil
81
+ if @use_string_double == false
82
+ value = (runner.getDoubleArgumentValue(argument['name'], user_arguments).to_f)
83
+ else
84
+ value = runner.getStringArgumentValue(argument['name'], user_arguments)
85
+ if valid_float?(value)
86
+ value = value.to_f
87
+ end
88
+ end
89
+ values[argument['name']] = value
90
+ end
91
+ end
92
+ end
93
+ return values
94
+ end
95
+
96
+ # boilerplate that validated ranges of inputs.
97
+ def validate_and_get_arguments_in_hash(model, runner, user_arguments)
98
+ return_value = true
99
+ values = get_hash_of_arguments(user_arguments, runner)
100
+ # use the built-in error checking
101
+ if !runner.validateUserArguments(arguments(model), user_arguments)
102
+ runner_register(runner, 'Error', "validateUserArguments failed... Check the argument definition for errors.")
103
+ return_value = false
104
+ end
105
+
106
+ # Validate arguments
107
+ errors = ""
108
+ @measure_interface_detailed.each do |argument|
109
+ case argument['type']
110
+ when "Double"
111
+ value = values[argument['name']]
112
+ if (not argument["max_double_value"].nil? and value.to_f > argument["max_double_value"].to_f) or
113
+ (not argument["min_double_value"].nil? and value.to_f < argument["min_double_value"].to_f)
114
+ error = "#{argument['name']} must be between #{argument["min_double_value"]} and #{argument["max_double_value"]}. You entered #{value.to_f} for this #{argument['name']}.\n Please enter a value withing the expected range.\n"
115
+ errors << error
116
+ end
117
+ when "StringDouble"
118
+ value = values[argument['name']]
119
+ if (not argument["valid_strings"].include?(value)) and (not valid_float?(value))
120
+ error = "#{argument['name']} must be a string that can be converted to a float, or one of these #{argument["valid_strings"]}. You have entered #{value}\n"
121
+ errors << error
122
+ elsif (not argument["max_double_value"].nil? and value.to_f > argument["max_double_value"]) or
123
+ (not argument["min_double_value"].nil? and value.to_f < argument["min_double_value"])
124
+ error = "#{argument['name']} must be between #{argument["min_double_value"]} and #{argument["max_double_value"]}. You entered #{value} for #{argument['name']}. Please enter a stringdouble value in the expected range.\n"
125
+ errors << error
126
+ end
127
+ end
128
+ end
129
+ #If any errors return false, else return the hash of argument values for user to use in measure.
130
+ if errors != ""
131
+ runner.registerError(errors)
132
+ return false
133
+ end
134
+ return values
135
+ end
136
+
137
+ # Helper method to see if str is a valid float.
138
+ def valid_float?(str)
139
+ !!Float(str) rescue false
140
+ end
141
+
142
+ end
143
+
144
+ module BTAPMeasureTestHelper
145
+ ##### Helper methods Do notouch unless you know the consequences.
146
+
147
+ #Boiler plate to default values and number of arguments against what is in your test's setup method.
148
+ def test_arguments_and_defaults
149
+ [true, false].each do |json_input|
150
+ [true, false].each do |string_double|
151
+ @use_json_package = json_input
152
+ @use_string_double = string_double
153
+
154
+ # Create an instance of the measure
155
+ measure = get_measure_object()
156
+ measure.use_json_package = @use_json_package
157
+ measure.use_string_double = @use_string_double
158
+ model = OpenStudio::Model::Model.new
159
+
160
+ # Create an instance of a runner
161
+ runner = OpenStudio::Measure::OSRunner.new(OpenStudio::WorkflowJSON.new)
162
+
163
+ # Test arguments and defaults
164
+ arguments = measure.arguments(model)
165
+ #convert whatever the input was into a hash. Then test.
166
+
167
+ #check number of arguments.
168
+ if @use_json_package
169
+ assert_equal(@measure_interface_detailed.size, JSON.parse(arguments[0].defaultValueAsString).size, "The measure should have #{@measure_interface_detailed.size} but actually has #{arguments.size}. Here the the arguement expected #{@measure_interface_detailed} and this is the actual #{arguments}")
170
+ else
171
+ assert_equal(@measure_interface_detailed.size, arguments.size, "The measure should have #{@measure_interface_detailed.size} but actually has #{arguments.size}. Here the the arguement expected #{@measure_interface_detailed} and this is the actual #{arguments}")
172
+ (@measure_interface_detailed).each_with_index do |argument_expected, index|
173
+ assert_equal(argument_expected['name'], arguments[index].name, "Measure argument name of #{argument_expected['name']} was expected, but got #{arguments[index].name} instead.")
174
+ assert_equal(argument_expected['display_name'], arguments[index].displayName, "Display name for argument #{argument_expected['name']} was expected to be #{argument_expected['display_name']}, but got #{arguments[index].displayName} instead.")
175
+ case argument_type(arguments[index])
176
+ when "String", "Choice"
177
+ assert_equal(argument_expected['default_value'].to_s, arguments[index].defaultValueAsString, "The default value for argument #{argument_expected['name']} was #{argument_expected['default_value']}, but actual was #{arguments[index].defaultValueAsString}")
178
+ when "Double", "Integer"
179
+ assert_equal(argument_expected['default_value'].to_f, arguments[index].defaultValueAsDouble.to_f, "The default value for argument #{argument_expected['name']} was #{argument_expected['default_value']}, but actual was #{arguments[index].defaultValueAsString}")
180
+ when "Bool"
181
+ assert_equal(argument_expected['default_value'], arguments[index].defaultValueAsBool, "The default value for argument #{argument_expected['name']} was #{argument_expected['default_value']}, but actual was #{arguments[index].defaultValueAsString}")
182
+ end
183
+ end
184
+ end
185
+ end
186
+ end
187
+ end
188
+
189
+ # Test argument ranges.
190
+ def test_argument_ranges
191
+ [true, false].each do |json_input|
192
+ [true, false].each do |string_double|
193
+ @use_json_package = json_input
194
+ @use_string_double = string_double
195
+ (@measure_interface_detailed).each_with_index do |argument|
196
+ if argument['type'] == 'Double' or argument['type'] == 'StringDouble'
197
+ puts "testing range for #{argument['name']} "
198
+ #Check over max
199
+ if not argument['max_double_value'].nil?
200
+ puts "testing max limit"
201
+ model = OpenStudio::Model::Model.new
202
+ input_arguments = @good_input_arguments.clone
203
+ over_max_value = argument['max_double_value'].to_f + 1.0
204
+ over_max_value = over_max_value.to_s if argument['type'].downcase == "StringDouble".downcase
205
+ input_arguments[argument['name']] = over_max_value
206
+ puts "Testing argument #{argument['name']} max limit of #{argument['max_double_value']}"
207
+ input_arguments = {'json_input' => JSON.pretty_generate(input_arguments)} if @use_json_package
208
+ run_measure(input_arguments, model)
209
+ runner = run_measure(input_arguments, model)
210
+ assert(runner.result.value.valueName != 'Success', "Checks did not stop a lower than limit value of #{over_max_value} for #{argument['name']}")
211
+ puts "Success: Testing argument #{argument['name']} max limit of #{argument['max_double_value']}"
212
+ end
213
+ #Check over max
214
+ if not argument['min_double_value'].nil?
215
+ puts "testing min limit"
216
+ model = OpenStudio::Model::Model.new
217
+ input_arguments = @good_input_arguments.clone
218
+ over_min_value = argument['min_double_value'].to_f - 1.0
219
+ over_min_value = over_max_value.to_s if argument['type'].downcase == "StringDouble".downcase
220
+ input_arguments[argument['name']] = over_min_value
221
+ puts "Testing argument #{argument['name']} min limit of #{argument['min_double_value']}"
222
+ input_arguments = {'json_input' => JSON.pretty_generate(input_arguments)} if @use_json_package
223
+ runner = run_measure(input_arguments, model)
224
+ assert(runner.result.value.valueName != 'Success', "Checks did not stop a lower than limit value of #{over_min_value} for #{argument['name']}")
225
+ puts "Success:Testing argument #{argument['name']} min limit of #{argument['min_double_value']}"
226
+ end
227
+
228
+ end
229
+ if (argument['type'] == 'StringDouble') and (not argument["valid_strings"].nil?) and @use_string_double
230
+ model = OpenStudio::Model::Model.new
231
+ input_arguments = @good_input_arguments.clone
232
+ input_arguments[argument['name']] = SecureRandom.uuid.to_s
233
+ puts "Testing argument #{argument['name']} min limit of #{argument['min_double_value']}"
234
+ input_arguments = {'json_input' => JSON.pretty_generate(input_arguments)} if @use_json_package
235
+ runner = run_measure(input_arguments, model)
236
+ assert(runner.result.value.valueName != 'Success', "Checks did not stop a lower than limit value of #{over_min_value} for #{argument['name']}")
237
+ end
238
+ end
239
+ end
240
+ end
241
+ end
242
+
243
+ # helper method to create necb archetype as a starting point for testing.
244
+ def create_necb_protype_model(building_type, climate_zone, epw_file, template)
245
+
246
+ osm_directory = "#{Dir.pwd}/output/#{building_type}-#{template}-#{climate_zone}-#{epw_file}"
247
+ FileUtils.mkdir_p (osm_directory) unless Dir.exist?(osm_directory)
248
+ #Get Weather climate zone from lookup
249
+ weather = BTAP::Environment::WeatherFile.new(epw_file)
250
+ #create model
251
+ building_name = "#{template}_#{building_type}"
252
+
253
+ prototype_creator = Standard.build(template)
254
+ model = prototype_creator.model_create_prototype_model(
255
+ epw_file: epw_file,
256
+ sizing_run_dir: osm_directory,
257
+ debug: @debug,
258
+ template: template,
259
+ building_type: building_type)
260
+
261
+ #set weather file to epw_file passed to model.
262
+ weather.set_weather_file(model)
263
+ return model
264
+ end
265
+
266
+ # Custom way to run the measure in the test.
267
+ def run_measure(input_arguments, model)
268
+
269
+ # This will create a instance of the measure you wish to test. It does this based on the test class name.
270
+ measure = get_measure_object()
271
+ measure.use_json_package = @use_json_package
272
+ measure.use_string_double = @use_string_double
273
+ # Return false if can't
274
+ return false if false == measure
275
+ arguments = measure.arguments(model)
276
+ argument_map = OpenStudio::Measure.convertOSArgumentVectorToMap(arguments)
277
+ runner = OpenStudio::Measure::OSRunner.new(OpenStudio::WorkflowJSON.new)
278
+ #Check if
279
+
280
+ # Set the arguements in the argument map use json or real arguments.
281
+ if @use_json_package
282
+ argument = arguments[0].clone
283
+ assert(argument.setValue(input_arguments['json_input']), "Could not set value for 'json_input' to #{input_arguments['json_input']}")
284
+ argument_map['json_input'] = argument
285
+ else
286
+ input_arguments.each_with_index do |(key, value), index|
287
+ argument = arguments[index].clone
288
+ if argument_type(argument) == "Double"
289
+ #forces it to a double if it is a double.
290
+ assert(argument.setValue(value.to_f), "Could not set value for #{key} to #{value}")
291
+ else
292
+ assert(argument.setValue(value.to_s), "Could not set value for #{key} to #{value}")
293
+ end
294
+ argument_map[key] = argument
295
+ end
296
+ end
297
+ #run the measure
298
+ measure.run(model, runner, argument_map)
299
+ runner.result
300
+ return runner
301
+ end
302
+
303
+
304
+ #Fancy way of getting the measure object automatically.
305
+ def get_measure_object()
306
+ measure_class_name = self.class.name.to_s.match(/(BTAP.*)(\_Test)/i).captures[0]
307
+ measure = nil
308
+ eval "measure = #{measure_class_name}.new"
309
+ if measure.nil?
310
+ puts "Measure class #{measure_class_name} is invalid. Please ensure the test class name is of the form 'MeasureName_Test' "
311
+ return false
312
+ end
313
+ return measure
314
+ end
315
+
316
+ #Determines the OS argument type dynamically.
317
+ def argument_type(argument)
318
+ case argument.type.value
319
+ when 0
320
+ return "Bool"
321
+ when 1 #Double
322
+ return "Double"
323
+ when 2 #Quantity
324
+ return "Quantity"
325
+ when 3 #Integer
326
+ return "Integer"
327
+ when 4
328
+ return "String"
329
+ when 5 #Choice
330
+ return "Choice"
331
+ when 6 #Path
332
+ return "Path"
333
+ when 7 #Separator
334
+ return "Separator"
335
+ else
336
+ return "Blah"
337
+ end
338
+ end
339
+
340
+ # Valid float helper.
341
+ def valid_float?(str)
342
+ !!Float(str) rescue false
343
+ end
344
+
345
+ #Method does a deep copy of a model.
346
+ def copy_model(model)
347
+ copy_model = OpenStudio::Model::Model.new
348
+ # remove existing objects from model
349
+ handles = OpenStudio::UUIDVector.new
350
+ copy_model.objects.each do |obj|
351
+ handles << obj.handle
352
+ end
353
+ copy_model.removeObjects(handles)
354
+ # put contents of new_model into model_to_replace
355
+ copy_model.addObjects(model.toIdfFile.objects)
356
+ return copy_model
357
+ end
358
+
359
+ end
@@ -0,0 +1,117 @@
1
+ require_relative '../../../../lib/openstudio-standards.rb'
2
+
3
+ class BTAPWorkflow
4
+ attr_accessor :workflow
5
+
6
+ def initialize(measures_folder: File.join(__dir__, '../../measures'))
7
+ @model = nil
8
+ @run_dir = nil
9
+ @sql_path = nil
10
+ @idf_name = 'in.idf'
11
+ @osm_name = 'in.osm'
12
+ @osw_name = 'out.osw'
13
+ @epw_path = 'in.epw'
14
+ @workflow = OpenStudio::WorkflowJSON.new
15
+ @workflow.addMeasurePath(measures_folder)
16
+ @run_cli_verbose = true
17
+ @os_measures = []
18
+ @ep_measures = []
19
+ @report_measures = []
20
+ end
21
+
22
+ def set_run_dir(run_dir: "#{Dir.pwd}/Run")
23
+ puts "set run folder to #{run_dir}"
24
+ @run_dir = run_dir
25
+ @sql_path = OpenStudio::Path.new("#{@run_dir}/run/eplusout.sql")
26
+ return self
27
+ end
28
+
29
+ def add_os_measure(measure)
30
+ @os_measures << measure
31
+ end
32
+
33
+ def add_ep_measure(measure)
34
+ @ep_measures << measure
35
+ end
36
+
37
+ def add_reporting_measure(measure)
38
+ @report_measures << measure
39
+ return self
40
+ end
41
+
42
+ def add_measures_to_workflow
43
+ unless @os_measures.empty?
44
+ measure_type = OpenStudio::MeasureType.new("ModelMeasure")
45
+ @workflow.setMeasureSteps(measure_type, @os_measures)
46
+ end
47
+ unless @ep_measures.empty?
48
+ measure_type = OpenStudio::MeasureType.new("EnergyPlusMeasure")
49
+ @workflow.setMeasureSteps(measure_type, @ep_measures)
50
+ end
51
+ unless @report_measures.empty?
52
+ measure_type = OpenStudio::MeasureType.new("ReportingMeasure")
53
+ @workflow.setMeasureSteps(measure_type, @report_measures)
54
+ end
55
+ @workflow
56
+ return self
57
+ end
58
+
59
+ def add_btap_create_necb_prototype_building_measure(building_type:, epw_file:, template:, primary_heating_fuel:)
60
+ os_measure_type = OpenStudio::MeasureType.new("ModelMeasure")
61
+ create_prototype_measure = OpenStudio::MeasureStep.new("btap_create_necb_prototype_building")
62
+ create_prototype_measure.setName("btap_create_necb_prototype_building")
63
+ create_prototype_measure.setArgument('building_type', building_type)
64
+ create_prototype_measure.setArgument('epw_file', epw_file)
65
+ create_prototype_measure.setArgument('template', template)
66
+ create_prototype_measure.setArgument('primary_heating_fuel', primary_heating_fuel)
67
+ @os_measures << create_prototype_measure
68
+ end
69
+
70
+
71
+ def add_btap_results_measure
72
+ reporting_measure_type = OpenStudio::MeasureType.new("ReportingMeasure")
73
+ btap_results = OpenStudio::MeasureStep.new("btap_results")
74
+ btap_results.setName("btap_results")
75
+ btap_results.setArgument('generate_hourly_report', 'false')
76
+ btap_results.setArgument('output_diet', false)
77
+ btap_results.setArgument('envelope_costing', true)
78
+ btap_results.setArgument('lighting_costing', true)
79
+ btap_results.setArgument('boilers_costing', true)
80
+ btap_results.setArgument('chillers_costing', true)
81
+ btap_results.setArgument('cooling_towers_costing', true)
82
+ btap_results.setArgument('shw_costing', true)
83
+ btap_results.setArgument('ventilation_costing', true)
84
+ btap_results.setArgument('zone_system_costing', true)
85
+ @report_measures << btap_results
86
+ end
87
+
88
+
89
+ def run_command(command:)
90
+ stdout_str, stderr_str, status = Open3.capture3({}, command)
91
+ if status.success?
92
+ puts "Command completed successfully"
93
+ puts "stdout: #{stdout_str}"
94
+ puts "stderr: #{stderr_str}"
95
+ return true
96
+ else
97
+ puts "Error running command: '#{command}'"
98
+ puts "stdout: #{stdout_str}"
99
+ puts "stderr: #{stderr_str}"
100
+ return false
101
+ end
102
+ end
103
+
104
+ def run_workflow(postprocess_only: nil, osw_path:)
105
+ #command to run workflow
106
+ os_ruby_cli = "bundle exec ruby #{File.join(File.dirname(OpenStudio.getOpenStudioCLI.to_s), '..', 'Ruby', 'openstudio_cli.rb')}"
107
+ extra_args = ' --postprocess_only ' if postprocess_only == true
108
+ cmd = "#{os_ruby_cli} run #{extra_args} --debug --workflow \"#{osw_path}\""
109
+ puts "running cli command: #{cmd}"
110
+ OpenStudio.logFree(OpenStudio::Info, 'openstudio.model.Model', "running cli command: #{cmd}")
111
+ self.run_command(command: cmd)
112
+ OpenStudio.logFree(OpenStudio::Info, 'openstudio.model.Model', 'Finished cli run.')
113
+ #Ensure items are written to disk.
114
+ sleep 3
115
+ return true
116
+ end
117
+ end
@@ -0,0 +1,11 @@
1
+ require 'fileutils'
2
+
3
+ folder_path = "#{File.dirname(__FILE__)}/btap_results/tests/regression_files/"
4
+ puts folder_path
5
+ Dir.glob(folder_path + "/*test_result.cost.json").sort.each do |f|
6
+ new_file = f.gsub("test_result.cost.json","expected_result.cost.json")
7
+ FileUtils.cp(f,new_file )
8
+ FileUtils.rm(f, :force => true)
9
+ puts "created new #{new_file}"
10
+ end
11
+
@@ -0,0 +1,136 @@
1
+ require 'fileutils'
2
+ require 'json'
3
+ require 'optparse'
4
+ require_relative './btap_costing.rb'
5
+
6
+ # This script is used to apply costs to a list of costing items produced by btap_costing. Right now it can only be run
7
+ # from the btap_results resources folder because it uses btap_costing.rb. It can be used elsewhere probably but then
8
+ # the require_relative statement has to be changed. It takes in the following command line arguments:
9
+ # -c (string, required) Location of the json containing the list of items to be costed and the original costing City and
10
+ # Province.
11
+ # -d (string, optional) Location of a custom costing database containing the costing information for the items that
12
+ # need costing. This is used only if you do not want to use the standard costing database. It must have the same
13
+ # structure as the 'costs' hash in the default costing database
14
+ # -t (string, optional) The city to use when finding localization factors (only if you do not want to use the city that
15
+ # used in the original run).
16
+ # -p (string, optional) Same as -t only for Province.
17
+ # -o (string, optional) The location and name of the output file containing the costs. If a name and path are not
18
+ # provided then one called cost_list_output.json will be put in the same directory as this file.
19
+ #
20
+ # The output of this script is a json file containing the following cost summary:
21
+ # {
22
+ # envelope: (float) Building envelope costs (to 2 decimal places).
23
+ # lighting: (float) Ligting costs (to 2 decimal places).
24
+ # heating_and_cooling: (float) Heating and cooling costs (not related to ventilation) (to 2 decimal places).
25
+ # shw: (float) Service hot water costs (to 2 decimal places).
26
+ # ventilation: (float) Ventilation (including ventilation air heating and cooling) costs (to 2 decimal places).
27
+ # grand_total: (float) Total costs (to 2 decimal places).
28
+ # }
29
+ class BTAPCostFromFile
30
+ def cost_file()
31
+ # Get the commond line arguments
32
+ args = {}
33
+ OptionParser.new do |opts|
34
+ opts.banner = "Usage: example.rb [options]"
35
+ opts.on("-c", "--costlist_location=NAME", "Costing List File Location") do |n|
36
+ args['cost_file'] = n
37
+ end
38
+
39
+ opts.on("-d", "--custom_costing=NAME", "Custom Costing Database Location") do |n|
40
+ args['custom_db_file'] = n
41
+ end
42
+
43
+ opts.on("-t", "--custom_city=NAME", "Custom Costing City") do |n|
44
+ args['custom_city'] = n
45
+ end
46
+
47
+ opts.on("-p", "--custom_province=NAME", "Custom Costing Province") do |n|
48
+ args['custom_province'] = n
49
+ end
50
+
51
+ opts.on("-o", "--output_name=NAME", "Output file name and location") do |n|
52
+ args['output_loc'] = n
53
+ end
54
+
55
+ opts.on("-h", "--help", "Prints this help") do
56
+ puts opts
57
+ exit
58
+ end
59
+ end.parse!
60
+
61
+ curr_folder = (File.dirname(__FILE__)).to_s + "/"
62
+
63
+ # Get the output file location from the arguments
64
+ outputLoc = args['output_loc']
65
+ if outputLoc.nil?
66
+ outputFile = "./cost_list_output.json"
67
+ elsif outputLoc[0] == "."
68
+ if outputLoc[1] == "."
69
+ outputFile = curr_folder + outputLoc
70
+ elsif outputLoc[1] == "/"
71
+ outputFile = curr_folder + outputLoc[2..-1]
72
+ else
73
+ outputFile = curr_folder + outputLoc[1..-1]
74
+ end
75
+ elsif outputLoc[0] == "/"
76
+ outputFile = outputLoc
77
+ else
78
+ outputFile = curr_folder + outputLoc
79
+ end
80
+
81
+ # Get the cost list location from the arguments
82
+ costListLoc = args['cost_file']
83
+ if costListLoc.nil?
84
+ raise("No cost list location specified. Please enter the location and name of the costed item list after the -c")
85
+ elsif costListLoc[0] == "."
86
+ if costListLoc[1] == "."
87
+ cost_loc = curr_folder + costListLoc
88
+ elsif costListLoc[1] == "/"
89
+ cost_loc = curr_folder + costListLoc[2..-1]
90
+ else
91
+ cost_loc = curr_folder + costListLoc[1..-1]
92
+ end
93
+ elsif costListLoc[0] == "/"
94
+ cost_loc = costListLoc
95
+ else
96
+ cost_loc = curr_folder + costListLoc
97
+ end
98
+
99
+ # Get the custom costing database location from the arguments
100
+ custDB = args['custom_db_file']
101
+ if custDB.nil?
102
+ db_loc = nil
103
+ else
104
+ if custDB[0] == "."
105
+ if custDB[1] == "."
106
+ db_loc = curr_folder + custDB
107
+ elsif custDB[1] == "/"
108
+ db_loc = curr_folder + custDB[2..-1]
109
+ else
110
+ db_loc = curr_folder + custDB[1..-1]
111
+ end
112
+ elsif custDB[0] == "/"
113
+ db_loc = custDB
114
+ else
115
+ db_loc = curr_folder + custDB
116
+ end
117
+ end
118
+
119
+ # Set the custom costing city and province location if specified
120
+ args['custom_city'].nil? ? customCity = nil : customCity = args['custom_city'].to_s
121
+ args['custom_province'].nil? ? customProv = nil : customProv = args['custom_province'].to_s
122
+
123
+ # Get the costed items list
124
+ costList = JSON.parse(File.read(cost_loc))
125
+
126
+ # Create a BTAPCosting object and pass the btap_items list, and optional costing database, costing City and costing
127
+ # Province arguments. Get the resulting costs and save them in a json (see the description of the -o inline
128
+ # arguments above for more information).
129
+ btapCosting = BTAPCosting.new()
130
+ costResults = btapCosting.cost_list_items(btap_items: costList, custom_costing: custDB, custCity: customCity, custProvince: customProv)
131
+
132
+ File.write(outputFile, JSON.pretty_generate(costResults))
133
+ end
134
+ end
135
+ # Create a 'BTAPCostFromFile' object and call the 'cost_file' method to run the above script.
136
+ BTAPCostFromFile.new().cost_file()