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
@@ -75,7 +75,7 @@ module OpenstudioStandards
75
75
  space.spaceInfiltrationDesignFlowRates.each do |infil|
76
76
  if infil.designFlowRate.is_initialized
77
77
  is_vest = true
78
- OpenStudio.logFree(OpenStudio::Info, 'OpenstudioStandards::ThermalZone', "For #{thermal_zone.name}: This zone is considered a vestibule.")
78
+ OpenStudio.logFree(OpenStudio::Info, 'openstudio.standards.ThermalZone', "For #{thermal_zone.name}: This zone is considered a vestibule.")
79
79
  break
80
80
  end
81
81
  end
@@ -175,7 +175,7 @@ module OpenstudioStandards
175
175
  htd = true
176
176
  end
177
177
  else
178
- OpenStudio.logFree(OpenStudio::Debug, 'OpenstudioStandards::ThermalZone', "Zone #{thermal_zone.name} used an unknown schedule type for the heating setpoint; assuming heated.")
178
+ OpenStudio.logFree(OpenStudio::Debug, 'openstudio.standards.ThermalZone', "Zone #{thermal_zone.name} used an unknown schedule type for the heating setpoint; assuming heated.")
179
179
  htd = true
180
180
  end
181
181
  end
@@ -211,7 +211,7 @@ module OpenstudioStandards
211
211
  htd = true
212
212
  end
213
213
  else
214
- OpenStudio.logFree(OpenStudio::Debug, 'OpenstudioStandards::ThermalZone', "Zone #{thermal_zone.name} used an unknown schedule type for the heating setpoint; assuming heated.")
214
+ OpenStudio.logFree(OpenStudio::Debug, 'openstudio.standards.ThermalZone', "Zone #{thermal_zone.name} used an unknown schedule type for the heating setpoint; assuming heated.")
215
215
  htd = true
216
216
  end
217
217
  end
@@ -316,7 +316,7 @@ module OpenstudioStandards
316
316
  cld = true
317
317
  end
318
318
  else
319
- OpenStudio.logFree(OpenStudio::Debug, 'OpenstudioStandards::ThermalZone', "Zone #{thermal_zone.name} used an unknown schedule type for the cooling setpoint; assuming cooled.")
319
+ OpenStudio.logFree(OpenStudio::Debug, 'openstudio.standards.ThermalZone', "Zone #{thermal_zone.name} used an unknown schedule type for the cooling setpoint; assuming cooled.")
320
320
  cld = true
321
321
  end
322
322
  end
@@ -352,7 +352,7 @@ module OpenstudioStandards
352
352
  cld = true
353
353
  end
354
354
  else
355
- OpenStudio.logFree(OpenStudio::Debug, 'OpenstudioStandards::ThermalZone', "Zone #{thermal_zone.name} used an unknown schedule type for the cooling setpoint; assuming cooled.")
355
+ OpenStudio.logFree(OpenStudio::Debug, 'openstudio.standards.ThermalZone', "Zone #{thermal_zone.name} used an unknown schedule type for the cooling setpoint; assuming cooled.")
356
356
  cld = true
357
357
  end
358
358
  end
@@ -384,7 +384,7 @@ module OpenstudioStandards
384
384
  def self.thermal_zone_electric_heat?(thermal_zone)
385
385
  # error if HVACComponent heating fuels method is not available
386
386
  if thermal_zone.model.version < OpenStudio::VersionString.new('3.6.0')
387
- OpenStudio.logFree(OpenStudio::Error, 'OpenstudioStandards::ThermalZone', 'Required HVACComponent method .heatingFuelTypes is not available in pre-OpenStudio 3.6.0 versions. Use a more recent version of OpenStudio.')
387
+ OpenStudio.logFree(OpenStudio::Error, 'openstudio.standards.ThermalZone', 'Required HVACComponent method .heatingFuelTypes is not available in pre-OpenStudio 3.6.0 versions. Use a more recent version of OpenStudio.')
388
388
  end
389
389
 
390
390
  # Get an array of the heating fuels used by the zone
