openstudio-standards 0.4.0 → 0.5.0.rc1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/data/inventory/thermal_bridging.csv +90 -0
- data/data/standards/OpenStudio_Standards-deer-comstock.xlsx +0 -0
- data/data/standards/manage_OpenStudio_Standards.rb +1 -1
- data/data/standards/test_performance_expected_dd_results.csv +2014 -1891
- data/lib/openstudio-standards/btap/analysis.rb +8 -8
- data/lib/openstudio-standards/btap/bridging.rb +664 -645
- data/lib/openstudio-standards/btap/btap.model.rb +14 -14
- data/lib/openstudio-standards/btap/btap.rb +7 -7
- data/lib/openstudio-standards/btap/btap_result.rb +1 -1
- data/lib/openstudio-standards/btap/economics.rb +23 -23
- data/lib/openstudio-standards/btap/envelope.rb +8 -8
- data/lib/openstudio-standards/btap/equest.rb +1 -1
- data/lib/openstudio-standards/btap/geometry.rb +2 -2
- data/lib/openstudio-standards/btap/mpc.rb +7 -7
- data/lib/openstudio-standards/btap/schedules.rb +1 -1
- data/lib/openstudio-standards/btap/simmanager.rb +4 -4
- data/lib/openstudio-standards/btap/spaceloads.rb +26 -26
- data/lib/openstudio-standards/btap/utilities.rb +6 -6
- data/lib/openstudio-standards/btap/vintagizer.rb +1 -1
- data/lib/openstudio-standards/constructions/information.rb +83 -0
- data/lib/openstudio-standards/constructions/materials/modify.rb +72 -0
- data/lib/openstudio-standards/constructions/modify.rb +80 -0
- data/lib/openstudio-standards/create_typical/create_typical.rb +983 -0
- data/lib/openstudio-standards/create_typical/enumerations.rb +484 -0
- data/lib/openstudio-standards/create_typical/space_type_blend.rb +791 -0
- data/lib/openstudio-standards/create_typical/space_type_ratios.rb +494 -0
- data/lib/openstudio-standards/daylighting/space.rb +47 -0
- data/lib/openstudio-standards/geometry/create.rb +801 -0
- data/lib/openstudio-standards/geometry/create_bar.rb +2171 -0
- data/lib/openstudio-standards/geometry/information.rb +462 -0
- data/lib/openstudio-standards/geometry/modify.rb +48 -0
- data/lib/openstudio-standards/hvac/air_loop/information.rb +79 -0
- data/lib/openstudio-standards/hvac/cbecs_hvac.rb +616 -0
- data/lib/openstudio-standards/hvac/setpoint_managers/information.rb +91 -0
- data/lib/openstudio-standards/prototypes/ashrae_90_1/ashrae_90_1_2004/ashrae_90_1_2004.AirTerminalSingleDuctVAVReheat.rb +1 -1
- data/lib/openstudio-standards/prototypes/ashrae_90_1/ashrae_90_1_2007/ashrae_90_1_2007.AirTerminalSingleDuctVAVReheat.rb +1 -1
- data/lib/openstudio-standards/prototypes/ashrae_90_1/ashrae_90_1_2010/ashrae_90_1_2010.AirTerminalSingleDuctVAVReheat.rb +1 -1
- data/lib/openstudio-standards/prototypes/ashrae_90_1/ashrae_90_1_2010/ashrae_90_1_2010.Model.rb +1 -1
- data/lib/openstudio-standards/prototypes/ashrae_90_1/ashrae_90_1_2013/ashrae_90_1_2013.AirTerminalSingleDuctVAVReheat.rb +1 -1
- data/lib/openstudio-standards/prototypes/ashrae_90_1/ashrae_90_1_2013/ashrae_90_1_2013.Model.rb +2 -2
- data/lib/openstudio-standards/prototypes/ashrae_90_1/ashrae_90_1_2013/ashrae_90_1_2013.hvac_systems.rb +1 -1
- data/lib/openstudio-standards/prototypes/ashrae_90_1/ashrae_90_1_2016/ashrae_90_1_2016.AirTerminalSingleDuctVAVReheat.rb +1 -1
- data/lib/openstudio-standards/prototypes/ashrae_90_1/ashrae_90_1_2016/ashrae_90_1_2016.Model.rb +4 -36
- data/lib/openstudio-standards/prototypes/ashrae_90_1/ashrae_90_1_2016/ashrae_90_1_2016.hvac_systems.rb +1 -1
- data/lib/openstudio-standards/prototypes/ashrae_90_1/ashrae_90_1_2019/ashrae_90_1_2019.AirTerminalSingleDuctVAVReheat.rb +1 -1
- data/lib/openstudio-standards/prototypes/ashrae_90_1/ashrae_90_1_2019/ashrae_90_1_2019.Model.rb +4 -36
- data/lib/openstudio-standards/prototypes/ashrae_90_1/ashrae_90_1_2019/ashrae_90_1_2019.Space.rb +3 -3
- data/lib/openstudio-standards/prototypes/ashrae_90_1/ashrae_90_1_2019/ashrae_90_1_2019.hvac_systems.rb +1 -1
- data/lib/openstudio-standards/prototypes/ashrae_90_1/doe_ref_1980_2004/doe_ref_1980_2004.AirTerminalSingleDuctVAVReheat.rb +1 -1
- data/lib/openstudio-standards/prototypes/ashrae_90_1/doe_ref_1980_2004/doe_ref_1980_2004.Model.elevators.rb +1 -1
- data/lib/openstudio-standards/prototypes/ashrae_90_1/doe_ref_pre_1980/doe_ref_pre_1980.AirTerminalSingleDuctVAVReheat.rb +1 -1
- data/lib/openstudio-standards/prototypes/ashrae_90_1/doe_ref_pre_1980/doe_ref_pre_1980.CoilHeatingGas.rb +1 -1
- data/lib/openstudio-standards/prototypes/ashrae_90_1/doe_ref_pre_1980/doe_ref_pre_1980.Model.elevators.rb +1 -1
- data/lib/openstudio-standards/prototypes/ashrae_90_1/nrel_nze_ready_2017/nrel_zne_ready_2017.AirTerminalSingleDuctVAVReheat.rb +1 -1
- data/lib/openstudio-standards/prototypes/ashrae_90_1/ze_aedg_multifamily/ze_aedg_multifamily.AirTerminalSingleDuctVAVReheat.rb +1 -1
- data/lib/openstudio-standards/prototypes/common/buildings/Prototype.College.rb +7 -7
- data/lib/openstudio-standards/prototypes/common/buildings/Prototype.Courthouse.rb +8 -8
- data/lib/openstudio-standards/prototypes/common/buildings/Prototype.FullServiceRestaurant.rb +14 -14
- data/lib/openstudio-standards/prototypes/common/buildings/Prototype.HighRiseApartment.rb +9 -9
- data/lib/openstudio-standards/prototypes/common/buildings/Prototype.Hospital.rb +16 -16
- data/lib/openstudio-standards/prototypes/common/buildings/Prototype.Laboratory.rb +7 -7
- data/lib/openstudio-standards/prototypes/common/buildings/Prototype.LargeDataCenterHighITE.rb +8 -8
- data/lib/openstudio-standards/prototypes/common/buildings/Prototype.LargeDataCenterLowITE.rb +8 -8
- data/lib/openstudio-standards/prototypes/common/buildings/Prototype.LargeHotel.rb +11 -11
- data/lib/openstudio-standards/prototypes/common/buildings/Prototype.LargeOffice.rb +7 -7
- data/lib/openstudio-standards/prototypes/common/buildings/Prototype.LargeOfficeDetailed.rb +9 -9
- data/lib/openstudio-standards/prototypes/common/buildings/Prototype.MediumOffice.rb +8 -8
- data/lib/openstudio-standards/prototypes/common/buildings/Prototype.MediumOfficeDetailed.rb +11 -11
- data/lib/openstudio-standards/prototypes/common/buildings/Prototype.MidriseApartment.rb +9 -9
- data/lib/openstudio-standards/prototypes/common/buildings/Prototype.Outpatient.rb +19 -19
- data/lib/openstudio-standards/prototypes/common/buildings/Prototype.PrimarySchool.rb +10 -10
- data/lib/openstudio-standards/prototypes/common/buildings/Prototype.QuickServiceRestaurant.rb +13 -13
- data/lib/openstudio-standards/prototypes/common/buildings/Prototype.RetailStandalone.rb +6 -6
- data/lib/openstudio-standards/prototypes/common/buildings/Prototype.RetailStripmall.rb +6 -6
- data/lib/openstudio-standards/prototypes/common/buildings/Prototype.SecondarySchool.rb +9 -9
- data/lib/openstudio-standards/prototypes/common/buildings/Prototype.SmallDataCenterHighITE.rb +8 -8
- data/lib/openstudio-standards/prototypes/common/buildings/Prototype.SmallDataCenterLowITE.rb +8 -8
- data/lib/openstudio-standards/prototypes/common/buildings/Prototype.SmallHotel.rb +8 -8
- data/lib/openstudio-standards/prototypes/common/buildings/Prototype.SmallOffice.rb +8 -8
- data/lib/openstudio-standards/prototypes/common/buildings/Prototype.SmallOfficeDetailed.rb +11 -11
- data/lib/openstudio-standards/prototypes/common/buildings/Prototype.SuperMarket.rb +10 -10
- data/lib/openstudio-standards/prototypes/common/buildings/Prototype.SuperTallBuilding.rb +19 -19
- data/lib/openstudio-standards/prototypes/common/buildings/Prototype.TallBuilding.rb +18 -18
- data/lib/openstudio-standards/prototypes/common/buildings/Prototype.Warehouse.rb +6 -6
- data/lib/openstudio-standards/prototypes/common/do_not_edit_metaclasses.rb +957 -957
- data/lib/openstudio-standards/prototypes/common/objects/Prototype.AirConditionerVariableRefrigerantFlow.rb +1 -1
- data/lib/openstudio-standards/prototypes/common/objects/Prototype.AirTerminalSingleDuctVAVReheat.rb +1 -1
- data/lib/openstudio-standards/prototypes/common/objects/Prototype.CoilCoolingWaterToAirHeatPumpEquationFit.rb +84 -16
- data/lib/openstudio-standards/prototypes/common/objects/Prototype.CoilHeatingDXSingleSpeed.rb +1 -1
- data/lib/openstudio-standards/prototypes/common/objects/Prototype.CoilHeatingGas.rb +1 -1
- data/lib/openstudio-standards/prototypes/common/objects/Prototype.CoilHeatingWaterToAirHeatPumpEquationFit.rb +61 -10
- data/lib/openstudio-standards/prototypes/common/objects/Prototype.ControllerWaterCoil.rb +1 -1
- data/lib/openstudio-standards/prototypes/common/objects/Prototype.CoolingTower.rb +1 -1
- data/lib/openstudio-standards/prototypes/common/objects/Prototype.Fan.rb +1 -1
- data/lib/openstudio-standards/prototypes/common/objects/Prototype.FanConstantVolume.rb +1 -1
- data/lib/openstudio-standards/prototypes/common/objects/Prototype.FanOnOff.rb +1 -1
- data/lib/openstudio-standards/prototypes/common/objects/Prototype.FanVariableVolume.rb +1 -1
- data/lib/openstudio-standards/prototypes/common/objects/Prototype.FanZoneExhaust.rb +1 -1
- data/lib/openstudio-standards/prototypes/common/objects/Prototype.HeatExchangerAirToAirSensibleAndLatent.rb +2 -2
- data/lib/openstudio-standards/prototypes/common/objects/Prototype.Model.exterior_lights.rb +4 -4
- data/lib/openstudio-standards/prototypes/common/objects/Prototype.Model.hvac.rb +4 -4
- data/lib/openstudio-standards/prototypes/common/objects/Prototype.Model.rb +43 -30
- data/lib/openstudio-standards/prototypes/common/objects/Prototype.Model.swh.rb +1 -1
- data/lib/openstudio-standards/prototypes/common/objects/Prototype.ServiceWaterHeating.rb +18 -11
- data/lib/openstudio-standards/prototypes/common/objects/Prototype.SizingSystem.rb +1 -1
- data/lib/openstudio-standards/prototypes/common/objects/Prototype.hvac_systems.rb +774 -117
- data/lib/openstudio-standards/prototypes/common/objects/Prototype.radiant_system_controls.rb +340 -481
- data/lib/openstudio-standards/prototypes/common/objects/Prototype.refrigeration.rb +3 -3
- data/lib/openstudio-standards/prototypes/common/objects/Prototype.utilities.rb +3 -3
- data/lib/openstudio-standards/prototypes/common/prototype_metaprogramming.rb +22 -22
- data/lib/openstudio-standards/prototypes/deer/deer.Model.rb +1 -1
- data/lib/openstudio-standards/qaqc/calibration.rb +131 -0
- data/lib/openstudio-standards/qaqc/create_results.rb +983 -0
- data/lib/openstudio-standards/qaqc/envelope.rb +399 -0
- data/lib/openstudio-standards/qaqc/eui.rb +213 -0
- data/lib/openstudio-standards/qaqc/hvac.rb +1943 -0
- data/lib/openstudio-standards/qaqc/internal_loads.rb +568 -0
- data/lib/openstudio-standards/qaqc/reporting.rb +141 -0
- data/lib/openstudio-standards/qaqc/schedules.rb +129 -0
- data/lib/openstudio-standards/qaqc/service_water_heating.rb +273 -0
- data/lib/openstudio-standards/qaqc/weather_files.rb +497 -0
- data/lib/openstudio-standards/qaqc/zone_conditions.rb +278 -0
- data/lib/openstudio-standards/schedules/create.rb +364 -0
- data/lib/openstudio-standards/schedules/information.rb +169 -0
- data/lib/openstudio-standards/schedules/modify.rb +445 -0
- data/lib/openstudio-standards/standards/Standards.AirLoopHVAC.rb +110 -71
- data/lib/openstudio-standards/standards/Standards.AirTerminalSingleDuctParallelPIUReheat.rb +3 -3
- data/lib/openstudio-standards/standards/Standards.AirTerminalSingleDuctVAVReheat.rb +4 -4
- data/lib/openstudio-standards/standards/Standards.BoilerHotWater.rb +2 -1
- data/lib/openstudio-standards/standards/Standards.ChillerElectricEIR.rb +16 -10
- data/lib/openstudio-standards/standards/Standards.CoilCoolingDXSingleSpeed.rb +4 -4
- data/lib/openstudio-standards/standards/Standards.CoilCoolingDXTwoSpeed.rb +1 -1
- data/lib/openstudio-standards/standards/Standards.CoilCoolingWaterToAirHeatPumpEquationFit.rb +1 -1
- data/lib/openstudio-standards/standards/Standards.CoilDX.rb +4 -4
- data/lib/openstudio-standards/standards/Standards.CoilHeatingDXMultiSpeed.rb +1 -1
- data/lib/openstudio-standards/standards/Standards.CoilHeatingDXSingleSpeed.rb +5 -5
- data/lib/openstudio-standards/standards/Standards.CoilHeatingGas.rb +1 -1
- data/lib/openstudio-standards/standards/Standards.CoilHeatingGasMultiStage.rb +1 -1
- data/lib/openstudio-standards/standards/Standards.CoilHeatingWaterToAirHeatPumpEquationFit.rb +1 -1
- data/lib/openstudio-standards/standards/Standards.Construction.rb +17 -18
- data/lib/openstudio-standards/standards/Standards.CoolingTower.rb +6 -6
- data/lib/openstudio-standards/standards/Standards.CoolingTowerSingleSpeed.rb +1 -1
- data/lib/openstudio-standards/standards/Standards.CoolingTowerTwoSpeed.rb +1 -1
- data/lib/openstudio-standards/standards/Standards.CoolingTowerVariableSpeed.rb +1 -1
- data/lib/openstudio-standards/standards/Standards.Fan.rb +6 -12
- data/lib/openstudio-standards/standards/Standards.FanVariableVolume.rb +2 -2
- data/lib/openstudio-standards/standards/Standards.FluidCooler.rb +1 -1
- data/lib/openstudio-standards/standards/Standards.HeaderedPumpsVariableSpeed.rb +1 -1
- data/lib/openstudio-standards/standards/Standards.HeatExchangerSensLat.rb +3 -3
- data/lib/openstudio-standards/standards/Standards.Model.rb +411 -261
- data/lib/openstudio-standards/standards/Standards.PlanarSurface.rb +2 -2
- data/lib/openstudio-standards/standards/Standards.PlantLoop.rb +94 -29
- data/lib/openstudio-standards/standards/Standards.Pump.rb +2 -2
- data/lib/openstudio-standards/standards/Standards.ScheduleConstant.rb +2 -2
- data/lib/openstudio-standards/standards/Standards.ScheduleRuleset.rb +14 -14
- data/lib/openstudio-standards/standards/Standards.Space.rb +37 -30
- data/lib/openstudio-standards/standards/Standards.SpaceType.rb +38 -29
- data/lib/openstudio-standards/standards/Standards.SubSurface.rb +7 -7
- data/lib/openstudio-standards/standards/Standards.Surface.rb +13 -13
- data/lib/openstudio-standards/standards/Standards.ThermalZone.rb +109 -66
- data/lib/openstudio-standards/standards/Standards.WaterHeaterMixed.rb +11 -4
- data/lib/openstudio-standards/standards/Standards.ZoneHVACComponent.rb +6 -6
- data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2004/ashrae_90_1_2004.AirLoopHVAC.rb +1 -1
- data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2004/ashrae_90_1_2004.PlantLoop.rb +1 -1
- data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2004/ashrae_90_1_2004.Space.rb +1 -1
- data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2007/ashrae_90_1_2007.Space.rb +1 -1
- data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2010/ashrae_90_1_2010.AirLoopHVAC.rb +4 -4
- data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2010/ashrae_90_1_2010.AirTerminalSingleDuctVAVReheat.rb +1 -1
- data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2010/ashrae_90_1_2010.Space.rb +4 -4
- data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2013/ashrae_90_1_2013.AirLoopHVAC.rb +4 -4
- data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2013/ashrae_90_1_2013.AirTerminalSingleDuctVAVReheat.rb +1 -1
- data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2013/ashrae_90_1_2013.CoolingTowerVariableSpeed.rb +1 -1
- data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2013/ashrae_90_1_2013.Model.rb +5 -21
- data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2013/ashrae_90_1_2013.Space.rb +4 -4
- data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2013/ashrae_90_1_2013.WaterHeaterMixed.rb +1 -1
- data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2013/ashrae_90_1_2013.ZoneHVACComponent.rb +1 -1
- data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2016/ashrae_90_1_2016.AirLoopHVAC.rb +36 -4
- data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2016/ashrae_90_1_2016.AirTerminalSingleDuctVAVReheat.rb +1 -1
- data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2016/ashrae_90_1_2016.CoolingTowerVariableSpeed.rb +1 -1
- data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2016/ashrae_90_1_2016.Space.rb +4 -4
- data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2016/ashrae_90_1_2016.ZoneHVACComponent.rb +1 -1
- data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2016/comstock_ashrae_90_1_2016/comstock_ashrae_90_1_2016.AirLoopHVAC.rb +26 -0
- data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2019/ashrae_90_1_2019.AirLoopHVAC.rb +53 -10
- data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2019/ashrae_90_1_2019.AirTerminalSingleDuctVAVReheat.rb +1 -1
- data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2019/ashrae_90_1_2019.CoolingTowerVariableSpeed.rb +1 -1
- data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2019/ashrae_90_1_2019.Space.rb +6 -6
- data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2019/ashrae_90_1_2019.ZoneHVACComponent.rb +2 -2
- data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2019/comstock_ashrae_90_1_2019/comstock_ashrae_90_1_2019.AirLoopHVAC.rb +26 -0
- data/lib/openstudio-standards/standards/ashrae_90_1/data/ashrae_90_1.curves.json +211 -211
- data/lib/openstudio-standards/standards/ashrae_90_1/doe_ref_1980_2004/data/doe_ref_1980_2004.economizers.json +14 -14
- data/lib/openstudio-standards/standards/ashrae_90_1/doe_ref_1980_2004/doe_ref_1980_2004.AirLoopHVAC.rb +4 -4
- data/lib/openstudio-standards/standards/ashrae_90_1/doe_ref_1980_2004/doe_ref_1980_2004.Model.rb +1 -1
- data/lib/openstudio-standards/standards/ashrae_90_1/doe_ref_1980_2004/doe_ref_1980_2004.PlantLoop.rb +1 -1
- data/lib/openstudio-standards/standards/ashrae_90_1/doe_ref_pre_1980/data/doe_ref_pre_1980.economizers.json +14 -14
- data/lib/openstudio-standards/standards/ashrae_90_1/doe_ref_pre_1980/doe_ref_pre_1980.AirLoopHVAC.rb +4 -4
- data/lib/openstudio-standards/standards/ashrae_90_1/doe_ref_pre_1980/doe_ref_pre_1980.Model.rb +1 -1
- data/lib/openstudio-standards/standards/ashrae_90_1/doe_ref_pre_1980/doe_ref_pre_1980.PlantLoop.rb +1 -1
- data/lib/openstudio-standards/standards/ashrae_90_1/nrel_zne_ready_2017/nrel_zne_ready_2017.AirLoopHVAC.rb +6 -6
- data/lib/openstudio-standards/standards/ashrae_90_1/nrel_zne_ready_2017/nrel_zne_ready_2017.AirTerminalSingleDuctVAVReheat.rb +1 -1
- data/lib/openstudio-standards/standards/ashrae_90_1/nrel_zne_ready_2017/nrel_zne_ready_2017.CoolingTowerVariableSpeed.rb +1 -1
- data/lib/openstudio-standards/standards/ashrae_90_1/nrel_zne_ready_2017/nrel_zne_ready_2017.PlantLoop.rb +1 -1
- data/lib/openstudio-standards/standards/ashrae_90_1/nrel_zne_ready_2017/nrel_zne_ready_2017.Space.rb +4 -4
- data/lib/openstudio-standards/standards/ashrae_90_1/ze_aedg_multifamily/ze_aedg_multifamily.AirLoopHVAC.rb +6 -6
- data/lib/openstudio-standards/standards/ashrae_90_1/ze_aedg_multifamily/ze_aedg_multifamily.AirTerminalSingleDuctVAVReheat.rb +1 -1
- data/lib/openstudio-standards/standards/ashrae_90_1/ze_aedg_multifamily/ze_aedg_multifamily.CoolingTowerVariableSpeed.rb +1 -1
- data/lib/openstudio-standards/standards/ashrae_90_1/ze_aedg_multifamily/ze_aedg_multifamily.PlantLoop.rb +1 -1
- data/lib/openstudio-standards/standards/ashrae_90_1/ze_aedg_multifamily/ze_aedg_multifamily.Space.rb +4 -4
- data/lib/openstudio-standards/standards/ashrae_90_1_prm/ashrae_90_1_prm.AirLoopHVAC.rb +22 -28
- data/lib/openstudio-standards/standards/ashrae_90_1_prm/ashrae_90_1_prm.AirTerminalSingleDuctParallelPIUReheat.rb +1 -1
- data/lib/openstudio-standards/standards/ashrae_90_1_prm/ashrae_90_1_prm.AirTerminalSingleDuctVAVReheat.rb +2 -2
- data/lib/openstudio-standards/standards/ashrae_90_1_prm/ashrae_90_1_prm.BoilerHotWater.rb +1 -74
- data/lib/openstudio-standards/standards/ashrae_90_1_prm/ashrae_90_1_prm.ChillerElectricEIR.rb +7 -59
- data/lib/openstudio-standards/standards/ashrae_90_1_prm/ashrae_90_1_prm.CoilCoolingDXSingleSpeed.rb +1 -1
- data/lib/openstudio-standards/standards/ashrae_90_1_prm/ashrae_90_1_prm.CoilCoolingDXTwoSpeed.rb +1 -1
- data/lib/openstudio-standards/standards/ashrae_90_1_prm/ashrae_90_1_prm.CoilDX.rb +1 -1
- data/lib/openstudio-standards/standards/ashrae_90_1_prm/ashrae_90_1_prm.CoilHeatingDXSingleSpeed.rb +1 -1
- data/lib/openstudio-standards/standards/ashrae_90_1_prm/ashrae_90_1_prm.CoilHeatingGas.rb +1 -21
- data/lib/openstudio-standards/standards/ashrae_90_1_prm/ashrae_90_1_prm.DesignSpecificationOutdoorAir.rb +101 -0
- data/lib/openstudio-standards/standards/ashrae_90_1_prm/ashrae_90_1_prm.FanConstantVolume.rb +1 -1
- data/lib/openstudio-standards/standards/ashrae_90_1_prm/ashrae_90_1_prm.FanOnOff.rb +1 -1
- data/lib/openstudio-standards/standards/ashrae_90_1_prm/ashrae_90_1_prm.FanVariableVolume.rb +1 -1
- data/lib/openstudio-standards/standards/ashrae_90_1_prm/ashrae_90_1_prm.HeatExchangerSensLat.rb +1 -1
- data/lib/openstudio-standards/standards/ashrae_90_1_prm/ashrae_90_1_prm.Model.rb +643 -526
- data/lib/openstudio-standards/standards/ashrae_90_1_prm/ashrae_90_1_prm.PlanarSurface.rb +8 -2
- data/lib/openstudio-standards/standards/ashrae_90_1_prm/ashrae_90_1_prm.PlantLoop.rb +17 -77
- data/lib/openstudio-standards/standards/ashrae_90_1_prm/ashrae_90_1_prm.Space.rb +74 -16
- data/lib/openstudio-standards/standards/ashrae_90_1_prm/ashrae_90_1_prm.SpaceType.rb +96 -44
- data/lib/openstudio-standards/standards/ashrae_90_1_prm/ashrae_90_1_prm.Surface.rb +6 -6
- data/lib/openstudio-standards/standards/ashrae_90_1_prm/ashrae_90_1_prm.ThermalZone.rb +18 -6
- data/lib/openstudio-standards/standards/ashrae_90_1_prm/ashrae_90_1_prm.ZoneHVACComponent.rb +1 -1
- data/lib/openstudio-standards/standards/ashrae_90_1_prm/ashrae_90_1_prm.rb +328 -74
- data/lib/openstudio-standards/standards/ashrae_90_1_prm/ashrae_90_1_prm_2019/ashrae_90_1_prm_2019.Model.rb +0 -118
- data/lib/openstudio-standards/standards/ashrae_90_1_prm/ashrae_90_1_prm_2019/ashrae_90_1_prm_2019.rb +2 -1
- data/lib/openstudio-standards/standards/ashrae_90_1_prm/ashrae_90_1_prm_2019/data/ashrae_90_1_prm_2019.heat_rejection.json +1 -1
- data/lib/openstudio-standards/standards/ashrae_90_1_prm/docs/baseline_outdoor_air.md +35 -0
- data/lib/openstudio-standards/standards/ashrae_90_1_prm/docs/set_plug_load_measures.md +1 -1
- data/lib/openstudio-standards/standards/ashrae_90_1_prm/userdata_csv/ashrae_90_1_prm.UserData.rb +228 -0
- data/lib/openstudio-standards/standards/ashrae_90_1_prm/userdata_csv/userdata_enums.rb +131 -0
- data/lib/openstudio-standards/standards/ashrae_90_1_prm/userdata_csv/userdata_space.csv +1 -1
- data/lib/openstudio-standards/standards/cbes/cbes.AirLoopHVAC.rb +5 -5
- data/lib/openstudio-standards/standards/cbes/cbes.Model.rb +1 -1
- data/lib/openstudio-standards/standards/cbes/cbes.PlantLoop.rb +1 -1
- data/lib/openstudio-standards/standards/cbes/cbes.Space.rb +1 -1
- data/lib/openstudio-standards/standards/cbes/cbes_t24_2005/cbes_t24_2005.Space.rb +1 -1
- data/lib/openstudio-standards/standards/cbes/cbes_t24_2008/cbes_t24_2008.Space.rb +1 -1
- data/lib/openstudio-standards/standards/deer/deer.AirLoopHVAC.rb +109 -27
- data/lib/openstudio-standards/standards/deer/deer.Space.rb +1 -1
- data/lib/openstudio-standards/standards/deer/deer_1985/data/deer_1985.economizers.json +246 -4
- data/lib/openstudio-standards/standards/deer/deer_1996/data/deer_1996.economizers.json +246 -4
- data/lib/openstudio-standards/standards/deer/deer_2003/data/deer_2003.economizers.json +246 -4
- data/lib/openstudio-standards/standards/deer/deer_2003/deer_2003.ThermalZone.rb +18 -18
- data/lib/openstudio-standards/standards/deer/deer_2007/data/deer_2007.economizers.json +246 -4
- data/lib/openstudio-standards/standards/deer/deer_2007/deer_2007.ThermalZone.rb +18 -18
- data/lib/openstudio-standards/standards/deer/deer_2011/data/deer_2011.economizers.json +246 -4
- data/lib/openstudio-standards/standards/deer/deer_2011/deer_2011.ThermalZone.rb +18 -18
- data/lib/openstudio-standards/standards/deer/deer_2014/data/deer_2014.economizers.json +248 -6
- data/lib/openstudio-standards/standards/deer/deer_2014/deer_2014.Space.rb +3 -3
- data/lib/openstudio-standards/standards/deer/deer_2014/deer_2014.ThermalZone.rb +18 -18
- data/lib/openstudio-standards/standards/deer/deer_2015/data/deer_2015.economizers.json +248 -6
- data/lib/openstudio-standards/standards/deer/deer_2015/deer_2015.Space.rb +3 -3
- data/lib/openstudio-standards/standards/deer/deer_2015/deer_2015.ThermalZone.rb +18 -18
- data/lib/openstudio-standards/standards/deer/deer_2017/data/deer_2017.economizers.json +248 -6
- data/lib/openstudio-standards/standards/deer/deer_2017/deer_2017.Space.rb +3 -3
- data/lib/openstudio-standards/standards/deer/deer_2017/deer_2017.ThermalZone.rb +18 -18
- data/lib/openstudio-standards/standards/deer/deer_2020/data/deer_2020.economizers.json +248 -6
- data/lib/openstudio-standards/standards/deer/deer_2020/deer_2020.AirLoopHVAC.rb +18 -5
- data/lib/openstudio-standards/standards/deer/deer_2020/deer_2020.FanVariableVolume.rb +1 -1
- data/lib/openstudio-standards/standards/deer/deer_2020/deer_2020.Space.rb +3 -3
- data/lib/openstudio-standards/standards/deer/deer_2020/deer_2020.ThermalZone.rb +18 -18
- data/lib/openstudio-standards/standards/deer/deer_2025/data/deer_2025.economizers.json +248 -6
- data/lib/openstudio-standards/standards/deer/deer_2025/deer_2025.AirLoopHVAC.rb +3 -3
- data/lib/openstudio-standards/standards/deer/deer_2025/deer_2025.FanVariableVolume.rb +1 -1
- data/lib/openstudio-standards/standards/deer/deer_2025/deer_2025.Space.rb +3 -3
- data/lib/openstudio-standards/standards/deer/deer_2030/data/deer_2030.economizers.json +248 -6
- data/lib/openstudio-standards/standards/deer/deer_2030/data/deer_2030.heat_pumps.json +2 -2
- data/lib/openstudio-standards/standards/deer/deer_2030/deer_2030.AirLoopHVAC.rb +3 -3
- data/lib/openstudio-standards/standards/deer/deer_2030/deer_2030.FanVariableVolume.rb +1 -1
- data/lib/openstudio-standards/standards/deer/deer_2030/deer_2030.Space.rb +3 -3
- data/lib/openstudio-standards/standards/deer/deer_2035/data/deer_2035.economizers.json +248 -6
- data/lib/openstudio-standards/standards/deer/deer_2035/deer_2035.AirLoopHVAC.rb +3 -3
- data/lib/openstudio-standards/standards/deer/deer_2035/deer_2035.FanVariableVolume.rb +1 -1
- data/lib/openstudio-standards/standards/deer/deer_2035/deer_2035.Space.rb +3 -3
- data/lib/openstudio-standards/standards/deer/deer_2040/data/deer_2040.economizers.json +248 -6
- data/lib/openstudio-standards/standards/deer/deer_2040/deer_2040.AirLoopHVAC.rb +3 -3
- data/lib/openstudio-standards/standards/deer/deer_2040/deer_2040.FanVariableVolume.rb +1 -1
- data/lib/openstudio-standards/standards/deer/deer_2040/deer_2040.Space.rb +3 -3
- data/lib/openstudio-standards/standards/deer/deer_2045/data/deer_2045.economizers.json +260 -0
- data/lib/openstudio-standards/standards/deer/deer_2045/deer_2045.AirLoopHVAC.rb +3 -3
- data/lib/openstudio-standards/standards/deer/deer_2045/deer_2045.FanVariableVolume.rb +1 -1
- data/lib/openstudio-standards/standards/deer/deer_2045/deer_2045.Space.rb +3 -3
- data/lib/openstudio-standards/standards/deer/deer_2050/data/deer_2050.economizers.json +248 -6
- data/lib/openstudio-standards/standards/deer/deer_2050/deer_2050.AirLoopHVAC.rb +3 -3
- data/lib/openstudio-standards/standards/deer/deer_2050/deer_2050.FanVariableVolume.rb +1 -1
- data/lib/openstudio-standards/standards/deer/deer_2050/deer_2050.Space.rb +3 -3
- data/lib/openstudio-standards/standards/deer/deer_2055/data/deer_2055.economizers.json +248 -6
- data/lib/openstudio-standards/standards/deer/deer_2055/deer_2055.AirLoopHVAC.rb +3 -3
- data/lib/openstudio-standards/standards/deer/deer_2055/deer_2055.FanVariableVolume.rb +1 -1
- data/lib/openstudio-standards/standards/deer/deer_2055/deer_2055.Space.rb +3 -3
- data/lib/openstudio-standards/standards/deer/deer_2060/data/deer_2060.economizers.json +248 -6
- data/lib/openstudio-standards/standards/deer/deer_2060/deer_2060.AirLoopHVAC.rb +3 -3
- data/lib/openstudio-standards/standards/deer/deer_2060/deer_2060.FanVariableVolume.rb +1 -1
- data/lib/openstudio-standards/standards/deer/deer_2060/deer_2060.Space.rb +3 -3
- data/lib/openstudio-standards/standards/deer/deer_2065/data/deer_2065.economizers.json +248 -6
- data/lib/openstudio-standards/standards/deer/deer_2065/deer_2065.AirLoopHVAC.rb +3 -3
- data/lib/openstudio-standards/standards/deer/deer_2065/deer_2065.FanVariableVolume.rb +1 -1
- data/lib/openstudio-standards/standards/deer/deer_2065/deer_2065.Space.rb +3 -3
- data/lib/openstudio-standards/standards/deer/deer_2070/data/deer_2070.economizers.json +248 -6
- data/lib/openstudio-standards/standards/deer/deer_2070/deer_2070.AirLoopHVAC.rb +3 -3
- data/lib/openstudio-standards/standards/deer/deer_2070/deer_2070.FanVariableVolume.rb +1 -1
- data/lib/openstudio-standards/standards/deer/deer_2070/deer_2070.Space.rb +3 -3
- data/lib/openstudio-standards/standards/deer/deer_2075/data/deer_2075.economizers.json +248 -6
- data/lib/openstudio-standards/standards/deer/deer_2075/deer_2075.AirLoopHVAC.rb +3 -3
- data/lib/openstudio-standards/standards/deer/deer_2075/deer_2075.FanVariableVolume.rb +1 -1
- data/lib/openstudio-standards/standards/deer/deer_2075/deer_2075.Space.rb +3 -3
- data/lib/openstudio-standards/standards/deer/deer_pre_1975/data/deer_pre_1975.economizers.json +246 -4
- data/lib/openstudio-standards/standards/necb/BTAP1980TO2010/data/space_types.json +447 -223
- data/lib/openstudio-standards/standards/necb/BTAPPRE1980/building_envelope.rb +1 -1
- data/lib/openstudio-standards/standards/necb/BTAPPRE1980/data/space_types.json +447 -223
- data/lib/openstudio-standards/standards/necb/BTAPPRE1980/hvac_systems.rb +5 -2
- data/lib/openstudio-standards/standards/necb/ECMS/data/chiller_types.json +25 -0
- data/lib/openstudio-standards/standards/necb/ECMS/data/chillers.json +44 -0
- data/lib/openstudio-standards/standards/necb/ECMS/data/curves.json +225 -0
- data/lib/openstudio-standards/standards/necb/ECMS/ecms.rb +2 -2
- data/lib/openstudio-standards/standards/necb/ECMS/hvac_systems.rb +193 -73
- data/lib/openstudio-standards/standards/necb/ECMS/pv_ground.rb +1 -1
- data/lib/openstudio-standards/standards/necb/NECB2011/autozone.rb +10 -4
- data/lib/openstudio-standards/standards/necb/NECB2011/beps_compliance_path.rb +7 -7
- data/lib/openstudio-standards/standards/necb/NECB2011/building_envelope.rb +4 -5
- data/lib/openstudio-standards/standards/necb/NECB2011/data/chiller_types.json +32 -0
- data/lib/openstudio-standards/standards/necb/NECB2011/data/chillers.json +1 -1
- data/lib/openstudio-standards/standards/necb/NECB2011/data/constants.json +36 -0
- data/lib/openstudio-standards/standards/necb/NECB2011/data/fuel_type_sets.json +7 -7
- data/lib/openstudio-standards/standards/necb/NECB2011/data/geometry/NorthernEducation.osm +47587 -0
- data/lib/openstudio-standards/standards/necb/NECB2011/data/geometry/NorthernHealthCare.osm +49764 -0
- data/lib/openstudio-standards/standards/necb/NECB2011/data/geometry/Warehouse.osm +283 -297
- data/lib/openstudio-standards/standards/necb/NECB2011/data/space_type_unit_definitions.txt +2 -1
- data/lib/openstudio-standards/standards/necb/NECB2011/data/space_types.json +447 -223
- data/lib/openstudio-standards/standards/necb/NECB2011/data/standards_data.rb +3 -3
- data/lib/openstudio-standards/standards/necb/NECB2011/hvac_system_1_multi_speed.rb +1 -1
- data/lib/openstudio-standards/standards/necb/NECB2011/hvac_systems.rb +49 -27
- data/lib/openstudio-standards/standards/necb/NECB2011/necb_2011.rb +400 -202
- data/lib/openstudio-standards/standards/necb/NECB2011/service_water_heating.rb +4 -4
- data/lib/openstudio-standards/standards/necb/NECB2015/data/space_types.json +637 -318
- data/lib/openstudio-standards/standards/necb/NECB2015/hvac_systems.rb +18 -1
- data/lib/openstudio-standards/standards/necb/NECB2015/necb_2015.rb +3 -3
- data/lib/openstudio-standards/standards/necb/NECB2017/data/space_types.json +637 -318
- data/lib/openstudio-standards/standards/necb/NECB2017/hvac_systems.rb +1 -1
- data/lib/openstudio-standards/standards/necb/NECB2017/necb_2017.rb +3 -3
- data/lib/openstudio-standards/standards/necb/NECB2020/building_envelope.rb +1 -1
- data/lib/openstudio-standards/standards/necb/NECB2020/data/space_types.json +615 -307
- data/lib/openstudio-standards/standards/necb/NECB2020/service_water_heating.rb +4 -4
- data/lib/openstudio-standards/standards/necb/common/btap_data.rb +10 -5
- data/lib/openstudio-standards/standards/necb/common/btap_datapoint.rb +1 -1
- data/lib/openstudio-standards/utilities/assertion.rb +128 -0
- data/lib/openstudio-standards/utilities/logging.rb +2 -3
- data/lib/openstudio-standards/utilities/object_info.rb +39 -18
- data/lib/openstudio-standards/utilities/schedule_translator.rb +8 -6
- data/lib/openstudio-standards/utilities/simulation.rb +24 -11
- data/lib/openstudio-standards/utilities/sqlfile.rb +10 -5
- data/lib/openstudio-standards/version.rb +1 -1
- data/lib/openstudio-standards/weather/Weather.Model.rb +8 -9
- data/lib/openstudio-standards/weather/Weather.stat_file.rb +3 -3
- data/lib/openstudio-standards/weather/information.rb +35 -0
- data/lib/openstudio-standards.rb +69 -5
- metadata +52 -16
- data/data/standards/OpenStudio_Standards-deer-ALL-comstock(space_types).xlsx +0 -0
- data/lib/openstudio-standards/hvac_sizing/Siz.AirLoopHVAC.rb +0 -59
- data/lib/openstudio-standards/hvac_sizing/Siz.CoilCoolingWater.rb +0 -13
- data/lib/openstudio-standards/hvac_sizing/Siz.HVACComponent.rb +0 -36
- data/lib/openstudio-standards/hvac_sizing/Siz.HeatingCoolingFuels.rb +0 -898
- data/lib/openstudio-standards/hvac_sizing/Siz.Model.rb +0 -126
- data/lib/openstudio-standards/hvac_sizing/Siz.ThermalZone.rb +0 -356
- data/lib/openstudio-standards/prototypes/ashrae_90_1/nrel_nze_ready_2017/nrel_zne_ready_2017.Model.rb +0 -35
- data/lib/openstudio-standards/standards/ashrae_90_1_prm/ashrae_90_1_prm.CoolingTower.rb +0 -110
- data/lib/openstudio-standards/standards/ashrae_90_1_prm/ashrae_90_1_prm.CoolingTowerVariableSpeed.rb +0 -5
|
@@ -24,7 +24,8 @@ class Standard
|
|
|
24
24
|
# Creates a hot water loop with a boiler, district heating, or a water-to-water heat pump and adds it to the model.
|
|
25
25
|
#
|
|
26
26
|
# @param model [OpenStudio::Model::Model] OpenStudio model object
|
|
27
|
-
# @param boiler_fuel_type [String] valid choices are Electricity, NaturalGas, Propane, PropaneGas, FuelOilNo1, FuelOilNo2,
|
|
27
|
+
# @param boiler_fuel_type [String] valid choices are Electricity, NaturalGas, Propane, PropaneGas, FuelOilNo1, FuelOilNo2,
|
|
28
|
+
# DistrictHeating, DistrictHeatingWater, DistrictHeatingSteam, HeatPump
|
|
28
29
|
# @param ambient_loop [OpenStudio::Model::PlantLoop] The condenser loop for the heat pump. Only used when boiler_fuel_type is HeatPump.
|
|
29
30
|
# @param system_name [String] the name of the system, or nil in which case it will be defaulted
|
|
30
31
|
# @param dsgn_sup_wtr_temp [Double] design supply water temperature in degrees Fahrenheit, default 180F
|
|
@@ -106,6 +107,15 @@ class Standard
|
|
|
106
107
|
hw_pump.setPumpControlType('Intermittent')
|
|
107
108
|
hw_pump.addToNode(hot_water_loop.supplyInletNode)
|
|
108
109
|
|
|
110
|
+
# switch statement to handle district heating name change
|
|
111
|
+
if model.version < OpenStudio::VersionString.new('3.7.0')
|
|
112
|
+
if boiler_fuel_type == 'DistrictHeatingWater' || boiler_fuel_type == 'DistrictHeatingSteam'
|
|
113
|
+
boiler_fuel_type = 'DistrictHeating'
|
|
114
|
+
end
|
|
115
|
+
else
|
|
116
|
+
boiler_fuel_type = 'DistrictHeatingWater' if boiler_fuel_type == 'DistrictHeating'
|
|
117
|
+
end
|
|
118
|
+
|
|
109
119
|
# create boiler and add to loop
|
|
110
120
|
case boiler_fuel_type
|
|
111
121
|
# District Heating
|
|
@@ -114,8 +124,18 @@ class Standard
|
|
|
114
124
|
district_heat.setName("#{hot_water_loop.name} District Heating")
|
|
115
125
|
district_heat.autosizeNominalCapacity
|
|
116
126
|
hot_water_loop.addSupplyBranchForComponent(district_heat)
|
|
117
|
-
|
|
127
|
+
when 'DistrictHeatingWater'
|
|
128
|
+
district_heat = OpenStudio::Model::DistrictHeatingWater.new(model)
|
|
129
|
+
district_heat.setName("#{hot_water_loop.name} District Heating")
|
|
130
|
+
district_heat.autosizeNominalCapacity
|
|
131
|
+
hot_water_loop.addSupplyBranchForComponent(district_heat)
|
|
132
|
+
when 'DistrictHeatingSteam'
|
|
133
|
+
district_heat = OpenStudio::Model::DistrictHeatingSteam.new(model)
|
|
134
|
+
district_heat.setName("#{hot_water_loop.name} District Heating")
|
|
135
|
+
district_heat.autosizeNominalCapacity
|
|
136
|
+
hot_water_loop.addSupplyBranchForComponent(district_heat)
|
|
118
137
|
when 'HeatPump', 'AmbientLoop'
|
|
138
|
+
# Ambient Loop
|
|
119
139
|
water_to_water_hp = OpenStudio::Model::HeatPumpWaterToWaterEquationFitHeating.new(model)
|
|
120
140
|
water_to_water_hp.setName("#{hot_water_loop.name} Water to Water Heat Pump")
|
|
121
141
|
hot_water_loop.addSupplyBranchForComponent(water_to_water_hp)
|
|
@@ -844,6 +864,15 @@ class Standard
|
|
|
844
864
|
heating_equipment_stpt_manager.setHighSetpointSchedule(hp_high_temp_sch)
|
|
845
865
|
heating_equipment_stpt_manager.setLowSetpointSchedule(hp_low_temp_sch)
|
|
846
866
|
|
|
867
|
+
# switch statement to handle district heating name change
|
|
868
|
+
if model.version < OpenStudio::VersionString.new('3.7.0')
|
|
869
|
+
if heating_fuel == 'DistrictHeatingWater' || heating_fuel == 'DistrictHeatingSteam'
|
|
870
|
+
heating_fuel = 'DistrictHeating'
|
|
871
|
+
end
|
|
872
|
+
else
|
|
873
|
+
heating_fuel = 'DistrictHeatingWater' if heating_fuel == 'DistrictHeating'
|
|
874
|
+
end
|
|
875
|
+
|
|
847
876
|
# create heating equipment and add to the loop
|
|
848
877
|
case heating_fuel
|
|
849
878
|
when 'DistrictHeating'
|
|
@@ -852,6 +881,18 @@ class Standard
|
|
|
852
881
|
heating_equipment.autosizeNominalCapacity
|
|
853
882
|
heat_pump_water_loop.addSupplyBranchForComponent(heating_equipment)
|
|
854
883
|
heating_equipment_stpt_manager.setName("#{heat_pump_water_loop.name} District Heating Scheduled Dual Setpoint")
|
|
884
|
+
when 'DistrictHeatingWater'
|
|
885
|
+
heating_equipment = OpenStudio::Model::DistrictHeatingWater.new(model)
|
|
886
|
+
heating_equipment.setName("#{heat_pump_water_loop.name} District Heating")
|
|
887
|
+
heating_equipment.autosizeNominalCapacity
|
|
888
|
+
heat_pump_water_loop.addSupplyBranchForComponent(heating_equipment)
|
|
889
|
+
heating_equipment_stpt_manager.setName("#{heat_pump_water_loop.name} District Heating Scheduled Dual Setpoint")
|
|
890
|
+
when 'DistrictHeatingSteam'
|
|
891
|
+
heating_equipment = OpenStudio::Model::DistrictHeatingSteam.new(model)
|
|
892
|
+
heating_equipment.setName("#{heat_pump_water_loop.name} District Heating")
|
|
893
|
+
heating_equipment.autosizeNominalCapacity
|
|
894
|
+
heat_pump_water_loop.addSupplyBranchForComponent(heating_equipment)
|
|
895
|
+
heating_equipment_stpt_manager.setName("#{heat_pump_water_loop.name} District Heating Scheduled Dual Setpoint")
|
|
855
896
|
when 'AirSourceHeatPump', 'ASHP'
|
|
856
897
|
heating_equipment = create_central_air_source_heat_pump(model, heat_pump_water_loop)
|
|
857
898
|
heating_equipment_stpt_manager.setName("#{heat_pump_water_loop.name} ASHP Scheduled Dual Setpoint")
|
|
@@ -1056,7 +1097,11 @@ class Standard
|
|
|
1056
1097
|
ambient_loop.addSupplyBranchForComponent(district_cooling)
|
|
1057
1098
|
|
|
1058
1099
|
# heating
|
|
1059
|
-
|
|
1100
|
+
if model.version < OpenStudio::VersionString.new('3.7.0')
|
|
1101
|
+
district_heating = OpenStudio::Model::DistrictHeating.new(model)
|
|
1102
|
+
else
|
|
1103
|
+
district_heating = OpenStudio::Model::DistrictHeatingWater.new(model)
|
|
1104
|
+
end
|
|
1060
1105
|
district_heating.setNominalCapacity(1_000_000_000_000) # large number; no autosizing
|
|
1061
1106
|
ambient_loop.addSupplyBranchForComponent(district_heating)
|
|
1062
1107
|
|
|
@@ -1084,6 +1129,123 @@ class Standard
|
|
|
1084
1129
|
return ambient_loop
|
|
1085
1130
|
end
|
|
1086
1131
|
|
|
1132
|
+
# Model a 2-pipe plant loop, where the loop is either in heating or cooling.
|
|
1133
|
+
# For sizing reasons, this method keeps separate hot water and chilled water loops,
|
|
1134
|
+
# and connects them together with a common inverse schedule.
|
|
1135
|
+
#
|
|
1136
|
+
# @param model [OpenStudio::Model::Model] OpenStudio model object
|
|
1137
|
+
# @param hot_water_loop [OpenStudio::Model::PlantLoop] the hot water loop
|
|
1138
|
+
# @param chilled_water_loop [OpenStudio::Model::PlantLoop] the chilled water loop
|
|
1139
|
+
# @param control_strategy [String] Method to determine whether the loop is in heating or cooling mode
|
|
1140
|
+
# 'outdoor_air_lockout' - The system will be in heating below the lockout_temperature variable,
|
|
1141
|
+
# and cooling above the lockout_temperature. Requires the lockout_temperature variable.
|
|
1142
|
+
# 'zone_demand' - Heating or cooling determined by preponderance of zone demand.
|
|
1143
|
+
# Requires thermal_zones defined.
|
|
1144
|
+
# @param lockout_temperature [Double] lockout temperature in degrees Fahrenheit, default 65F.
|
|
1145
|
+
# @param thermal_zones [Array<OpenStudio::Model::ThermalZone>] array of zones
|
|
1146
|
+
# @return [OpenStudio::Model::ScheduleRuleset]
|
|
1147
|
+
def model_two_pipe_loop(model,
|
|
1148
|
+
hot_water_loop,
|
|
1149
|
+
chilled_water_loop,
|
|
1150
|
+
control_strategy: 'outdoor_air_lockout',
|
|
1151
|
+
lockout_temperature: 65.0,
|
|
1152
|
+
thermal_zones: [])
|
|
1153
|
+
|
|
1154
|
+
if control_strategy == 'outdoor_air_lockout'
|
|
1155
|
+
# get or create outdoor sensor node to be used in plant availability managers if needed
|
|
1156
|
+
outdoor_airnode = model.outdoorAirNode
|
|
1157
|
+
|
|
1158
|
+
# create availability managers based on outdoor temperature
|
|
1159
|
+
# create hot water plant availability manager
|
|
1160
|
+
hot_water_loop_lockout_manager = OpenStudio::Model::AvailabilityManagerHighTemperatureTurnOff.new(model)
|
|
1161
|
+
hot_water_loop_lockout_manager.setName("#{hot_water_loop.name} Lockout Manager")
|
|
1162
|
+
hot_water_loop_lockout_manager.setSensorNode(outdoor_airnode)
|
|
1163
|
+
hot_water_loop_lockout_manager.setTemperature(OpenStudio.convert(lockout_temperature, 'F', 'C').get)
|
|
1164
|
+
|
|
1165
|
+
# set availability manager to hot water plant
|
|
1166
|
+
hot_water_loop.addAvailabilityManager(hot_water_loop_lockout_manager)
|
|
1167
|
+
|
|
1168
|
+
# create chilled water plant availability manager
|
|
1169
|
+
chilled_water_loop_lockout_manager = OpenStudio::Model::AvailabilityManagerLowTemperatureTurnOff.new(model)
|
|
1170
|
+
chilled_water_loop_lockout_manager.setName("#{chilled_water_loop.name} Lockout Manager")
|
|
1171
|
+
chilled_water_loop_lockout_manager.setSensorNode(outdoor_airnode)
|
|
1172
|
+
chilled_water_loop_lockout_manager.setTemperature(OpenStudio.convert(lockout_temperature, 'F', 'C').get)
|
|
1173
|
+
|
|
1174
|
+
# set availability manager to hot water plant
|
|
1175
|
+
chilled_water_loop.addAvailabilityManager(chilled_water_loop_lockout_manager)
|
|
1176
|
+
else
|
|
1177
|
+
# create availability managers based on zone heating and cooling demand
|
|
1178
|
+
hot_water_loop_name = ems_friendly_name(hot_water_loop.name)
|
|
1179
|
+
chilled_water_loop_name = ems_friendly_name(chilled_water_loop.name)
|
|
1180
|
+
|
|
1181
|
+
# create hot water plant availability schedule managers and create an EMS acuator
|
|
1182
|
+
sch_hot_water_availability = model_add_constant_schedule_ruleset(model,
|
|
1183
|
+
0,
|
|
1184
|
+
name = "#{hot_water_loop.name} Availability Schedule",
|
|
1185
|
+
sch_type_limit: 'OnOff')
|
|
1186
|
+
|
|
1187
|
+
hot_water_loop_manager = OpenStudio::Model::AvailabilityManagerScheduled.new(model)
|
|
1188
|
+
hot_water_loop_manager.setName("#{hot_water_loop.name} Availability Manager")
|
|
1189
|
+
hot_water_loop_manager.setSchedule(sch_hot_water_availability)
|
|
1190
|
+
|
|
1191
|
+
hot_water_plant_ctrl = OpenStudio::Model::EnergyManagementSystemActuator.new(sch_hot_water_availability,
|
|
1192
|
+
'Schedule:Year',
|
|
1193
|
+
'Schedule Value')
|
|
1194
|
+
hot_water_plant_ctrl.setName("#{hot_water_loop_name}_availability_control")
|
|
1195
|
+
|
|
1196
|
+
# set availability manager to hot water plant
|
|
1197
|
+
hot_water_loop.addAvailabilityManager(hot_water_loop_manager)
|
|
1198
|
+
|
|
1199
|
+
# create chilled water plant availability schedule managers and create an EMS acuator
|
|
1200
|
+
sch_chilled_water_availability = model_add_constant_schedule_ruleset(model,
|
|
1201
|
+
0,
|
|
1202
|
+
name = "#{chilled_water_loop.name} Availability Schedule",
|
|
1203
|
+
sch_type_limit: 'OnOff')
|
|
1204
|
+
|
|
1205
|
+
chilled_water_loop_manager = OpenStudio::Model::AvailabilityManagerScheduled.new(model)
|
|
1206
|
+
chilled_water_loop_manager.setName("#{chilled_water_loop.name} Availability Manager")
|
|
1207
|
+
chilled_water_loop_manager.setSchedule(sch_chilled_water_availability)
|
|
1208
|
+
|
|
1209
|
+
chilled_water_plant_ctrl = OpenStudio::Model::EnergyManagementSystemActuator.new(sch_chilled_water_availability,
|
|
1210
|
+
'Schedule:Year',
|
|
1211
|
+
'Schedule Value')
|
|
1212
|
+
chilled_water_plant_ctrl.setName("#{chilled_water_loop_name}_availability_control")
|
|
1213
|
+
|
|
1214
|
+
# set availability manager to chilled water plant
|
|
1215
|
+
chilled_water_loop.addAvailabilityManager(chilled_water_loop_manager)
|
|
1216
|
+
|
|
1217
|
+
# check if zone heat and cool requests program exists, if not create it
|
|
1218
|
+
determine_zone_cooling_needs_prg = model.getEnergyManagementSystemProgramByName('Determine_Zone_Cooling_Needs')
|
|
1219
|
+
determine_zone_heating_needs_prg = model.getEnergyManagementSystemProgramByName('Determine_Zone_Heating_Needs')
|
|
1220
|
+
unless determine_zone_cooling_needs_prg.is_initialized && determine_zone_heating_needs_prg.is_initialized
|
|
1221
|
+
model_add_zone_heat_cool_request_count_program(model, thermal_zones)
|
|
1222
|
+
end
|
|
1223
|
+
|
|
1224
|
+
# create program to determine plant heating or cooling mode
|
|
1225
|
+
determine_plant_mode_prg = OpenStudio::Model::EnergyManagementSystemProgram.new(model)
|
|
1226
|
+
determine_plant_mode_prg.setName('Determine_Heating_Cooling_Plant_Mode')
|
|
1227
|
+
determine_plant_mode_prg_body = <<-EMS
|
|
1228
|
+
IF Zone_Heating_Ratio > 0.5,
|
|
1229
|
+
SET #{hot_water_loop_name}_availability_control = 1,
|
|
1230
|
+
SET #{chilled_water_loop_name}_availability_control = 0,
|
|
1231
|
+
ELSEIF Zone_Cooling_Ratio > 0.5,
|
|
1232
|
+
SET #{hot_water_loop_name}_availability_control = 0,
|
|
1233
|
+
SET #{chilled_water_loop_name}_availability_control = 1,
|
|
1234
|
+
ELSE,
|
|
1235
|
+
SET #{hot_water_loop_name}_availability_control = #{hot_water_loop_name}_availability_control,
|
|
1236
|
+
SET #{chilled_water_loop_name}_availability_control = #{chilled_water_loop_name}_availability_control,
|
|
1237
|
+
ENDIF
|
|
1238
|
+
EMS
|
|
1239
|
+
determine_plant_mode_prg.setBody(determine_plant_mode_prg_body)
|
|
1240
|
+
|
|
1241
|
+
# create EMS program manager objects
|
|
1242
|
+
programs_at_beginning_of_timestep = OpenStudio::Model::EnergyManagementSystemProgramCallingManager.new(model)
|
|
1243
|
+
programs_at_beginning_of_timestep.setName('Heating_Cooling_Demand_Based_Plant_Availability_At_Beginning_Of_Timestep')
|
|
1244
|
+
programs_at_beginning_of_timestep.setCallingPoint('BeginTimestepBeforePredictor')
|
|
1245
|
+
programs_at_beginning_of_timestep.addProgram(determine_plant_mode_prg)
|
|
1246
|
+
end
|
|
1247
|
+
end
|
|
1248
|
+
|
|
1087
1249
|
# Creates a DOAS system with cold supply and terminal units for each zone.
|
|
1088
1250
|
# This is the default DOAS system for DOE prototype buildings. Use model_add_doas for other DOAS systems.
|
|
1089
1251
|
#
|
|
@@ -1097,7 +1259,7 @@ class Standard
|
|
|
1097
1259
|
# @param min_frac_oa_sch [String] name of the minimum fraction of outdoor air schedule, default is always on
|
|
1098
1260
|
# @param fan_maximum_flow_rate [Double] fan maximum flow rate in cfm, default is autosize
|
|
1099
1261
|
# @param econo_ctrl_mthd [String] economizer control type, default is Fixed Dry Bulb
|
|
1100
|
-
# @param energy_recovery [
|
|
1262
|
+
# @param energy_recovery [Boolean] if true, an ERV will be added to the system
|
|
1101
1263
|
# @param doas_control_strategy [String] DOAS control strategy
|
|
1102
1264
|
# @param clg_dsgn_sup_air_temp [Double] design cooling supply air temperature in degrees Fahrenheit, default 65F
|
|
1103
1265
|
# @param htg_dsgn_sup_air_temp [Double] design heating supply air temperature in degrees Fahrenheit, default 75F
|
|
@@ -1329,7 +1491,7 @@ class Standard
|
|
|
1329
1491
|
# @param fan_maximum_flow_rate [Double] fan maximum flow rate in cfm, default is autosize
|
|
1330
1492
|
# @param econo_ctrl_mthd [String] economizer control type, default is Fixed Dry Bulb
|
|
1331
1493
|
# If enabled, the DOAS will be sized for twice the ventilation minimum to allow economizing
|
|
1332
|
-
# @param include_exhaust_fan [
|
|
1494
|
+
# @param include_exhaust_fan [Boolean] if true, include an exhaust fan
|
|
1333
1495
|
# @param clg_dsgn_sup_air_temp [Double] design cooling supply air temperature in degrees Fahrenheit, default 65F
|
|
1334
1496
|
# @param htg_dsgn_sup_air_temp [Double] design heating supply air temperature in degrees Fahrenheit, default 75F
|
|
1335
1497
|
# @return [OpenStudio::Model::AirLoopHVAC] the resulting DOAS air loop
|
|
@@ -1622,7 +1784,7 @@ class Standard
|
|
|
1622
1784
|
# @param system_name [String] the name of the system, or nil in which case it will be defaulted
|
|
1623
1785
|
# @param return_plenum [OpenStudio::Model::ThermalZone] the zone to attach as the supply plenum, or nil, in which case no return plenum will be used
|
|
1624
1786
|
# @param heating_type [String] main heating coil fuel type
|
|
1625
|
-
# valid choices are NaturalGas, Gas, Electricity, HeatPump, DistrictHeating, or nil (defaults to NaturalGas)
|
|
1787
|
+
# valid choices are NaturalGas, Gas, Electricity, HeatPump, DistrictHeating, DistrictHeatingWater, DistrictHeatingSteam, or nil (defaults to NaturalGas)
|
|
1626
1788
|
# @param reheat_type [String] valid options are NaturalGas, Gas, Electricity, Water, nil (no heat)
|
|
1627
1789
|
# @param hot_water_loop [OpenStudio::Model::PlantLoop] hot water loop to connect heating and reheat coils to
|
|
1628
1790
|
# @param chilled_water_loop [OpenStudio::Model::PlantLoop] chilled water loop to connect cooling coil to
|
|
@@ -1778,7 +1940,7 @@ class Standard
|
|
|
1778
1940
|
else
|
|
1779
1941
|
avail_mgr = nil
|
|
1780
1942
|
end
|
|
1781
|
-
else
|
|
1943
|
+
else
|
|
1782
1944
|
avail_mgr = air_loop.availabilityManagers[0]
|
|
1783
1945
|
end
|
|
1784
1946
|
|
|
@@ -1823,7 +1985,8 @@ class Standard
|
|
|
1823
1985
|
else
|
|
1824
1986
|
terminal.setZoneMinimumAirFlowInputMethod('Constant')
|
|
1825
1987
|
end
|
|
1826
|
-
|
|
1988
|
+
# default to single maximum control logic
|
|
1989
|
+
terminal.setDamperHeatingAction('Normal')
|
|
1827
1990
|
terminal.setMaximumReheatAirTemperature(dsgn_temps['zn_htg_dsgn_sup_air_temp_c'])
|
|
1828
1991
|
air_loop.multiAddBranchForZone(zone, terminal.to_HVACComponent.get)
|
|
1829
1992
|
air_terminal_single_duct_vav_reheat_apply_initial_prototype_damper_position(terminal, thermal_zone_outdoor_airflow_rate_per_area(zone))
|
|
@@ -1858,12 +2021,6 @@ class Standard
|
|
|
1858
2021
|
end
|
|
1859
2022
|
end
|
|
1860
2023
|
|
|
1861
|
-
# Design outdoor air calculation based on VRP if applicable (prototypes maintained by PNNL)
|
|
1862
|
-
model_system_outdoor_air_sizing_vrp_method(air_loop)
|
|
1863
|
-
|
|
1864
|
-
# set the damper action based on the template
|
|
1865
|
-
air_loop_hvac_apply_vav_damper_action(air_loop)
|
|
1866
|
-
|
|
1867
2024
|
return air_loop
|
|
1868
2025
|
end
|
|
1869
2026
|
|
|
@@ -2012,9 +2169,10 @@ class Standard
|
|
|
2012
2169
|
# @param chilled_water_loop [OpenStudio::Model::PlantLoop] chilled water loop to connect cooling coils to. If nil, will be DX cooling
|
|
2013
2170
|
# @param heating_type [String] main heating coil fuel type
|
|
2014
2171
|
# valid choices are NaturalGas, Electricity, Water, or nil (defaults to NaturalGas)
|
|
2015
|
-
# @param electric_reheat [
|
|
2172
|
+
# @param electric_reheat [Boolean] if true electric reheat coils, if false the reheat coils served by hot_water_loop
|
|
2016
2173
|
# @param hvac_op_sch [String] name of the HVAC operation schedule or nil in which case will be defaulted to always on
|
|
2017
2174
|
# @param oa_damper_sch [String] name of the oa damper schedule or nil in which case will be defaulted to always open
|
|
2175
|
+
# @param econo_ctrl_mthd [String] economizer control type
|
|
2018
2176
|
# @return [OpenStudio::Model::AirLoopHVAC] the resulting packaged VAV air loop
|
|
2019
2177
|
def model_add_pvav(model,
|
|
2020
2178
|
thermal_zones,
|
|
@@ -2025,7 +2183,8 @@ class Standard
|
|
|
2025
2183
|
heating_type: nil,
|
|
2026
2184
|
electric_reheat: false,
|
|
2027
2185
|
hvac_op_sch: nil,
|
|
2028
|
-
oa_damper_sch: nil
|
|
2186
|
+
oa_damper_sch: nil,
|
|
2187
|
+
econo_ctrl_mthd: nil)
|
|
2029
2188
|
OpenStudio.logFree(OpenStudio::Info, 'openstudio.Model.Model', "Adding Packaged VAV for #{thermal_zones.size} zones.")
|
|
2030
2189
|
|
|
2031
2190
|
# create air handler
|
|
@@ -2118,18 +2277,25 @@ class Standard
|
|
|
2118
2277
|
name: "#{air_loop.name} Clg Coil")
|
|
2119
2278
|
end
|
|
2120
2279
|
|
|
2121
|
-
#
|
|
2280
|
+
# outdoor air intake system
|
|
2122
2281
|
oa_intake_controller = OpenStudio::Model::ControllerOutdoorAir.new(model)
|
|
2282
|
+
oa_intake_controller.setName("#{air_loop.name} OA Controller")
|
|
2123
2283
|
oa_intake_controller.setMinimumLimitType('FixedMinimum')
|
|
2124
2284
|
oa_intake_controller.autosizeMinimumOutdoorAirFlowRate
|
|
2125
|
-
oa_intake_controller.
|
|
2285
|
+
oa_intake_controller.resetMaximumFractionofOutdoorAirSchedule
|
|
2126
2286
|
oa_intake_controller.resetEconomizerMinimumLimitDryBulbTemperature
|
|
2287
|
+
unless econo_ctrl_mthd.nil?
|
|
2288
|
+
oa_intake_controller.setEconomizerControlType(econo_ctrl_mthd)
|
|
2289
|
+
end
|
|
2290
|
+
unless oa_damper_sch.nil?
|
|
2291
|
+
oa_intake_controller.setMinimumOutdoorAirSchedule(oa_damper_sch)
|
|
2292
|
+
end
|
|
2293
|
+
controller_mv = oa_intake_controller.controllerMechanicalVentilation
|
|
2294
|
+
controller_mv.setName("#{air_loop.name} Mechanical Ventilation Controller")
|
|
2295
|
+
controller_mv.setSystemOutdoorAirMethod('ZoneSum')
|
|
2127
2296
|
oa_intake = OpenStudio::Model::AirLoopHVACOutdoorAirSystem.new(model, oa_intake_controller)
|
|
2128
2297
|
oa_intake.setName("#{air_loop.name} OA System")
|
|
2129
2298
|
oa_intake.addToNode(air_loop.supplyInletNode)
|
|
2130
|
-
controller_mv = oa_intake_controller.controllerMechanicalVentilation
|
|
2131
|
-
controller_mv.setName("#{air_loop.name} Ventilation Controller")
|
|
2132
|
-
controller_mv.setAvailabilitySchedule(oa_damper_sch)
|
|
2133
2299
|
|
|
2134
2300
|
# set air loop availability controls and night cycle manager, after oa system added
|
|
2135
2301
|
air_loop.setAvailabilitySchedule(hvac_op_sch)
|
|
@@ -2142,7 +2308,7 @@ class Standard
|
|
|
2142
2308
|
else
|
|
2143
2309
|
avail_mgr = nil
|
|
2144
2310
|
end
|
|
2145
|
-
else
|
|
2311
|
+
else
|
|
2146
2312
|
avail_mgr = air_loop.availabilityManagers[0]
|
|
2147
2313
|
end
|
|
2148
2314
|
|
|
@@ -2177,6 +2343,8 @@ class Standard
|
|
|
2177
2343
|
else
|
|
2178
2344
|
terminal.setZoneMinimumAirFlowInputMethod('Constant')
|
|
2179
2345
|
end
|
|
2346
|
+
# default to single maximum control logic
|
|
2347
|
+
terminal.setDamperHeatingAction('Normal')
|
|
2180
2348
|
terminal.setMaximumReheatAirTemperature(dsgn_temps['zn_htg_dsgn_sup_air_temp_c'])
|
|
2181
2349
|
air_loop.multiAddBranchForZone(zone, terminal.to_HVACComponent.get)
|
|
2182
2350
|
air_terminal_single_duct_vav_reheat_apply_initial_prototype_damper_position(terminal, thermal_zone_outdoor_airflow_rate_per_area(zone))
|
|
@@ -2191,13 +2359,7 @@ class Standard
|
|
|
2191
2359
|
sizing_zone.setZoneHeatingDesignSupplyAirTemperature(dsgn_temps['zn_htg_dsgn_sup_air_temp_c'])
|
|
2192
2360
|
end
|
|
2193
2361
|
|
|
2194
|
-
|
|
2195
|
-
model_system_outdoor_air_sizing_vrp_method(air_loop)
|
|
2196
|
-
|
|
2197
|
-
# set the damper action based on the template
|
|
2198
|
-
air_loop_hvac_apply_vav_damper_action(air_loop)
|
|
2199
|
-
|
|
2200
|
-
return true
|
|
2362
|
+
return air_loop
|
|
2201
2363
|
end
|
|
2202
2364
|
|
|
2203
2365
|
# Creates a packaged VAV system with parallel fan powered boxes and adds it to the model.
|
|
@@ -2502,7 +2664,7 @@ class Standard
|
|
|
2502
2664
|
# Set the damper action based on the template.
|
|
2503
2665
|
air_loop_hvac_apply_vav_damper_action(air_loop)
|
|
2504
2666
|
|
|
2505
|
-
return
|
|
2667
|
+
return air_loop
|
|
2506
2668
|
end
|
|
2507
2669
|
|
|
2508
2670
|
# Creates a PSZ-AC system for each zone and adds it to the model.
|
|
@@ -2722,9 +2884,15 @@ class Standard
|
|
|
2722
2884
|
unitary_system.setMaximumOutdoorDryBulbTemperatureforSupplementalHeaterOperation(OpenStudio.convert(40.0, 'F', 'C').get)
|
|
2723
2885
|
unitary_system.setName("#{air_loop.name} Unitary HP")
|
|
2724
2886
|
unitary_system.setMaximumSupplyAirTemperature(dsgn_temps['zn_htg_dsgn_sup_air_temp_c'])
|
|
2725
|
-
|
|
2726
|
-
|
|
2727
|
-
|
|
2887
|
+
if model.version < OpenStudio::VersionString.new('3.7.0')
|
|
2888
|
+
unitary_system.setSupplyAirFlowRateMethodDuringCoolingOperation('SupplyAirFlowRate')
|
|
2889
|
+
unitary_system.setSupplyAirFlowRateMethodDuringHeatingOperation('SupplyAirFlowRate')
|
|
2890
|
+
unitary_system.setSupplyAirFlowRateMethodWhenNoCoolingorHeatingisRequired('SupplyAirFlowRate')
|
|
2891
|
+
else
|
|
2892
|
+
unitary_system.autosizeSupplyAirFlowRateDuringCoolingOperation
|
|
2893
|
+
unitary_system.autosizeSupplyAirFlowRateDuringHeatingOperation
|
|
2894
|
+
unitary_system.autosizeSupplyAirFlowRateWhenNoCoolingorHeatingisRequired
|
|
2895
|
+
end
|
|
2728
2896
|
when 'Single Speed Heat Pump'
|
|
2729
2897
|
unitary_system.setMaximumOutdoorDryBulbTemperatureforSupplementalHeaterOperation(OpenStudio.convert(40.0, 'F', 'C').get)
|
|
2730
2898
|
unitary_system.setName("#{air_loop.name} Unitary HP")
|
|
@@ -2764,7 +2932,7 @@ class Standard
|
|
|
2764
2932
|
else
|
|
2765
2933
|
avail_mgr = nil
|
|
2766
2934
|
end
|
|
2767
|
-
else
|
|
2935
|
+
else
|
|
2768
2936
|
avail_mgr = air_loop.availabilityManagers[0]
|
|
2769
2937
|
end
|
|
2770
2938
|
|
|
@@ -2875,7 +3043,6 @@ class Standard
|
|
|
2875
3043
|
when 'Water'
|
|
2876
3044
|
htg_coil = create_coil_heating_water(model,
|
|
2877
3045
|
hot_water_loop,
|
|
2878
|
-
air_loop_node: air_loop.supplyOutletNode,
|
|
2879
3046
|
name: "#{air_loop.name} Water Htg Coil")
|
|
2880
3047
|
else
|
|
2881
3048
|
# Zero-capacity, always-off electric heating coil
|
|
@@ -2934,13 +3101,23 @@ class Standard
|
|
|
2934
3101
|
unitary_system.setControllingZoneorThermostatLocation(zone)
|
|
2935
3102
|
unitary_system.setMaximumSupplyAirTemperature(dsgn_temps['zn_htg_dsgn_sup_air_temp_c'])
|
|
2936
3103
|
unitary_system.setFanPlacement('BlowThrough')
|
|
2937
|
-
|
|
2938
|
-
|
|
2939
|
-
|
|
2940
|
-
|
|
3104
|
+
if model.version < OpenStudio::VersionString.new('3.7.0')
|
|
3105
|
+
unitary_system.setSupplyAirFlowRateMethodDuringCoolingOperation('SupplyAirFlowRate')
|
|
3106
|
+
unitary_system.setSupplyAirFlowRateMethodDuringHeatingOperation('SupplyAirFlowRate')
|
|
3107
|
+
if minimum_volume_setpoint.nil?
|
|
3108
|
+
unitary_system.setSupplyAirFlowRateMethodWhenNoCoolingorHeatingisRequired('SupplyAirFlowRate')
|
|
3109
|
+
else
|
|
3110
|
+
unitary_system.setSupplyAirFlowRateMethodWhenNoCoolingorHeatingisRequired('FractionOfAutosizedCoolingValue')
|
|
3111
|
+
unitary_system.setFractionofAutosizedDesignCoolingSupplyAirFlowRateWhenNoCoolingorHeatingisRequired(minimum_volume_setpoint)
|
|
3112
|
+
end
|
|
2941
3113
|
else
|
|
2942
|
-
unitary_system.
|
|
2943
|
-
unitary_system.
|
|
3114
|
+
unitary_system.autosizeSupplyAirFlowRateDuringCoolingOperation
|
|
3115
|
+
unitary_system.autosizeSupplyAirFlowRateDuringHeatingOperation
|
|
3116
|
+
if minimum_volume_setpoint.nil?
|
|
3117
|
+
unitary_system.autosizeSupplyAirFlowRateWhenNoCoolingorHeatingisRequired
|
|
3118
|
+
else
|
|
3119
|
+
unitary_system.setFractionofAutosizedDesignCoolingSupplyAirFlowRateWhenNoCoolingorHeatingisRequired(minimum_volume_setpoint)
|
|
3120
|
+
end
|
|
2944
3121
|
end
|
|
2945
3122
|
unitary_system.setSupplyAirFanOperatingModeSchedule(model.alwaysOnDiscreteSchedule)
|
|
2946
3123
|
unitary_system.addToNode(air_loop.supplyInletNode)
|
|
@@ -2975,7 +3152,7 @@ class Standard
|
|
|
2975
3152
|
# @param model [OpenStudio::Model::Model] OpenStudio model object
|
|
2976
3153
|
# @param space [OpenStudio::Model::Space] which space to assign the data center loads to
|
|
2977
3154
|
# @param dc_watts_per_area [Double] data center load, in W/m^2
|
|
2978
|
-
# @return [
|
|
3155
|
+
# @return [Boolean] returns true if successful, false if not
|
|
2979
3156
|
def model_add_data_center_load(model, space, dc_watts_per_area)
|
|
2980
3157
|
# create data center load
|
|
2981
3158
|
data_center_definition = OpenStudio::Model::ElectricEquipmentDefinition.new(model)
|
|
@@ -2999,7 +3176,7 @@ class Standard
|
|
|
2999
3176
|
# @param thermal_zones [Array<OpenStudio::Model::ThermalZone>] array of zones to connect to this system
|
|
3000
3177
|
# @param hvac_op_sch [String] name of the HVAC operation schedule or nil in which case will be defaulted to always on
|
|
3001
3178
|
# @param oa_damper_sch [String] name of the oa damper schedule or nil in which case will be defaulted to always open
|
|
3002
|
-
# @param main_data_center [
|
|
3179
|
+
# @param main_data_center [Boolean] whether or not this is the main data center in the building.
|
|
3003
3180
|
# @return [Array<OpenStudio::Model::AirLoopHVAC>] an array of the resulting air loops
|
|
3004
3181
|
def model_add_data_center_hvac(model,
|
|
3005
3182
|
thermal_zones,
|
|
@@ -3249,7 +3426,7 @@ class Standard
|
|
|
3249
3426
|
fan.setAvailabilitySchedule(hvac_op_sch)
|
|
3250
3427
|
else
|
|
3251
3428
|
OpenStudio.logFree(OpenStudio::Error, 'openstudio.Model.Model', "Fan type '#{fan_type}' not recognized, cannot add CRAC.")
|
|
3252
|
-
return
|
|
3429
|
+
return false
|
|
3253
3430
|
end
|
|
3254
3431
|
|
|
3255
3432
|
# create cooling coil
|
|
@@ -3369,7 +3546,7 @@ class Standard
|
|
|
3369
3546
|
# Creates a CRAH system for larger size data center and adds it to the model.
|
|
3370
3547
|
#
|
|
3371
3548
|
# @param model [OpenStudio::Model::Model] OpenStudio model object
|
|
3372
|
-
# @param chilled_water_loop [
|
|
3549
|
+
# @param chilled_water_loop [String
|
|
3373
3550
|
# @param system_name [String] the name of the system, or nil in which case it will be defaulted
|
|
3374
3551
|
# @param thermal_zones [String] zones to connect to this system
|
|
3375
3552
|
# @param hvac_op_sch [String] name of the HVAC operation schedule
|
|
@@ -3806,7 +3983,7 @@ class Standard
|
|
|
3806
3983
|
# @param heating_type [String] valid choices are NaturalGas, Electricity, Water, nil (no heat)
|
|
3807
3984
|
# @param hot_water_loop [OpenStudio::Model::PlantLoop] hot water loop to connect heating coil to. Set to nil for heating types besides water
|
|
3808
3985
|
# @param fan_type [String] valid choices are ConstantVolume, Cycling
|
|
3809
|
-
# @param ventilation [
|
|
3986
|
+
# @param ventilation [Boolean] If true, ventilation will be supplied through the unit. If false,
|
|
3810
3987
|
# no ventilation will be supplied through the unit, with the expectation that it will be provided by a DOAS or separate system.
|
|
3811
3988
|
# @return [Array<OpenStudio::Model::ZoneHVACPackagedTerminalAirConditioner>] an array of the resulting PTACs
|
|
3812
3989
|
def model_add_ptac(model,
|
|
@@ -3925,7 +4102,7 @@ class Standard
|
|
|
3925
4102
|
# @param model [OpenStudio::Model::Model] OpenStudio model object
|
|
3926
4103
|
# @param thermal_zones [Array<OpenStudio::Model::ThermalZone>] array of zones to connect to this system
|
|
3927
4104
|
# @param fan_type [String] valid choices are ConstantVolume, Cycling
|
|
3928
|
-
# @param ventilation [
|
|
4105
|
+
# @param ventilation [Boolean] If true, ventilation will be supplied through the unit. If false,
|
|
3929
4106
|
# no ventilation will be supplied through the unit, with the expectation that it will be provided by a DOAS or separate system.
|
|
3930
4107
|
# @return [Array<OpenStudio::Model::ZoneHVACPackagedTerminalAirConditioner>] an array of the resulting PTACs.
|
|
3931
4108
|
def model_add_pthp(model,
|
|
@@ -4013,7 +4190,7 @@ class Standard
|
|
|
4013
4190
|
# @param hvac_op_sch [String] name of the HVAC operation schedule or nil in which case will be defaulted to always on
|
|
4014
4191
|
# @param fan_control_type [String] valid choices are OnOff, ConstantVolume, VariableVolume
|
|
4015
4192
|
# @param fan_pressure_rise [Double] fan pressure rise, inH2O
|
|
4016
|
-
# @param heating_type [String] valid choices are NaturalGas, Gas, Electricity, Electric, DistrictHeating
|
|
4193
|
+
# @param heating_type [String] valid choices are NaturalGas, Gas, Electricity, Electric, DistrictHeating, DistrictHeatingWater, DistrictHeatingSteam
|
|
4017
4194
|
# @param hot_water_loop [OpenStudio::Model::PlantLoop] hot water loop to connect to the heating coil
|
|
4018
4195
|
# @param rated_inlet_water_temperature [Double] rated inlet water temperature in degrees Fahrenheit, default is 180F
|
|
4019
4196
|
# @param rated_outlet_water_temperature [Double] rated outlet water temperature in degrees Fahrenheit, default is 160F
|
|
@@ -4075,7 +4252,7 @@ class Standard
|
|
|
4075
4252
|
htg_coil = create_coil_heating_electric(model,
|
|
4076
4253
|
name: "#{zone.name} UnitHeater Electric Htg Coil",
|
|
4077
4254
|
schedule: hvac_op_sch)
|
|
4078
|
-
elsif heating_type
|
|
4255
|
+
elsif heating_type.include?('DistrictHeating') && !hot_water_loop.nil?
|
|
4079
4256
|
# control temperature for hot water loop
|
|
4080
4257
|
if rated_inlet_water_temperature.nil?
|
|
4081
4258
|
rated_inlet_water_temperature_c = OpenStudio.convert(180.0, 'F', 'C').get
|
|
@@ -4291,9 +4468,15 @@ class Standard
|
|
|
4291
4468
|
unitary_system.setControllingZoneorThermostatLocation(zone)
|
|
4292
4469
|
unitary_system.setMaximumSupplyAirTemperature(dsgn_temps['zn_htg_dsgn_sup_air_temp_c'])
|
|
4293
4470
|
unitary_system.setFanPlacement('BlowThrough')
|
|
4294
|
-
|
|
4295
|
-
|
|
4296
|
-
|
|
4471
|
+
if model.version < OpenStudio::VersionString.new('3.7.0')
|
|
4472
|
+
unitary_system.setSupplyAirFlowRateMethodDuringCoolingOperation('SupplyAirFlowRate')
|
|
4473
|
+
unitary_system.setSupplyAirFlowRateMethodDuringHeatingOperation('SupplyAirFlowRate')
|
|
4474
|
+
unitary_system.setSupplyAirFlowRateMethodWhenNoCoolingorHeatingisRequired('SupplyAirFlowRate')
|
|
4475
|
+
else
|
|
4476
|
+
unitary_system.autosizeSupplyAirFlowRateDuringCoolingOperation
|
|
4477
|
+
unitary_system.autosizeSupplyAirFlowRateDuringHeatingOperation
|
|
4478
|
+
unitary_system.autosizeSupplyAirFlowRateWhenNoCoolingorHeatingisRequired
|
|
4479
|
+
end
|
|
4297
4480
|
unitary_system.setSupplyAirFanOperatingModeSchedule(model.alwaysOffDiscreteSchedule)
|
|
4298
4481
|
unitary_system.addToNode(air_loop.supplyInletNode)
|
|
4299
4482
|
|
|
@@ -4376,7 +4559,7 @@ class Standard
|
|
|
4376
4559
|
#
|
|
4377
4560
|
# @param model [OpenStudio::Model::Model] OpenStudio model object
|
|
4378
4561
|
# @param thermal_zones [Array<OpenStudio::Model::ThermalZone>] array of zones to add fan coil units
|
|
4379
|
-
# @param ventilation [
|
|
4562
|
+
# @param ventilation [Boolean] If true, ventilation will be supplied through the unit. If false,
|
|
4380
4563
|
# no ventilation will be supplied through the unit, with the expectation that it will be provided by a DOAS or separate system.
|
|
4381
4564
|
# @return [Array<OpenStudio::Model::ZoneHVACTerminalUnitVariableRefrigerantFlow>] array of vrf units.
|
|
4382
4565
|
def model_add_vrf(model,
|
|
@@ -4436,7 +4619,7 @@ class Standard
|
|
|
4436
4619
|
# @param chilled_water_loop [OpenStudio::Model::PlantLoop] the chilled water loop that serves the fan coils.
|
|
4437
4620
|
# @param hot_water_loop [OpenStudio::Model::PlantLoop] the hot water loop that serves the fan coils.
|
|
4438
4621
|
# If nil, a zero-capacity, electric heating coil set to Always-Off will be included in the unit.
|
|
4439
|
-
# @param ventilation [
|
|
4622
|
+
# @param ventilation [Boolean] If true, ventilation will be supplied through the unit. If false,
|
|
4440
4623
|
# no ventilation will be supplied through the unit, with the expectation that it will be provided by a DOAS or separate system.
|
|
4441
4624
|
# @param capacity_control_method [String] Capacity control method for the fan coil. Options are ConstantFanVariableFlow,
|
|
4442
4625
|
# CyclingFan, VariableFanVariableFlow, and VariableFanConstantFlow. If VariableFan, the fan will be VariableVolume.
|
|
@@ -4520,27 +4703,70 @@ class Standard
|
|
|
4520
4703
|
# @param thermal_zones [Array<OpenStudio::Model::ThermalZone>] array of zones to add radiant loops
|
|
4521
4704
|
# @param hot_water_loop [OpenStudio::Model::PlantLoop] the hot water loop that serves the radiant loop.
|
|
4522
4705
|
# @param chilled_water_loop [OpenStudio::Model::PlantLoop] the chilled water loop that serves the radiant loop.
|
|
4706
|
+
# @param two_pipe_system [Boolean] when set to true, it converts the default 4-pipe water plant HVAC system to a 2-pipe system.
|
|
4707
|
+
# @param two_pipe_control_strategy [String] Method to determine whether the loop is in heating or cooling mode
|
|
4708
|
+
# 'outdoor_air_lockout' - The system will be in heating below the two_pipe_lockout_temperature variable,
|
|
4709
|
+
# and cooling above the two_pipe_lockout_temperature. Requires the two_pipe_lockout_temperature variable.
|
|
4710
|
+
# 'zone_demand' - Create EMS code to determine heating or cooling mode based on zone heating or cooling load requests.
|
|
4711
|
+
# Requires thermal_zones defined.
|
|
4712
|
+
# @param two_pipe_lockout_temperature [Double] hot water plant lockout in degrees Fahrenheit, default 65F.
|
|
4713
|
+
# Hot water plant is unavailable when outdoor drybulb is above the specified threshold.
|
|
4714
|
+
# @param plant_supply_water_temperature_control [Bool] Set to true if the plant supply water temperature
|
|
4715
|
+
# is to be controlled else it is held constant, default to false.
|
|
4716
|
+
# @param plant_supply_water_temperature_control_strategy [String] Method to determine how to control the plant's supply water temperature.
|
|
4717
|
+
# 'outdoor_air' - Set the supply water temperature based on the outdoor air temperature.
|
|
4718
|
+
# 'zone_demand' - Set the supply water temperature based on the preponderance of zone demand.
|
|
4719
|
+
# Requires thermal_zone defined.
|
|
4720
|
+
# @param hwsp_at_oat_low [Double] hot water plant supply water temperature setpoint, in F, at the outdoor low temperature.
|
|
4721
|
+
# Requires
|
|
4722
|
+
# @param hw_oat_low [Double] outdoor drybulb air temperature, in F, for low setpoint for hot water plant.
|
|
4723
|
+
# @param hwsp_at_oat_high [Double] hot water plant supply water temperature setpoint, in F, at the outdoor high temperature.
|
|
4724
|
+
# @param hw_oat_high [Double] outdoor drybulb air temperature, in F, for high setpoint for hot water plant.
|
|
4725
|
+
# @param chwsp_at_oat_low [Double] chilled water plant supply water temperature setpoint, in F, at the outdoor low temperature.
|
|
4726
|
+
# @param chw_oat_low [Double] outdoor drybulb air temperature, in F, for low setpoint for chilled water plant.
|
|
4727
|
+
# @param chwsp_at_oat_high [Double] chilled water plant supply water temperature setpoint, in F, at the outdoor high temperature.
|
|
4728
|
+
# @param chw_oat_high [Double] outdoor drybulb air temperature, in F, for high setpoint for chilled water plant.
|
|
4523
4729
|
# @param radiant_type [String] type of radiant system, floor or ceiling, to create in zone.
|
|
4524
|
-
# @param
|
|
4730
|
+
# @param radiant_temperature_control_type [String] determines the controlled temperature for the radiant system
|
|
4731
|
+
# options are 'MeanAirTemperature', 'MeanRadiantTemperature', 'OperativeTemperature', 'OutdoorDryBulbTemperature',
|
|
4732
|
+
# 'OutdoorWetBulbTemperature', 'SurfaceFaceTemperature', 'SurfaceInteriorTemperature'
|
|
4733
|
+
# @param radiant_setpoint_control_type [String] determines the response of the radiant system at setpoint temperature
|
|
4734
|
+
# options are 'ZeroFlowPower', 'HalfFlowPower'
|
|
4735
|
+
# @param include_carpet [Boolean] boolean to include thin carpet tile over radiant slab, default to true
|
|
4525
4736
|
# @param carpet_thickness_in [Double] thickness of carpet in inches
|
|
4737
|
+
# @param control_strategy [String] name of control strategy. Options are 'proportional_control', 'oa_based_control',
|
|
4738
|
+
# 'constant_control', and 'none'.
|
|
4739
|
+
# If control strategy is 'proportional_control', the method will apply the CBE radiant control sequences
|
|
4740
|
+
# detailed in Raftery et al. (2017), 'A new control strategy for high thermal mass radiant systems'.
|
|
4741
|
+
# If control strategy is 'oa_based_control', the method will apply native EnergyPlus objects/parameters
|
|
4742
|
+
# to vary slab setpoint based on outdoor weather.
|
|
4743
|
+
# If control strategy is 'constant_control', the method will apply native EnergyPlus objects/parameters to
|
|
4744
|
+
# maintain a constant slab setpoint.
|
|
4745
|
+
# Otherwise no control strategy will be applied and the radiant system will assume the EnergyPlus default controls.
|
|
4746
|
+
# @param use_zone_occupancy_for_control [Boolean] Set to true if radiant system is to use specific zone occupancy objects
|
|
4747
|
+
# for CBE control strategy. If false, then it will use values in model_occ_hr_start and model_occ_hr_end
|
|
4748
|
+
# for all radiant zones. default to true.
|
|
4749
|
+
# @param occupied_percentage_threshold [Double] the minimum fraction (0 to 1) that counts as occupied
|
|
4750
|
+
# if this parameter is set, the returned ScheduleRuleset will be 0 = unoccupied, 1 = occupied
|
|
4751
|
+
# otherwise the ScheduleRuleset will be the weighted fractional occupancy schedule.
|
|
4752
|
+
# Only used if use_zone_occupancy_for_control is set to true.
|
|
4526
4753
|
# @param model_occ_hr_start [Double] (Optional) Only applies if control_strategy is 'proportional_control'.
|
|
4527
4754
|
# Starting hour of building occupancy.
|
|
4528
4755
|
# @param model_occ_hr_end [Double] (Optional) Only applies if control_strategy is 'proportional_control'.
|
|
4529
4756
|
# Ending hour of building occupancy.
|
|
4530
|
-
# @param control_strategy [String] name of control strategy. Options are 'proportional_control' and 'none'.
|
|
4531
|
-
# If control strategy is 'proportional_control', the method will apply the CBE radiant control sequences
|
|
4532
|
-
# detailed in Raftery et al. (2017), 'A new control strategy for high thermal mass radiant systems'.
|
|
4533
|
-
# Otherwise no control strategy will be applied and the radiant system will assume the EnergyPlus default controls.
|
|
4534
4757
|
# @param proportional_gain [Double] (Optional) Only applies if control_strategy is 'proportional_control'.
|
|
4535
4758
|
# Proportional gain constant (recommended 0.3 or less).
|
|
4536
|
-
# @param minimum_operation [Double] (Optional) Only applies if control_strategy is 'proportional_control'.
|
|
4537
|
-
# Minimum number of hours of operation for radiant system before it shuts off.
|
|
4538
|
-
# @param weekend_temperature_reset [Double] (Optional) Only applies if control_strategy is 'proportional_control'.
|
|
4539
|
-
# Weekend temperature reset for slab temperature setpoint in degree Celsius.
|
|
4540
|
-
# @param early_reset_out_arg [Double] (Optional) Only applies if control_strategy is 'proportional_control'.
|
|
4541
|
-
# Time at which the weekend temperature reset is removed.
|
|
4542
4759
|
# @param switch_over_time [Double] Time limitation for when the system can switch between heating and cooling
|
|
4543
|
-
# @param
|
|
4760
|
+
# @param slab_sp_at_oat_low [Double] radiant slab temperature setpoint, in F, at the outdoor high temperature.
|
|
4761
|
+
# @param slab_oat_low [Double] outdoor drybulb air temperature, in F, for low radiant slab setpoint.
|
|
4762
|
+
# @param slab_sp_at_oat_high [Double] radiant slab temperature setpoint, in F, at the outdoor low temperature.
|
|
4763
|
+
# @param slab_oat_high [Double] outdoor drybulb air temperature, in F, for high radiant slab setpoint.
|
|
4764
|
+
# @param radiant_availability_type [String] a preset that determines the availability of the radiant system
|
|
4765
|
+
# options are 'all_day', 'precool', 'afternoon_shutoff', 'occupancy'
|
|
4766
|
+
# If preset is set to 'all_day' radiant system is available 24 hours a day, 'precool' primarily operates
|
|
4767
|
+
# radiant system during night-time hours, 'afternoon_shutoff' avoids operation during peak grid demand,
|
|
4768
|
+
# and 'occupancy' operates radiant system during building occupancy hours.
|
|
4769
|
+
# @param radiant_lockout [Boolean] True if system contains a radiant lockout. If true, it will overwrite radiant_availability_type.
|
|
4544
4770
|
# @param radiant_lockout_start_time [double] decimal hour of when radiant lockout starts
|
|
4545
4771
|
# Only used if radiant_lockout is true
|
|
4546
4772
|
# @param radiant_lockout_end_time [double] decimal hour of when radiant lockout ends
|
|
@@ -4552,17 +4778,36 @@ class Standard
|
|
|
4552
4778
|
thermal_zones,
|
|
4553
4779
|
hot_water_loop,
|
|
4554
4780
|
chilled_water_loop,
|
|
4781
|
+
two_pipe_system: false,
|
|
4782
|
+
two_pipe_control_strategy: 'outdoor_air_lockout',
|
|
4783
|
+
two_pipe_lockout_temperature: 65.0,
|
|
4784
|
+
plant_supply_water_temperature_control: false,
|
|
4785
|
+
plant_supply_water_temperature_control_strategy: 'outdoor_air',
|
|
4786
|
+
hwsp_at_oat_low: 120.0,
|
|
4787
|
+
hw_oat_low: 55.0,
|
|
4788
|
+
hwsp_at_oat_high: 80.0,
|
|
4789
|
+
hw_oat_high: 70.0,
|
|
4790
|
+
chwsp_at_oat_low: 70.0,
|
|
4791
|
+
chw_oat_low: 65.0,
|
|
4792
|
+
chwsp_at_oat_high: 55.0,
|
|
4793
|
+
chw_oat_high: 75.0,
|
|
4555
4794
|
radiant_type: 'floor',
|
|
4795
|
+
radiant_temperature_control_type: 'SurfaceFaceTemperature',
|
|
4796
|
+
radiant_setpoint_control_type: 'ZeroFlowPower',
|
|
4556
4797
|
include_carpet: true,
|
|
4557
4798
|
carpet_thickness_in: 0.25,
|
|
4799
|
+
control_strategy: 'proportional_control',
|
|
4800
|
+
use_zone_occupancy_for_control: true,
|
|
4801
|
+
occupied_percentage_threshold: 0.10,
|
|
4558
4802
|
model_occ_hr_start: 6.0,
|
|
4559
4803
|
model_occ_hr_end: 18.0,
|
|
4560
|
-
control_strategy: 'proportional_control',
|
|
4561
4804
|
proportional_gain: 0.3,
|
|
4562
|
-
minimum_operation: 1,
|
|
4563
|
-
weekend_temperature_reset: 2,
|
|
4564
|
-
early_reset_out_arg: 20,
|
|
4565
4805
|
switch_over_time: 24.0,
|
|
4806
|
+
slab_sp_at_oat_low: 73,
|
|
4807
|
+
slab_oat_low: 65,
|
|
4808
|
+
slab_sp_at_oat_high: 68,
|
|
4809
|
+
slab_oat_high: 80,
|
|
4810
|
+
radiant_availability_type: 'precool',
|
|
4566
4811
|
radiant_lockout: false,
|
|
4567
4812
|
radiant_lockout_start_time: 12.0,
|
|
4568
4813
|
radiant_lockout_end_time: 20.0)
|
|
@@ -4682,9 +4927,16 @@ class Standard
|
|
|
4682
4927
|
radiant_interior_floor_slab_construction = OpenStudio::Model::ConstructionWithInternalSource.new(layers)
|
|
4683
4928
|
radiant_interior_floor_slab_construction.setName('Radiant Interior Floor Slab Construction')
|
|
4684
4929
|
radiant_interior_floor_slab_construction.setSourcePresentAfterLayerNumber(1)
|
|
4685
|
-
radiant_interior_floor_slab_construction.setTemperatureCalculationRequestedAfterLayerNumber(
|
|
4930
|
+
radiant_interior_floor_slab_construction.setTemperatureCalculationRequestedAfterLayerNumber(1)
|
|
4686
4931
|
radiant_interior_floor_slab_construction.setTubeSpacing(0.2286) # 9 inches
|
|
4687
4932
|
|
|
4933
|
+
# create reversed interior floor construction
|
|
4934
|
+
rev_radiant_interior_floor_slab_construction = OpenStudio::Model::ConstructionWithInternalSource.new(layers.reverse)
|
|
4935
|
+
rev_radiant_interior_floor_slab_construction.setName('Radiant Interior Floor Slab Construction - Reversed')
|
|
4936
|
+
rev_radiant_interior_floor_slab_construction.setSourcePresentAfterLayerNumber(layers.length - 1)
|
|
4937
|
+
rev_radiant_interior_floor_slab_construction.setTemperatureCalculationRequestedAfterLayerNumber(layers.length - 1)
|
|
4938
|
+
rev_radiant_interior_floor_slab_construction.setTubeSpacing(0.2286) # 9 inches
|
|
4939
|
+
|
|
4688
4940
|
layers = []
|
|
4689
4941
|
layers << mat_thin_carpet_tile if include_carpet
|
|
4690
4942
|
layers << mat_concrete_3_5in
|
|
@@ -4693,9 +4945,16 @@ class Standard
|
|
|
4693
4945
|
radiant_interior_ceiling_slab_construction.setName('Radiant Interior Ceiling Slab Construction')
|
|
4694
4946
|
slab_src_loc = include_carpet ? 2 : 1
|
|
4695
4947
|
radiant_interior_ceiling_slab_construction.setSourcePresentAfterLayerNumber(slab_src_loc)
|
|
4696
|
-
radiant_interior_ceiling_slab_construction.setTemperatureCalculationRequestedAfterLayerNumber(slab_src_loc
|
|
4948
|
+
radiant_interior_ceiling_slab_construction.setTemperatureCalculationRequestedAfterLayerNumber(slab_src_loc)
|
|
4697
4949
|
radiant_interior_ceiling_slab_construction.setTubeSpacing(0.2286) # 9 inches
|
|
4698
4950
|
|
|
4951
|
+
# create reversed interior ceiling construction
|
|
4952
|
+
rev_radiant_interior_ceiling_slab_construction = OpenStudio::Model::ConstructionWithInternalSource.new(layers.reverse)
|
|
4953
|
+
rev_radiant_interior_ceiling_slab_construction.setName('Radiant Interior Ceiling Slab Construction - Reversed')
|
|
4954
|
+
rev_radiant_interior_ceiling_slab_construction.setSourcePresentAfterLayerNumber(layers.length - slab_src_loc)
|
|
4955
|
+
rev_radiant_interior_ceiling_slab_construction.setTemperatureCalculationRequestedAfterLayerNumber(layers.length - slab_src_loc)
|
|
4956
|
+
rev_radiant_interior_ceiling_slab_construction.setTubeSpacing(0.2286) # 9 inches
|
|
4957
|
+
|
|
4699
4958
|
layers = []
|
|
4700
4959
|
layers << mat_refl_roof_membrane
|
|
4701
4960
|
layers << mat_roof_insulation
|
|
@@ -4708,7 +4967,7 @@ class Standard
|
|
|
4708
4967
|
radiant_ceiling_slab_construction.setTubeSpacing(0.2286) # 9 inches
|
|
4709
4968
|
|
|
4710
4969
|
# adjust hot and chilled water loop temperatures and set new setpoint schedules
|
|
4711
|
-
radiant_htg_dsgn_sup_wtr_temp_delt_r = 10
|
|
4970
|
+
radiant_htg_dsgn_sup_wtr_temp_delt_r = 10.0
|
|
4712
4971
|
radiant_htg_dsgn_sup_wtr_temp_c = OpenStudio.convert(radiant_htg_dsgn_sup_wtr_temp_f, 'F', 'C').get
|
|
4713
4972
|
radiant_htg_dsgn_sup_wtr_temp_delt_k = OpenStudio.convert(radiant_htg_dsgn_sup_wtr_temp_delt_r, 'R', 'K').get
|
|
4714
4973
|
hot_water_loop.sizingPlant.setDesignLoopExitTemperature(radiant_htg_dsgn_sup_wtr_temp_c)
|
|
@@ -4756,29 +5015,89 @@ class Standard
|
|
|
4756
5015
|
throttling_range_f = 4.0 # 2 degF on either side of control temperature
|
|
4757
5016
|
throttling_range_c = OpenStudio.convert(throttling_range_f, 'F', 'C').get
|
|
4758
5017
|
|
|
4759
|
-
# create availability schedule for radiant loop
|
|
4760
|
-
|
|
4761
|
-
|
|
4762
|
-
|
|
5018
|
+
# create preset availability schedule for radiant loop
|
|
5019
|
+
radiant_avail_sch = OpenStudio::Model::ScheduleRuleset.new(model)
|
|
5020
|
+
radiant_avail_sch.setName('Radiant System Availability Schedule')
|
|
5021
|
+
|
|
5022
|
+
unless radiant_lockout
|
|
5023
|
+
case radiant_availability_type.downcase
|
|
5024
|
+
when 'all_day'
|
|
5025
|
+
start_hour = 24
|
|
5026
|
+
start_minute = 0
|
|
5027
|
+
end_hour = 24
|
|
5028
|
+
end_minute = 0
|
|
5029
|
+
when 'afternoon_shutoff'
|
|
5030
|
+
start_hour = 15
|
|
5031
|
+
start_minute = 0
|
|
5032
|
+
end_hour = 22
|
|
5033
|
+
end_minute = 0
|
|
5034
|
+
when 'precool'
|
|
5035
|
+
start_hour = 10
|
|
5036
|
+
start_minute = 0
|
|
5037
|
+
end_hour = 22
|
|
5038
|
+
end_minute = 0
|
|
5039
|
+
when 'occupancy'
|
|
5040
|
+
start_hour = model_occ_hr_end.to_i
|
|
5041
|
+
start_minute = ((model_occ_hr_end % 1) * 60).to_i
|
|
5042
|
+
end_hour = model_occ_hr_start.to_i
|
|
5043
|
+
end_minute = ((model_occ_hr_start % 1) * 60).to_i
|
|
5044
|
+
else
|
|
5045
|
+
OpenStudio.logFree(OpenStudio::Warn, 'openstudio.Model.Model', "Unsupported radiant availability preset '#{radiant_availability_type}'. Defaulting to all day operation.")
|
|
5046
|
+
start_hour = 24
|
|
5047
|
+
start_minute = 0
|
|
5048
|
+
end_hour = 24
|
|
5049
|
+
end_minute = 0
|
|
5050
|
+
end
|
|
5051
|
+
end
|
|
4763
5052
|
|
|
5053
|
+
# create custom availability schedule for radiant loop
|
|
5054
|
+
if radiant_lockout
|
|
4764
5055
|
start_hour = radiant_lockout_start_time.to_i
|
|
4765
5056
|
start_minute = ((radiant_lockout_start_time % 1) * 60).to_i
|
|
4766
5057
|
end_hour = radiant_lockout_end_time.to_i
|
|
4767
5058
|
end_minute = ((radiant_lockout_end_time % 1) * 60).to_i
|
|
5059
|
+
end
|
|
4768
5060
|
|
|
4769
|
-
|
|
4770
|
-
|
|
4771
|
-
|
|
4772
|
-
|
|
4773
|
-
|
|
4774
|
-
|
|
4775
|
-
|
|
4776
|
-
|
|
4777
|
-
|
|
4778
|
-
radiant_avail_sch.defaultDaySchedule.addValue(OpenStudio::Time.new(0, 24, 0, 0), 1.0)
|
|
4779
|
-
end
|
|
5061
|
+
# create availability schedules
|
|
5062
|
+
if end_hour > start_hour
|
|
5063
|
+
radiant_avail_sch.defaultDaySchedule.addValue(OpenStudio::Time.new(0, start_hour, start_minute, 0), 1.0)
|
|
5064
|
+
radiant_avail_sch.defaultDaySchedule.addValue(OpenStudio::Time.new(0, end_hour, end_minute, 0), 0.0)
|
|
5065
|
+
radiant_avail_sch.defaultDaySchedule.addValue(OpenStudio::Time.new(0, 24, 0, 0), 1.0) if end_hour < 24
|
|
5066
|
+
elsif start_hour > end_hour
|
|
5067
|
+
radiant_avail_sch.defaultDaySchedule.addValue(OpenStudio::Time.new(0, end_hour, end_minute, 0), 0.0)
|
|
5068
|
+
radiant_avail_sch.defaultDaySchedule.addValue(OpenStudio::Time.new(0, start_hour, start_minute, 0), 1.0)
|
|
5069
|
+
radiant_avail_sch.defaultDaySchedule.addValue(OpenStudio::Time.new(0, 24, 0, 0), 0.0) if start_hour < 24
|
|
4780
5070
|
else
|
|
4781
|
-
radiant_avail_sch
|
|
5071
|
+
radiant_avail_sch.defaultDaySchedule.addValue(OpenStudio::Time.new(0, 24, 0, 0), 1.0)
|
|
5072
|
+
end
|
|
5073
|
+
|
|
5074
|
+
# convert to a two-pipe system if required
|
|
5075
|
+
if two_pipe_system
|
|
5076
|
+
model_two_pipe_loop(model, hot_water_loop, chilled_water_loop,
|
|
5077
|
+
control_strategy: two_pipe_control_strategy,
|
|
5078
|
+
lockout_temperature: two_pipe_lockout_temperature,
|
|
5079
|
+
thermal_zones: thermal_zones)
|
|
5080
|
+
end
|
|
5081
|
+
|
|
5082
|
+
# add supply water temperature control if enabled
|
|
5083
|
+
if plant_supply_water_temperature_control
|
|
5084
|
+
# add supply water temperature for heating plant loop
|
|
5085
|
+
model_add_plant_supply_water_temperature_control(model, hot_water_loop,
|
|
5086
|
+
control_strategy: plant_supply_water_temperature_control_strategy,
|
|
5087
|
+
sp_at_oat_low: hwsp_at_oat_low,
|
|
5088
|
+
oat_low: hw_oat_low,
|
|
5089
|
+
sp_at_oat_high: hwsp_at_oat_high,
|
|
5090
|
+
oat_high: hw_oat_high,
|
|
5091
|
+
thermal_zones: thermal_zones)
|
|
5092
|
+
|
|
5093
|
+
# add supply water temperature for cooling plant loop
|
|
5094
|
+
model_add_plant_supply_water_temperature_control(model, chilled_water_loop,
|
|
5095
|
+
control_strategy: plant_supply_water_temperature_control_strategy,
|
|
5096
|
+
sp_at_oat_low: chwsp_at_oat_low,
|
|
5097
|
+
oat_low: chw_oat_low,
|
|
5098
|
+
sp_at_oat_high: chwsp_at_oat_high,
|
|
5099
|
+
oat_high: chw_oat_high,
|
|
5100
|
+
thermal_zones: thermal_zones)
|
|
4782
5101
|
end
|
|
4783
5102
|
|
|
4784
5103
|
# make a low temperature radiant loop for each zone
|
|
@@ -4824,6 +5143,10 @@ class Standard
|
|
|
4824
5143
|
surface.setConstruction(radiant_exterior_slab_construction)
|
|
4825
5144
|
else # interior floor
|
|
4826
5145
|
surface.setConstruction(radiant_interior_floor_slab_construction)
|
|
5146
|
+
|
|
5147
|
+
# also assign construciton to adjacent surface
|
|
5148
|
+
adjacent_surface = surface.adjacentSurface.get
|
|
5149
|
+
adjacent_surface.setConstruction(rev_radiant_interior_floor_slab_construction)
|
|
4827
5150
|
end
|
|
4828
5151
|
end
|
|
4829
5152
|
elsif radiant_type == 'ceiling'
|
|
@@ -4832,6 +5155,10 @@ class Standard
|
|
|
4832
5155
|
surface.setConstruction(radiant_ceiling_slab_construction)
|
|
4833
5156
|
else # interior ceiling
|
|
4834
5157
|
surface.setConstruction(radiant_interior_ceiling_slab_construction)
|
|
5158
|
+
|
|
5159
|
+
# also assign construciton to adjacent surface
|
|
5160
|
+
adjacent_surface = surface.adjacentSurface.get
|
|
5161
|
+
adjacent_surface.setConstruction(rev_radiant_interior_ceiling_slab_construction)
|
|
4835
5162
|
end
|
|
4836
5163
|
end
|
|
4837
5164
|
end
|
|
@@ -4854,8 +5181,11 @@ class Standard
|
|
|
4854
5181
|
radiant_loop.setNumberofCircuits('CalculateFromCircuitLength')
|
|
4855
5182
|
radiant_loop.setCircuitLength(106.7)
|
|
4856
5183
|
|
|
4857
|
-
# radiant loop controls
|
|
4858
|
-
radiant_loop.setTemperatureControlType(
|
|
5184
|
+
# radiant loop temperature controls
|
|
5185
|
+
radiant_loop.setTemperatureControlType(radiant_temperature_control_type)
|
|
5186
|
+
|
|
5187
|
+
# radiant loop setpoint temperature response
|
|
5188
|
+
radiant_loop.setSetpointControlType(radiant_setpoint_control_type)
|
|
4859
5189
|
radiant_loop.addToThermalZone(zone)
|
|
4860
5190
|
radiant_loops << radiant_loop
|
|
4861
5191
|
|
|
@@ -4863,19 +5193,41 @@ class Standard
|
|
|
4863
5193
|
rename_plant_loop_nodes(model)
|
|
4864
5194
|
|
|
4865
5195
|
# set radiant loop controls
|
|
4866
|
-
|
|
5196
|
+
case control_strategy.downcase
|
|
5197
|
+
when 'proportional_control'
|
|
5198
|
+
# slab setpoint varies based on previous day zone conditions
|
|
4867
5199
|
model_add_radiant_proportional_controls(model, zone, radiant_loop,
|
|
4868
|
-
|
|
5200
|
+
radiant_temperature_control_type: radiant_temperature_control_type,
|
|
5201
|
+
use_zone_occupancy_for_control: use_zone_occupancy_for_control,
|
|
5202
|
+
occupied_percentage_threshold: occupied_percentage_threshold,
|
|
4869
5203
|
model_occ_hr_start: model_occ_hr_start,
|
|
4870
5204
|
model_occ_hr_end: model_occ_hr_end,
|
|
4871
5205
|
proportional_gain: proportional_gain,
|
|
4872
|
-
minimum_operation: minimum_operation,
|
|
4873
|
-
weekend_temperature_reset: weekend_temperature_reset,
|
|
4874
|
-
early_reset_out_arg: early_reset_out_arg,
|
|
4875
5206
|
switch_over_time: switch_over_time)
|
|
5207
|
+
when 'oa_based_control'
|
|
5208
|
+
# slab setpoint varies based on outdoor weather
|
|
5209
|
+
model_add_radiant_basic_controls(model, zone, radiant_loop,
|
|
5210
|
+
radiant_temperature_control_type: radiant_temperature_control_type,
|
|
5211
|
+
slab_setpoint_oa_control: true,
|
|
5212
|
+
switch_over_time: switch_over_time,
|
|
5213
|
+
slab_sp_at_oat_low: slab_sp_at_oat_low,
|
|
5214
|
+
slab_oat_low: slab_oat_low,
|
|
5215
|
+
slab_sp_at_oat_high: slab_sp_at_oat_high,
|
|
5216
|
+
slab_oat_high: slab_oat_high)
|
|
5217
|
+
when 'constant_control'
|
|
5218
|
+
# constant slab setpoint control
|
|
5219
|
+
model_add_radiant_basic_controls(model, zone, radiant_loop,
|
|
5220
|
+
radiant_temperature_control_type: radiant_temperature_control_type,
|
|
5221
|
+
slab_setpoint_oa_control: false,
|
|
5222
|
+
switch_over_time: switch_over_time,
|
|
5223
|
+
slab_sp_at_oat_low: slab_sp_at_oat_low,
|
|
5224
|
+
slab_oat_low: slab_oat_low,
|
|
5225
|
+
slab_sp_at_oat_high: slab_sp_at_oat_high,
|
|
5226
|
+
slab_oat_high: slab_oat_high)
|
|
5227
|
+
else
|
|
5228
|
+
# 'none'; use energyplus default controls
|
|
4876
5229
|
end
|
|
4877
5230
|
end
|
|
4878
|
-
|
|
4879
5231
|
return radiant_loops
|
|
4880
5232
|
end
|
|
4881
5233
|
|
|
@@ -4939,9 +5291,9 @@ class Standard
|
|
|
4939
5291
|
#
|
|
4940
5292
|
# @param model [OpenStudio::Model::Model] OpenStudio model object
|
|
4941
5293
|
# @param thermal_zones [Array<OpenStudio::Model::ThermalZone>] array of zones to add fan coil units to.
|
|
4942
|
-
# @param heating [
|
|
4943
|
-
# @param cooling [
|
|
4944
|
-
# @param ventilation [
|
|
5294
|
+
# @param heating [Boolean] if true, the unit will include a NaturalGas heating coil
|
|
5295
|
+
# @param cooling [Boolean] if true, the unit will include a DX cooling coil
|
|
5296
|
+
# @param ventilation [Boolean] if true, the unit will include an OA intake
|
|
4945
5297
|
# @return [Array<OpenStudio::Model::AirLoopHVAC>] and array of air loops representing the furnaces
|
|
4946
5298
|
def model_add_furnace_central_ac(model,
|
|
4947
5299
|
thermal_zones,
|
|
@@ -5070,9 +5422,9 @@ class Standard
|
|
|
5070
5422
|
#
|
|
5071
5423
|
# @param model [OpenStudio::Model::Model] OpenStudio model object
|
|
5072
5424
|
# @param thermal_zones [Array<OpenStudio::Model::ThermalZone>] array of zones to add fan coil units to.
|
|
5073
|
-
# @param heating [
|
|
5074
|
-
# @param cooling [
|
|
5075
|
-
# @param ventilation [
|
|
5425
|
+
# @param heating [Boolean] if true, the unit will include a NaturalGas heating coil
|
|
5426
|
+
# @param cooling [Boolean] if true, the unit will include a DX cooling coil
|
|
5427
|
+
# @param ventilation [Boolean] if true, the unit will include an OA intake
|
|
5076
5428
|
# @return [Array<OpenStudio::Model::AirLoopHVAC>] and array of air loops representing the heat pumps
|
|
5077
5429
|
def model_add_central_air_source_heat_pump(model,
|
|
5078
5430
|
thermal_zones,
|
|
@@ -5211,7 +5563,7 @@ class Standard
|
|
|
5211
5563
|
# @param model [OpenStudio::Model::Model] OpenStudio model object
|
|
5212
5564
|
# @param thermal_zones [Array<OpenStudio::Model::ThermalZone>] array of zones served by heat pumps
|
|
5213
5565
|
# @param condenser_loop [OpenStudio::Model::PlantLoop] the condenser loop for the heat pumps #
|
|
5214
|
-
# @param ventilation [
|
|
5566
|
+
# @param ventilation [Boolean] if true, ventilation will be supplied through the unit.
|
|
5215
5567
|
# If false, no ventilation will be supplied through the unit, with the expectation that it will be provided by a DOAS or separate system.
|
|
5216
5568
|
# @return [Array<OpenStudio::Model::ZoneHVACWaterToAirHeatPump>] an array of heat pumps
|
|
5217
5569
|
def model_add_water_source_hp(model,
|
|
@@ -5712,10 +6064,315 @@ class Standard
|
|
|
5712
6064
|
return fan_type
|
|
5713
6065
|
end
|
|
5714
6066
|
|
|
6067
|
+
# Adds supply water temperature control on specified plant water loops.
|
|
6068
|
+
#
|
|
6069
|
+
# @param model [OpenStudio::Model::Model] OpenStudio model object
|
|
6070
|
+
# @param plant_water_loop [OpenStudio::Model::PlantLoop] plant water loop to add supply water temperature control.
|
|
6071
|
+
# @param control_strategy [String] Method to determine how to control the plant's supply water temperature (swt).
|
|
6072
|
+
# 'outdoor_air' - The plant's swt will be proportional to the outdoor air based on the next 4 parameters.
|
|
6073
|
+
# 'zone_demand' - The plant's swt will be determined by preponderance of zone demand.
|
|
6074
|
+
# Requires thermal_zone defined.
|
|
6075
|
+
# @param sp_at_oat_low [Double] supply water temperature setpoint, in F, at the outdoor low temperature.
|
|
6076
|
+
# @param oat_low [Double] outdoor drybulb air temperature, in F, for low setpoint.
|
|
6077
|
+
# @param sp_at_oat_high [Double] supply water temperature setpoint, in F, at the outdoor high temperature.
|
|
6078
|
+
# @param oat_high [Double] outdoor drybulb air temperature, in F, for high setpoint.
|
|
6079
|
+
# @param thermal_zones [Array<OpenStudio::Model::ThermalZone>] array of zones
|
|
6080
|
+
def model_add_plant_supply_water_temperature_control(model, plant_water_loop,
|
|
6081
|
+
control_strategy: 'outdoor_air',
|
|
6082
|
+
sp_at_oat_low: nil,
|
|
6083
|
+
oat_low: nil,
|
|
6084
|
+
sp_at_oat_high: nil,
|
|
6085
|
+
oat_high: nil,
|
|
6086
|
+
thermal_zones: [])
|
|
6087
|
+
|
|
6088
|
+
# check that all required temperature parameters are defined
|
|
6089
|
+
if sp_at_oat_low.nil? && oat_low.nil? && sp_at_oat_high.nil? && oat_high.nil?
|
|
6090
|
+
OpenStudio.logFree(OpenStudio::Error, 'openstudio.model.Model', 'At least one of the required temperature parameter is nil.')
|
|
6091
|
+
end
|
|
6092
|
+
|
|
6093
|
+
# remove any existing setpoint manager on the plant water loop
|
|
6094
|
+
exisiting_setpoint_managers = plant_water_loop.loopTemperatureSetpointNode.setpointManagers
|
|
6095
|
+
exisiting_setpoint_managers.each(&:disconnect)
|
|
6096
|
+
|
|
6097
|
+
if control_strategy == 'outdoor_air'
|
|
6098
|
+
# create supply water temperature setpoint managers for plant based on outdoor temperature
|
|
6099
|
+
water_loop_setpoint_manager = OpenStudio::Model::SetpointManagerOutdoorAirReset.new(model)
|
|
6100
|
+
water_loop_setpoint_manager.setName("#{plant_water_loop.name.get} Supply Water Temperature Control")
|
|
6101
|
+
water_loop_setpoint_manager.setControlVariable('Temperature')
|
|
6102
|
+
water_loop_setpoint_manager.setSetpointatOutdoorLowTemperature(OpenStudio.convert(sp_at_oat_low, 'F', 'C').get)
|
|
6103
|
+
water_loop_setpoint_manager.setOutdoorLowTemperature(OpenStudio.convert(oat_low, 'F', 'C').get)
|
|
6104
|
+
water_loop_setpoint_manager.setSetpointatOutdoorHighTemperature(OpenStudio.convert(sp_at_oat_high, 'F', 'C').get)
|
|
6105
|
+
water_loop_setpoint_manager.setOutdoorHighTemperature(OpenStudio.convert(oat_high, 'F', 'C').get)
|
|
6106
|
+
water_loop_setpoint_manager.addToNode(plant_water_loop.loopTemperatureSetpointNode)
|
|
6107
|
+
else
|
|
6108
|
+
# create supply water temperature setpoint managers for plant based on zone heating and cooling demand
|
|
6109
|
+
# check if zone heat and cool requests program exists, if not create it
|
|
6110
|
+
determine_zone_cooling_needs_prg = model.getEnergyManagementSystemProgramByName('Determine_Zone_Cooling_Needs')
|
|
6111
|
+
determine_zone_heating_needs_prg = model.getEnergyManagementSystemProgramByName('Determine_Zone_Heating_Needs')
|
|
6112
|
+
unless determine_zone_cooling_needs_prg.is_initialized && determine_zone_heating_needs_prg.is_initialized
|
|
6113
|
+
model_add_zone_heat_cool_request_count_program(model, thermal_zones)
|
|
6114
|
+
end
|
|
6115
|
+
|
|
6116
|
+
plant_water_loop_name = ems_friendly_name(plant_water_loop.name)
|
|
6117
|
+
|
|
6118
|
+
if plant_water_loop.componentType.valueName == 'Heating'
|
|
6119
|
+
swt_upper_limit = sp_at_oat_low.nil? ? OpenStudio.convert(120, 'F', 'C').get : OpenStudio.convert(sp_at_oat_low, 'F', 'C').get
|
|
6120
|
+
swt_lower_limit = sp_at_oat_high.nil? ? OpenStudio.convert(80, 'F', 'C').get : OpenStudio.convert(sp_at_oat_high, 'F', 'C').get
|
|
6121
|
+
swt_init = OpenStudio.convert(100, 'F', 'C').get
|
|
6122
|
+
zone_demand_var = 'Zone_Heating_Ratio'
|
|
6123
|
+
swt_inc_condition_var = '> 0.70'
|
|
6124
|
+
swt_dec_condition_var = '< 0.30'
|
|
6125
|
+
else
|
|
6126
|
+
swt_upper_limit = sp_at_oat_low.nil? ? OpenStudio.convert(70, 'F', 'C').get : OpenStudio.convert(sp_at_oat_low, 'F', 'C').get
|
|
6127
|
+
swt_lower_limit = sp_at_oat_high.nil? ? OpenStudio.convert(55, 'F', 'C').get : OpenStudio.convert(sp_at_oat_high, 'F', 'C').get
|
|
6128
|
+
swt_init = OpenStudio.convert(62, 'F', 'C').get
|
|
6129
|
+
zone_demand_var = 'Zone_Cooling_Ratio'
|
|
6130
|
+
swt_inc_condition_var = '< 0.30'
|
|
6131
|
+
swt_dec_condition_var = '> 0.70'
|
|
6132
|
+
end
|
|
6133
|
+
|
|
6134
|
+
# plant loop supply water control actuator
|
|
6135
|
+
sch_plant_swt_ctrl = model_add_constant_schedule_ruleset(model,
|
|
6136
|
+
swt_init,
|
|
6137
|
+
name = "#{plant_water_loop_name}_Sch_Supply_Water_Temperature")
|
|
6138
|
+
|
|
6139
|
+
cmd_plant_water_ctrl = OpenStudio::Model::EnergyManagementSystemActuator.new(sch_plant_swt_ctrl,
|
|
6140
|
+
'Schedule:Year',
|
|
6141
|
+
'Schedule Value')
|
|
6142
|
+
cmd_plant_water_ctrl.setName("#{plant_water_loop_name}_supply_water_ctrl")
|
|
6143
|
+
|
|
6144
|
+
# create plant loop setpoint manager
|
|
6145
|
+
water_loop_setpoint_manager = OpenStudio::Model::SetpointManagerScheduled.new(model,
|
|
6146
|
+
sch_plant_swt_ctrl)
|
|
6147
|
+
water_loop_setpoint_manager.setName("#{plant_water_loop.name.get} Supply Water Temperature Control")
|
|
6148
|
+
water_loop_setpoint_manager.setControlVariable('Temperature')
|
|
6149
|
+
water_loop_setpoint_manager.addToNode(plant_water_loop.loopTemperatureSetpointNode)
|
|
6150
|
+
|
|
6151
|
+
# add uninitialized variables into constant program
|
|
6152
|
+
set_constant_values_prg_body = <<-EMS
|
|
6153
|
+
SET #{plant_water_loop_name}_supply_water_ctrl = #{swt_init}
|
|
6154
|
+
EMS
|
|
6155
|
+
|
|
6156
|
+
set_constant_values_prg = model.getEnergyManagementSystemProgramByName('Set_Plant_Constant_Values')
|
|
6157
|
+
if set_constant_values_prg.is_initialized
|
|
6158
|
+
set_constant_values_prg = set_constant_values_prg.get
|
|
6159
|
+
set_constant_values_prg.addLine(set_constant_values_prg_body)
|
|
6160
|
+
else
|
|
6161
|
+
set_constant_values_prg = OpenStudio::Model::EnergyManagementSystemProgram.new(model)
|
|
6162
|
+
set_constant_values_prg.setName('Set_Plant_Constant_Values')
|
|
6163
|
+
set_constant_values_prg.setBody(set_constant_values_prg_body)
|
|
6164
|
+
end
|
|
6165
|
+
|
|
6166
|
+
# program for supply water temperature control in the plot
|
|
6167
|
+
determine_plant_swt_prg = OpenStudio::Model::EnergyManagementSystemProgram.new(model)
|
|
6168
|
+
determine_plant_swt_prg.setName("Determine_#{plant_water_loop_name}_Supply_Water_Temperature")
|
|
6169
|
+
determine_plant_swt_prg_body = <<-EMS
|
|
6170
|
+
SET SWT_Increase = 1,
|
|
6171
|
+
SET SWT_Decrease = 1,
|
|
6172
|
+
SET SWT_upper_limit = #{swt_upper_limit},
|
|
6173
|
+
SET SWT_lower_limit = #{swt_lower_limit},
|
|
6174
|
+
IF #{zone_demand_var} #{swt_inc_condition_var} && (@Mod CurrentTime 1) == 0,
|
|
6175
|
+
SET #{plant_water_loop_name}_supply_water_ctrl = #{plant_water_loop_name}_supply_water_ctrl + SWT_Increase,
|
|
6176
|
+
ELSEIF #{zone_demand_var} #{swt_dec_condition_var} && (@Mod CurrentTime 1) == 0,
|
|
6177
|
+
SET #{plant_water_loop_name}_supply_water_ctrl = #{plant_water_loop_name}_supply_water_ctrl - SWT_Decrease,
|
|
6178
|
+
ELSE,
|
|
6179
|
+
SET #{plant_water_loop_name}_supply_water_ctrl = #{plant_water_loop_name}_supply_water_ctrl,
|
|
6180
|
+
ENDIF,
|
|
6181
|
+
IF #{plant_water_loop_name}_supply_water_ctrl > SWT_upper_limit,
|
|
6182
|
+
SET #{plant_water_loop_name}_supply_water_ctrl = SWT_upper_limit
|
|
6183
|
+
ENDIF,
|
|
6184
|
+
IF #{plant_water_loop_name}_supply_water_ctrl < SWT_lower_limit,
|
|
6185
|
+
SET #{plant_water_loop_name}_supply_water_ctrl = SWT_lower_limit
|
|
6186
|
+
ENDIF
|
|
6187
|
+
EMS
|
|
6188
|
+
determine_plant_swt_prg.setBody(determine_plant_swt_prg_body)
|
|
6189
|
+
|
|
6190
|
+
# create EMS program manager objects
|
|
6191
|
+
programs_at_beginning_of_timestep = OpenStudio::Model::EnergyManagementSystemProgramCallingManager.new(model)
|
|
6192
|
+
programs_at_beginning_of_timestep.setName("#{plant_water_loop_name}_Demand_Based_Supply_Water_Temperature_At_Beginning_Of_Timestep")
|
|
6193
|
+
programs_at_beginning_of_timestep.setCallingPoint('BeginTimestepBeforePredictor')
|
|
6194
|
+
programs_at_beginning_of_timestep.addProgram(determine_plant_swt_prg)
|
|
6195
|
+
|
|
6196
|
+
initialize_constant_parameters = model.getEnergyManagementSystemProgramCallingManagerByName('Initialize_Constant_Parameters')
|
|
6197
|
+
if initialize_constant_parameters.is_initialized
|
|
6198
|
+
initialize_constant_parameters = initialize_constant_parameters.get
|
|
6199
|
+
# add program if it does not exist in manager
|
|
6200
|
+
existing_program_names = initialize_constant_parameters.programs.collect { |prg| prg.name.get.downcase }
|
|
6201
|
+
unless existing_program_names.include? set_constant_values_prg.name.get.downcase
|
|
6202
|
+
initialize_constant_parameters.addProgram(set_constant_values_prg)
|
|
6203
|
+
end
|
|
6204
|
+
else
|
|
6205
|
+
initialize_constant_parameters = OpenStudio::Model::EnergyManagementSystemProgramCallingManager.new(model)
|
|
6206
|
+
initialize_constant_parameters.setName('Initialize_Constant_Parameters')
|
|
6207
|
+
initialize_constant_parameters.setCallingPoint('BeginNewEnvironment')
|
|
6208
|
+
initialize_constant_parameters.addProgram(set_constant_values_prg)
|
|
6209
|
+
end
|
|
6210
|
+
|
|
6211
|
+
initialize_constant_parameters_after_warmup = model.getEnergyManagementSystemProgramCallingManagerByName('Initialize_Constant_Parameters_After_Warmup')
|
|
6212
|
+
if initialize_constant_parameters_after_warmup.is_initialized
|
|
6213
|
+
initialize_constant_parameters_after_warmup = initialize_constant_parameters_after_warmup.get
|
|
6214
|
+
# add program if it does not exist in manager
|
|
6215
|
+
existing_program_names = initialize_constant_parameters_after_warmup.programs.collect { |prg| prg.name.get.downcase }
|
|
6216
|
+
unless existing_program_names.include? set_constant_values_prg.name.get.downcase
|
|
6217
|
+
initialize_constant_parameters_after_warmup.addProgram(set_constant_values_prg)
|
|
6218
|
+
end
|
|
6219
|
+
else
|
|
6220
|
+
initialize_constant_parameters_after_warmup = OpenStudio::Model::EnergyManagementSystemProgramCallingManager.new(model)
|
|
6221
|
+
initialize_constant_parameters_after_warmup.setName('Initialize_Constant_Parameters_After_Warmup')
|
|
6222
|
+
initialize_constant_parameters_after_warmup.setCallingPoint('AfterNewEnvironmentWarmUpIsComplete')
|
|
6223
|
+
initialize_constant_parameters_after_warmup.addProgram(set_constant_values_prg)
|
|
6224
|
+
end
|
|
6225
|
+
end
|
|
6226
|
+
end
|
|
6227
|
+
|
|
6228
|
+
# Make EMS program that will compare 'measured' zone air temperatures to thermostats
|
|
6229
|
+
# setpoint to determine if zone needs cooling or heating. Program will output the total
|
|
6230
|
+
# zones needing heating and cooling and the their ratio using the total number of zones.
|
|
6231
|
+
#
|
|
6232
|
+
# @param model [OpenStudio::Model::Model] OpenStudio model object
|
|
6233
|
+
# @param thermal_zones [Array<OpenStudio::Model::ThermalZone>] array of zones to dictate cooling or heating mode of water plant
|
|
6234
|
+
def model_add_zone_heat_cool_request_count_program(model, thermal_zones)
|
|
6235
|
+
# create container schedules to hold number of zones needing heating and cooling
|
|
6236
|
+
sch_zones_needing_heating = model_add_constant_schedule_ruleset(model,
|
|
6237
|
+
0,
|
|
6238
|
+
name = 'Zones Needing Heating Count Schedule',
|
|
6239
|
+
sch_type_limit: 'Dimensionless')
|
|
6240
|
+
|
|
6241
|
+
zone_needing_heating_actuator = OpenStudio::Model::EnergyManagementSystemActuator.new(sch_zones_needing_heating,
|
|
6242
|
+
'Schedule:Year',
|
|
6243
|
+
'Schedule Value')
|
|
6244
|
+
zone_needing_heating_actuator.setName('Zones_Needing_Heating')
|
|
6245
|
+
|
|
6246
|
+
sch_zones_needing_cooling = model_add_constant_schedule_ruleset(model,
|
|
6247
|
+
0,
|
|
6248
|
+
name = 'Zones Needing Cooling Count Schedule',
|
|
6249
|
+
sch_type_limit: 'Dimensionless')
|
|
6250
|
+
|
|
6251
|
+
zone_needing_cooling_actuator = OpenStudio::Model::EnergyManagementSystemActuator.new(sch_zones_needing_cooling,
|
|
6252
|
+
'Schedule:Year',
|
|
6253
|
+
'Schedule Value')
|
|
6254
|
+
zone_needing_cooling_actuator.setName('Zones_Needing_Cooling')
|
|
6255
|
+
|
|
6256
|
+
# create container schedules to hold ratio of zones needing heating and cooling
|
|
6257
|
+
sch_zones_needing_heating_ratio = model_add_constant_schedule_ruleset(model,
|
|
6258
|
+
0,
|
|
6259
|
+
name = 'Zones Needing Heating Ratio Schedule',
|
|
6260
|
+
sch_type_limit: 'Dimensionless')
|
|
6261
|
+
|
|
6262
|
+
zone_needing_heating_ratio_actuator = OpenStudio::Model::EnergyManagementSystemActuator.new(sch_zones_needing_heating_ratio,
|
|
6263
|
+
'Schedule:Year',
|
|
6264
|
+
'Schedule Value')
|
|
6265
|
+
zone_needing_heating_ratio_actuator.setName('Zone_Heating_Ratio')
|
|
6266
|
+
|
|
6267
|
+
sch_zones_needing_cooling_ratio = model_add_constant_schedule_ruleset(model,
|
|
6268
|
+
0,
|
|
6269
|
+
name = 'Zones Needing Cooling Ratio Schedule',
|
|
6270
|
+
sch_type_limit: 'Dimensionless')
|
|
6271
|
+
|
|
6272
|
+
zone_needing_cooling_ratio_actuator = OpenStudio::Model::EnergyManagementSystemActuator.new(sch_zones_needing_cooling_ratio,
|
|
6273
|
+
'Schedule:Year',
|
|
6274
|
+
'Schedule Value')
|
|
6275
|
+
zone_needing_cooling_ratio_actuator.setName('Zone_Cooling_Ratio')
|
|
6276
|
+
|
|
6277
|
+
#####
|
|
6278
|
+
# Create EMS program to check comfort exceedances
|
|
6279
|
+
####
|
|
6280
|
+
|
|
6281
|
+
# initalize inner body for heating and cooling requests programs
|
|
6282
|
+
determine_zone_cooling_needs_prg_inner_body = ''
|
|
6283
|
+
determine_zone_heating_needs_prg_inner_body = ''
|
|
6284
|
+
|
|
6285
|
+
thermal_zones.each do |zone|
|
|
6286
|
+
# get existing 'sensors'
|
|
6287
|
+
exisiting_ems_sensors = model.getEnergyManagementSystemSensors
|
|
6288
|
+
exisiting_ems_sensors_names = exisiting_ems_sensors.collect { |sensor| sensor.name.get + '-' + sensor.outputVariableOrMeterName }
|
|
6289
|
+
|
|
6290
|
+
# Create zone air temperature 'sensor' for the zone.
|
|
6291
|
+
zone_name = ems_friendly_name(zone.name)
|
|
6292
|
+
zone_air_sensor_name = "#{zone_name}_ctrl_temperature"
|
|
6293
|
+
|
|
6294
|
+
unless exisiting_ems_sensors_names.include? zone_air_sensor_name + '-Zone Air Temperature'
|
|
6295
|
+
zone_ctrl_temperature = OpenStudio::Model::EnergyManagementSystemSensor.new(model, 'Zone Air Temperature')
|
|
6296
|
+
zone_ctrl_temperature.setName(zone_air_sensor_name)
|
|
6297
|
+
zone_ctrl_temperature.setKeyName(zone.name.get)
|
|
6298
|
+
end
|
|
6299
|
+
|
|
6300
|
+
# check for zone thermostats
|
|
6301
|
+
zone_thermostat = zone.thermostatSetpointDualSetpoint
|
|
6302
|
+
unless zone_thermostat.is_initialized
|
|
6303
|
+
OpenStudio.logFree(OpenStudio::Error, 'openstudio.model.Model', "Zone #{zone.name} does not have thermostats.")
|
|
6304
|
+
return false
|
|
6305
|
+
end
|
|
6306
|
+
|
|
6307
|
+
zone_thermostat = zone.thermostatSetpointDualSetpoint.get
|
|
6308
|
+
zone_clg_thermostat = zone_thermostat.coolingSetpointTemperatureSchedule.get
|
|
6309
|
+
zone_htg_thermostat = zone_thermostat.heatingSetpointTemperatureSchedule.get
|
|
6310
|
+
|
|
6311
|
+
# create new sensor for zone thermostat if it does not exist already
|
|
6312
|
+
zone_clg_thermostat_sensor_name = "#{zone_name}_upper_comfort_limit"
|
|
6313
|
+
zone_htg_thermostat_sensor_name = "#{zone_name}_lower_comfort_limit"
|
|
6314
|
+
|
|
6315
|
+
unless exisiting_ems_sensors_names.include? zone_clg_thermostat_sensor_name + '-Schedule Value'
|
|
6316
|
+
# Upper comfort limit for the zone. Taken from existing thermostat schedules in the zone.
|
|
6317
|
+
zone_upper_comfort_limit = OpenStudio::Model::EnergyManagementSystemSensor.new(model, 'Schedule Value')
|
|
6318
|
+
zone_upper_comfort_limit.setName(zone_clg_thermostat_sensor_name)
|
|
6319
|
+
zone_upper_comfort_limit.setKeyName(zone_clg_thermostat.name.get)
|
|
6320
|
+
end
|
|
6321
|
+
|
|
6322
|
+
unless exisiting_ems_sensors_names.include? zone_htg_thermostat_sensor_name + '-Schedule Value'
|
|
6323
|
+
# Lower comfort limit for the zone. Taken from existing thermostat schedules in the zone.
|
|
6324
|
+
zone_lower_comfort_limit = OpenStudio::Model::EnergyManagementSystemSensor.new(model, 'Schedule Value')
|
|
6325
|
+
zone_lower_comfort_limit.setName(zone_htg_thermostat_sensor_name)
|
|
6326
|
+
zone_lower_comfort_limit.setKeyName(zone_htg_thermostat.name.get)
|
|
6327
|
+
end
|
|
6328
|
+
|
|
6329
|
+
# create program inner body for determining zone cooling needs
|
|
6330
|
+
if thermal_zones.include? zone
|
|
6331
|
+
determine_zone_cooling_needs_prg_inner_body += "IF #{zone_air_sensor_name} > #{zone_clg_thermostat_sensor_name},
|
|
6332
|
+
SET Zones_Needing_Cooling = Zones_Needing_Cooling + 1,
|
|
6333
|
+
ENDIF,\n"
|
|
6334
|
+
end
|
|
6335
|
+
|
|
6336
|
+
# create program inner body for determining zone cooling needs
|
|
6337
|
+
if thermal_zones.include? zone
|
|
6338
|
+
determine_zone_heating_needs_prg_inner_body += "IF #{zone_air_sensor_name} < #{zone_htg_thermostat_sensor_name},
|
|
6339
|
+
SET Zones_Needing_Heating = Zones_Needing_Heating + 1,
|
|
6340
|
+
ENDIF,\n"
|
|
6341
|
+
end
|
|
6342
|
+
end
|
|
6343
|
+
|
|
6344
|
+
# create program for determining zone cooling needs
|
|
6345
|
+
determine_zone_cooling_needs_prg = OpenStudio::Model::EnergyManagementSystemProgram.new(model)
|
|
6346
|
+
determine_zone_cooling_needs_prg.setName('Determine_Zone_Cooling_Needs')
|
|
6347
|
+
determine_zone_cooling_needs_prg_body =
|
|
6348
|
+
"SET Zones_Needing_Cooling = 0,
|
|
6349
|
+
#{determine_zone_cooling_needs_prg_inner_body}
|
|
6350
|
+
SET Total_Zones = #{thermal_zones.length},
|
|
6351
|
+
SET Zone_Cooling_Ratio = Zones_Needing_Cooling/Total_Zones"
|
|
6352
|
+
determine_zone_cooling_needs_prg.setBody(determine_zone_cooling_needs_prg_body)
|
|
6353
|
+
|
|
6354
|
+
# create program for determining zone heating needs
|
|
6355
|
+
determine_zone_heating_needs_prg = OpenStudio::Model::EnergyManagementSystemProgram.new(model)
|
|
6356
|
+
determine_zone_heating_needs_prg.setName('Determine_Zone_Heating_Needs')
|
|
6357
|
+
determine_zone_heating_needs_prg_body =
|
|
6358
|
+
"SET Zones_Needing_Heating = 0,
|
|
6359
|
+
#{determine_zone_heating_needs_prg_inner_body}
|
|
6360
|
+
SET Total_Zones = #{thermal_zones.length},
|
|
6361
|
+
SET Zone_Heating_Ratio = Zones_Needing_Heating/Total_Zones"
|
|
6362
|
+
determine_zone_heating_needs_prg.setBody(determine_zone_heating_needs_prg_body)
|
|
6363
|
+
|
|
6364
|
+
# create EMS program manager objects
|
|
6365
|
+
programs_at_beginning_of_timestep = OpenStudio::Model::EnergyManagementSystemProgramCallingManager.new(model)
|
|
6366
|
+
programs_at_beginning_of_timestep.setName('Heating_Cooling_Request_Programs_At_End_Of_Timestep')
|
|
6367
|
+
programs_at_beginning_of_timestep.setCallingPoint('EndOfZoneTimestepAfterZoneReporting')
|
|
6368
|
+
programs_at_beginning_of_timestep.addProgram(determine_zone_cooling_needs_prg)
|
|
6369
|
+
programs_at_beginning_of_timestep.addProgram(determine_zone_heating_needs_prg)
|
|
6370
|
+
end
|
|
6371
|
+
|
|
5715
6372
|
# Adds a waterside economizer to the chilled water and condenser loop
|
|
5716
6373
|
#
|
|
5717
6374
|
# @param model [OpenStudio::Model::Model] OpenStudio model object
|
|
5718
|
-
# @param integrated [
|
|
6375
|
+
# @param integrated [Boolean] when set to true, models an integrated waterside economizer
|
|
5719
6376
|
# Integrated: in series with chillers, can run simultaneously with chillers
|
|
5720
6377
|
# Non-Integrated: in parallel with chillers, chillers locked out during operation
|
|
5721
6378
|
def model_add_waterside_economizer(model, chilled_water_loop, condenser_water_loop,
|
|
@@ -5864,7 +6521,7 @@ class Standard
|
|
|
5864
6521
|
# Get the existing hot water loop in the model or add a new one if there isn't one already.
|
|
5865
6522
|
#
|
|
5866
6523
|
# @param model [OpenStudio::Model::Model] OpenStudio model object
|
|
5867
|
-
# @param heat_fuel [String] the heating fuel. Valid choices are NaturalGas, Electricity, DistrictHeating
|
|
6524
|
+
# @param heat_fuel [String] the heating fuel. Valid choices are NaturalGas, Electricity, DistrictHeating, DistrictHeatingWater, DistrictHeatingSteam
|
|
5868
6525
|
# @param hot_water_loop_type [String] Archetype for hot water loops
|
|
5869
6526
|
# HighTemperature (180F supply) or LowTemperature (120F supply)
|
|
5870
6527
|
def model_get_or_add_hot_water_loop(model, heat_fuel,
|
|
@@ -5936,7 +6593,7 @@ class Standard
|
|
|
5936
6593
|
# Get the existing heat pump loop in the model or add a new one if there isn't one already.
|
|
5937
6594
|
#
|
|
5938
6595
|
# @param model [OpenStudio::Model::Model] OpenStudio model object
|
|
5939
|
-
# @param heat_fuel [String] the heating fuel. Valid choices are NaturalGas, Electricity, DistrictHeating
|
|
6596
|
+
# @param heat_fuel [String] the heating fuel. Valid choices are NaturalGas, Electricity, DistrictHeating, DistrictHeatingWater, DistrictHeatingSteam
|
|
5940
6597
|
# @param cool_fuel [String] the cooling fuel. Valid choices are Electricity and DistrictCooling.
|
|
5941
6598
|
# @param heat_pump_loop_cooling_type [String] the type of cooling equipment if not DistrictCooling.
|
|
5942
6599
|
# Valid options are:
|
|
@@ -5975,12 +6632,12 @@ class Standard
|
|
|
5975
6632
|
# EvaporativeFluidCooler, EvaporativeFluidCoolerSingleSpeed, EvaporativeFluidCoolerTwoSpeed
|
|
5976
6633
|
# @param air_loop_heating_type [String] type of heating coil serving main air loop, options are Gas, DX, or Water
|
|
5977
6634
|
# @param air_loop_cooling_type [String] type of cooling coil serving main air loop, options are DX or Water
|
|
5978
|
-
# @param zone_equipment_ventilation [
|
|
6635
|
+
# @param zone_equipment_ventilation [Boolean] toggle whether to include outdoor air ventilation on zone equipment
|
|
5979
6636
|
# including as fan coil units, VRF terminals, or water source heat pumps.
|
|
5980
6637
|
# @param fan_coil_capacity_control_method [String] Only applicable to Fan Coil system type.
|
|
5981
6638
|
# Capacity control method for the fan coil. Options are ConstantFanVariableFlow, CyclingFan, VariableFanVariableFlow,
|
|
5982
6639
|
# and VariableFanConstantFlow. If VariableFan, the fan will be VariableVolume.
|
|
5983
|
-
# @return [
|
|
6640
|
+
# @return [Boolean] returns true if successful, false if not
|
|
5984
6641
|
def model_add_hvac_system(model,
|
|
5985
6642
|
system_type,
|
|
5986
6643
|
main_heat_fuel,
|
|
@@ -6010,7 +6667,7 @@ class Standard
|
|
|
6010
6667
|
case system_type
|
|
6011
6668
|
when 'PTAC'
|
|
6012
6669
|
case main_heat_fuel
|
|
6013
|
-
when 'NaturalGas', 'DistrictHeating'
|
|
6670
|
+
when 'NaturalGas', 'DistrictHeating', 'DistrictHeatingWater', 'DistrictHeatingSteam'
|
|
6014
6671
|
heating_type = 'Water'
|
|
6015
6672
|
hot_water_loop = model_get_or_add_hot_water_loop(model, main_heat_fuel,
|
|
6016
6673
|
hot_water_loop_type: hot_water_loop_type)
|
|
@@ -6052,7 +6709,7 @@ class Standard
|
|
|
6052
6709
|
else
|
|
6053
6710
|
hot_water_loop = nil
|
|
6054
6711
|
end
|
|
6055
|
-
when 'DistrictHeating'
|
|
6712
|
+
when 'DistrictHeating', 'DistrictHeatingWater', 'DistrictHeatingSteam'
|
|
6056
6713
|
heating_type = 'Water'
|
|
6057
6714
|
supplemental_heating_type = 'Electricity'
|
|
6058
6715
|
hot_water_loop = model_get_or_add_hot_water_loop(model, main_heat_fuel,
|
|
@@ -6121,7 +6778,7 @@ class Standard
|
|
|
6121
6778
|
|
|
6122
6779
|
when 'Fan Coil'
|
|
6123
6780
|
case main_heat_fuel
|
|
6124
|
-
when 'NaturalGas', 'DistrictHeating', 'Electricity'
|
|
6781
|
+
when 'NaturalGas', 'DistrictHeating', 'DistrictHeatingWater', 'DistrictHeatingSteam', 'Electricity'
|
|
6125
6782
|
hot_water_loop = model_get_or_add_hot_water_loop(model, main_heat_fuel,
|
|
6126
6783
|
hot_water_loop_type: hot_water_loop_type)
|
|
6127
6784
|
when 'AirSourceHeatPump'
|
|
@@ -6148,7 +6805,7 @@ class Standard
|
|
|
6148
6805
|
|
|
6149
6806
|
when 'Radiant Slab'
|
|
6150
6807
|
case main_heat_fuel
|
|
6151
|
-
when 'NaturalGas', 'DistrictHeating', 'Electricity'
|
|
6808
|
+
when 'NaturalGas', 'DistrictHeating', 'DistrictHeatingWater', 'DistrictHeatingSteam', 'Electricity'
|
|
6152
6809
|
hot_water_loop = model_get_or_add_hot_water_loop(model, main_heat_fuel,
|
|
6153
6810
|
hot_water_loop_type: hot_water_loop_type)
|
|
6154
6811
|
when 'AirSourceHeatPump'
|
|
@@ -6173,7 +6830,7 @@ class Standard
|
|
|
6173
6830
|
|
|
6174
6831
|
when 'Baseboards'
|
|
6175
6832
|
case main_heat_fuel
|
|
6176
|
-
when 'NaturalGas', 'DistrictHeating'
|
|
6833
|
+
when 'NaturalGas', 'DistrictHeating', 'DistrictHeatingWater', 'DistrictHeatingSteam'
|
|
6177
6834
|
hot_water_loop = model_get_or_add_hot_water_loop(model, main_heat_fuel,
|
|
6178
6835
|
hot_water_loop_type: hot_water_loop_type)
|
|
6179
6836
|
when 'AirSourceHeatPump'
|
|
@@ -6251,7 +6908,7 @@ class Standard
|
|
|
6251
6908
|
|
|
6252
6909
|
when 'VAV Reheat'
|
|
6253
6910
|
case main_heat_fuel
|
|
6254
|
-
when 'NaturalGas', 'Gas', 'HeatPump', 'DistrictHeating'
|
|
6911
|
+
when 'NaturalGas', 'Gas', 'HeatPump', 'DistrictHeating', 'DistrictHeatingWater', 'DistrictHeatingSteam'
|
|
6255
6912
|
heating_type = main_heat_fuel
|
|
6256
6913
|
hot_water_loop = model_get_or_add_hot_water_loop(model, main_heat_fuel,
|
|
6257
6914
|
hot_water_loop_type: hot_water_loop_type)
|
|
@@ -6298,7 +6955,7 @@ class Standard
|
|
|
6298
6955
|
|
|
6299
6956
|
when 'VAV No Reheat'
|
|
6300
6957
|
case main_heat_fuel
|
|
6301
|
-
when 'NaturalGas', 'Gas', 'HeatPump', 'DistrictHeating'
|
|
6958
|
+
when 'NaturalGas', 'Gas', 'HeatPump', 'DistrictHeating', 'DistrictHeatingWater', 'DistrictHeatingSteam'
|
|
6302
6959
|
heating_type = main_heat_fuel
|
|
6303
6960
|
hot_water_loop = model_get_or_add_hot_water_loop(model, main_heat_fuel,
|
|
6304
6961
|
hot_water_loop_type: hot_water_loop_type)
|
|
@@ -6403,7 +7060,7 @@ class Standard
|
|
|
6403
7060
|
fan_pressure_rise: 4.0)
|
|
6404
7061
|
|
|
6405
7062
|
when 'Water Source Heat Pumps'
|
|
6406
|
-
if main_heat_fuel
|
|
7063
|
+
if main_heat_fuel.include?('DistrictHeating') && cool_fuel == 'DistrictCooling'
|
|
6407
7064
|
condenser_loop = model_get_or_add_ambient_water_loop(model)
|
|
6408
7065
|
elsif main_heat_fuel == 'AmbientLoop' && cool_fuel == 'AmbientLoop'
|
|
6409
7066
|
condenser_loop = model_get_or_add_ambient_water_loop(model)
|