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
|
@@ -0,0 +1,141 @@
|
|
|
1
|
+
# Module to apply QAQC checks to a model
|
|
2
|
+
module OpenstudioStandards
|
|
3
|
+
module QAQC
|
|
4
|
+
# @!group QAQC HTML reporting
|
|
5
|
+
|
|
6
|
+
# Cleanup and prepare HTML
|
|
7
|
+
# measures calling this must add the following require calls:
|
|
8
|
+
# require 'json'
|
|
9
|
+
# require 'erb'
|
|
10
|
+
#
|
|
11
|
+
# @param html_in_path [String] HTML input path
|
|
12
|
+
# @param sections [Array] sections from create_sections_from_check_attributes
|
|
13
|
+
# @param name [String] the name that a user will see
|
|
14
|
+
# @return [String] HTML output path
|
|
15
|
+
def self.create_qaqc_html(html_in_path, sections, name)
|
|
16
|
+
# read in template
|
|
17
|
+
if File.exist?(html_in_path)
|
|
18
|
+
html_in_path = html_in_path
|
|
19
|
+
else
|
|
20
|
+
html_in_path = "#{File.dirname(__FILE__)}/report.html.erb"
|
|
21
|
+
end
|
|
22
|
+
html_in = ''
|
|
23
|
+
File.open(html_in_path, 'r') do |file|
|
|
24
|
+
html_in = file.read
|
|
25
|
+
end
|
|
26
|
+
|
|
27
|
+
# configure template with variable values
|
|
28
|
+
# instance variables for erb
|
|
29
|
+
@sections = sections
|
|
30
|
+
@name = name
|
|
31
|
+
renderer = ERB.new(html_in)
|
|
32
|
+
html_out = renderer.result(binding)
|
|
33
|
+
|
|
34
|
+
# write html file
|
|
35
|
+
html_out_path = './report.html'
|
|
36
|
+
File.open(html_out_path, 'w') do |file|
|
|
37
|
+
file << html_out
|
|
38
|
+
# make sure data is written to the disk one way or the other
|
|
39
|
+
begin
|
|
40
|
+
file.fsync
|
|
41
|
+
rescue StandardError
|
|
42
|
+
file.flush
|
|
43
|
+
end
|
|
44
|
+
end
|
|
45
|
+
|
|
46
|
+
return html_out_path
|
|
47
|
+
end
|
|
48
|
+
|
|
49
|
+
# Make HTML sections from a collection of QAQC checks
|
|
50
|
+
#
|
|
51
|
+
# @param check_elems [OpenStudio::AttributeVector.new] vector of check elements
|
|
52
|
+
# @return [Array] Array of HTML sections
|
|
53
|
+
def self.create_sections_from_check_attributes(check_elems)
|
|
54
|
+
# developer notes
|
|
55
|
+
# method below is custom version of standard OpenStudio results methods. It passes an array of sections vs. a single section.
|
|
56
|
+
# It doesn't use the model or SQL file. It just gets data form OpenStudio attributes passed in
|
|
57
|
+
# It doesn't have a name_only section since it doesn't populate user arguments
|
|
58
|
+
|
|
59
|
+
# inspecting check attributes
|
|
60
|
+
# make single table with checks.
|
|
61
|
+
# make second table with flag description (with column for where it came from)
|
|
62
|
+
|
|
63
|
+
# array to hold sections
|
|
64
|
+
sections = []
|
|
65
|
+
|
|
66
|
+
# gather data for section
|
|
67
|
+
qaqc_check_summary = {}
|
|
68
|
+
qaqc_check_summary[:title] = 'List of Checks in Measure'
|
|
69
|
+
qaqc_check_summary[:header] = ['Name', 'Category', 'Flags', 'Description']
|
|
70
|
+
qaqc_check_summary[:data] = []
|
|
71
|
+
qaqc_check_summary[:data_color] = []
|
|
72
|
+
@qaqc_check_section = {}
|
|
73
|
+
@qaqc_check_section[:title] = 'QAQC Check Summary'
|
|
74
|
+
@qaqc_check_section[:tables] = [qaqc_check_summary]
|
|
75
|
+
|
|
76
|
+
# add sections to array
|
|
77
|
+
sections << @qaqc_check_section
|
|
78
|
+
|
|
79
|
+
# counter for flags thrown
|
|
80
|
+
num_flags = 0
|
|
81
|
+
|
|
82
|
+
check_elems.each do |check|
|
|
83
|
+
# gather data for section
|
|
84
|
+
qaqc_flag_details = {}
|
|
85
|
+
qaqc_flag_details[:title] = "List of Flags Triggered for #{check.valueAsAttributeVector.first.valueAsString}."
|
|
86
|
+
qaqc_flag_details[:header] = ['Flag Detail']
|
|
87
|
+
qaqc_flag_details[:data] = []
|
|
88
|
+
@qaqc_flag_section = {}
|
|
89
|
+
@qaqc_flag_section[:title] = check.valueAsAttributeVector.first.valueAsString.to_s
|
|
90
|
+
@qaqc_flag_section[:tables] = [qaqc_flag_details]
|
|
91
|
+
|
|
92
|
+
check_name = nil
|
|
93
|
+
check_cat = nil
|
|
94
|
+
check_desc = nil
|
|
95
|
+
flags = []
|
|
96
|
+
# loop through attributes (name,category,description,then optionally one or more flag attributes)
|
|
97
|
+
check.valueAsAttributeVector.each_with_index do |value, index|
|
|
98
|
+
if index == 0
|
|
99
|
+
check_name = value.valueAsString
|
|
100
|
+
elsif index == 1
|
|
101
|
+
check_cat = value.valueAsString
|
|
102
|
+
elsif index == 2
|
|
103
|
+
check_desc = value.valueAsString
|
|
104
|
+
else # should be flag
|
|
105
|
+
flags << value.valueAsString
|
|
106
|
+
qaqc_flag_details[:data] << [value.valueAsString]
|
|
107
|
+
OpenStudio.logFree(OpenStudio::Warn, 'openstudio.standards.QAQC', "#{check_name} - #{value.valueAsString}")
|
|
108
|
+
num_flags += 1
|
|
109
|
+
end
|
|
110
|
+
end
|
|
111
|
+
|
|
112
|
+
# add row to table for this check
|
|
113
|
+
qaqc_check_summary[:data] << [check_name, check_cat, flags.size, check_desc]
|
|
114
|
+
|
|
115
|
+
# add info message for check if no flags found (this way user still knows what ran)
|
|
116
|
+
if check.valueAsAttributeVector.size < 4
|
|
117
|
+
OpenStudio.logFree(OpenStudio::Info, 'openstudio.standards.QAQC', "#{check_name} - no flags.")
|
|
118
|
+
end
|
|
119
|
+
|
|
120
|
+
# color cells based and add logging messages based on flag status
|
|
121
|
+
if !flags.empty?
|
|
122
|
+
qaqc_check_summary[:data_color] << ['', '', 'indianred', '']
|
|
123
|
+
OpenStudio.logFree(OpenStudio::Info, 'openstudio.standards.QAQC', "#{check_name.downcase.tr(' ', '_')} #{flags.size} flags")
|
|
124
|
+
else
|
|
125
|
+
qaqc_check_summary[:data_color] << ['', '', 'lightgreen', '']
|
|
126
|
+
OpenStudio.logFree(OpenStudio::Info, 'openstudio.standards.QAQC', "#{check_name.downcase.tr(' ', '_')} #{flags.size} flags")
|
|
127
|
+
end
|
|
128
|
+
|
|
129
|
+
# add table for this check if there are flags
|
|
130
|
+
if !qaqc_flag_details[:data].empty?
|
|
131
|
+
sections << @qaqc_flag_section
|
|
132
|
+
end
|
|
133
|
+
end
|
|
134
|
+
|
|
135
|
+
# add total flags registerValue
|
|
136
|
+
OpenStudio.logFree(OpenStudio::Info, 'openstudio.standards.QAQC', "total flags: #{num_flags}")
|
|
137
|
+
|
|
138
|
+
return sections
|
|
139
|
+
end
|
|
140
|
+
end
|
|
141
|
+
end
|
|
@@ -0,0 +1,129 @@
|
|
|
1
|
+
# Module to apply QAQC checks to a model
|
|
2
|
+
module OpenstudioStandards
|
|
3
|
+
module QAQC
|
|
4
|
+
# @!group Schedules
|
|
5
|
+
|
|
6
|
+
# Check that the lighting, equipment, and HVAC setpoint schedules coordinate with the occupancy schedules.
|
|
7
|
+
# This is defined as having start and end times within the specified number of hours away from the occupancy schedule.
|
|
8
|
+
#
|
|
9
|
+
# @param category [String] category to bin this check into
|
|
10
|
+
# @param target_standard [String] standard template, e.g. '90.1-2013'
|
|
11
|
+
# @param max_hrs [Double] threshold for throwing an error for schedule coordination
|
|
12
|
+
# @param name_only [Boolean] If true, only return the name of this check
|
|
13
|
+
# @return [OpenStudio::Attribute] OpenStudio Attribute object containing check results
|
|
14
|
+
def self.check_schedule_coordination(category, target_standard, max_hrs: 2.0, name_only: false)
|
|
15
|
+
# summary of the check
|
|
16
|
+
check_elems = OpenStudio::AttributeVector.new
|
|
17
|
+
check_elems << OpenStudio::Attribute.new('name', 'Schedule Coordination')
|
|
18
|
+
check_elems << OpenStudio::Attribute.new('category', category)
|
|
19
|
+
check_elems << OpenStudio::Attribute.new('description', 'Check that lighting, equipment, and HVAC schedules coordinate with occupancy.')
|
|
20
|
+
|
|
21
|
+
# stop here if only name is requested this is used to populate display name for arguments
|
|
22
|
+
if name_only == true
|
|
23
|
+
results = []
|
|
24
|
+
check_elems.each do |elem|
|
|
25
|
+
results << elem.valueAsString
|
|
26
|
+
end
|
|
27
|
+
return results
|
|
28
|
+
end
|
|
29
|
+
|
|
30
|
+
std = Standard.build(target_standard)
|
|
31
|
+
|
|
32
|
+
begin
|
|
33
|
+
# Convert max hr limit to OpenStudio Time
|
|
34
|
+
max_hrs = OpenStudio::Time.new(0, max_hrs.to_i, 0, 0)
|
|
35
|
+
|
|
36
|
+
# Check schedules in each space
|
|
37
|
+
@model.getSpaces.sort.each do |space|
|
|
38
|
+
# Occupancy, Lighting, and Equipment Schedules
|
|
39
|
+
coord_schs = []
|
|
40
|
+
occ_schs = []
|
|
41
|
+
# Get the space type (optional)
|
|
42
|
+
space_type = space.spaceType
|
|
43
|
+
|
|
44
|
+
# Occupancy
|
|
45
|
+
occs = []
|
|
46
|
+
occs += space.people # From space directly
|
|
47
|
+
occs += space_type.get.people if space_type.is_initialized # Inherited from space type
|
|
48
|
+
occs.each do |occ|
|
|
49
|
+
occ_schs << occ.numberofPeopleSchedule.get if occ.numberofPeopleSchedule.is_initialized
|
|
50
|
+
end
|
|
51
|
+
|
|
52
|
+
# Lights
|
|
53
|
+
lts = []
|
|
54
|
+
lts += space.lights # From space directly
|
|
55
|
+
lts += space_type.get.lights if space_type.is_initialized # Inherited from space type
|
|
56
|
+
lts.each do |lt|
|
|
57
|
+
coord_schs << lt.schedule.get if lt.schedule.is_initialized
|
|
58
|
+
end
|
|
59
|
+
|
|
60
|
+
# Equip
|
|
61
|
+
plugs = []
|
|
62
|
+
plugs += space.electricEquipment # From space directly
|
|
63
|
+
plugs += space_type.get.electricEquipment if space_type.is_initialized # Inherited from space type
|
|
64
|
+
plugs.each do |plug|
|
|
65
|
+
coord_schs << plug.schedule.get if plug.schedule.is_initialized
|
|
66
|
+
end
|
|
67
|
+
|
|
68
|
+
# HVAC Schedule (airloop-served zones only)
|
|
69
|
+
if space.thermalZone.is_initialized
|
|
70
|
+
zone = space.thermalZone.get
|
|
71
|
+
if zone.airLoopHVAC.is_initialized
|
|
72
|
+
coord_schs << zone.airLoopHVAC.get.availabilitySchedule
|
|
73
|
+
end
|
|
74
|
+
end
|
|
75
|
+
|
|
76
|
+
# Cannot check spaces with no occupancy schedule to compare against
|
|
77
|
+
next if occ_schs.empty?
|
|
78
|
+
|
|
79
|
+
# Get start and end occupancy times from the first occupancy schedule
|
|
80
|
+
times = OpenstudioStandards::Schedules.schedule_ruleset_get_start_and_end_times(occ_schs[0])
|
|
81
|
+
occ_start_time = times['start_time']
|
|
82
|
+
occ_end_time = times['end_time']
|
|
83
|
+
|
|
84
|
+
# Cannot check a space where the occupancy start time or end time cannot be determined
|
|
85
|
+
next if occ_start_time.nil? || occ_end_time.nil?
|
|
86
|
+
|
|
87
|
+
# Check all schedules against occupancy
|
|
88
|
+
|
|
89
|
+
# Lights should have a start and end within X hrs of the occupancy start and end
|
|
90
|
+
coord_schs.each do |coord_sch|
|
|
91
|
+
# Get start and end time of load/HVAC schedule
|
|
92
|
+
times = OpenstudioStandards::Schedules.schedule_ruleset_get_start_and_end_times(coord_sch)
|
|
93
|
+
start_time = times['start_time']
|
|
94
|
+
end_time = times['end_time]']
|
|
95
|
+
|
|
96
|
+
if start_time.nil?
|
|
97
|
+
check_elems << OpenStudio::Attribute.new('flag', "Could not determine start time of a schedule called #{coord_sch.name}, cannot determine if schedule coordinates with occupancy schedule.")
|
|
98
|
+
next
|
|
99
|
+
elsif end_time.nil?
|
|
100
|
+
check_elems << OpenStudio::Attribute.new('flag', "Could not determine end time of a schedule called #{coord_sch.name}, cannot determine if schedule coordinates with occupancy schedule.")
|
|
101
|
+
next
|
|
102
|
+
end
|
|
103
|
+
|
|
104
|
+
# Check start time
|
|
105
|
+
if (occ_start_time - start_time) > max_hrs || (start_time - occ_start_time) > max_hrs
|
|
106
|
+
check_elems << OpenStudio::Attribute.new('flag', "The start time of #{coord_sch.name} is #{start_time}, which is more than #{max_hrs} away from the occupancy schedule start time of #{occ_start_time} for #{occ_schs[0].name} in #{space.name}. Schedules do not coordinate.")
|
|
107
|
+
end
|
|
108
|
+
|
|
109
|
+
# Check end time
|
|
110
|
+
if (occ_end_time - end_time) > max_hrs || (end_time - occ_end_time) > max_hrs
|
|
111
|
+
check_elems << OpenStudio::Attribute.new('flag', "The end time of #{coord_sch.name} is #{end_time}, which is more than #{max_hrs} away from the occupancy schedule end time of #{occ_end_time} for #{occ_schs[0].name} in #{space.name}. Schedules do not coordinate.")
|
|
112
|
+
end
|
|
113
|
+
end
|
|
114
|
+
end
|
|
115
|
+
rescue StandardError => e
|
|
116
|
+
# brief description of ruby error
|
|
117
|
+
check_elems << OpenStudio::Attribute.new('flag', "Error prevented QAQC check from running (#{e}).")
|
|
118
|
+
|
|
119
|
+
# backtrace of ruby error for diagnostic use
|
|
120
|
+
if @error_backtrace then check_elems << OpenStudio::Attribute.new('flag', e.backtrace.join("\n").to_s) end
|
|
121
|
+
end
|
|
122
|
+
|
|
123
|
+
# add check_elms to new attribute
|
|
124
|
+
check_elem = OpenStudio::Attribute.new('check', check_elems)
|
|
125
|
+
|
|
126
|
+
return check_elem
|
|
127
|
+
end
|
|
128
|
+
end
|
|
129
|
+
end
|
|
@@ -0,0 +1,273 @@
|
|
|
1
|
+
# Module to apply QAQC checks to a model
|
|
2
|
+
module OpenstudioStandards
|
|
3
|
+
module QAQC
|
|
4
|
+
# @!group Service Water Heating
|
|
5
|
+
|
|
6
|
+
# Checks the hot water use in a model for typical values
|
|
7
|
+
#
|
|
8
|
+
# @param category [String] category to bin this check into
|
|
9
|
+
# @param target_standard [String] standard template, e.g. '90.1-2013'
|
|
10
|
+
# @param min_pass_pct [Double] threshold for throwing an error for percent difference
|
|
11
|
+
# @param max_pass_pct [Double] threshold for throwing an error for percent difference
|
|
12
|
+
# @param name_only [Boolean] If true, only return the name of this check
|
|
13
|
+
# @return [OpenStudio::Attribute] OpenStudio Attribute object containing check results
|
|
14
|
+
def self.check_service_hot_water(category, target_standard, min_pass_pct: 0.25, max_pass_pct: 0.25, name_only: false)
|
|
15
|
+
# @todo could expose meal turnover and people per unit for res and hotel into arguments
|
|
16
|
+
|
|
17
|
+
# summary of the check
|
|
18
|
+
check_elems = OpenStudio::AttributeVector.new
|
|
19
|
+
check_elems << OpenStudio::Attribute.new('name', 'Domestic Hot Water')
|
|
20
|
+
check_elems << OpenStudio::Attribute.new('category', category)
|
|
21
|
+
if target_standard == 'ICC IECC 2015'
|
|
22
|
+
check_elems << OpenStudio::Attribute.new('description', 'Check service water heating consumption against Table R405.5.2(1) in ICC IECC 2015 Residential Provisions.')
|
|
23
|
+
else
|
|
24
|
+
check_elems << OpenStudio::Attribute.new('description', 'Check against the 2011 ASHRAE Handbook - HVAC Applications, Table 7 section 50.14.')
|
|
25
|
+
end
|
|
26
|
+
|
|
27
|
+
# stop here if only name is requested this is used to populate display name for arguments
|
|
28
|
+
if name_only == true
|
|
29
|
+
results = []
|
|
30
|
+
check_elems.each do |elem|
|
|
31
|
+
results << elem.valueAsString
|
|
32
|
+
end
|
|
33
|
+
return results
|
|
34
|
+
end
|
|
35
|
+
|
|
36
|
+
std = Standard.build(target_standard)
|
|
37
|
+
|
|
38
|
+
begin
|
|
39
|
+
# loop through water_use_equipment
|
|
40
|
+
service_water_consumption_daily_avg_gal = 0.0
|
|
41
|
+
@model.getWaterUseEquipments.each do |water_use_equipment|
|
|
42
|
+
# get peak flow rate from def
|
|
43
|
+
peak_flow_rate_si = water_use_equipment.waterUseEquipmentDefinition.peakFlowRate
|
|
44
|
+
source_units = 'm^3/s'
|
|
45
|
+
target_units = 'gal/min'
|
|
46
|
+
peak_flow_rate_ip = OpenStudio.convert(peak_flow_rate_si, source_units, target_units).get
|
|
47
|
+
|
|
48
|
+
# get value from flow rate schedule
|
|
49
|
+
if water_use_equipment.flowRateFractionSchedule.is_initialized
|
|
50
|
+
# get annual equiv for model schedule
|
|
51
|
+
schedule_inst = water_use_equipment.flowRateFractionSchedule.get
|
|
52
|
+
if schedule_inst.to_ScheduleRuleset.is_initialized
|
|
53
|
+
annual_equiv_flow_rate = std.schedule_ruleset_annual_equivalent_full_load_hrs(schedule_inst.to_ScheduleRuleset.get)
|
|
54
|
+
elsif schedule_inst.to_ScheduleConstant.is_initialized
|
|
55
|
+
annual_equiv_flow_rate = std.schedule_constant_annual_equivalent_full_load_hrs(schedule_inst.to_ScheduleConstant.get)
|
|
56
|
+
else
|
|
57
|
+
check_elems << OpenStudio::Attribute.new('flag', "#{schedule_inst.name} isn't a Ruleset or Constant schedule. Can't calculate annual equivalent full load hours.")
|
|
58
|
+
next
|
|
59
|
+
end
|
|
60
|
+
else
|
|
61
|
+
# issue flag
|
|
62
|
+
check_elems << OpenStudio::Attribute.new('flag', "#{water_use_equipment.name} doesn't have a schedule. Can't identify hot water consumption.")
|
|
63
|
+
next
|
|
64
|
+
end
|
|
65
|
+
|
|
66
|
+
# add to global service water consumpiton value
|
|
67
|
+
service_water_consumption_daily_avg_gal += 60.0 * peak_flow_rate_ip * annual_equiv_flow_rate / 365.0
|
|
68
|
+
end
|
|
69
|
+
|
|
70
|
+
if target_standard == 'ICC IECC 2015'
|
|
71
|
+
|
|
72
|
+
num_people = 0.0
|
|
73
|
+
@model.getSpaceTypes.each do |space_type|
|
|
74
|
+
next if !space_type.standardsSpaceType.is_initialized
|
|
75
|
+
next if space_type.standardsSpaceType.get != 'Apartment' # currently only supports midrise apt space type
|
|
76
|
+
|
|
77
|
+
space_type_floor_area = space_type.floorArea
|
|
78
|
+
space_type_num_people = space_type.getNumberOfPeople(space_type_floor_area)
|
|
79
|
+
num_people += space_type_num_people
|
|
80
|
+
end
|
|
81
|
+
|
|
82
|
+
# lookup target gal/day for the building
|
|
83
|
+
bedrooms_per_unit = 2.0 # assumption
|
|
84
|
+
num_units = num_people / 2.5 # Avg 2.5 units per person.
|
|
85
|
+
target_consumption = std.model_find_icc_iecc_2015_hot_water_demand(@model, num_units, bedrooms_per_unit)
|
|
86
|
+
else
|
|
87
|
+
# only other path for now is 90.1-2013
|
|
88
|
+
|
|
89
|
+
# get building type
|
|
90
|
+
building_type = ''
|
|
91
|
+
if @model.getBuilding.standardsBuildingType.is_initialized
|
|
92
|
+
building_type = @model.getBuilding.standardsBuildingType.get
|
|
93
|
+
end
|
|
94
|
+
|
|
95
|
+
# lookup data from standards
|
|
96
|
+
ashrae_hot_water_demand = std.model_find_ashrae_hot_water_demand(@model)
|
|
97
|
+
|
|
98
|
+
# building type specific logic for water consumption
|
|
99
|
+
# todo - update test to exercise various building types
|
|
100
|
+
if !ashrae_hot_water_demand.empty?
|
|
101
|
+
|
|
102
|
+
if building_type == 'FullServiceRestaurant'
|
|
103
|
+
num_people_hours = 0.0
|
|
104
|
+
@model.getSpaceTypes.each do |space_type|
|
|
105
|
+
next if !space_type.standardsSpaceType.is_initialized
|
|
106
|
+
next if space_type.standardsSpaceType.get != 'Dining'
|
|
107
|
+
|
|
108
|
+
space_type_floor_area = space_type.floorArea
|
|
109
|
+
|
|
110
|
+
space_type_num_people_hours = 0.0
|
|
111
|
+
# loop through peole instances
|
|
112
|
+
space_type.peoples.each do |inst|
|
|
113
|
+
inst_num_people = inst.getNumberOfPeople(space_type_floor_area)
|
|
114
|
+
inst_schedule = inst.numberofPeopleSchedule.get # sim will fail prior to this if doesn't have it
|
|
115
|
+
|
|
116
|
+
if inst_schedule.to_ScheduleRuleset.is_initialized
|
|
117
|
+
annual_equiv_flow_rate = std.schedule_ruleset_annual_equivalent_full_load_hrs(inst_schedule.to_ScheduleRuleset.get)
|
|
118
|
+
elsif inst_schedule.to_ScheduleConstant.is_initialized
|
|
119
|
+
annual_equiv_flow_rate = std.schedule_constant_annual_equivalent_full_load_hrs(inst_schedule.to_ScheduleConstant.get)
|
|
120
|
+
else
|
|
121
|
+
check_elems << OpenStudio::Attribute.new('flag', "#{inst_schedule.name} isn't a Ruleset or Constant schedule. Can't calculate annual equivalent full load hours.")
|
|
122
|
+
annual_equiv_flow_rate = 0.0
|
|
123
|
+
end
|
|
124
|
+
|
|
125
|
+
inst_num_people_horus = annual_equiv_flow_rate * inst_num_people
|
|
126
|
+
space_type_num_people_hours += inst_num_people_horus
|
|
127
|
+
end
|
|
128
|
+
|
|
129
|
+
num_people_hours += space_type_num_people_hours
|
|
130
|
+
end
|
|
131
|
+
num_meals = num_people_hours / 365.0 * 1.5 # 90 minute meal
|
|
132
|
+
target_consumption = num_meals * ashrae_hot_water_demand.first[:avg_day_unit]
|
|
133
|
+
|
|
134
|
+
elsif ['LargeHotel', 'SmallHotel'].include? building_type
|
|
135
|
+
num_people = 0.0
|
|
136
|
+
@model.getSpaceTypes.each do |space_type|
|
|
137
|
+
next if !space_type.standardsSpaceType.is_initialized
|
|
138
|
+
next if space_type.standardsSpaceType.get != 'GuestRoom'
|
|
139
|
+
|
|
140
|
+
space_type_floor_area = space_type.floorArea
|
|
141
|
+
space_type_num_people = space_type.getNumberOfPeople(space_type_floor_area)
|
|
142
|
+
num_people += space_type_num_people
|
|
143
|
+
end
|
|
144
|
+
|
|
145
|
+
# find best fit from returned results
|
|
146
|
+
num_units = num_people / 2.0 # 2 people per room design load, not typical occupancy
|
|
147
|
+
avg_day_unit = nil
|
|
148
|
+
fit = nil
|
|
149
|
+
ashrae_hot_water_demand.each do |block|
|
|
150
|
+
if fit.nil?
|
|
151
|
+
avg_day_unit = block[:avg_day_unit]
|
|
152
|
+
fit = (avg_day_unit - block[:block]).abs
|
|
153
|
+
elsif (avg_day_unit - block[:block]).abs - fit
|
|
154
|
+
avg_day_unit = block[:avg_day_unit]
|
|
155
|
+
fit = (avg_day_unit - block[:block]).abs
|
|
156
|
+
end
|
|
157
|
+
end
|
|
158
|
+
target_consumption = num_units * avg_day_unit
|
|
159
|
+
|
|
160
|
+
elsif building_type == 'MidriseApartment'
|
|
161
|
+
num_people = 0.0
|
|
162
|
+
@model.getSpaceTypes.each do |space_type|
|
|
163
|
+
next if !space_type.standardsSpaceType.is_initialized
|
|
164
|
+
next if space_type.standardsSpaceType.get != 'Apartment'
|
|
165
|
+
|
|
166
|
+
space_type_floor_area = space_type.floorArea
|
|
167
|
+
space_type_num_people = space_type.getNumberOfPeople(space_type_floor_area)
|
|
168
|
+
num_people += space_type_num_people
|
|
169
|
+
end
|
|
170
|
+
|
|
171
|
+
# find best fit from returned results
|
|
172
|
+
num_units = num_people / 2.5 # Avg 2.5 units per person.
|
|
173
|
+
avg_day_unit = nil
|
|
174
|
+
fit = nil
|
|
175
|
+
ashrae_hot_water_demand.each do |block|
|
|
176
|
+
if fit.nil?
|
|
177
|
+
avg_day_unit = block[:avg_day_unit]
|
|
178
|
+
fit = (avg_day_unit - block[:block]).abs
|
|
179
|
+
elsif (avg_day_unit - block[:block]).abs - fit
|
|
180
|
+
avg_day_unit = block[:avg_day_unit]
|
|
181
|
+
fit = (avg_day_unit - block[:block]).abs
|
|
182
|
+
end
|
|
183
|
+
end
|
|
184
|
+
target_consumption = num_units * avg_day_unit
|
|
185
|
+
|
|
186
|
+
elsif ['Office', 'LargeOffice', 'MediumOffice', 'SmallOffice'].include? building_type
|
|
187
|
+
num_people = @model.getBuilding.numberOfPeople
|
|
188
|
+
target_consumption = num_people * ashrae_hot_water_demand.first[:avg_day_unit]
|
|
189
|
+
elsif building_type == 'PrimarySchool'
|
|
190
|
+
num_people = 0.0
|
|
191
|
+
@model.getSpaceTypes.each do |space_type|
|
|
192
|
+
next if !space_type.standardsSpaceType.is_initialized
|
|
193
|
+
next if space_type.standardsSpaceType.get != 'Classroom'
|
|
194
|
+
|
|
195
|
+
space_type_floor_area = space_type.floorArea
|
|
196
|
+
space_type_num_people = space_type.getNumberOfPeople(space_type_floor_area)
|
|
197
|
+
num_people += space_type_num_people
|
|
198
|
+
end
|
|
199
|
+
target_consumption = num_people * ashrae_hot_water_demand.first[:avg_day_unit]
|
|
200
|
+
elsif building_type == 'QuickServiceRestaurant'
|
|
201
|
+
num_people_hours = 0.0
|
|
202
|
+
@model.getSpaceTypes.each do |space_type|
|
|
203
|
+
next if !space_type.standardsSpaceType.is_initialized
|
|
204
|
+
next if space_type.standardsSpaceType.get != 'Dining'
|
|
205
|
+
|
|
206
|
+
space_type_floor_area = space_type.floorArea
|
|
207
|
+
|
|
208
|
+
space_type_num_people_hours = 0.0
|
|
209
|
+
# loop through peole instances
|
|
210
|
+
space_type.peoples.each do |inst|
|
|
211
|
+
inst_num_people = inst.getNumberOfPeople(space_type_floor_area)
|
|
212
|
+
inst_schedule = inst.numberofPeopleSchedule.get # sim will fail prior to this if doesn't have it
|
|
213
|
+
|
|
214
|
+
if inst_schedule.to_ScheduleRuleset.is_initialized
|
|
215
|
+
annual_equiv_flow_rate = std.schedule_ruleset_annual_equivalent_full_load_hrs(inst_schedule.to_ScheduleRuleset.get)
|
|
216
|
+
elsif inst_schedule.to_ScheduleConstant.is_initialized
|
|
217
|
+
annual_equiv_flow_rate = std.schedule_constant_annual_equivalent_full_load_hrs(inst_schedule.to_ScheduleConstant.get)
|
|
218
|
+
else
|
|
219
|
+
check_elems << OpenStudio::Attribute.new('flag', "#{inst_schedule.name} isn't a Ruleset or Constant schedule. Can't calculate annual equivalent full load hours.")
|
|
220
|
+
annual_equiv_flow_rate = 0.0
|
|
221
|
+
end
|
|
222
|
+
|
|
223
|
+
inst_num_people_horus = annual_equiv_flow_rate * inst_num_people
|
|
224
|
+
space_type_num_people_hours += inst_num_people_horus
|
|
225
|
+
end
|
|
226
|
+
|
|
227
|
+
num_people_hours += space_type_num_people_hours
|
|
228
|
+
end
|
|
229
|
+
num_meals = num_people_hours / 365.0 * 0.5 # 30 minute leal
|
|
230
|
+
# todo - add logic to address drive through traffic
|
|
231
|
+
target_consumption = num_meals * ashrae_hot_water_demand.first[:avg_day_unit]
|
|
232
|
+
|
|
233
|
+
elsif building_type == 'SecondarySchool'
|
|
234
|
+
num_people = 0.0
|
|
235
|
+
@model.getSpaceTypes.each do |space_type|
|
|
236
|
+
next if !space_type.standardsSpaceType.is_initialized
|
|
237
|
+
next if space_type.standardsSpaceType.get != 'Classroom'
|
|
238
|
+
|
|
239
|
+
space_type_floor_area = space_type.floorArea
|
|
240
|
+
space_type_num_people = space_type.getNumberOfPeople(space_type_floor_area)
|
|
241
|
+
num_people += space_type_num_people
|
|
242
|
+
end
|
|
243
|
+
target_consumption = num_people * ashrae_hot_water_demand.first[:avg_day_unit]
|
|
244
|
+
else
|
|
245
|
+
check_elems << OpenStudio::Attribute.new('flag', "No rule of thumb values exist for #{building_type}. Hot water consumption was not checked.")
|
|
246
|
+
end
|
|
247
|
+
|
|
248
|
+
else
|
|
249
|
+
check_elems << OpenStudio::Attribute.new('flag', "No rule of thumb values exist for #{building_type}. Hot water consumption was not checked.")
|
|
250
|
+
end
|
|
251
|
+
end
|
|
252
|
+
|
|
253
|
+
# check actual against target
|
|
254
|
+
if service_water_consumption_daily_avg_gal < target_consumption * (1.0 - min_pass_pct)
|
|
255
|
+
check_elems << OpenStudio::Attribute.new('flag', "Annual average of #{service_water_consumption_daily_avg_gal.round} gallons per day of hot water is more than #{min_pass_pct * 100} % below the expected value of #{target_consumption.round} gallons per day.")
|
|
256
|
+
elsif service_water_consumption_daily_avg_gal > target_consumption * (1.0 + max_pass_pct)
|
|
257
|
+
check_elems << OpenStudio::Attribute.new('flag', "Annual average of #{service_water_consumption_daily_avg_gal.round} gallons per day of hot water is more than #{max_pass_pct * 100} % above the expected value of #{target_consumption.round} gallons per day.")
|
|
258
|
+
end
|
|
259
|
+
rescue StandardError => e
|
|
260
|
+
# brief description of ruby error
|
|
261
|
+
check_elems << OpenStudio::Attribute.new('flag', "Error prevented QAQC check from running (#{e}).")
|
|
262
|
+
|
|
263
|
+
# backtrace of ruby error for diagnostic use
|
|
264
|
+
if @error_backtrace then check_elems << OpenStudio::Attribute.new('flag', e.backtrace.join("\n").to_s) end
|
|
265
|
+
end
|
|
266
|
+
|
|
267
|
+
# add check_elms to new attribute
|
|
268
|
+
check_elem = OpenStudio::Attribute.new('check', check_elems)
|
|
269
|
+
|
|
270
|
+
return check_elem
|
|
271
|
+
end
|
|
272
|
+
end
|
|
273
|
+
end
|