@@ -404,7 +404,7 @@ module OpenstudioStandards
404
404
  def self.thermal_zone_fossil_heat?(thermal_zone)
405
405
  # error if HVACComponent heating fuels method is not available
406
406
  if thermal_zone.model.version < OpenStudio::VersionString.new('3.6.0')
407
- OpenStudio.logFree(OpenStudio::Error, 'OpenstudioStandards::ThermalZone', 'Required HVACComponent method .heatingFuelTypes is not available in pre-OpenStudio 3.6.0 versions. Use a more recent version of OpenStudio.')
407
+ OpenStudio.logFree(OpenStudio::Error, 'openstudio.standards.ThermalZone', 'Required HVACComponent method .heatingFuelTypes is not available in pre-OpenStudio 3.6.0 versions. Use a more recent version of OpenStudio.')
408
408
  end
409
409
 
410
410
  is_fossil = false
@@ -438,7 +438,7 @@ module OpenstudioStandards
438
438
  def self.thermal_zone_district_heat?(thermal_zone)
439
439
  # error if HVACComponent heating fuels method is not available
440
440
  if thermal_zone.model.version < OpenStudio::VersionString.new('3.6.0')
441
- OpenStudio.logFree(OpenStudio::Error, 'OpenstudioStandards::ThermalZone', 'Required HVACComponent method .heatingFuelTypes is not available in pre-OpenStudio 3.6.0 versions. Use a more recent version of OpenStudio.')
441
+ OpenStudio.logFree(OpenStudio::Error, 'openstudio.standards.ThermalZone', 'Required HVACComponent method .heatingFuelTypes is not available in pre-OpenStudio 3.6.0 versions. Use a more recent version of OpenStudio.')
442
442
  end
443
443
 
444
444
  is_district = false
@@ -467,39 +467,6 @@ module OpenstudioStandards
467
467
  return is_mixed
468
468
  end
469
469
 
470
- # Adds a thermostat that heats the space to 0 F and cools to 120 F.
471
- # These numbers are outside of the threshold that is considered heated
472
- # or cooled by thermal_zone_cooled?() and thermal_zone_heated?()
473
- #
474
- # @param thermal_zone [OpenStudio::Model::ThermalZone] OpenStudio ThermalZone object
475
- # @return [Boolean] returns true if successful, false if not
476
- def self.thermal_zone_add_unconditioned_thermostat(thermal_zone)
477
- # Heated to 0F (below thermal_zone_heated?(thermal_zone) threshold)
478
- htg_t_f = 0
479
- htg_t_c = OpenStudio.convert(htg_t_f, 'F', 'C').get
480
- htg_stpt_sch = OpenStudio::Model::ScheduleRuleset.new(thermal_zone.model)
481
- htg_stpt_sch.setName('Unconditioned Minimal Heating')
482
- htg_stpt_sch.defaultDaySchedule.setName('Unconditioned Minimal Heating Default')
483
- htg_stpt_sch.defaultDaySchedule.addValue(OpenStudio::Time.new(0, 24, 0, 0), htg_t_c)
484
-
485
- # Cooled to 120F (above thermal_zone_cooled?(thermal_zone) threshold)
486
- clg_t_f = 120
487
- clg_t_c = OpenStudio.convert(clg_t_f, 'F', 'C').get
488
- clg_stpt_sch = OpenStudio::Model::ScheduleRuleset.new(thermal_zone.model)
489
- clg_stpt_sch.setName('Unconditioned Minimal Heating')
490
- clg_stpt_sch.defaultDaySchedule.setName('Unconditioned Minimal Heating Default')
491
- clg_stpt_sch.defaultDaySchedule.addValue(OpenStudio::Time.new(0, 24, 0, 0), clg_t_c)
492
-
493
- # Thermostat
494
- thermostat = OpenStudio::Model::ThermostatSetpointDualSetpoint.new(thermal_zone.model)
495
- thermostat.setName("#{thermal_zone.name} Unconditioned Thermostat")
496
- thermostat.setHeatingSetpointTemperatureSchedule(htg_stpt_sch)
497
- thermostat.setCoolingSetpointTemperatureSchedule(clg_stpt_sch)
498
- thermal_zone.setThermostatSetpointDualSetpoint(thermostat)
499
-
500
- return true
501
- end
502
-
503
470
  # Determine the design internal load (W) for this zone without space multipliers.
