openstudio-standards 0.4.0 → 0.5.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/LICENSE.md +33 -0
- 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 +2170 -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 +54 -18
- data/License.txt +0 -65
- 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,169 @@
|
|
1
|
+
# Methods to get information from Schedule objects
|
2
|
+
# Many of these methods may be moved to core OpenStudio
|
3
|
+
module OpenstudioStandards
|
4
|
+
module Schedules
|
5
|
+
# @!group Information
|
6
|
+
|
7
|
+
# add general schedule_min_max(schedule) method and merge with other methods
|
8
|
+
|
9
|
+
# returns the ScheduleRuleset minimum and maximum values
|
10
|
+
#
|
11
|
+
# @param schedule_ruleset [OpenStudio::Model::ScheduleRuleset] OpenStudio ScheduleRuleset object
|
12
|
+
# @return [Hash] returns as hash with 'min' and 'max' values
|
13
|
+
def self.schedule_ruleset_get_min_max(schedule_ruleset)
|
14
|
+
# validate schedule
|
15
|
+
if schedule_ruleset.to_ScheduleRuleset.is_initialized
|
16
|
+
schedule = schedule_ruleset.to_ScheduleRuleset.get
|
17
|
+
|
18
|
+
# gather profiles
|
19
|
+
profiles = []
|
20
|
+
profiles << schedule.defaultDaySchedule
|
21
|
+
rules = schedule.scheduleRules
|
22
|
+
rules.each do |rule|
|
23
|
+
profiles << rule.daySchedule
|
24
|
+
end
|
25
|
+
|
26
|
+
# test profiles
|
27
|
+
min = nil
|
28
|
+
max = nil
|
29
|
+
profiles.each do |profile|
|
30
|
+
profile.values.each do |value|
|
31
|
+
if min.nil?
|
32
|
+
min = value
|
33
|
+
else
|
34
|
+
if min > value then min = value end
|
35
|
+
end
|
36
|
+
if max.nil?
|
37
|
+
max = value
|
38
|
+
else
|
39
|
+
if max < value then max = value end
|
40
|
+
end
|
41
|
+
end
|
42
|
+
end
|
43
|
+
result = { 'min' => min, 'max' => max } # this doesn't include summer and winter design day
|
44
|
+
else
|
45
|
+
result = nil
|
46
|
+
end
|
47
|
+
|
48
|
+
return result
|
49
|
+
end
|
50
|
+
|
51
|
+
# create OpenStudio TimeSeries object from ScheduleRuleset values
|
52
|
+
#
|
53
|
+
# @param schedule_ruleset [OpenStudio::Model::ScheduleRuleset] OpenStudio ScheduleRuleset object
|
54
|
+
# @return [OpenStudio::TimeSeries] OpenStudio TimeSeries object of schedule values
|
55
|
+
def self.schedule_ruleset_get_timeseries(schedule_ruleset)
|
56
|
+
yd = schedule_ruleset.model.getYearDescription
|
57
|
+
start_date = yd.makeDate(1, 1)
|
58
|
+
end_date = yd.makeDate(12, 31)
|
59
|
+
|
60
|
+
values = OpenStudio::DoubleVector.new
|
61
|
+
day = OpenStudio::Time.new(1.0)
|
62
|
+
interval = OpenStudio::Time.new(1.0 / 48.0)
|
63
|
+
day_schedules = schedule_ruleset.to_ScheduleRuleset.get.getDaySchedules(start_date, end_date)
|
64
|
+
day_schedules.each do |day_schedule|
|
65
|
+
time = interval
|
66
|
+
while time < day
|
67
|
+
values << day_schedule.getValue(time)
|
68
|
+
time += interval
|
69
|
+
end
|
70
|
+
end
|
71
|
+
timeseries = OpenStudio::TimeSeries.new(start_date, interval, OpenStudio.createVector(values), '')
|
72
|
+
return timeseries
|
73
|
+
end
|
74
|
+
|
75
|
+
# Determine the hour when the schedule first exceeds the starting value and when
|
76
|
+
# it goes back down to the ending value at the end of the day.
|
77
|
+
# This method only works for ScheduleRuleset schedules.
|
78
|
+
#
|
79
|
+
# @param schedule_ruleset [OpenStudio::Model::ScheduleRuleset] OpenStudio ScheduleRuleset object
|
80
|
+
# @return [Hash<OpenStudio:Time>] returns as hash with 'start_time', 'end time']
|
81
|
+
def self.schedule_ruleset_get_start_and_end_times(schedule_ruleset)
|
82
|
+
# Ensure that this is a ScheduleRuleset
|
83
|
+
schedule_ruleset = schedule_ruleset.to_ScheduleRuleset
|
84
|
+
return [nil, nil] if schedule_ruleset.empty?
|
85
|
+
|
86
|
+
schedule_ruleset = schedule_ruleset.get
|
87
|
+
|
88
|
+
# Define the start and end date
|
89
|
+
if schedule_ruleset.model.yearDescription.is_initialized
|
90
|
+
year_description = schedule_ruleset.model.yearDescription.get
|
91
|
+
year = year_description.assumedYear
|
92
|
+
year_start_date = OpenStudio::Date.new(OpenStudio::MonthOfYear.new('January'), 1, year)
|
93
|
+
year_end_date = OpenStudio::Date.new(OpenStudio::MonthOfYear.new('December'), 31, year)
|
94
|
+
else
|
95
|
+
year_start_date = OpenStudio::Date.new(OpenStudio::MonthOfYear.new('January'), 1, 2009)
|
96
|
+
year_end_date = OpenStudio::Date.new(OpenStudio::MonthOfYear.new('December'), 31, 2009)
|
97
|
+
end
|
98
|
+
|
99
|
+
# Get the ordered list of all the day schedules that are used by this schedule ruleset
|
100
|
+
day_schs = schedule_ruleset.getDaySchedules(year_start_date, year_end_date)
|
101
|
+
|
102
|
+
# Get a 365-value array of which schedule is used on each day of the year,
|
103
|
+
day_schs_used_each_day = schedule_ruleset.getActiveRuleIndices(year_start_date, year_end_date)
|
104
|
+
|
105
|
+
# Create a map that shows how many days each schedule is used
|
106
|
+
day_sch_freq = day_schs_used_each_day.group_by { |n| n }
|
107
|
+
day_sch_freq = day_sch_freq.sort_by { |freq| freq[1].size }
|
108
|
+
common_day_freq = day_sch_freq.last
|
109
|
+
|
110
|
+
# Build a hash that maps schedule day index to schedule day
|
111
|
+
schedule_index_to_day = {}
|
112
|
+
day_schs.each_with_index do |day_sch, i|
|
113
|
+
schedule_index_to_day[day_schs_used_each_day[i]] = day_sch
|
114
|
+
end
|
115
|
+
|
116
|
+
# Get the most common day schedule
|
117
|
+
sch_index = common_day_freq[0]
|
118
|
+
number_of_days_sch_used = common_day_freq[1].size
|
119
|
+
|
120
|
+
# Get the day schedule at this index
|
121
|
+
day_sch = if sch_index == -1 # If index = -1, this day uses the default day schedule (not a rule)
|
122
|
+
schedule_ruleset.defaultDaySchedule
|
123
|
+
else
|
124
|
+
schedule_index_to_day[sch_index]
|
125
|
+
end
|
126
|
+
|
127
|
+
# Determine the full load hours for just one day
|
128
|
+
values = []
|
129
|
+
times = []
|
130
|
+
day_sch.times.each_with_index do |time, i|
|
131
|
+
times << day_sch.times[i]
|
132
|
+
values << day_sch.values[i]
|
133
|
+
end
|
134
|
+
|
135
|
+
# Get the minimum value
|
136
|
+
start_val = values.first
|
137
|
+
end_val = values.last
|
138
|
+
|
139
|
+
# Get the start time (first time value goes above minimum)
|
140
|
+
start_time = nil
|
141
|
+
values.each_with_index do |val, i|
|
142
|
+
break if i == values.size - 1 # Stop if we reach end of array
|
143
|
+
|
144
|
+
if val == start_val && values[i + 1] > start_val
|
145
|
+
start_time = times[i]
|
146
|
+
break
|
147
|
+
end
|
148
|
+
end
|
149
|
+
|
150
|
+
# Get the end time (first time value goes back down to minimum)
|
151
|
+
end_time = nil
|
152
|
+
values.each_with_index do |val, i|
|
153
|
+
if i < values.size - 1
|
154
|
+
if val > end_val && values[i + 1] == end_val
|
155
|
+
end_time = times[i]
|
156
|
+
break
|
157
|
+
end
|
158
|
+
else
|
159
|
+
if val > end_val && values[0] == start_val # Check first hour of day for schedules that end at midnight
|
160
|
+
end_time = OpenStudio::Time.new(0, 24, 0, 0)
|
161
|
+
break
|
162
|
+
end
|
163
|
+
end
|
164
|
+
end
|
165
|
+
|
166
|
+
return { 'start_time' => start_time, 'end_time' => end_time }
|
167
|
+
end
|
168
|
+
end
|
169
|
+
end
|
@@ -0,0 +1,445 @@
|
|
1
|
+
# Methods to modify existing Schedule objects
|
2
|
+
module OpenstudioStandards
|
3
|
+
module Schedules
|
4
|
+
# @!group Modify
|
5
|
+
|
6
|
+
# Increase/decrease by percentage or static value
|
7
|
+
#
|
8
|
+
# @param schedule_ruleset [OpenStudio::Model::ScheduleRuleset] OpenStudio ScheduleRuleset object
|
9
|
+
# @param value [Double] Hash of name and time value pairs
|
10
|
+
# @param modification_type [String] Options are 'Multiplier', which multiples by the value,
|
11
|
+
# and 'Sum' which adds by the value
|
12
|
+
# @return [OpenStudio::Model::ScheduleRuleset] OpenStudio ScheduleRuleset object
|
13
|
+
# @todo add in design day adjustments, maybe as an optional argument
|
14
|
+
# @todo provide option to clone existing schedule
|
15
|
+
def self.schedule_ruleset_simple_value_adjust(schedule_ruleset, value, modification_type = 'Multiplier')
|
16
|
+
# gather profiles
|
17
|
+
profiles = []
|
18
|
+
default_profile = schedule_ruleset.to_ScheduleRuleset.get.defaultDaySchedule
|
19
|
+
profiles << default_profile
|
20
|
+
rules = schedule_ruleset.scheduleRules
|
21
|
+
rules.each do |rule|
|
22
|
+
profiles << rule.daySchedule
|
23
|
+
end
|
24
|
+
|
25
|
+
# alter profiles
|
26
|
+
profiles.each do |profile|
|
27
|
+
times = profile.times
|
28
|
+
i = 0
|
29
|
+
profile.values.each do |sch_value|
|
30
|
+
case modification_type
|
31
|
+
when 'Multiplier', 'Percentage'
|
32
|
+
# percentage was used early on but Multiplier is preferable
|
33
|
+
profile.addValue(times[i], sch_value * value)
|
34
|
+
when 'Sum', 'Value'
|
35
|
+
# value was used early on but Sum is preferable
|
36
|
+
profile.addValue(times[i], sch_value + value)
|
37
|
+
end
|
38
|
+
i += 1
|
39
|
+
end
|
40
|
+
end
|
41
|
+
|
42
|
+
return schedule_ruleset
|
43
|
+
end
|
44
|
+
|
45
|
+
# Increase/decrease by percentage or static value
|
46
|
+
# change value when value passes/fails test
|
47
|
+
#
|
48
|
+
# @param schedule_ruleset [OpenStudio::Model::ScheduleRuleset] OpenStudio ScheduleRuleset object
|
49
|
+
# @param test_value [Double] if less than the test_value, use the pass_value to modify, otherwise use the fail_value
|
50
|
+
# @param pass_value [Double] value to adjust by if less than test value
|
51
|
+
# @param fail_value [Double] value to adjust by if more than test value
|
52
|
+
# @param floor_value [Double] minimum value that the adjustment can take
|
53
|
+
# @param modification_type [String] Options are 'Multiplier', which multiples by the value,
|
54
|
+
# and 'Sum' which adds by the value
|
55
|
+
# @return [OpenStudio::Model::ScheduleRuleset] OpenStudio ScheduleRuleset object
|
56
|
+
# @todo add in design day adjustments, maybe as an optional argument
|
57
|
+
# @todo provide option to clone existing schedule
|
58
|
+
def self.schedule_ruleset_conditional_adjust_value(schedule_ruleset, test_value, pass_value, fail_value, floor_value, modification_type = 'Multiplier')
|
59
|
+
# gather profiles
|
60
|
+
profiles = []
|
61
|
+
default_profile = schedule_ruleset.to_ScheduleRuleset.get.defaultDaySchedule
|
62
|
+
profiles << default_profile
|
63
|
+
rules = schedule_ruleset.scheduleRules
|
64
|
+
rules.each do |rule|
|
65
|
+
profiles << rule.daySchedule
|
66
|
+
end
|
67
|
+
|
68
|
+
# alter profiles
|
69
|
+
profiles.each do |profile|
|
70
|
+
times = profile.times
|
71
|
+
i = 0
|
72
|
+
|
73
|
+
profile.values.each do |sch_value|
|
74
|
+
# run test on this sch_value
|
75
|
+
if sch_value < test_value
|
76
|
+
adjust_value = pass_value
|
77
|
+
else
|
78
|
+
adjust_value = fail_value
|
79
|
+
end
|
80
|
+
|
81
|
+
# skip if sch_value is floor or less
|
82
|
+
next if sch_value <= floor_value
|
83
|
+
|
84
|
+
case modification_type
|
85
|
+
when 'Multiplier'
|
86
|
+
# take the max of the floor or resulting value
|
87
|
+
profile.addValue(times[i], [sch_value * adjust_value, floor_value].max)
|
88
|
+
when 'Sum'
|
89
|
+
# take the max of the floor or resulting value
|
90
|
+
profile.addValue(times[i], [sch_value + adjust_value, floor_value].max)
|
91
|
+
end
|
92
|
+
i += 1
|
93
|
+
end
|
94
|
+
end
|
95
|
+
|
96
|
+
return schedule_ruleset
|
97
|
+
end
|
98
|
+
|
99
|
+
# Increase/decrease by percentage or static value
|
100
|
+
# change value when time passes test
|
101
|
+
#
|
102
|
+
# @param schedule_ruleset [OpenStudio::Model::ScheduleRuleset] OpenStudio ScheduleRuleset object
|
103
|
+
# @param hhmm_before [String] time before string in hhmm format, e.g. 1530
|
104
|
+
# @param hhmm_after [String] string in hhmm format, e.g. 1530
|
105
|
+
# @param inside_value [Double]
|
106
|
+
# @param outside_value [Double]
|
107
|
+
# @param modification_type [String] Options are 'Sum', which adds to the value,
|
108
|
+
# and 'Replace' which replaces the value
|
109
|
+
# @return [OpenStudio::Model::ScheduleRuleset] OpenStudio ScheduleRuleset object
|
110
|
+
def self.schedule_ruleset_time_conditional_adjust_value(schedule_ruleset, hhmm_before, hhmm_after, inside_value, outside_value, modification_type = 'Sum')
|
111
|
+
# setup variables
|
112
|
+
array = hhmm_before.to_s.split('')
|
113
|
+
before_hour = "#{array[0]}#{array[1]}".to_i
|
114
|
+
before_min = "#{array[2]}#{array[3]}".to_i
|
115
|
+
array = hhmm_after.to_s.split('')
|
116
|
+
after_hour = "#{array[0]}#{array[1]}".to_i
|
117
|
+
after_min = "#{array[2]}#{array[3]}".to_i
|
118
|
+
|
119
|
+
# gather profiles
|
120
|
+
profiles = []
|
121
|
+
schedule = schedule_ruleset.to_ScheduleRuleset.get
|
122
|
+
default_profile = schedule_ruleset.defaultDaySchedule
|
123
|
+
profiles << default_profile
|
124
|
+
rules = schedule_ruleset.scheduleRules
|
125
|
+
rules.each do |rule|
|
126
|
+
profiles << rule.daySchedule
|
127
|
+
end
|
128
|
+
|
129
|
+
# alter profiles
|
130
|
+
profiles.each do |day_sch|
|
131
|
+
times = day_sch.times
|
132
|
+
i = 0
|
133
|
+
|
134
|
+
# set times special times needed for methods below
|
135
|
+
before_time = OpenStudio::Time.new(0, before_hour, before_min, 0)
|
136
|
+
after_time = OpenStudio::Time.new(0, after_hour, after_min, 0)
|
137
|
+
# day_end_time = OpenStudio::Time.new(0, 24, 0, 0)
|
138
|
+
|
139
|
+
# add datapoint at before and after time
|
140
|
+
original_value_at_before_time = day_sch.getValue(before_time)
|
141
|
+
original_value_at_after_time = day_sch.getValue(after_time)
|
142
|
+
day_sch.addValue(before_time, original_value_at_before_time)
|
143
|
+
day_sch.addValue(after_time, original_value_at_after_time)
|
144
|
+
|
145
|
+
# make arrays for original times and values
|
146
|
+
times = day_sch.times
|
147
|
+
sch_values = day_sch.values
|
148
|
+
day_sch.clearValues
|
149
|
+
|
150
|
+
# make arrays for new values
|
151
|
+
new_times = []
|
152
|
+
new_values = []
|
153
|
+
|
154
|
+
# loop through original time/value pairs to populate new array
|
155
|
+
for i in 0..(sch_values.length - 1)
|
156
|
+
new_times << times[i]
|
157
|
+
|
158
|
+
if times[i] > before_time && times[i] <= after_time
|
159
|
+
# updated this so times[i] == before_time goes into the else
|
160
|
+
if inside_value.nil?
|
161
|
+
new_values << sch_values[i]
|
162
|
+
elsif modification_type == 'Sum'
|
163
|
+
new_values << inside_value + sch_values[i]
|
164
|
+
elsif modification_type == 'Replace'
|
165
|
+
new_values << inside_value
|
166
|
+
else # should be Multiplier
|
167
|
+
new_values << inside_value * sch_values[i]
|
168
|
+
end
|
169
|
+
else
|
170
|
+
if outside_value.nil?
|
171
|
+
new_values << sch_values[i]
|
172
|
+
elsif modification_type == 'Sum'
|
173
|
+
new_values << outside_value + sch_values[i]
|
174
|
+
elsif modification_type == 'Replace'
|
175
|
+
new_values << outside_value
|
176
|
+
else # should be Multiplier
|
177
|
+
new_values << outside_value * sch_values[i]
|
178
|
+
end
|
179
|
+
end
|
180
|
+
|
181
|
+
end
|
182
|
+
|
183
|
+
# generate new day_sch values
|
184
|
+
for i in 0..(new_values.length - 1)
|
185
|
+
day_sch.addValue(new_times[i], new_values[i])
|
186
|
+
end
|
187
|
+
end
|
188
|
+
|
189
|
+
return schedule_ruleset
|
190
|
+
end
|
191
|
+
|
192
|
+
# Adjust hours of operation
|
193
|
+
#
|
194
|
+
# @param schedule_ruleset [OpenStudio::Model::ScheduleRuleset] OpenStudio ScheduleRuleset object
|
195
|
+
# @param options [Hash] Hash of argument options
|
196
|
+
# @return [OpenStudio::Model::ScheduleRuleset] OpenStudio ScheduleRuleset object
|
197
|
+
def self.schedule_ruleset_adjust_hours_of_operation(schedule_ruleset, options = {})
|
198
|
+
defaults = {
|
199
|
+
'base_start_hoo' => 8.0, # may not be good idea to have default
|
200
|
+
'base_finish_hoo' => 18.0, # may not be good idea to have default
|
201
|
+
'delta_length_hoo' => 0.0,
|
202
|
+
'shift_hoo' => 0.0,
|
203
|
+
'default' => true,
|
204
|
+
'mon' => true,
|
205
|
+
'tue' => true,
|
206
|
+
'wed' => true,
|
207
|
+
'thur' => true,
|
208
|
+
'fri' => true,
|
209
|
+
'sat' => true,
|
210
|
+
'sun' => true,
|
211
|
+
'summer' => false,
|
212
|
+
'winter' => false
|
213
|
+
}
|
214
|
+
|
215
|
+
# merge user inputs with defaults
|
216
|
+
options = defaults.merge(options)
|
217
|
+
|
218
|
+
# grab schedule out of argument
|
219
|
+
if schedule_ruleset.to_ScheduleRuleset.is_initialized
|
220
|
+
schedule = schedule_ruleset.to_ScheduleRuleset.get
|
221
|
+
else
|
222
|
+
OpenStudio.logFree(OpenStudio::Warn, 'openstudio.standards.Schedules.Modify', "schedule_ruleset_adjust_hours_of_operation only applies to ScheduleRuleset objects. Skipping #{schedule.name}")
|
223
|
+
return nil
|
224
|
+
end
|
225
|
+
|
226
|
+
# array of all profiles to change
|
227
|
+
profiles = []
|
228
|
+
|
229
|
+
# push default profiles to array
|
230
|
+
if options['default']
|
231
|
+
default_rule = schedule.defaultDaySchedule
|
232
|
+
profiles << default_rule
|
233
|
+
end
|
234
|
+
|
235
|
+
# push profiles to array
|
236
|
+
rules = schedule.scheduleRules
|
237
|
+
rules.each do |rule|
|
238
|
+
day_sch = rule.daySchedule
|
239
|
+
|
240
|
+
# if any day requested also exists in the rule, then it will be altered
|
241
|
+
alter_rule = false
|
242
|
+
if rule.applyMonday && rule.applyMonday == options['mon'] then alter_rule = true end
|
243
|
+
if rule.applyTuesday && rule.applyTuesday == options['tue'] then alter_rule = true end
|
244
|
+
if rule.applyWednesday && rule.applyWednesday == options['wed'] then alter_rule = true end
|
245
|
+
if rule.applyThursday && rule.applyThursday == options['thur'] then alter_rule = true end
|
246
|
+
if rule.applyFriday && rule.applyFriday == options['fri'] then alter_rule = true end
|
247
|
+
if rule.applySaturday && rule.applySaturday == options['sat'] then alter_rule = true end
|
248
|
+
if rule.applySunday && rule.applySunday == options['sun'] then alter_rule = true end
|
249
|
+
|
250
|
+
# @todo add in logic to warn user about conflicts where a single rule has conflicting tests
|
251
|
+
|
252
|
+
if alter_rule
|
253
|
+
profiles << day_sch
|
254
|
+
end
|
255
|
+
end
|
256
|
+
|
257
|
+
# add design days to array
|
258
|
+
if options['summer']
|
259
|
+
summer_design = schedule.summerDesignDaySchedule
|
260
|
+
profiles << summer_design
|
261
|
+
end
|
262
|
+
if options['winter']
|
263
|
+
winter_design = schedule.winterDesignDaySchedule
|
264
|
+
profiles << winter_design
|
265
|
+
end
|
266
|
+
|
267
|
+
# give info messages as I change specific profiles
|
268
|
+
OpenStudio.logFree(OpenStudio::Info, 'openstudio.standards.Schedules.Modify', "Adjusting #{schedule.name}")
|
269
|
+
|
270
|
+
# rename schedule
|
271
|
+
schedule.setName("#{schedule.name} - extend #{options['delta_length_hoo']} shift #{options['shift_hoo']}")
|
272
|
+
|
273
|
+
# break time args into hours and minutes
|
274
|
+
start_hoo_hours = (options['base_start_hoo']).to_i
|
275
|
+
start_hoo_minutes = (((options['base_start_hoo']) - (options['base_start_hoo']).to_i) * 60).to_i
|
276
|
+
finish_hoo_hours = (options['base_finish_hoo']).to_i
|
277
|
+
finish_hoo_minutes = (((options['base_finish_hoo']) - (options['base_finish_hoo']).to_i) * 60).to_i
|
278
|
+
delta_hours = (options['delta_length_hoo']).to_i
|
279
|
+
delta_minutes = (((options['delta_length_hoo']) - (options['delta_length_hoo']).to_i) * 60).to_i
|
280
|
+
shift_hours = (options['shift_hoo']).to_i
|
281
|
+
shift_minutes = (((options['shift_hoo']) - (options['shift_hoo']).to_i) * 60).to_i
|
282
|
+
|
283
|
+
# time objects to use in measure
|
284
|
+
time_0 = OpenStudio::Time.new(0, 0, 0, 0)
|
285
|
+
time_1_min = OpenStudio::Time.new(0, 0, 1, 0) # add this to avoid times in day profile less than this
|
286
|
+
time_12 = OpenStudio::Time.new(0, 12, 0, 0)
|
287
|
+
time_24 = OpenStudio::Time.new(0, 24, 0, 0)
|
288
|
+
start_hoo_time = OpenStudio::Time.new(0, start_hoo_hours, start_hoo_minutes, 0)
|
289
|
+
finish_hoo_time = OpenStudio::Time.new(0, finish_hoo_hours, finish_hoo_minutes, 0)
|
290
|
+
delta_time = OpenStudio::Time.new(0, delta_hours, delta_minutes, 0) # not used
|
291
|
+
shift_time = OpenStudio::Time.new(0, shift_hours, shift_minutes, 0)
|
292
|
+
|
293
|
+
# calculations
|
294
|
+
if options['base_start_hoo'] <= options['base_finish_hoo']
|
295
|
+
base_opp_day_length = options['base_finish_hoo'] - options['base_start_hoo']
|
296
|
+
mid_hoo = start_hoo_time + (finish_hoo_time - start_hoo_time) / 2
|
297
|
+
mid_non_hoo = mid_hoo + time_12
|
298
|
+
if mid_non_hoo > time_24 then mid_non_hoo -= time_24 end
|
299
|
+
else
|
300
|
+
base_opp_day_length = options['base_finish_hoo'] - options['base_start_hoo'] + 24
|
301
|
+
mid_non_hoo = finish_hoo_time + (start_hoo_time - finish_hoo_time) / 2
|
302
|
+
mid_hoo = mid_non_hoo + time_12
|
303
|
+
if mid_non_hoo > time_24 then mid_non_hoo -= time_24 end
|
304
|
+
end
|
305
|
+
adjusted_opp_day_length = base_opp_day_length + options['delta_length_hoo']
|
306
|
+
hoo_time_multiplier = adjusted_opp_day_length / base_opp_day_length
|
307
|
+
non_hoo_time_multiplier = (24 - adjusted_opp_day_length) / (24 - base_opp_day_length)
|
308
|
+
|
309
|
+
# check for invalid input
|
310
|
+
if adjusted_opp_day_length < 0
|
311
|
+
OpenStudio.logFree(OpenStudio::Error, 'openstudio.standards.Schedules.Modify', 'Requested hours of operation adjustment results in an invalid negative hours of operation')
|
312
|
+
return false
|
313
|
+
end
|
314
|
+
# check for invalid input
|
315
|
+
if adjusted_opp_day_length > 24
|
316
|
+
OpenStudio.logFree(OpenStudio::Error, 'openstudio.standards.Schedules.Modify', 'Requested hours of operation adjustment results in more than 24 hours of operation')
|
317
|
+
return false
|
318
|
+
end
|
319
|
+
|
320
|
+
# making some temp objects to avoid having to deal with wrap around for change of hoo times
|
321
|
+
mid_hoo < start_hoo_time ? (adj_mid_hoo = mid_hoo + time_24) : (adj_mid_hoo = mid_hoo)
|
322
|
+
finish_hoo_time < adj_mid_hoo ? (adj_finish_hoo_time = finish_hoo_time + time_24) : (adj_finish_hoo_time = finish_hoo_time)
|
323
|
+
mid_non_hoo < adj_finish_hoo_time ? (adj_mid_non_hoo = mid_non_hoo + time_24) : (adj_mid_non_hoo = mid_non_hoo)
|
324
|
+
adj_start = start_hoo_time + time_24 # not used
|
325
|
+
|
326
|
+
# edit profiles
|
327
|
+
profiles.each do |day_sch|
|
328
|
+
times = day_sch.times
|
329
|
+
values = day_sch.values
|
330
|
+
|
331
|
+
# in this case delete all values outside of
|
332
|
+
# todo - may need similar logic if exactly 0 hours
|
333
|
+
if adjusted_opp_day_length == 24
|
334
|
+
start_val = day_sch.getValue(start_hoo_time)
|
335
|
+
finish_val = day_sch.getValue(finish_hoo_time)
|
336
|
+
|
337
|
+
# remove times out of range that should not be reference or compressed
|
338
|
+
if start_hoo_time < finish_hoo_time
|
339
|
+
times.each do |time|
|
340
|
+
if time <= start_hoo_time || time > finish_hoo_time
|
341
|
+
day_sch.removeValue(time)
|
342
|
+
end
|
343
|
+
end
|
344
|
+
# add in values
|
345
|
+
day_sch.addValue(start_hoo_time, start_val)
|
346
|
+
day_sch.addValue(finish_hoo_time, finish_val)
|
347
|
+
day_sch.addValue(time_24, [start_val, finish_val].max)
|
348
|
+
else
|
349
|
+
times.each do |time|
|
350
|
+
if time > start_hoo_time && time <= finish_hoo_time
|
351
|
+
day_sch.removeValue(time)
|
352
|
+
end
|
353
|
+
end
|
354
|
+
# add in values
|
355
|
+
day_sch.addValue(finish_hoo_time, finish_val)
|
356
|
+
day_sch.addValue(start_hoo_time, start_val)
|
357
|
+
day_sch.addValue(time_24, [values.first, values.last].max)
|
358
|
+
end
|
359
|
+
|
360
|
+
end
|
361
|
+
|
362
|
+
times = day_sch.times
|
363
|
+
values = day_sch.values
|
364
|
+
|
365
|
+
# arrays for values to avoid overlap conflict of times
|
366
|
+
new_times = []
|
367
|
+
new_values = []
|
368
|
+
|
369
|
+
# this is to store what datapoint will be first after midnight, and what the value at that time should be
|
370
|
+
min_time_new = time_24
|
371
|
+
min_time_value = nil
|
372
|
+
|
373
|
+
# flag if found time at 24
|
374
|
+
found_24_or_0 = false
|
375
|
+
|
376
|
+
# push times to array
|
377
|
+
times.each do |time|
|
378
|
+
# create logic for four possible quadrants. Assume any quadrant can pass over 24/0 threshold
|
379
|
+
time < start_hoo_time ? (temp_time = time + time_24) : (temp_time = time)
|
380
|
+
|
381
|
+
# calculate change in time do to hoo delta
|
382
|
+
if temp_time <= adj_finish_hoo_time
|
383
|
+
expand_time = (temp_time - adj_mid_hoo) * hoo_time_multiplier - (temp_time - adj_mid_hoo)
|
384
|
+
else
|
385
|
+
expand_time = (temp_time - adj_mid_non_hoo) * non_hoo_time_multiplier - (temp_time - adj_mid_non_hoo)
|
386
|
+
end
|
387
|
+
|
388
|
+
new_time = time + shift_time + expand_time
|
389
|
+
|
390
|
+
# adjust wrap around times
|
391
|
+
if new_time < time_0
|
392
|
+
new_time += time_24
|
393
|
+
elsif new_time > time_24
|
394
|
+
new_time -= time_24
|
395
|
+
end
|
396
|
+
new_times << new_time
|
397
|
+
|
398
|
+
# see which new_time has the lowest value. Then add a value at 24 equal to that
|
399
|
+
if !found_24_or_0 && new_time <= min_time_new
|
400
|
+
min_time_new = new_time
|
401
|
+
min_time_value = day_sch.getValue(time)
|
402
|
+
elsif new_time == time_24 # this was added to address time exactly at 24
|
403
|
+
min_time_new = new_time
|
404
|
+
min_time_value = day_sch.getValue(time)
|
405
|
+
found_24_or_0 = true
|
406
|
+
elsif new_time == time_0
|
407
|
+
min_time_new = new_time
|
408
|
+
min_time_value = day_sch.getValue(time_0)
|
409
|
+
found_24_or_0 = true
|
410
|
+
end
|
411
|
+
end
|
412
|
+
|
413
|
+
# push values to array
|
414
|
+
values.each do |value|
|
415
|
+
new_values << value
|
416
|
+
end
|
417
|
+
|
418
|
+
# add value for what will be 24
|
419
|
+
new_times << time_24
|
420
|
+
new_values << min_time_value
|
421
|
+
|
422
|
+
new_time_val_hash = {}
|
423
|
+
new_times.each_with_index do |time, i|
|
424
|
+
new_time_val_hash[time.totalHours] = { time: time, value: new_values[i] }
|
425
|
+
end
|
426
|
+
|
427
|
+
# clear values
|
428
|
+
day_sch.clearValues
|
429
|
+
|
430
|
+
new_time_val_hash = Hash[new_time_val_hash.sort]
|
431
|
+
prev_time = nil
|
432
|
+
new_time_val_hash.sort.each do |hours, time_val|
|
433
|
+
if prev_time.nil? || time_val[:time] - prev_time > time_1_min
|
434
|
+
day_sch.addValue(time_val[:time], time_val[:value])
|
435
|
+
prev_time = time_val[:time]
|
436
|
+
else
|
437
|
+
OpenStudio.logFree(OpenStudio::Warn, 'openstudio.standards.Schedules.Modify', "Time step in #{day_sch.name} between #{prev_time.toString} and #{time_val[:time].toString} is too small to support, not adding value.")
|
438
|
+
end
|
439
|
+
end
|
440
|
+
end
|
441
|
+
|
442
|
+
return schedule
|
443
|
+
end
|
444
|
+
end
|
445
|
+
end
|