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
@@ -1,590 +0,0 @@
1
- class Standard
2
- # These EnergyPlus objects implement a proportional control for a single thermal zone with a radiant system.
3
- # @ref [References::CBERadiantSystems]
4
- # @param zone [OpenStudio::Model::ThermalZone>] zone to add radiant controls
5
- # @param radiant_loop [OpenStudio::Model::ZoneHVACLowTempRadiantVarFlow>] radiant loop in thermal zone
6
- # @param radiant_temperature_control_type [String] determines the controlled temperature for the radiant system
7
- # options are 'SurfaceFaceTemperature', 'SurfaceInteriorTemperature'
8
- # @param use_zone_occupancy_for_control [Boolean] Set to true if radiant system is to use specific zone occupancy objects
9
- # for CBE control strategy. If false, then it will use values in model_occ_hr_start and model_occ_hr_end
10
- # for all radiant zones. default to true.
11
- # @param occupied_percentage_threshold [Double] the minimum fraction (0 to 1) that counts as occupied
12
- # if this parameter is set, the returned ScheduleRuleset will be 0 = unoccupied, 1 = occupied
13
- # otherwise the ScheduleRuleset will be the weighted fractional occupancy schedule
14
- # @param model_occ_hr_start [Double] Starting decimal hour of whole building occupancy
15
- # @param model_occ_hr_end [Double] Ending decimal hour of whole building occupancy
16
- # @todo model_occ_hr_start and model_occ_hr_end from zone occupancy schedules
17
- # @param proportional_gain [Double] Proportional gain constant (recommended 0.3 or less).
18
- # @param switch_over_time [Double] Time limitation for when the system can switch between heating and cooling
19
- def model_add_radiant_proportional_controls(model, zone, radiant_loop,
20
- radiant_temperature_control_type: 'SurfaceFaceTemperature',
21
- use_zone_occupancy_for_control: true,
22
- occupied_percentage_threshold: 0.10,
23
- model_occ_hr_start: 6.0,
24
- model_occ_hr_end: 18.0,
25
- proportional_gain: 0.3,
26
- switch_over_time: 24.0)
27
-
28
- zone_name = ems_friendly_name(zone.name)
29
- zone_timestep = model.getTimestep.numberOfTimestepsPerHour
30
-
31
- if model.version < OpenStudio::VersionString.new('3.1.1')
32
- coil_cooling_radiant = radiant_loop.coolingCoil.to_CoilCoolingLowTempRadiantVarFlow.get
33
- coil_heating_radiant = radiant_loop.heatingCoil.to_CoilHeatingLowTempRadiantVarFlow.get
34
- else
35
- coil_cooling_radiant = radiant_loop.coolingCoil.get.to_CoilCoolingLowTempRadiantVarFlow.get
36
- coil_heating_radiant = radiant_loop.heatingCoil.get.to_CoilHeatingLowTempRadiantVarFlow.get
37
- end
38
-
39
- #####
40
- # Define radiant system parameters
41
- ####
42
- # set radiant system temperature and setpoint control type
43
- unless ['surfacefacetemperature', 'surfaceinteriortemperature'].include? radiant_temperature_control_type.downcase
44
- OpenStudio.logFree(OpenStudio::Error, 'openstudio.Model.Model',
45
- "Control sequences not compatible with '#{radiant_temperature_control_type}' radiant system control. Defaulting to 'SurfaceFaceTemperature'.")
46
- radiant_temperature_control_type = 'SurfaceFaceTemperature'
47
- end
48
-
49
- radiant_loop.setTemperatureControlType(radiant_temperature_control_type)
50
-
51
- #####
52
- # List of schedule objects used to hold calculation results
53
- ####
54
-
55
- # get existing switchover time schedule or create one if needed
56
- sch_radiant_switchover = model.getScheduleRulesetByName('Radiant System Switchover')
57
- if sch_radiant_switchover.is_initialized
58
- sch_radiant_switchover = sch_radiant_switchover.get
59
- else
60
- sch_radiant_switchover = OpenstudioStandards::Schedules.create_constant_schedule_ruleset(model,
61
- switch_over_time,
62
- name: 'Radiant System Switchover',
63
- schedule_type_limit: 'Dimensionless')
64
- end
65
-
66
- # set radiant system switchover schedule
67
- radiant_loop.setChangeoverDelayTimePeriodSchedule(sch_radiant_switchover.to_Schedule.get)
68
-
69
- # Calculated active slab heating and cooling temperature setpoint.
70
- # radiant system cooling control actuator
71
- sch_radiant_clgsetp = OpenstudioStandards::Schedules.create_constant_schedule_ruleset(model,
72
- 26.0,
73
- name: "#{zone_name}_Sch_Radiant_ClgSetP",
74
- schedule_type_limit: 'Temperature')
75
- coil_cooling_radiant.setCoolingControlTemperatureSchedule(sch_radiant_clgsetp)
76
- cmd_cold_water_ctrl = OpenStudio::Model::EnergyManagementSystemActuator.new(sch_radiant_clgsetp,
77
- 'Schedule:Year',
78
- 'Schedule Value')
79
- cmd_cold_water_ctrl.setName("#{zone_name}_cmd_cold_water_ctrl")
80
-
81
- # radiant system heating control actuator
82
- sch_radiant_htgsetp = OpenstudioStandards::Schedules.create_constant_schedule_ruleset(model,
83
- 20.0,
84
- name: "#{zone_name}_Sch_Radiant_HtgSetP",
85
- schedule_type_limit: 'Temperature')
86
- coil_heating_radiant.setHeatingControlTemperatureSchedule(sch_radiant_htgsetp)
87
- cmd_hot_water_ctrl = OpenStudio::Model::EnergyManagementSystemActuator.new(sch_radiant_htgsetp,
88
- 'Schedule:Year',
89
- 'Schedule Value')
90
- cmd_hot_water_ctrl.setName("#{zone_name}_cmd_hot_water_ctrl")
91
-
92
- # Calculated cooling setpoint error. Calculated from upper comfort limit minus setpoint offset and 'measured' controlled zone temperature.
93
- sch_csp_error = OpenstudioStandards::Schedules.create_constant_schedule_ruleset(model,
94
- 0.0,
95
- name: "#{zone_name}_Sch_CSP_Error",
96
- schedule_type_limit: 'Temperature')
97
- cmd_csp_error = OpenStudio::Model::EnergyManagementSystemActuator.new(sch_csp_error,
98
- 'Schedule:Year',
99
- 'Schedule Value')
100
- cmd_csp_error.setName("#{zone_name}_cmd_csp_error")
101
-
102
- # Calculated heating setpoint error. Calculated from lower comfort limit plus setpoint offset and 'measured' controlled zone temperature.
103
- sch_hsp_error = OpenstudioStandards::Schedules.create_constant_schedule_ruleset(model,
104
- 0.0,
105
- name: "#{zone_name}_Sch_HSP_Error",
106
- schedule_type_limit: 'Temperature')
107
- cmd_hsp_error = OpenStudio::Model::EnergyManagementSystemActuator.new(sch_hsp_error,
108
- 'Schedule:Year',
109
- 'Schedule Value')
110
- cmd_hsp_error.setName("#{zone_name}_cmd_hsp_error")
111
-
112
- #####
113
- # List of global variables used in EMS scripts
114
- ####
115
-
116
- # Proportional gain constant (recommended 0.3 or less).
117
- prp_k = model.getEnergyManagementSystemGlobalVariableByName('prp_k')
118
- if prp_k.is_initialized
119
- prp_k = prp_k.get
120
- else
121
- prp_k = OpenStudio::Model::EnergyManagementSystemGlobalVariable.new(model, 'prp_k')
122
- end
123
-
124
- # Upper slab temperature setpoint limit (recommended no higher than 29C (84F))
125
- upper_slab_sp_lim = model.getEnergyManagementSystemGlobalVariableByName('upper_slab_sp_lim')
126
- if upper_slab_sp_lim.is_initialized
127
- upper_slab_sp_lim = upper_slab_sp_lim.get
128
- else
129
- upper_slab_sp_lim = OpenStudio::Model::EnergyManagementSystemGlobalVariable.new(model, 'upper_slab_sp_lim')
130
- end
131
-
132
- # Lower slab temperature setpoint limit (recommended no lower than 19C (66F))
133
- lower_slab_sp_lim = model.getEnergyManagementSystemGlobalVariableByName('lower_slab_sp_lim')
134
- if lower_slab_sp_lim.is_initialized
135
- lower_slab_sp_lim = lower_slab_sp_lim.get
136
- else
137
- lower_slab_sp_lim = OpenStudio::Model::EnergyManagementSystemGlobalVariable.new(model, 'lower_slab_sp_lim')
138
- end
139
-
140
- # Temperature offset used as a safety factor for thermal control (recommend 0.5C (1F)).
141
- ctrl_temp_offset = model.getEnergyManagementSystemGlobalVariableByName('ctrl_temp_offset')
142
- if ctrl_temp_offset.is_initialized
143
- ctrl_temp_offset = ctrl_temp_offset.get
144
- else
145
- ctrl_temp_offset = OpenStudio::Model::EnergyManagementSystemGlobalVariable.new(model, 'ctrl_temp_offset')
146
- end
147
-
148
- # Hour where slab setpoint is to be changed
149
- hour_of_slab_sp_change = model.getEnergyManagementSystemGlobalVariableByName('hour_of_slab_sp_change')
150
- if hour_of_slab_sp_change.is_initialized
151
- hour_of_slab_sp_change = hour_of_slab_sp_change.get
152
- else
153
- hour_of_slab_sp_change = OpenStudio::Model::EnergyManagementSystemGlobalVariable.new(model, 'hour_of_slab_sp_change')
154
- end
155
-
156
- #####
157
- # List of zone specific variables used in EMS scripts
158
- ####
159
-
160
- # Maximum 'measured' temperature in zone during occupied times. Default setup uses mean air temperature.
161
- # Other possible choices are operative and mean radiant temperature.
162
- zone_max_ctrl_temp = OpenStudio::Model::EnergyManagementSystemGlobalVariable.new(model, "#{zone_name}_max_ctrl_temp")
163
-
164
- # Minimum 'measured' temperature in zone during occupied times. Default setup uses mean air temperature.
165
- # Other possible choices are operative and mean radiant temperature.
166
- zone_min_ctrl_temp = OpenStudio::Model::EnergyManagementSystemGlobalVariable.new(model, "#{zone_name}_min_ctrl_temp")
167
-
168
- #####
169
- # List of 'sensors' used in the EMS programs
170
- ####
171
-
172
- # Controlled zone temperature for the zone.
173
- zone_ctrl_temperature = OpenStudio::Model::EnergyManagementSystemSensor.new(model, 'Zone Air Temperature')
174
- zone_ctrl_temperature.setName("#{zone_name}_ctrl_temperature")
175
- zone_ctrl_temperature.setKeyName(zone.name.get)
176
-
177
- # check for zone thermostat and replace heat/cool schedules for radiant system control
178
- # if there is no zone thermostat, then create one
179
- zone_thermostat = zone.thermostatSetpointDualSetpoint
180
-
181
- if zone_thermostat.is_initialized
182
- OpenStudio.logFree(OpenStudio::Info, 'openstudio.Model.Model', "Replacing thermostat schedules in zone #{zone.name} for radiant system control.")
183
- zone_thermostat = zone.thermostatSetpointDualSetpoint.get
184
- else
185
- OpenStudio.logFree(OpenStudio::Info, 'openstudio.Model.Model', "Zone #{zone.name} does not have a thermostat. Creating a thermostat for radiant system control.")
186
- zone_thermostat = OpenStudio::Model::ThermostatSetpointDualSetpoint.new(model)
187
- zone_thermostat.setName("#{zone_name}_Thermostat_DualSetpoint")
188
- end
189
-
190
- # create new heating and cooling schedules to be used with all radiant systems
191
- zone_htg_thermostat = model.getScheduleRulesetByName('Radiant System Heating Setpoint')
192
- if zone_htg_thermostat.is_initialized
193
- zone_htg_thermostat = zone_htg_thermostat.get
194
- else
195
- zone_htg_thermostat = OpenstudioStandards::Schedules.create_constant_schedule_ruleset(model,
196
- 20.0,
197
- name: 'Radiant System Heating Setpoint',
198
- schedule_type_limit: 'Temperature')
199
- end
200
-
201
- zone_clg_thermostat = model.getScheduleRulesetByName('Radiant System Cooling Setpoint')
202
- if zone_clg_thermostat.is_initialized
203
- zone_clg_thermostat = zone_clg_thermostat.get
204
- else
205
- zone_clg_thermostat = OpenstudioStandards::Schedules.create_constant_schedule_ruleset(model,
206
- 26.0,
207
- name: 'Radiant System Cooling Setpoint',
208
- schedule_type_limit: 'Temperature')
209
- end
210
-
211
- # implement new heating and cooling schedules
212
- zone_thermostat.setHeatingSetpointTemperatureSchedule(zone_htg_thermostat)
213
- zone_thermostat.setCoolingSetpointTemperatureSchedule(zone_clg_thermostat)
214
-
215
- # Upper comfort limit for the zone. Taken from existing thermostat schedules in the zone.
216
- zone_upper_comfort_limit = OpenStudio::Model::EnergyManagementSystemSensor.new(model, 'Schedule Value')
217
- zone_upper_comfort_limit.setName("#{zone_name}_upper_comfort_limit")
218
- zone_upper_comfort_limit.setKeyName(zone_clg_thermostat.name.get)
219
-
220
- # Lower comfort limit for the zone. Taken from existing thermostat schedules in the zone.
221
- zone_lower_comfort_limit = OpenStudio::Model::EnergyManagementSystemSensor.new(model, 'Schedule Value')
222
- zone_lower_comfort_limit.setName("#{zone_name}_lower_comfort_limit")
223
- zone_lower_comfort_limit.setKeyName(zone_htg_thermostat.name.get)
224
-
225
- # Radiant system water flow rate used to determine if there is active hydronic cooling in the radiant system.
226
- zone_rad_cool_operation = OpenStudio::Model::EnergyManagementSystemSensor.new(model, 'System Node Mass Flow Rate')
227
- zone_rad_cool_operation.setName("#{zone_name}_rad_cool_operation")
228
- zone_rad_cool_operation.setKeyName(coil_cooling_radiant.to_StraightComponent.get.inletModelObject.get.name.get)
229
-
230
- # Radiant system water flow rate used to determine if there is active hydronic heating in the radiant system.
231
- zone_rad_heat_operation = OpenStudio::Model::EnergyManagementSystemSensor.new(model, 'System Node Mass Flow Rate')
232
- zone_rad_heat_operation.setName("#{zone_name}_rad_heat_operation")
233
- zone_rad_heat_operation.setKeyName(coil_heating_radiant.to_StraightComponent.get.inletModelObject.get.name.get)
234
-
235
- # Radiant system switchover delay time period schedule
236
- # used to determine if there is active hydronic cooling/heating in the radiant system.
237
- zone_rad_switch_over = model.getEnergyManagementSystemSensorByName('radiant_switch_over_time')
238
-
239
- unless zone_rad_switch_over.is_initialized
240
- zone_rad_switch_over = OpenStudio::Model::EnergyManagementSystemSensor.new(model, 'Schedule Value')
241
- zone_rad_switch_over.setName('radiant_switch_over_time')
242
- zone_rad_switch_over.setKeyName(sch_radiant_switchover.name.get)
243
- end
244
-
245
- # Last 24 hours trend for radiant system in cooling mode.
246
- zone_rad_cool_operation_trend = OpenStudio::Model::EnergyManagementSystemTrendVariable.new(model, zone_rad_cool_operation)
247
- zone_rad_cool_operation_trend.setName("#{zone_name}_rad_cool_operation_trend")
248
- zone_rad_cool_operation_trend.setNumberOfTimestepsToBeLogged(zone_timestep * 48)
249
-
250
- # Last 24 hours trend for radiant system in heating mode.
251
- zone_rad_heat_operation_trend = OpenStudio::Model::EnergyManagementSystemTrendVariable.new(model, zone_rad_heat_operation)
252
- zone_rad_heat_operation_trend.setName("#{zone_name}_rad_heat_operation_trend")
253
- zone_rad_heat_operation_trend.setNumberOfTimestepsToBeLogged(zone_timestep * 48)
254
-
255
- # use zone occupancy objects for radiant system control if selected
256
- if use_zone_occupancy_for_control
257
-
258
- # get annual occupancy schedule for zone
259
- occ_schedule_ruleset = OpenstudioStandards::ThermalZone.thermal_zone_get_occupancy_schedule(zone,
260
- sch_name: "#{zone.name} Radiant System Occupied Schedule",
261
- occupied_percentage_threshold: occupied_percentage_threshold)
262
- else
263
-
264
- occ_schedule_ruleset = model.getScheduleRulesetByName('Whole Building Radiant System Occupied Schedule')
265
- if occ_schedule_ruleset.is_initialized
266
- occ_schedule_ruleset = occ_schedule_ruleset.get
267
- else
268
- # create occupancy schedules
269
- occ_schedule_ruleset = OpenStudio::Model::ScheduleRuleset.new(model)
270
- occ_schedule_ruleset.setName('Whole Building Radiant System Occupied Schedule')
271
-
272
- start_hour = model_occ_hr_end.to_i
273
- start_minute = ((model_occ_hr_end % 1) * 60).to_i
274
- end_hour = model_occ_hr_start.to_i
275
- end_minute = ((model_occ_hr_start % 1) * 60).to_i
276
-
277
- if end_hour > start_hour
278
- occ_schedule_ruleset.defaultDaySchedule.addValue(OpenStudio::Time.new(0, start_hour, start_minute, 0), 1.0)
279
- occ_schedule_ruleset.defaultDaySchedule.addValue(OpenStudio::Time.new(0, end_hour, end_minute, 0), 0.0)
280
- occ_schedule_ruleset.defaultDaySchedule.addValue(OpenStudio::Time.new(0, 24, 0, 0), 1.0) if end_hour < 24
281
- elsif start_hour > end_hour
282
- occ_schedule_ruleset.defaultDaySchedule.addValue(OpenStudio::Time.new(0, end_hour, end_minute, 0), 0.0)
283
- occ_schedule_ruleset.defaultDaySchedule.addValue(OpenStudio::Time.new(0, start_hour, start_minute, 0), 1.0)
284
- occ_schedule_ruleset.defaultDaySchedule.addValue(OpenStudio::Time.new(0, 24, 0, 0), 0.0) if start_hour < 24
285
- else
286
- occ_schedule_ruleset.defaultDaySchedule.addValue(OpenStudio::Time.new(0, 24, 0, 0), 1.0)
287
- end
288
- end
289
- end
290
-
291
- # create ems sensor for zone occupied status
292
- zone_occupied_status = OpenStudio::Model::EnergyManagementSystemSensor.new(model, 'Schedule Value')
293
- zone_occupied_status.setName("#{zone_name}_occupied_status")
294
- zone_occupied_status.setKeyName(occ_schedule_ruleset.name.get)
295
-
296
- # Last 24 hours trend for zone occupied status
297
- zone_occupied_status_trend = OpenStudio::Model::EnergyManagementSystemTrendVariable.new(model, zone_occupied_status)
298
- zone_occupied_status_trend.setName("#{zone_name}_occupied_status_trend")
299
- zone_occupied_status_trend.setNumberOfTimestepsToBeLogged(zone_timestep * 48)
300
-
301
- #####
302
- # List of EMS programs to implement the proportional control for the radiant system.
303
- ####
304
-
305
- # Initialize global constant values used in EMS programs.
306
- set_constant_values_prg_body = <<-EMS
307
- SET prp_k = #{proportional_gain},
308
- SET ctrl_temp_offset = 0.5,
309
- SET upper_slab_sp_lim = 29,
310
- SET lower_slab_sp_lim = 19,
311
- SET hour_of_slab_sp_change = 18
312
- EMS
313
-
314
- set_constant_values_prg = model.getEnergyManagementSystemProgramByName('Set_Constant_Values')
315
- if set_constant_values_prg.is_initialized
316
- set_constant_values_prg = set_constant_values_prg.get
317
- else
318
- set_constant_values_prg = OpenStudio::Model::EnergyManagementSystemProgram.new(model)
319
- set_constant_values_prg.setName('Set_Constant_Values')
320
- set_constant_values_prg.setBody(set_constant_values_prg_body)
321
- end
322
-
323
- # Initialize zone specific constant values used in EMS programs.
324
- set_constant_zone_values_prg_body = <<-EMS
325
- SET #{zone_name}_max_ctrl_temp = #{zone_name}_lower_comfort_limit,
326
- SET #{zone_name}_min_ctrl_temp = #{zone_name}_upper_comfort_limit,
327
- SET #{zone_name}_cmd_csp_error = 0,
328
- SET #{zone_name}_cmd_hsp_error = 0,
329
- SET #{zone_name}_cmd_cold_water_ctrl = #{zone_name}_upper_comfort_limit,
330
- SET #{zone_name}_cmd_hot_water_ctrl = #{zone_name}_lower_comfort_limit
331
- EMS
332
-
333
- set_constant_zone_values_prg = OpenStudio::Model::EnergyManagementSystemProgram.new(model)
334
- set_constant_zone_values_prg.setName("#{zone_name}_Set_Constant_Values")
335
- set_constant_zone_values_prg.setBody(set_constant_zone_values_prg_body)
336
-
337
- # Calculate maximum and minimum 'measured' controlled temperature in the zone
338
- calculate_minmax_ctrl_temp_prg = OpenStudio::Model::EnergyManagementSystemProgram.new(model)
339
- calculate_minmax_ctrl_temp_prg.setName("#{zone_name}_Calculate_Extremes_In_Zone")
340
- calculate_minmax_ctrl_temp_prg_body = <<-EMS
341
- IF (#{zone_name}_occupied_status == 1),
342
- IF #{zone_name}_ctrl_temperature > #{zone_name}_max_ctrl_temp,
343
- SET #{zone_name}_max_ctrl_temp = #{zone_name}_ctrl_temperature,
344
- ENDIF,
345
- IF #{zone_name}_ctrl_temperature < #{zone_name}_min_ctrl_temp,
346
- SET #{zone_name}_min_ctrl_temp = #{zone_name}_ctrl_temperature,
347
- ENDIF,
348
- ELSE,
349
- SET #{zone_name}_max_ctrl_temp = #{zone_name}_lower_comfort_limit,
350
- SET #{zone_name}_min_ctrl_temp = #{zone_name}_upper_comfort_limit,
351
- ENDIF
352
- EMS
353
- calculate_minmax_ctrl_temp_prg.setBody(calculate_minmax_ctrl_temp_prg_body)
354
-
355
- # Calculate errors from comfort zone limits and 'measured' controlled temperature in the zone.
356
- calculate_errors_from_comfort_prg = OpenStudio::Model::EnergyManagementSystemProgram.new(model)
357
- calculate_errors_from_comfort_prg.setName("#{zone_name}_Calculate_Errors_From_Comfort")
358
- calculate_errors_from_comfort_prg_body = <<-EMS
359
- IF (CurrentTime == (hour_of_slab_sp_change - ZoneTimeStep)),
360
- SET #{zone_name}_cmd_csp_error = (#{zone_name}_upper_comfort_limit - ctrl_temp_offset) - #{zone_name}_max_ctrl_temp,
361
- SET #{zone_name}_cmd_hsp_error = (#{zone_name}_lower_comfort_limit + ctrl_temp_offset) - #{zone_name}_min_ctrl_temp,
362
- ENDIF
363
- EMS
364
- calculate_errors_from_comfort_prg.setBody(calculate_errors_from_comfort_prg_body)
365
-
366
- # Calculate the new active slab temperature setpoint for heating and cooling
367
- calculate_slab_ctrl_setpoint_prg = OpenStudio::Model::EnergyManagementSystemProgram.new(model)
368
- calculate_slab_ctrl_setpoint_prg.setName("#{zone_name}_Calculate_Slab_Ctrl_Setpoint")
369
- calculate_slab_ctrl_setpoint_prg_body = <<-EMS
370
- SET #{zone_name}_cont_cool_oper = @TrendSum #{zone_name}_rad_cool_operation_trend radiant_switch_over_time/ZoneTimeStep,
371
- SET #{zone_name}_cont_heat_oper = @TrendSum #{zone_name}_rad_heat_operation_trend radiant_switch_over_time/ZoneTimeStep,
372
- SET #{zone_name}_occupied_hours = @TrendSum #{zone_name}_occupied_status_trend 24/ZoneTimeStep,
373
- IF (#{zone_name}_cont_cool_oper > 0) && (#{zone_name}_occupied_hours > 0) && (CurrentTime == hour_of_slab_sp_change),
374
- SET #{zone_name}_cmd_hot_water_ctrl = #{zone_name}_cmd_hot_water_ctrl + (#{zone_name}_cmd_csp_error*prp_k),
375
- ELSEIF (#{zone_name}_cont_heat_oper > 0) && (#{zone_name}_occupied_hours > 0) && (CurrentTime == hour_of_slab_sp_change),
376
- SET #{zone_name}_cmd_hot_water_ctrl = #{zone_name}_cmd_hot_water_ctrl + (#{zone_name}_cmd_hsp_error*prp_k),
377
- ELSE,
378
- SET #{zone_name}_cmd_hot_water_ctrl = #{zone_name}_cmd_hot_water_ctrl,
379
- ENDIF,
380
- IF (#{zone_name}_cmd_hot_water_ctrl < lower_slab_sp_lim),
381
- SET #{zone_name}_cmd_hot_water_ctrl = lower_slab_sp_lim,
382
- ELSEIF (#{zone_name}_cmd_hot_water_ctrl > upper_slab_sp_lim),
383
- SET #{zone_name}_cmd_hot_water_ctrl = upper_slab_sp_lim,
384
- ENDIF,
385
- SET #{zone_name}_cmd_cold_water_ctrl = #{zone_name}_cmd_hot_water_ctrl + 0.01
386
- EMS
387
- calculate_slab_ctrl_setpoint_prg.setBody(calculate_slab_ctrl_setpoint_prg_body)
388
-
389
- #####
390
- # List of EMS program manager objects
391
- ####
392
-
393
- initialize_constant_parameters = model.getEnergyManagementSystemProgramCallingManagerByName('Initialize_Constant_Parameters')
394
- if initialize_constant_parameters.is_initialized
395
- initialize_constant_parameters = initialize_constant_parameters.get
396
- # add program if it does not exist in manager
397
- existing_program_names = initialize_constant_parameters.programs.collect { |prg| prg.name.get.downcase }
398
- unless existing_program_names.include? set_constant_values_prg.name.get.downcase
399
- initialize_constant_parameters.addProgram(set_constant_values_prg)
400
- end
401
- else
402
- initialize_constant_parameters = OpenStudio::Model::EnergyManagementSystemProgramCallingManager.new(model)
403
- initialize_constant_parameters.setName('Initialize_Constant_Parameters')
404
- initialize_constant_parameters.setCallingPoint('BeginNewEnvironment')
405
- initialize_constant_parameters.addProgram(set_constant_values_prg)
406
- end
407
-
408
- initialize_constant_parameters_after_warmup = model.getEnergyManagementSystemProgramCallingManagerByName('Initialize_Constant_Parameters_After_Warmup')
409
- if initialize_constant_parameters_after_warmup.is_initialized
410
- initialize_constant_parameters_after_warmup = initialize_constant_parameters_after_warmup.get
411
- # add program if it does not exist in manager
412
- existing_program_names = initialize_constant_parameters_after_warmup.programs.collect { |prg| prg.name.get.downcase }
413
- unless existing_program_names.include? set_constant_values_prg.name.get.downcase
414
- initialize_constant_parameters_after_warmup.addProgram(set_constant_values_prg)
415
- end
416
- else
417
- initialize_constant_parameters_after_warmup = OpenStudio::Model::EnergyManagementSystemProgramCallingManager.new(model)
418
- initialize_constant_parameters_after_warmup.setName('Initialize_Constant_Parameters_After_Warmup')
419
- initialize_constant_parameters_after_warmup.setCallingPoint('AfterNewEnvironmentWarmUpIsComplete')
420
- initialize_constant_parameters_after_warmup.addProgram(set_constant_values_prg)
421
- end
422
-
423
- zone_initialize_constant_parameters = OpenStudio::Model::EnergyManagementSystemProgramCallingManager.new(model)
424
- zone_initialize_constant_parameters.setName("#{zone_name}_Initialize_Constant_Parameters")
425
- zone_initialize_constant_parameters.setCallingPoint('BeginNewEnvironment')
426
- zone_initialize_constant_parameters.addProgram(set_constant_zone_values_prg)
427
-
428
- zone_initialize_constant_parameters_after_warmup = OpenStudio::Model::EnergyManagementSystemProgramCallingManager.new(model)
429
- zone_initialize_constant_parameters_after_warmup.setName("#{zone_name}_Initialize_Constant_Parameters_After_Warmup")
430
- zone_initialize_constant_parameters_after_warmup.setCallingPoint('AfterNewEnvironmentWarmUpIsComplete')
431
- zone_initialize_constant_parameters_after_warmup.addProgram(set_constant_zone_values_prg)
432
-
433
- average_building_temperature = OpenStudio::Model::EnergyManagementSystemProgramCallingManager.new(model)
434
- average_building_temperature.setName("#{zone_name}_Average_Building_Temperature")
435
- average_building_temperature.setCallingPoint('EndOfZoneTimestepAfterZoneReporting')
436
- average_building_temperature.addProgram(calculate_minmax_ctrl_temp_prg)
437
- average_building_temperature.addProgram(calculate_errors_from_comfort_prg)
438
-
439
- programs_at_beginning_of_timestep = OpenStudio::Model::EnergyManagementSystemProgramCallingManager.new(model)
440
- programs_at_beginning_of_timestep.setName("#{zone_name}_Programs_At_Beginning_Of_Timestep")
441
- programs_at_beginning_of_timestep.setCallingPoint('BeginTimestepBeforePredictor')
442
- programs_at_beginning_of_timestep.addProgram(calculate_slab_ctrl_setpoint_prg)
443
-
444
- #####
445
- # List of variables for output.
446
- ####
447
-
448
- zone_max_ctrl_temp_output = OpenStudio::Model::EnergyManagementSystemOutputVariable.new(model, zone_max_ctrl_temp)
449
- zone_max_ctrl_temp_output.setName("#{zone_name} Maximum occupied temperature in zone")
450
- zone_min_ctrl_temp_output = OpenStudio::Model::EnergyManagementSystemOutputVariable.new(model, zone_min_ctrl_temp)
451
- zone_min_ctrl_temp_output.setName("#{zone_name} Minimum occupied temperature in zone")
452
- end
453
-
454
- # Native EnergyPlus objects implement a control for a single thermal zone with a radiant system.
455
- # @param zone [OpenStudio::Model::ThermalZone>] zone to add radiant controls
456
- # @param radiant_loop [OpenStudio::Model::ZoneHVACLowTempRadiantVarFlow>] radiant loop in thermal zone
457
- # @param radiant_temperature_control_type [String] determines the controlled temperature for the radiant system
458
- # options are 'SurfaceFaceTemperature', 'SurfaceInteriorTemperature'
459
- # @param slab_setpoint_oa_control [Bool] True if slab setpoint is to be varied based on outdoor air temperature
460
- # @param switch_over_time [Double] Time limitation for when the system can switch between heating and cooling
461
- # @param slab_sp_at_oat_low [Double] radiant slab temperature setpoint, in F, at the outdoor high temperature.
462
- # @param slab_oat_low [Double] outdoor drybulb air temperature, in F, for low radiant slab setpoint.
463
- # @param slab_sp_at_oat_high [Double] radiant slab temperature setpoint, in F, at the outdoor low temperature.
464
- # @param slab_oat_high [Double] outdoor drybulb air temperature, in F, for high radiant slab setpoint.
465
- def model_add_radiant_basic_controls(model, zone, radiant_loop,
466
- radiant_temperature_control_type: 'SurfaceFaceTemperature',
467
- slab_setpoint_oa_control: false,
468
- switch_over_time: 24.0,
469
- slab_sp_at_oat_low: 73,
470
- slab_oat_low: 65,
471
- slab_sp_at_oat_high: 68,
472
- slab_oat_high: 80)
473
-
474
- zone_name = zone.name.to_s.gsub(/[ +-.]/, '_')
475
-
476
- if model.version < OpenStudio::VersionString.new('3.1.1')
477
- coil_cooling_radiant = radiant_loop.coolingCoil.to_CoilCoolingLowTempRadiantVarFlow.get
478
- coil_heating_radiant = radiant_loop.heatingCoil.to_CoilHeatingLowTempRadiantVarFlow.get
479
- else
480
- coil_cooling_radiant = radiant_loop.coolingCoil.get.to_CoilCoolingLowTempRadiantVarFlow.get
481
- coil_heating_radiant = radiant_loop.heatingCoil.get.to_CoilHeatingLowTempRadiantVarFlow.get
482
- end
483
-
484
- #####
485
- # Define radiant system parameters
486
- ####
487
- # set radiant system temperature and setpoint control type
488
- unless ['surfacefacetemperature', 'surfaceinteriortemperature'].include? radiant_temperature_control_type.downcase
489
- OpenStudio.logFree(OpenStudio::Error, 'openstudio.Model.Model',
490
- "Control sequences not compatible with '#{radiant_temperature_control_type}' radiant system control. Defaulting to 'SurfaceFaceTemperature'.")
491
- radiant_temperature_control_type = 'SurfaceFaceTemperature'
492
- end
493
-
494
- radiant_loop.setTemperatureControlType(radiant_temperature_control_type)
495
-
496
- # get existing switchover time schedule or create one if needed
497
- sch_radiant_switchover = model.getScheduleRulesetByName('Radiant System Switchover')
498
- if sch_radiant_switchover.is_initialized
499
- sch_radiant_switchover = sch_radiant_switchover.get
500
- else
501
- sch_radiant_switchover = OpenstudioStandards::Schedules.create_constant_schedule_ruleset(model,
502
- switch_over_time,
503
- name: 'Radiant System Switchover',
504
- schedule_type_limit: 'Dimensionless')
505
- end
506
-
507
- # set radiant system switchover schedule
508
- radiant_loop.setChangeoverDelayTimePeriodSchedule(sch_radiant_switchover.to_Schedule.get)
509
-
510
- if slab_setpoint_oa_control
511
- # get weather file from model
512
- weather_file = model.getWeatherFile
513
- if weather_file.initialized
514
- # get annual outdoor dry bulb temperature
515
- annual_oat = weather_file.file.get.data.collect { |dat| dat.dryBulbTemperature.get }
516
-
517
- # calculate a nhrs rolling average from annual outdoor dry bulb temperature
518
- nhrs = 24
519
- last_nhrs_oat_in_year = annual_oat.last(nhrs - 1)
520
- combined_oat = last_nhrs_oat_in_year + annual_oat
521
- oat_rolling_average = combined_oat.each_cons(nhrs).map { |e| e.reduce(&:+).fdiv(nhrs).round(2) }
522
-
523
- # use rolling average to calculate slab setpoint temperature
524
-
525
- # convert temperature from IP to SI units
526
- slab_sp_at_oat_low_si = OpenStudio.convert(slab_sp_at_oat_low, 'F', 'C').get
527
- slab_oat_low_si = OpenStudio.convert(slab_oat_low, 'F', 'C').get
528
- slab_sp_at_oat_high_si = OpenStudio.convert(slab_sp_at_oat_high, 'F', 'C').get
529
- slab_oat_high_si = OpenStudio.convert(slab_oat_high, 'F', 'C').get
530
-
531
- # calculate relationship between slab setpoint and slope
532
- slope_num = slab_sp_at_oat_high_si - slab_sp_at_oat_low_si
533
- slope_den = slab_oat_high_si - slab_oat_low_si
534
- sp_and_oat_slope = slope_num.fdiv(slope_den).round(4)
535
-
536
- slab_setpoint = oat_rolling_average.map { |e| (slab_sp_at_oat_low_si + ((e - slab_oat_low_si) * sp_and_oat_slope)).round(1) }
537
-
538
- # input upper limits on slab setpoint
539
- slab_sp_upper_limit = [slab_sp_at_oat_high_si, slab_sp_at_oat_low_si].max
540
- slab_sp_lower_limit = [slab_sp_at_oat_high_si, slab_sp_at_oat_low_si].min
541
- slab_setpoint.map! { |e| e > slab_sp_upper_limit ? slab_sp_upper_limit.round(1) : e }
542
-
543
- # input lower limits on slab setpoint
544
- slab_setpoint.map! { |e| e < slab_sp_lower_limit ? slab_sp_lower_limit.round(1) : e }
545
-
546
- # convert to timeseries
547
- yd = model.getYearDescription
548
- start_date = yd.makeDate(1, 1)
549
- interval = OpenStudio::Time.new(1.0 / 24.0)
550
- time_series = OpenStudio::TimeSeries.new(start_date, interval, OpenStudio.createVector(slab_setpoint), 'C')
551
-
552
- # check for pre-existing schedule in model
553
- schedule_interval = model.getScheduleByName('Sch_Radiant_SlabSetP_Based_On_Rolling_Mean_OAT')
554
- if schedule_interval.is_initialized && schedule_interval.get.to_ScheduleFixedInterval.is_initialized
555
- schedule_interval = schedule_interval.get.to_ScheduleFixedInterval.get
556
- schedule_interval.setTimeSeries(time_series)
557
- else
558
- # create fixed interval schedule for slab setpoint
559
- schedule_interval = OpenStudio::Model::ScheduleFixedInterval.new(model)
560
- schedule_interval.setName('Sch_Radiant_SlabSetP_Based_On_Rolling_Mean_OAT')
561
- schedule_interval.setTimeSeries(time_series)
562
- sch_type_limits_obj = OpenstudioStandards::Schedules.create_schedule_type_limits(model, standard_schedule_type_limit: 'Temperature')
563
- schedule_interval.setScheduleTypeLimits(sch_type_limits_obj)
564
- end
565
-
566
- # assign slab setpoint schedule
567
- coil_heating_radiant.setHeatingControlTemperatureSchedule(sch_radiant_slab_setp)
568
- coil_cooling_radiant.setCoolingControlTemperatureSchedule(sch_radiant_slab_setp)
569
- else
570
- OpenStudio.logFree(OpenStudio::Error, 'openstudio.Model.Model',
571
- 'Model does not have a weather file associated with it. Define to implement slab setpoint based on outdoor weather.')
572
- end
573
- else
574
- # radiant system cooling control setpoint
575
- slab_setpoint = 22
576
- sch_radiant_clgsetp = OpenstudioStandards::Schedules.create_constant_schedule_ruleset(model,
577
- slab_setpoint + 0.1,
578
- name: "#{zone_name}_Sch_Radiant_ClgSetP",
579
- schedule_type_limit: 'Temperature')
580
- coil_cooling_radiant.setCoolingControlTemperatureSchedule(sch_radiant_clgsetp)
581
-
582
- # radiant system heating control setpoint
583
- sch_radiant_htgsetp = OpenstudioStandards::Schedules.create_constant_schedule_ruleset(model,
584
- slab_setpoint,
585
- name: "#{zone_name}_Sch_Radiant_HtgSetP",
586
- schedule_type_limit: 'Temperature')
587
- coil_heating_radiant.setHeatingControlTemperatureSchedule(sch_radiant_htgsetp)
588
- end
589
- end
590
- end