504
471
  # This include People, Lights, Electric Equipment, and Gas Equipment in all spaces in this zone.
505
472
  # It assumes 100% of the wattage is converted to heat, and that the design peak schedule value is 1 (100%).
@@ -569,7 +536,7 @@ module OpenstudioStandards
569
536
  building_type = building_type_areas.key(building_type_areas.values.max)
570
537
 
571
538
  if building_type.nil?
572
- OpenStudio.logFree(OpenStudio::Info, 'OpenstudioStandards::ThermalZone', "Thermal zone #{thermal_zone.name} does not have standards building type.")
539
+ OpenStudio.logFree(OpenStudio::Info, 'openstudio.standards.ThermalZone', "Thermal zone #{thermal_zone.name} does not have standards building type.")
573
540
  end
574
541
 
575
542
  return building_type
@@ -687,7 +654,7 @@ module OpenstudioStandards
687
654
  # Convert to cfm
688
655
  tot_oa_flow_rate_cfm = OpenStudio.convert(tot_oa_flow_rate, 'm^3/s', 'cfm').get
689
656
 
690
- OpenStudio.logFree(OpenStudio::Debug, 'openstudio.Standards.ThermalZone', "For #{thermal_zone.name}, design min OA = #{tot_oa_flow_rate_cfm.round} cfm.")
657
+ OpenStudio.logFree(OpenStudio::Debug, 'openstudio.standards.ThermalZone', "For #{thermal_zone.name}, design min OA = #{tot_oa_flow_rate_cfm.round} cfm.")
691
658
 
692
659
  return tot_oa_flow_rate
693
660
  end
@@ -711,7 +678,7 @@ module OpenstudioStandards
711
678
  # Calculate the per-area value
712
679
  tot_oa_flow_rate_per_area = tot_oa_flow_rate / sum_floor_area
713
680
 
714
- # OpenStudio::logFree(OpenStudio::Debug, "openstudio.Standards.Model", "For #{self.name}, OA per area = #{tot_oa_flow_rate_per_area.round(8)} m^3/s*m^2.")
681
+ # OpenStudio::logFree(OpenStudio::Debug, "openstudio.standards.ThermalZone", "For #{self.name}, OA per area = #{tot_oa_flow_rate_per_area.round(8)} m^3/s*m^2.")
715
682
 
716
683
  return tot_oa_flow_rate_per_area
717
684
  end
@@ -776,7 +743,7 @@ module OpenstudioStandards
776
743
  new_dsn_oa.setOutdoorAirFlowRateFractionSchedule(oa_sch)
777
744
  end
778
745
 
779
- OpenStudio.logFree(OpenStudio::Info, 'openstudio.Standards.ThermalZone', "For #{thermal_zone.name}: Converted total ventilation requirements to per-area value.")
746
+ OpenStudio.logFree(OpenStudio::Info, 'openstudio.standards.ThermalZone', "For #{thermal_zone.name}: Converted total ventilation requirements to per-area value.")
780
747
  end
781
748
 
782
749
  return true
@@ -0,0 +1,152 @@
1
+ module OpenstudioStandards
2
+ # The ThermalZone module provides methods to set thermostats and get information about model thermal zones
3
+ module ThermalZone
4
+ # Adds thermostat schedules to thermal zones based on the standards space type
5
+ # Chooses the thermostat schedule with the most restrictive setpoints (maximum heating, lowest cooling) in the schedule if multiple space types are present
6
+ #
7
+ # @param thermal_zones [Array<OpenStudio::Model::ThermalZone>] OpenStudio ThermalZone objects
8
+ # @return [Boolean] returns true if successful, false if not
9
+ def self.thermal_zones_set_thermostat_schedules(thermal_zones)
10
+ # load and return thermostat mapping data
11
+ thermostat_data = JSON.parse(File.read("#{File.dirname(__FILE__)}/../prototypes/common/data/thermostat_schedule_lookup.json"), symbolize_names: true)
12
+
13
+ # std call to access model_add_schedule
14
+ # @todo refactor once schedule data is separate
15
+ std = Standard.build('90.1-2013')
16
+
17
+ thermal_zones.each do |thermal_zone|
18
+ # skip plenums
19
+ if OpenstudioStandards::ThermalZone.thermal_zone_plenum?(thermal_zone)
20
+ OpenStudio.logFree(OpenStudio::Warn, 'openstudio.standards.ThermalZone', "Thermal Zone '#{thermal_zone.name}' is a plenum. Not adding thermostat schedules.")
21
+ next
22
+ end
23
+
24
+ # get space types
25
+ thermal_zone_space_types = []
26
+ thermal_zone.spaces.each do |space|
27
+ if space.spaceType.is_initialized
28
+ thermal_zone_space_types << space.spaceType.get
29
+ end
30
+ end
31
+
32
+ # check if additional properties set, and if not add it
33
+ has_space_type = thermal_zone_space_types[0].additionalProperties.hasFeature('standards_space_type')
34
+ unless has_space_type
35
+ OpenstudioStandards::SpaceType.set_standards_space_type_additional_properties(thermal_zone.model)
36
+ end
37
+
38
+ # add thermostat schedules for space type
39
+ zone_thermostats_options = []
40
+ thermal_zone_space_types.each do |space_type|
41
+ heating_thermostat_sch_name = nil
42
+ cooling_thermostat_sch_name = nil
43
+
44
+ # get the standards space type
45
+ space_type_name = space_type.additionalProperties.getFeatureAsString('standards_space_type').get
46
+
47
+ # get the thermostat data associated with this space type
48
+ space_type_data = thermostat_data.select { |h| h[:space_type] == space_type_name }
49
+
50
+ # get unique possible heating and cooling setpoint schedules
51
+ heating_thermostat_schs = space_type_data.map { |h| h[:heating_setpoint_schedule] }.compact.uniq
52
+ cooling_thermostat_schs = space_type_data.map { |h| h[:cooling_setpoint_schedule] }.compact.uniq
53
+
54
+ # check if there is a unique heating and cooling thermostat schedule for this space type
55
+ if (heating_thermostat_schs.size < 2) && (cooling_thermostat_schs.size < 2)
56
+ # if so, use it
57
+ heating_thermostat_sch_name = heating_thermostat_schs[0]
58
+ cooling_thermostat_sch_name = cooling_thermostat_schs[0]
59
+ else
60
+ # if not, get the heating and cooling thermostat schedule by standards building type
61
+ if space_type.standardsBuildingType.is_initialized
62
+ # select down to building type
63
+ space_type_data = space_type_data.select { |h| h[:standards_building_type] == space_type.standardsBuildingType.get }
64
+ if space_type_data.empty?
65
+ OpenStudio.logFree(OpenStudio::Warn, 'openstudio.standards.ThermalZone', "No thermostat schedule data is available for space type '#{space_type.name} with standards space type #{space_type_name} and standards building type #{space_type.standardsBuildingType.get}. Unable to create thermostat schedules.")
66
+ next
67
+ else
68
+ heating_thermostat_sch_name = space_type_data[0][:heating_setpoint_schedule]
69
+ cooling_thermostat_sch_name = space_type_data[0][:cooling_setpoint_schedule]
70
+ end
71
+ else
72
+ # unable to find standards building type
73
+ OpenStudio.logFree(OpenStudio::Warn, 'openstudio.standards.ThermalZone', "Multiple thermostat schedules are available for space type '#{space_type.name} with standards space type #{space_type_name} depending on building type, but building type is not specified. Using a default schedule for this space type.")
74
+ space_type_data = thermostat_data.find { |h| h[:space_type] == space_type_name }
75
+ heating_thermostat_sch_name = space_type_data[:heating_setpoint_schedule]
76
+ cooling_thermostat_sch_name = space_type_data[:cooling_setpoint_schedule]
77
+ end
78
+ end
79
+
80
+ # make thermostat
81
+ thermostat = space_type.model.getThermostatSetpointDualSetpointByName("#{space_type.name} Thermostat")
82
+ if thermostat.is_initialized
83
+ OpenStudio.logFree(OpenStudio::Debug, 'openstudio.standards.ThermalZone', "#{space_type.name} thermostat already in model.")
84
+ thermostat = thermostat.get
85
+ else
86
+ thermostat = OpenStudio::Model::ThermostatSetpointDualSetpoint.new(space_type.model)
87
+ thermostat.setName("#{space_type.name} Thermostat")
88
+
89
+ unless heating_thermostat_sch_name.nil?
90
+ thermostat.setHeatingSetpointTemperatureSchedule(std.model_add_schedule(space_type.model, heating_thermostat_sch_name))
91
+ OpenStudio.logFree(OpenStudio::Info, 'openstudio.standards.ThermalZone', "#{space_type.name} set heating setpoint schedule to #{heating_thermostat_sch_name}.")
92
+ end
93
+
94
+ unless cooling_thermostat_sch_name.nil?
95
+ thermostat.setCoolingSetpointTemperatureSchedule(std.model_add_schedule(space_type.model, cooling_thermostat_sch_name))
96
+ OpenStudio.logFree(OpenStudio::Info, 'openstudio.standards.ThermalZone', "#{space_type.name} set cooling setpoint schedule to #{cooling_thermostat_sch_name}.")
97
+ end
98
+ end
99
+
100
+ # log the schedules
101
+ zone_thermostats_options << thermostat
102
+ end
103
+
104
+ # If only one thermostat, use it
105
+ if zone_thermostats_options.size == 1
106
+ thermal_zone.setThermostatSetpointDualSetpoint(zone_thermostats_options[0])
107
+ elsif zone_thermostats_options.size > 1
108
+ # otherwise find the zone thermostat with the most restrictive setpoints
109
+ # @todo logic here to pick between options
110
+ OpenStudio.logFree(OpenStudio::Info, 'openstudio.standards.ThermalZone', "Multiple thermostat options for thermal zone #{thermal_zone.name} depending on space types.")
111
+ thermal_zone.setThermostatSetpointDualSetpoint(zone_thermostats_options[0])
112
+ else
113
+ OpenStudio.logFree(OpenStudio::Info, 'openstudio.standards.ThermalZone', "Unable to find valid thermostat options for thermal zone #{thermal_zone.name} depending on space types.")
114
+ end
115
+ end
116
+
117
+ return true
118
+ end
119
+
120
+ # Adds thermostat schedules with a 0F heating setpoint and 120F cooling setpoint.
121
+ # These numbers are outside of the threshold that is considered heated or cooled by thermal_zone_heated? and thermal_zone_cooled?
122
+ #
123
+ # @param thermal_zone [OpenStudio::Model::ThermalZone] OpenStudio ThermalZone object
124
+ # @return [Boolean] returns true if successful, false if not
125
+ def self.thermal_zone_set_unconditioned_thermostat(thermal_zone)
126
+ # Heated to 0F (below thermal_zone_heated?(thermal_zone) threshold)
127
+ htg_t_f = 0.0
128
+ htg_t_c = OpenStudio.convert(htg_t_f, 'F', 'C').get
129
+ htg_stpt_sch = OpenStudio::Model::ScheduleRuleset.new(thermal_zone.model)
130
+ htg_stpt_sch.setName('Unconditioned Minimal Heating')
131
+ htg_stpt_sch.defaultDaySchedule.setName('Unconditioned Minimal Heating Default')
132
+ htg_stpt_sch.defaultDaySchedule.addValue(OpenStudio::Time.new(0, 24, 0, 0), htg_t_c)
133
+
134
+ # Cooled to 120F (above thermal_zone_cooled?(thermal_zone) threshold)
135
+ clg_t_f = 120.0
136
+ clg_t_c = OpenStudio.convert(clg_t_f, 'F', 'C').get
137
+ clg_stpt_sch = OpenStudio::Model::ScheduleRuleset.new(thermal_zone.model)
138
+ clg_stpt_sch.setName('Unconditioned Minimal Cooling')
139
+ clg_stpt_sch.defaultDaySchedule.setName('Unconditioned Minimal Cooling Default')
140
+ clg_stpt_sch.defaultDaySchedule.addValue(OpenStudio::Time.new(0, 24, 0, 0), clg_t_c)
141
+
142
+ # Thermostat
143
+ thermostat = OpenStudio::Model::ThermostatSetpointDualSetpoint.new(thermal_zone.model)
144
+ thermostat.setName("#{thermal_zone.name} Unconditioned Thermostat")
145
+ thermostat.setHeatingSetpointTemperatureSchedule(htg_stpt_sch)
146
+ thermostat.setCoolingSetpointTemperatureSchedule(clg_stpt_sch)
147
+ thermal_zone.setThermostatSetpointDualSetpoint(thermostat)
148
+
149
+ return true
150
+ end
151
+ end
152
+ end
@@ -4,23 +4,27 @@ $OPENSTUDIO_LOG.setLogLevel(OpenStudio::Debug)
4
4
 
5
5
  # Log the info, warning, and error messages to a runner.
6
6
  #
7
- # runner @param [Runner] The Measure runner to add the messages to
8
- # debug @param [Boolean] If true, include the debug messages in the log
9
- # @return [Runner] The same Measure runner, with messages from the openstudio-standards library added
10
- def log_messages_to_runner(runner, debug = false)
7
+ # @param runner [OpenStudio::Measure::OSRunner] The Measure runner to add the messages to
8
+ # @param debug [Boolean] If true, include the debug messages in the log
9
+ # @param custom_exclusions [Array<String>] An array of custom strings to exclude from the log
10
+ def log_messages_to_runner(runner, debug = false, custom_exclusions: nil)
11
+ log_message_exclusions = [
12
+ 'UseWeatherFile', # 'UseWeatherFile' is not yet a supported option for YearDescription
13
+ 'Skipping layer', # Annoying/bogus "Skipping layer" warnings
14
+ 'runmanager', # RunManager messages
15
+ 'setFileExtension', # .ddy extension unexpected
16
+ 'Translator', # Forward translator and geometry translator
17
+ 'Successive data points', # Successive data points (2004-Jan-31 to 2001-Feb-01, ending on line 753) are greater than 1 day apart in EPW file
18
+ 'has multiple parents', # Bogus errors about curves having multiple parents
19
+ 'does not have an Output', # Warning from EMS translation
20
+ 'Prior to OpenStudio 2.6.2, this field was returning a double, it now returns an Optional double' # Warning about OS API change
21
+ ] + Array(custom_exclusions)
22
+
11
23
  $OPENSTUDIO_LOG.logMessages.each do |msg|
12
24
  # DLM: you can filter on log channel here for now
13
25
  if /openstudio.*/ =~ msg.logChannel # /openstudio\.model\..*/
14
26
  # Skip certain messages that are irrelevant/misleading
15
- next if msg.logMessage.include?('UseWeatherFile') || # 'UseWeatherFile' is not yet a supported option for YearDescription
16
- msg.logMessage.include?('Skipping layer') || # Annoying/bogus "Skipping layer" warnings
17
- msg.logChannel.include?('runmanager') || # RunManager messages
18
- msg.logChannel.include?('setFileExtension') || # .ddy extension unexpected
19
- msg.logChannel.include?('Translator') || # Forward translator and geometry translator
20
- msg.logMessage.include?('Successive data points') || # Successive data points (2004-Jan-31 to 2001-Feb-01, ending on line 753) are greater than 1 day apart in EPW file
21
- msg.logMessage.include?('has multiple parents') || # Bogus errors about curves having multiple parents
22
- msg.logMessage.include?('does not have an Output') || # Warning from EMS translation
23
- msg.logMessage.include?('Prior to OpenStudio 2.6.2, this field was returning a double, it now returns an Optional double') # Warning about OS API change
27
+ next if log_message_exclusions.any? { |ex| msg.logMessage.include?(ex) }
24
28
 
25
29
  # Report the message in the correct way
26
30
  if msg.logLevel == OpenStudio::Info
@@ -29,7 +33,7 @@ def log_messages_to_runner(runner, debug = false)
29
33
  runner.registerWarning("[#{msg.logChannel}] #{msg.logMessage}")
30
34
  elsif msg.logLevel == OpenStudio::Error
31
35
  runner.registerError("[#{msg.logChannel}] #{msg.logMessage}")
32
- elsif msg.logLevel == OpenStudio::Debug && debug
36
+ elsif debug && msg.logLevel == OpenStudio::Debug
33
37
  runner.registerInfo("DEBUG - #{msg.logMessage}")
34
38
  end
35
39
  end
@@ -13,5 +13,5 @@ module OpenstudioStandards
13
13
  end
14
14
  return 'git-not-found-on-this-system'
15
15
  end
16
- VERSION = '0.8.3'.freeze
16
+ VERSION = '0.8.5.rc1'.freeze
17
17
  end
@@ -79,7 +79,7 @@ module OpenstudioStandards
79
79
  end
80
80
 
81
81
  # set ground temperature shallow values based on .stat file
82
- ground_temperature_shallow = OpenStudio::Model::SiteGroundTemperatureShallow.new(model)
82
+ ground_temperature_shallow = model.getSiteGroundTemperatureShallow
83
83
  ground_temperature_shallow.setJanuarySurfaceGroundTemperature(stat_file.monthly_undis_ground_temps_0p5m[0])
84
84
  ground_temperature_shallow.setFebruarySurfaceGroundTemperature(stat_file.monthly_undis_ground_temps_0p5m[1])
85
85
  ground_temperature_shallow.setMarchSurfaceGroundTemperature(stat_file.monthly_undis_ground_temps_0p5m[2])
@@ -113,7 +113,7 @@ module OpenstudioStandards
113
113
  end
114
114
 
115
115
  # set ground temperature deep values based on .stat file
116
- ground_temperature_deep = OpenStudio::Model::SiteGroundTemperatureDeep.new(model)
116
+ ground_temperature_deep = model.getSiteGroundTemperatureDeep
117
117
  ground_temperature_deep.setJanuaryDeepGroundTemperature(stat_file.monthly_undis_ground_temps_4p0m[0])
118
118
  ground_temperature_deep.setFebruaryDeepGroundTemperature(stat_file.monthly_undis_ground_temps_4p0m[1])
119
119
  ground_temperature_deep.setMarchDeepGroundTemperature(stat_file.monthly_undis_ground_temps_4p0m[2])
@@ -285,7 +285,7 @@ module OpenstudioStandards
285
285
 
286
286
  # parse design temperatures
287
287
  # TMYx stat file format is different than TMY3, cf #1948
288
- is_tmyx = @text.include?("Wind Shelter Factor")
288
+ is_tmyx = @text.include?('Wind Shelter Factor')
289
289
  temperature_info = [
290
290
  { name: 'Heating Design Temperatures', regex: /Heating(\s*\d+.*)\n/, container: @heating_design_info, size: is_tmyx ? 16 : 15 },
291
291
  { name: 'Cooling Design Temperatures', regex: /Cooling(\s*\d+.*)\n/, container: @cooling_design_info, size: 32 },
@@ -294,7 +294,7 @@ module OpenstudioStandards
294
294
  ]
295
295
  temperature_info.each { |temp_info| parse_design_temp_info(temp_info) }
296
296
  if is_tmyx
297
- @heating_design_info.pop() # remove the last value, which is the Wind Shelter Factor
297
+ @heating_design_info.pop # remove the last value, which is the Wind Shelter Factor
298
298
  # There is no WBmax in TMYx files, so add a nil
299
299
  @extremes_design_info.insert(3, nil)
300
300
  end