openstudio-standards 0.7.1 → 0.8.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/geometry/ASHRAE90120162019LargeHotel.json +58 -13
- data/data/geometry/ASHRAELargeHotel.json +58 -13
- data/data/standards/OpenStudio_Standards-ashrae_90_1-ALL-comstock(space_types).xlsx +0 -0
- data/data/standards/export_OpenStudio_libraries.rb +2 -2
- data/data/standards/manage_OpenStudio_Standards.rb +6 -6
- data/data/standards/openstudio_standards_duplicates_log.csv +7961 -1
- data/data/standards/test_performance_expected_dd_results.csv +2016 -2004
- data/lib/openstudio-standards/btap/fileio.rb +171 -5
- data/lib/openstudio-standards/constructions/create.rb +38 -4
- data/lib/openstudio-standards/constructions/modify.rb +10 -3
- data/lib/openstudio-standards/create_typical/create_typical.rb +42 -28
- data/lib/openstudio-standards/create_typical/space_type_information.rb +160 -0
- data/lib/openstudio-standards/create_typical/space_type_ratios.rb +16 -19
- data/lib/openstudio-standards/exterior_lighting/create.rb +454 -0
- data/lib/openstudio-standards/exterior_lighting/data/entryways.csv +52 -0
- data/lib/openstudio-standards/exterior_lighting/data/parking.csv +54 -0
- data/lib/openstudio-standards/exterior_lighting/data/typical_exterior_lighting.json +37 -0
- data/lib/openstudio-standards/exterior_lighting/information.rb +202 -0
- data/lib/openstudio-standards/geometry/information.rb +49 -2
- data/lib/openstudio-standards/hvac/components/create.rb +169 -0
- data/lib/openstudio-standards/hvac/components/modify.rb +42 -0
- data/lib/openstudio-standards/hvac/exhaust/create_exhaust_fan.rb +108 -0
- data/lib/openstudio-standards/hvac/exhaust/data/convert_data.rb +86 -0
- data/lib/openstudio-standards/hvac/exhaust/data/typical_exhaust.csv +18 -0
- data/lib/openstudio-standards/hvac/exhaust/data/typical_exhaust.json +89 -0
- data/lib/openstudio-standards/infiltration/nist_infiltration.rb +25 -13
- data/lib/openstudio-standards/prototypes/common/buildings/Prototype.LargeHotel.rb +0 -64
- data/lib/openstudio-standards/prototypes/common/buildings/Prototype.LargeOffice.rb +0 -25
- data/lib/openstudio-standards/prototypes/common/buildings/Prototype.MediumOffice.rb +0 -25
- data/lib/openstudio-standards/prototypes/common/buildings/Prototype.Warehouse.rb +1 -11
- data/lib/openstudio-standards/prototypes/common/objects/Prototype.AirConditionerVariableRefrigerantFlow.rb +5 -1
- data/lib/openstudio-standards/prototypes/common/objects/Prototype.Fan.rb +0 -7
- data/lib/openstudio-standards/prototypes/common/objects/Prototype.HeatExchangerAirToAirSensibleAndLatent.rb +36 -18
- data/lib/openstudio-standards/prototypes/common/objects/Prototype.Model.hvac.rb +1 -1
- data/lib/openstudio-standards/prototypes/common/objects/Prototype.Model.rb +121 -239
- data/lib/openstudio-standards/prototypes/common/objects/Prototype.hvac_systems.rb +179 -151
- data/lib/openstudio-standards/prototypes/common/objects/Prototype.refrigeration.rb +0 -466
- data/lib/openstudio-standards/prototypes/common/objects/Prototype.utilities.rb +18 -2
- data/lib/openstudio-standards/refrigeration/create_case.rb +125 -0
- data/lib/openstudio-standards/refrigeration/create_compressor.rb +78 -0
- data/lib/openstudio-standards/refrigeration/create_compressor_rack.rb +48 -0
- data/lib/openstudio-standards/refrigeration/create_refrigeration_system.rb +74 -0
- data/lib/openstudio-standards/refrigeration/create_typical_refrigeration.rb +161 -0
- data/lib/openstudio-standards/refrigeration/create_walkin.rb +116 -0
- data/lib/openstudio-standards/refrigeration/data/refrigerated_cases.csv +31 -0
- data/lib/openstudio-standards/refrigeration/data/refrigerated_walkins.csv +76 -0
- data/lib/openstudio-standards/refrigeration/data/refrigeration_compressors.csv +13 -0
- data/lib/openstudio-standards/refrigeration/data/typical_refrigerated_cases.csv +17 -0
- data/lib/openstudio-standards/refrigeration/data/typical_refrigerated_walkins.csv +53 -0
- data/lib/openstudio-standards/refrigeration/information.rb +130 -0
- data/lib/openstudio-standards/schedules/parametric.rb +1 -1
- data/lib/openstudio-standards/service_water_heating/create_typical.rb +299 -0
- data/lib/openstudio-standards/service_water_heating/create_water_heating_loop.rb +16 -14
- data/lib/openstudio-standards/service_water_heating/data/convert_data.rb +119 -0
- data/lib/openstudio-standards/service_water_heating/data/typical_water_use_equipment.csv +54 -0
- data/lib/openstudio-standards/service_water_heating/data/typical_water_use_equipment.json +810 -0
- data/lib/openstudio-standards/service_water_heating/information.rb +69 -0
- data/lib/openstudio-standards/sql_file/fenestration.rb +1 -1
- data/lib/openstudio-standards/standards/Standards.AirConditionerVariableRefrigerantFlow.rb +154 -0
- data/lib/openstudio-standards/standards/Standards.AirLoopHVAC.rb +35 -12
- data/lib/openstudio-standards/standards/Standards.CoilCoolingDXMultiSpeed.rb +110 -61
- data/lib/openstudio-standards/standards/Standards.CoilCoolingDXSingleSpeed.rb +128 -29
- data/lib/openstudio-standards/standards/Standards.CoilCoolingDXTwoSpeed.rb +103 -38
- data/lib/openstudio-standards/standards/Standards.CoilCoolingWaterToAirHeatPumpEquationFit.rb +1 -1
- data/lib/openstudio-standards/standards/Standards.CoilDX.rb +106 -5
- data/lib/openstudio-standards/standards/Standards.CoilHeatingGasMultiStage.rb +8 -8
- data/lib/openstudio-standards/standards/Standards.CoolingTower.rb +44 -17
- data/lib/openstudio-standards/standards/Standards.Fan.rb +32 -21
- data/lib/openstudio-standards/standards/Standards.FluidCooler.rb +45 -18
- data/lib/openstudio-standards/standards/Standards.HeatExchangerSensLat.rb +14 -9
- data/lib/openstudio-standards/standards/Standards.Model.rb +294 -76
- data/lib/openstudio-standards/standards/Standards.Motor.rb +66 -0
- data/lib/openstudio-standards/standards/Standards.PlanarSurface.rb +2 -1
- data/lib/openstudio-standards/standards/Standards.Pump.rb +34 -20
- data/lib/openstudio-standards/standards/Standards.ServiceWaterHeating.rb +0 -353
- data/lib/openstudio-standards/standards/Standards.Space.rb +3 -107
- data/lib/openstudio-standards/standards/Standards.SpaceType.rb +2 -57
- data/lib/openstudio-standards/standards/Standards.Surface.rb +11 -3
- data/lib/openstudio-standards/standards/Standards.ThermalZone.rb +1 -120
- data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2004/data/ashrae_90_1_2004.computer_room_acs.json +142 -0
- data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2004/data/ashrae_90_1_2004.economizers.json +1006 -596
- data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2004/data/ashrae_90_1_2004.energy_recovery.json +724 -0
- data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2004/data/ashrae_90_1_2004.ext_ltg.json +1258 -163
- data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2004/data/ashrae_90_1_2004.motors.json +1070 -140
- data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2004/data/ashrae_90_1_2004.spc_typ.json +33 -3374
- data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2004/data/ashrae_90_1_2004.unitary_acs.json +1400 -340
- data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2004/data/ashrae_90_1_2004.vrfs.json +769 -0
- data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2007/comstock_ashrae_90_1_2007/data/comstock_ashrae_90_1_2007.spc_typ.json +2 -5338
- data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2007/data/ashrae_90_1_2007.computer_room_acs.json +142 -0
- data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2007/data/ashrae_90_1_2007.economizers.json +1006 -596
- data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2007/data/ashrae_90_1_2007.energy_recovery.json +724 -0
- data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2007/data/ashrae_90_1_2007.ext_ltg.json +1258 -163
- data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2007/data/ashrae_90_1_2007.motors.json +1070 -140
- data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2007/data/ashrae_90_1_2007.spc_typ.json +15 -3343
- data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2007/data/ashrae_90_1_2007.unitary_acs.json +1840 -372
- data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2007/data/ashrae_90_1_2007.vrfs.json +769 -0
- data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2010/ashrae_90_1_2010.AirLoopHVAC.rb +20 -10
- data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2010/ashrae_90_1_2010.Space.rb +0 -9
- data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2010/comstock_ashrae_90_1_2010/data/comstock_ashrae_90_1_2010.spc_typ.json +0 -5382
- data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2010/data/ashrae_90_1_2010.computer_room_acs.json +142 -0
- data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2010/data/ashrae_90_1_2010.economizers.json +1006 -628
- data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2010/data/ashrae_90_1_2010.energy_recovery.json +718 -712
- data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2010/data/ashrae_90_1_2010.ext_ltg.json +1438 -163
- data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2010/data/ashrae_90_1_2010.motors.json +2552 -182
- data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2010/data/ashrae_90_1_2010.spc_typ.json +14 -3368
- data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2010/data/ashrae_90_1_2010.unitary_acs.json +2348 -352
- data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2010/data/ashrae_90_1_2010.vrfs.json +769 -0
- data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2013/ashrae_90_1_2013.AirLoopHVAC.rb +47 -61
- data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2013/ashrae_90_1_2013.Model.rb +6 -0
- data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2013/ashrae_90_1_2013.Motor.rb +11 -0
- data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2013/ashrae_90_1_2013.Space.rb +0 -9
- data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2013/comstock_ashrae_90_1_2013/data/comstock_ashrae_90_1_2013.spc_typ.json +2 -5522
- data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2013/data/ashrae_90_1_2013.computer_room_acs.json +142 -0
- data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2013/data/ashrae_90_1_2013.economizers.json +1006 -628
- data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2013/data/ashrae_90_1_2013.energy_recovery.json +1358 -1346
- data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2013/data/ashrae_90_1_2013.ext_ltg.json +1438 -163
- data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2013/data/ashrae_90_1_2013.motors.json +1359 -189
- data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2013/data/ashrae_90_1_2013.spc_typ.json +19 -3451
- data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2013/data/ashrae_90_1_2013.unitary_acs.json +2176 -616
- data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2013/data/ashrae_90_1_2013.vrfs.json +616 -0
- data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2016/ashrae_90_1_2016.AirLoopHVAC.rb +47 -61
- data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2016/ashrae_90_1_2016.Model.rb +9 -0
- data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2016/ashrae_90_1_2016.Motor.rb +11 -0
- data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2016/ashrae_90_1_2016.Space.rb +0 -9
- data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2016/comstock_ashrae_90_1_2016/data/comstock_ashrae_90_1_2016.spc_typ.json +8 -6055
- data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2016/data/ashrae_90_1_2016.computer_room_acs.json +142 -0
- data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2016/data/ashrae_90_1_2016.economizers.json +1006 -628
- data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2016/data/ashrae_90_1_2016.energy_recovery.json +1188 -1424
- data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2016/data/ashrae_90_1_2016.ext_ltg.json +1498 -163
- data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2016/data/ashrae_90_1_2016.motors.json +1769 -189
- data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2016/data/ashrae_90_1_2016.spc_typ.json +15 -3422
- data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2016/data/ashrae_90_1_2016.unitary_acs.json +1807 -408
- data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2016/data/ashrae_90_1_2016.vrfs.json +1024 -0
- data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2019/ashrae_90_1_2019.AirLoopHVAC.rb +70 -87
- data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2019/ashrae_90_1_2019.Model.rb +9 -0
- data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2019/ashrae_90_1_2019.Motor.rb +11 -0
- data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2019/ashrae_90_1_2019.Space.rb +0 -9
- data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2019/comstock_ashrae_90_1_2019/data/comstock_ashrae_90_1_2019.spc_typ.json +8 -6080
- data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2019/data/ashrae_90_1_2019.computer_room_acs.json +142 -0
- data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2019/data/ashrae_90_1_2019.economizers.json +1006 -628
- data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2019/data/ashrae_90_1_2019.energy_recovery.json +2806 -3296
- data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2019/data/ashrae_90_1_2019.ext_ltg.json +1558 -163
- data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2019/data/ashrae_90_1_2019.motors.json +1759 -189
- data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2019/data/ashrae_90_1_2019.spc_typ.json +16 -3448
- data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2019/data/ashrae_90_1_2019.unitary_acs.json +2758 -422
- data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2019/data/ashrae_90_1_2019.vrfs.json +684 -0
- data/lib/openstudio-standards/standards/ashrae_90_1/data/ashrae_90_1.schedules.json +14 -3318
- data/lib/openstudio-standards/standards/ashrae_90_1/doe_ref_1980_2004/comstock_doe_ref_1980_2004/data/comstock_doe_ref_1980_2004.spc_typ.json +2 -4786
- data/lib/openstudio-standards/standards/ashrae_90_1/doe_ref_1980_2004/data/doe_ref_1980_2004.chillers.json +1 -1
- data/lib/openstudio-standards/standards/ashrae_90_1/doe_ref_1980_2004/data/doe_ref_1980_2004.economizers.json +953 -207
- data/lib/openstudio-standards/standards/ashrae_90_1/doe_ref_1980_2004/data/doe_ref_1980_2004.energy_recovery.json +724 -0
- data/lib/openstudio-standards/standards/ashrae_90_1/doe_ref_1980_2004/data/doe_ref_1980_2004.ext_ltg.json +5 -5
- data/lib/openstudio-standards/standards/ashrae_90_1/doe_ref_1980_2004/data/doe_ref_1980_2004.spc_typ.json +11 -2858
- data/lib/openstudio-standards/standards/ashrae_90_1/doe_ref_1980_2004/doe_ref_1980_2004.AirConditionerVariableRefrigerantFlow.rb +13 -0
- data/lib/openstudio-standards/standards/ashrae_90_1/doe_ref_1980_2004/doe_ref_1980_2004.Model.rb +0 -18
- data/lib/openstudio-standards/standards/ashrae_90_1/doe_ref_pre_1980/comstock_doe_ref_pre_1980/data/comstock_doe_ref_pre_1980.spc_typ.json +1 -4739
- data/lib/openstudio-standards/standards/ashrae_90_1/doe_ref_pre_1980/data/doe_ref_pre_1980.chillers.json +0 -51
- data/lib/openstudio-standards/standards/ashrae_90_1/doe_ref_pre_1980/data/doe_ref_pre_1980.economizers.json +953 -207
- data/lib/openstudio-standards/standards/ashrae_90_1/doe_ref_pre_1980/data/doe_ref_pre_1980.energy_recovery.json +724 -0
- data/lib/openstudio-standards/standards/ashrae_90_1/doe_ref_pre_1980/data/doe_ref_pre_1980.ext_ltg.json +5 -5
- data/lib/openstudio-standards/standards/ashrae_90_1/doe_ref_pre_1980/data/doe_ref_pre_1980.spc_typ.json +9 -2830
- data/lib/openstudio-standards/standards/ashrae_90_1/doe_ref_pre_1980/doe_ref_pre_1980.AirConditionerVariableRefrigerantFlow.rb +13 -0
- data/lib/openstudio-standards/standards/ashrae_90_1/doe_ref_pre_1980/doe_ref_pre_1980.Model.rb +0 -18
- data/lib/openstudio-standards/standards/ashrae_90_1/nrel_zne_ready_2017/data/nrel_zne_ready_2017.economizers.json +1006 -564
- data/lib/openstudio-standards/standards/ashrae_90_1/nrel_zne_ready_2017/data/nrel_zne_ready_2017.energy_recovery.json +1264 -0
- data/lib/openstudio-standards/standards/ashrae_90_1/nrel_zne_ready_2017/data/nrel_zne_ready_2017.ext_ltg.json +5 -5
- data/lib/openstudio-standards/standards/ashrae_90_1/nrel_zne_ready_2017/data/nrel_zne_ready_2017.spc_typ.json +0 -1079
- data/lib/openstudio-standards/standards/ashrae_90_1/nrel_zne_ready_2017/nrel_zne_ready_2017.AirLoopHVAC.rb +132 -288
- data/lib/openstudio-standards/standards/ashrae_90_1/nrel_zne_ready_2017/nrel_zne_ready_2017.HeatExchangerSensLat.rb +44 -20
- data/lib/openstudio-standards/standards/ashrae_90_1/nrel_zne_ready_2017/nrel_zne_ready_2017.Model.rb +11 -0
- data/lib/openstudio-standards/standards/ashrae_90_1/nrel_zne_ready_2017/nrel_zne_ready_2017.Space.rb +0 -8
- data/lib/openstudio-standards/standards/ashrae_90_1/ze_aedg_multifamily/data/ze_aedg_multifamily.economizers.json +1006 -564
- data/lib/openstudio-standards/standards/ashrae_90_1/ze_aedg_multifamily/data/ze_aedg_multifamily.energy_recovery.json +1264 -0
- data/lib/openstudio-standards/standards/ashrae_90_1/ze_aedg_multifamily/data/ze_aedg_multifamily.ext_ltg.json +5 -5
- data/lib/openstudio-standards/standards/ashrae_90_1/ze_aedg_multifamily/data/ze_aedg_multifamily.spc_typ.json +0 -1079
- data/lib/openstudio-standards/standards/ashrae_90_1/ze_aedg_multifamily/ze_aedg_multifamily.AirLoopHVAC.rb +137 -288
- data/lib/openstudio-standards/standards/ashrae_90_1/ze_aedg_multifamily/ze_aedg_multifamily.HeatExchangerSensLat.rb +44 -20
- data/lib/openstudio-standards/standards/ashrae_90_1/ze_aedg_multifamily/ze_aedg_multifamily.Model.rb +11 -0
- data/lib/openstudio-standards/standards/ashrae_90_1/ze_aedg_multifamily/ze_aedg_multifamily.Space.rb +0 -9
- data/lib/openstudio-standards/standards/ashrae_90_1_prm/ashrae_90_1_prm.AirLoopHVAC.rb +12 -10
- data/lib/openstudio-standards/standards/ashrae_90_1_prm/ashrae_90_1_prm.CoilCoolingDXSingleSpeed.rb +8 -6
- data/lib/openstudio-standards/standards/ashrae_90_1_prm/ashrae_90_1_prm.CoilCoolingDXTwoSpeed.rb +8 -6
- data/lib/openstudio-standards/standards/ashrae_90_1_prm/ashrae_90_1_prm.CoilDX.rb +9 -3
- data/lib/openstudio-standards/standards/ashrae_90_1_prm/ashrae_90_1_prm.Fan.rb +6 -40
- data/lib/openstudio-standards/standards/ashrae_90_1_prm/ashrae_90_1_prm.Model.rb +30 -337
- data/lib/openstudio-standards/standards/ashrae_90_1_prm/ashrae_90_1_prm.Space.rb +4 -5
- data/lib/openstudio-standards/standards/ashrae_90_1_prm/ashrae_90_1_prm.SpaceType.rb +1 -2
- data/lib/openstudio-standards/standards/ashrae_90_1_prm/ashrae_90_1_prm.rb +56 -3
- data/lib/openstudio-standards/standards/ashrae_90_1_prm/ashrae_90_1_prm_2019/ashrae_90_1_prm_2019.Model.rb +80 -0
- data/lib/openstudio-standards/standards/ashrae_90_1_prm/ashrae_90_1_prm_2019/ashrae_90_1_prm_2019.rb +0 -10
- data/lib/openstudio-standards/standards/ashrae_90_1_prm/ashrae_90_1_prm_2019/ashrae_90_1_prm_2019_WaterHeaterMixed.rb +35 -0
- data/lib/openstudio-standards/standards/ashrae_90_1_prm/ashrae_90_1_prm_2019/data/ashrae_90_1_prm_2019.economizers.json +550 -0
- data/lib/openstudio-standards/standards/ashrae_90_1_prm/ashrae_90_1_prm_2019/data/ashrae_90_1_prm_2019.energy_recovery.json +724 -0
- data/lib/openstudio-standards/standards/ashrae_90_1_prm/ashrae_90_1_prm_2019/data/ashrae_90_1_prm_2019.ext_ltg.json +1216 -0
- data/lib/openstudio-standards/standards/ashrae_90_1_prm/ashrae_90_1_prm_2019/data/ashrae_90_1_prm_2019.heat_pumps.json +5 -5
- data/lib/openstudio-standards/standards/ashrae_90_1_prm/ashrae_90_1_prm_2019/data/ashrae_90_1_prm_2019.motors.json +225 -245
- data/lib/openstudio-standards/standards/ashrae_90_1_prm/ashrae_90_1_prm_2019/data/ashrae_90_1_prm_2019.unitary_acs.json +174 -78
- data/lib/openstudio-standards/standards/ashrae_90_1_prm/ashrae_90_1_prm_2019/data/ashrae_90_1_prm_2019.water_heaters.json +354 -317
- data/lib/openstudio-standards/standards/ashrae_90_1_prm/userdata_csv/userdata_enums.rb +19 -3
- data/lib/openstudio-standards/standards/ashrae_90_1_prm/userdata_json/userdata_airloop_hvac.json +185 -0
- data/lib/openstudio-standards/standards/ashrae_90_1_prm/userdata_json/userdata_airloop_hvac_doas.json +127 -0
- data/lib/openstudio-standards/standards/ashrae_90_1_prm/userdata_json/userdata_building.json +121 -0
- data/lib/openstudio-standards/standards/ashrae_90_1_prm/userdata_json/userdata_design_specification_outdoor_air.json +49 -0
- data/lib/openstudio-standards/standards/ashrae_90_1_prm/userdata_json/userdata_electric_equipment.json +113 -0
- data/lib/openstudio-standards/standards/ashrae_90_1_prm/userdata_json/userdata_exterior_lights.json +120 -0
- data/lib/openstudio-standards/standards/ashrae_90_1_prm/userdata_json/userdata_space.json +388 -0
- data/lib/openstudio-standards/standards/ashrae_90_1_prm/userdata_json/userdata_spacetype.json +367 -0
- data/lib/openstudio-standards/standards/ashrae_90_1_prm/userdata_json/userdata_thermal_zone.json +56 -0
- data/lib/openstudio-standards/standards/ashrae_90_1_prm/userdata_json/userdata_wateruse_connections.json +37 -0
- data/lib/openstudio-standards/standards/ashrae_90_1_prm/userdata_json/userdata_wateruse_equipment.json +69 -0
- data/lib/openstudio-standards/standards/ashrae_90_1_prm/userdata_json/userdata_wateruse_equipment_definition.json +37 -0
- data/lib/openstudio-standards/standards/cbes/cbes_pre_1978/data/cbes_pre_1978.ext_ltg.json +5 -5
- data/lib/openstudio-standards/standards/cbes/cbes_t24_1978/data/cbes_t24_1978.ext_ltg.json +5 -5
- data/lib/openstudio-standards/standards/cbes/cbes_t24_1992/data/cbes_t24_1992.ext_ltg.json +5 -5
- data/lib/openstudio-standards/standards/cbes/cbes_t24_2001/data/cbes_t24_2001.ext_ltg.json +5 -5
- data/lib/openstudio-standards/standards/cbes/cbes_t24_2005/data/cbes_t24_2005.ext_ltg.json +5 -5
- data/lib/openstudio-standards/standards/cbes/cbes_t24_2008/data/cbes_t24_2008.ext_ltg.json +5 -5
- data/lib/openstudio-standards/standards/deer/deer_1985/comstock_deer_1985/data/comstock_deer_1985.ext_ltg.json +5 -5
- data/lib/openstudio-standards/standards/deer/deer_1985/data/deer_1985.ext_ltg.json +5 -5
- data/lib/openstudio-standards/standards/deer/deer_1996/comstock_deer_1996/data/comstock_deer_1996.ext_ltg.json +5 -5
- data/lib/openstudio-standards/standards/deer/deer_1996/data/deer_1996.ext_ltg.json +5 -5
- data/lib/openstudio-standards/standards/deer/deer_2003/comstock_deer_2003/data/comstock_deer_2003.ext_ltg.json +5 -5
- data/lib/openstudio-standards/standards/deer/deer_2003/data/deer_2003.ext_ltg.json +5 -5
- data/lib/openstudio-standards/standards/deer/deer_2007/comstock_deer_2007/data/comstock_deer_2007.ext_ltg.json +5 -5
- data/lib/openstudio-standards/standards/deer/deer_2007/data/deer_2007.ext_ltg.json +5 -5
- data/lib/openstudio-standards/standards/deer/deer_2011/comstock_deer_2011/data/comstock_deer_2011.ext_ltg.json +5 -5
- data/lib/openstudio-standards/standards/deer/deer_2011/data/deer_2011.ext_ltg.json +5 -5
- data/lib/openstudio-standards/standards/deer/deer_2014/comstock_deer_2014/data/comstock_deer_2014.ext_ltg.json +5 -5
- data/lib/openstudio-standards/standards/deer/deer_2014/data/deer_2014.ext_ltg.json +5 -5
- data/lib/openstudio-standards/standards/deer/deer_2015/comstock_deer_2015/data/comstock_deer_2015.ext_ltg.json +5 -5
- data/lib/openstudio-standards/standards/deer/deer_2015/data/deer_2015.ext_ltg.json +5 -5
- data/lib/openstudio-standards/standards/deer/deer_2017/comstock_deer_2017/data/comstock_deer_2017.ext_ltg.json +5 -5
- data/lib/openstudio-standards/standards/deer/deer_2017/data/deer_2017.ext_ltg.json +5 -5
- data/lib/openstudio-standards/standards/deer/deer_2020/comstock_deer_2020/data/comstock_deer_2020.ext_ltg.json +5 -5
- data/lib/openstudio-standards/standards/deer/deer_2020/data/deer_2020.ext_ltg.json +5 -5
- data/lib/openstudio-standards/standards/deer/deer_2025/comstock_deer_2025/data/comstock_deer_2025.ext_ltg.json +5 -5
- data/lib/openstudio-standards/standards/deer/deer_2025/data/deer_2025.ext_ltg.json +5 -5
- data/lib/openstudio-standards/standards/deer/deer_2030/comstock_deer_2030/data/comstock_deer_2030.ext_ltg.json +5 -5
- data/lib/openstudio-standards/standards/deer/deer_2030/data/deer_2030.ext_ltg.json +5 -5
- data/lib/openstudio-standards/standards/deer/deer_2035/comstock_deer_2035/data/comstock_deer_2035.ext_ltg.json +5 -5
- data/lib/openstudio-standards/standards/deer/deer_2035/data/deer_2035.ext_ltg.json +5 -5
- data/lib/openstudio-standards/standards/deer/deer_2040/comstock_deer_2040/data/comstock_deer_2040.ext_ltg.json +5 -5
- data/lib/openstudio-standards/standards/deer/deer_2040/data/deer_2040.ext_ltg.json +5 -5
- data/lib/openstudio-standards/standards/deer/deer_2045/comstock_deer_2045/data/comstock_deer_2045.ext_ltg.json +5 -5
- data/lib/openstudio-standards/standards/deer/deer_2045/data/deer_2045.ext_ltg.json +5 -5
- data/lib/openstudio-standards/standards/deer/deer_2050/comstock_deer_2050/data/comstock_deer_2050.ext_ltg.json +5 -5
- data/lib/openstudio-standards/standards/deer/deer_2050/data/deer_2050.ext_ltg.json +5 -5
- data/lib/openstudio-standards/standards/deer/deer_2055/comstock_deer_2055/data/comstock_deer_2055.ext_ltg.json +5 -5
- data/lib/openstudio-standards/standards/deer/deer_2055/data/deer_2055.ext_ltg.json +5 -5
- data/lib/openstudio-standards/standards/deer/deer_2060/comstock_deer_2060/data/comstock_deer_2060.ext_ltg.json +5 -5
- data/lib/openstudio-standards/standards/deer/deer_2060/data/deer_2060.ext_ltg.json +5 -5
- data/lib/openstudio-standards/standards/deer/deer_2065/comstock_deer_2065/data/comstock_deer_2065.ext_ltg.json +5 -5
- data/lib/openstudio-standards/standards/deer/deer_2065/data/deer_2065.ext_ltg.json +5 -5
- data/lib/openstudio-standards/standards/deer/deer_2070/comstock_deer_2070/data/comstock_deer_2070.ext_ltg.json +5 -5
- data/lib/openstudio-standards/standards/deer/deer_2070/data/deer_2070.ext_ltg.json +5 -5
- data/lib/openstudio-standards/standards/deer/deer_2075/comstock_deer_2075/data/comstock_deer_2075.ext_ltg.json +5 -5
- data/lib/openstudio-standards/standards/deer/deer_2075/data/deer_2075.ext_ltg.json +5 -5
- data/lib/openstudio-standards/standards/deer/deer_pre_1975/comstock_deer_pre_1975/data/comstock_deer_pre_1975.ext_ltg.json +5 -5
- data/lib/openstudio-standards/standards/deer/deer_pre_1975/data/deer_pre_1975.ext_ltg.json +5 -5
- data/lib/openstudio-standards/standards/necb/BTAPPRE1980/btap_pre1980.rb +10 -1
- data/lib/openstudio-standards/standards/necb/BTAPPRE1980/data/unitary_acs.json +20 -20
- data/lib/openstudio-standards/standards/necb/ECMS/hvac_systems.rb +379 -27
- data/lib/openstudio-standards/standards/necb/NECB2011/autozone.rb +1 -4
- data/lib/openstudio-standards/standards/necb/NECB2011/beps_compliance_path.rb +0 -1
- data/lib/openstudio-standards/standards/necb/NECB2011/data/fuel_type_sets.json +1 -1
- data/lib/openstudio-standards/standards/necb/NECB2011/data/unitary_acs.json +20 -20
- data/lib/openstudio-standards/standards/necb/NECB2011/hvac_systems.rb +34 -22
- data/lib/openstudio-standards/standards/necb/NECB2011/necb_2011.rb +76 -23
- data/lib/openstudio-standards/standards/necb/NECB2011/necb_shw_calculation.xlsx +0 -0
- data/lib/openstudio-standards/standards/necb/NECB2011/service_water_heating.rb +4 -5
- data/lib/openstudio-standards/standards/necb/NECB2011/system_fuels.rb +6 -2
- data/lib/openstudio-standards/standards/necb/NECB2015/data/unitary_acs.json +26 -24
- data/lib/openstudio-standards/standards/necb/NECB2015/hvac_systems.rb +2 -1
- data/lib/openstudio-standards/standards/necb/NECB2020/data/unitary_acs.json +38 -32
- data/lib/openstudio-standards/standards/necb/common/btap_data.rb +215 -18
- data/lib/openstudio-standards/standards/necb/common/btap_datapoint.rb +190 -15
- data/lib/openstudio-standards/standards/necb/common/national_carbon_price_sched_feb_2025.json +60 -0
- data/lib/openstudio-standards/standards/necb/common/utility_pricing_2025-02-20.csv +92 -0
- data/lib/openstudio-standards/utilities/ruleset_check.rb +204 -0
- data/lib/openstudio-standards/version.rb +1 -1
- data/lib/openstudio-standards/weather/information.rb +1 -1
- data/lib/openstudio-standards.rb +32 -12
- metadata +78 -80
- data/lib/openstudio-standards/prototypes/ashrae_90_1/doe_ref_1980_2004/doe_ref_1980_2004.refrigeration.rb +0 -13
- data/lib/openstudio-standards/prototypes/ashrae_90_1/doe_ref_pre_1980/doe_ref_pre_1980.refrigeration.rb +0 -13
- data/lib/openstudio-standards/prototypes/cbes/cbes.refrigeration.rb +0 -13
- data/lib/openstudio-standards/prototypes/common/objects/Prototype.Model.exterior_lights.rb +0 -432
- data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2004/ashrae_90_1_2004.Space.rb +0 -11
- data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2004/comstock_ashrae_90_1_2004/data/comstock_ashrae_90_1_2004.ext_ltg.json +0 -169
- data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2004/comstock_ashrae_90_1_2004/data/comstock_ashrae_90_1_2004.ref_cases.json +0 -1456
- data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2004/comstock_ashrae_90_1_2004/data/comstock_ashrae_90_1_2004.ref_lnup.json +0 -562
- data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2004/comstock_ashrae_90_1_2004/data/comstock_ashrae_90_1_2004.spc_typ.json +0 -20804
- data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2007/ashrae_90_1_2007.Space.rb +0 -11
- data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2007/comstock_ashrae_90_1_2007/data/comstock_ashrae_90_1_2007.ext_ltg.json +0 -169
- data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2007/comstock_ashrae_90_1_2007/data/comstock_ashrae_90_1_2007.ref_cases.json +0 -1456
- data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2007/comstock_ashrae_90_1_2007/data/comstock_ashrae_90_1_2007.ref_lnup.json +0 -562
- data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2010/comstock_ashrae_90_1_2010/data/comstock_ashrae_90_1_2010.ext_ltg.json +0 -169
- data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2010/comstock_ashrae_90_1_2010/data/comstock_ashrae_90_1_2010.ref_cases.json +0 -1456
- data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2010/comstock_ashrae_90_1_2010/data/comstock_ashrae_90_1_2010.ref_lnup.json +0 -562
- data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2013/comstock_ashrae_90_1_2013/data/comstock_ashrae_90_1_2013.ext_ltg.json +0 -169
- data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2013/comstock_ashrae_90_1_2013/data/comstock_ashrae_90_1_2013.ref_cases.json +0 -1456
- data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2013/comstock_ashrae_90_1_2013/data/comstock_ashrae_90_1_2013.ref_lnup.json +0 -562
- data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2016/comstock_ashrae_90_1_2016/data/comstock_ashrae_90_1_2016.ext_ltg.json +0 -169
- data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2016/comstock_ashrae_90_1_2016/data/comstock_ashrae_90_1_2016.ref_cases.json +0 -763
- data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2016/comstock_ashrae_90_1_2016/data/comstock_ashrae_90_1_2016.ref_lnup.json +0 -562
- data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2019/comstock_ashrae_90_1_2019/data/comstock_ashrae_90_1_2019.ext_ltg.json +0 -169
- data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2019/comstock_ashrae_90_1_2019/data/comstock_ashrae_90_1_2019.ref_cases.json +0 -763
- data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2019/comstock_ashrae_90_1_2019/data/comstock_ashrae_90_1_2019.ref_lnup.json +0 -562
- data/lib/openstudio-standards/standards/ashrae_90_1/doe_ref_1980_2004/comstock_doe_ref_1980_2004/data/comstock_doe_ref_1980_2004.ext_ltg.json +0 -169
- data/lib/openstudio-standards/standards/ashrae_90_1/doe_ref_1980_2004/comstock_doe_ref_1980_2004/data/comstock_doe_ref_1980_2004.ref_cases.json +0 -1456
- data/lib/openstudio-standards/standards/ashrae_90_1/doe_ref_1980_2004/comstock_doe_ref_1980_2004/data/comstock_doe_ref_1980_2004.ref_lnup.json +0 -562
- data/lib/openstudio-standards/standards/ashrae_90_1/doe_ref_pre_1980/comstock_doe_ref_pre_1980/data/comstock_doe_ref_pre_1980.ext_ltg.json +0 -169
- data/lib/openstudio-standards/standards/ashrae_90_1/doe_ref_pre_1980/comstock_doe_ref_pre_1980/data/comstock_doe_ref_pre_1980.ref_cases.json +0 -1456
- data/lib/openstudio-standards/standards/ashrae_90_1/doe_ref_pre_1980/comstock_doe_ref_pre_1980/data/comstock_doe_ref_pre_1980.ref_lnup.json +0 -562
- data/lib/openstudio-standards/standards/ashrae_90_1_prm/ashrae_90_1_prm_2019/data/ashrae_90_1_prm_2019.prm_economizers.json +0 -213
- data/lib/openstudio-standards/standards/cbes/cbes.Space.rb +0 -11
- data/lib/openstudio-standards/standards/cbes/cbes_t24_2005/cbes_t24_2005.Space.rb +0 -11
- data/lib/openstudio-standards/standards/cbes/cbes_t24_2008/cbes_t24_2008.Space.rb +0 -11
- data/lib/openstudio-standards/standards/deer/deer.Space.rb +0 -20
- data/lib/openstudio-standards/standards/deer/deer_1985/data/deer_1985.ref_cases.json +0 -1456
- data/lib/openstudio-standards/standards/deer/deer_1985/data/deer_1985.ref_lnup.json +0 -562
- data/lib/openstudio-standards/standards/deer/deer_1996/data/deer_1996.ref_cases.json +0 -1456
- data/lib/openstudio-standards/standards/deer/deer_1996/data/deer_1996.ref_lnup.json +0 -562
- data/lib/openstudio-standards/standards/deer/deer_2003/data/deer_2003.ref_cases.json +0 -1456
- data/lib/openstudio-standards/standards/deer/deer_2003/data/deer_2003.ref_lnup.json +0 -562
- data/lib/openstudio-standards/standards/deer/deer_2007/data/deer_2007.ref_cases.json +0 -1456
- data/lib/openstudio-standards/standards/deer/deer_2007/data/deer_2007.ref_lnup.json +0 -562
- data/lib/openstudio-standards/standards/deer/deer_2011/data/deer_2011.ref_cases.json +0 -1456
- data/lib/openstudio-standards/standards/deer/deer_2011/data/deer_2011.ref_lnup.json +0 -562
- data/lib/openstudio-standards/standards/deer/deer_2014/data/deer_2014.ref_cases.json +0 -1456
- data/lib/openstudio-standards/standards/deer/deer_2014/data/deer_2014.ref_lnup.json +0 -562
- data/lib/openstudio-standards/standards/deer/deer_2015/data/deer_2015.ref_cases.json +0 -1456
- data/lib/openstudio-standards/standards/deer/deer_2015/data/deer_2015.ref_lnup.json +0 -562
- data/lib/openstudio-standards/standards/deer/deer_2017/data/deer_2017.ref_cases.json +0 -1456
- data/lib/openstudio-standards/standards/deer/deer_2017/data/deer_2017.ref_lnup.json +0 -562
- data/lib/openstudio-standards/standards/deer/deer_2020/data/deer_2020.ref_cases.json +0 -1456
- data/lib/openstudio-standards/standards/deer/deer_2020/data/deer_2020.ref_lnup.json +0 -562
- data/lib/openstudio-standards/standards/deer/deer_2025/data/deer_2025.ref_cases.json +0 -1456
- data/lib/openstudio-standards/standards/deer/deer_2025/data/deer_2025.ref_lnup.json +0 -562
- data/lib/openstudio-standards/standards/deer/deer_2030/data/deer_2030.ref_cases.json +0 -1456
- data/lib/openstudio-standards/standards/deer/deer_2030/data/deer_2030.ref_lnup.json +0 -562
- data/lib/openstudio-standards/standards/deer/deer_2035/data/deer_2035.ref_cases.json +0 -1456
- data/lib/openstudio-standards/standards/deer/deer_2035/data/deer_2035.ref_lnup.json +0 -562
- data/lib/openstudio-standards/standards/deer/deer_2040/data/deer_2040.ref_cases.json +0 -1456
- data/lib/openstudio-standards/standards/deer/deer_2040/data/deer_2040.ref_lnup.json +0 -562
- data/lib/openstudio-standards/standards/deer/deer_2045/data/deer_2045.ref_cases.json +0 -1456
- data/lib/openstudio-standards/standards/deer/deer_2045/data/deer_2045.ref_lnup.json +0 -562
- data/lib/openstudio-standards/standards/deer/deer_2050/data/deer_2050.ref_cases.json +0 -1456
- data/lib/openstudio-standards/standards/deer/deer_2050/data/deer_2050.ref_lnup.json +0 -562
- data/lib/openstudio-standards/standards/deer/deer_2055/data/deer_2055.ref_cases.json +0 -1456
- data/lib/openstudio-standards/standards/deer/deer_2055/data/deer_2055.ref_lnup.json +0 -562
- data/lib/openstudio-standards/standards/deer/deer_2060/data/deer_2060.ref_cases.json +0 -1456
- data/lib/openstudio-standards/standards/deer/deer_2060/data/deer_2060.ref_lnup.json +0 -562
- data/lib/openstudio-standards/standards/deer/deer_2065/data/deer_2065.ref_cases.json +0 -1456
- data/lib/openstudio-standards/standards/deer/deer_2065/data/deer_2065.ref_lnup.json +0 -562
- data/lib/openstudio-standards/standards/deer/deer_2070/data/deer_2070.ref_cases.json +0 -1456
- data/lib/openstudio-standards/standards/deer/deer_2070/data/deer_2070.ref_lnup.json +0 -562
- data/lib/openstudio-standards/standards/deer/deer_2075/data/deer_2075.ref_cases.json +0 -1456
- data/lib/openstudio-standards/standards/deer/deer_2075/data/deer_2075.ref_lnup.json +0 -562
- data/lib/openstudio-standards/standards/deer/deer_pre_1975/data/deer_pre_1975.ref_cases.json +0 -1456
- data/lib/openstudio-standards/standards/deer/deer_pre_1975/data/deer_pre_1975.ref_lnup.json +0 -562
@@ -0,0 +1,37 @@
|
|
1
|
+
{
|
2
|
+
"exterior_lighting": [
|
3
|
+
{
|
4
|
+
"lighting_zone": 3,
|
5
|
+
"exterior_lighting_zone_name": "All Other Areas",
|
6
|
+
"lighting_generation": "default",
|
7
|
+
"control_option": "AstronomicalClock",
|
8
|
+
"building_facade_and_landscape_automatic_shut_off": 1,
|
9
|
+
"occupancy_setback_reduction": null,
|
10
|
+
"base_site_allowance_power": 750.0,
|
11
|
+
"base_site_allowance_fraction": null,
|
12
|
+
"parking_areas_and_drives": 0.041,
|
13
|
+
"walkways_less_than_10ft_wide": 0.8,
|
14
|
+
"walkways_10ft_wide_or_greater": 0.16,
|
15
|
+
"stairways": 1.0,
|
16
|
+
"pedestrian_tunnels": 0.2,
|
17
|
+
"landscaping": 0.05,
|
18
|
+
"main_entries": 30.0,
|
19
|
+
"other_doors": 20.0,
|
20
|
+
"entry_canopies": 0.4,
|
21
|
+
"loading_docks": 0.5,
|
22
|
+
"sales_canopies": 0.8,
|
23
|
+
"outdoor_sales_open_areas": 0.5,
|
24
|
+
"outdoor_sales_street_frontage_for_vehicle_sales": 10.0,
|
25
|
+
"building_facades": 0.15,
|
26
|
+
"building_facades_alt_perim": 3.75,
|
27
|
+
"automated_teller_machines_per_location": 270.0,
|
28
|
+
"automated_teller_machines_per_machine": 90.0,
|
29
|
+
"entries_and_gates": 0.75,
|
30
|
+
"loading_areas_for_emergency_vehicles": 0.5,
|
31
|
+
"drive_through_windows_and_doors": 400.0,
|
32
|
+
"parking_near_24_hour_entrances": 800.0,
|
33
|
+
"roadway_parking": 0.0,
|
34
|
+
"notes": "Parking Areas and Drives lpd updated based on values derived from 2015 U.S. Lighting Market Characterization report."
|
35
|
+
}
|
36
|
+
]
|
37
|
+
}
|
@@ -0,0 +1,202 @@
|
|
1
|
+
module OpenstudioStandards
|
2
|
+
# The Exterior Lighting module provides methods create, modify, and get information about model exterior lighting
|
3
|
+
module ExteriorLighting
|
4
|
+
# @!group Information
|
5
|
+
|
6
|
+
# get exterior lighting areas, distances, and counts
|
7
|
+
#
|
8
|
+
# @param model [OpenStudio::Model::Model] OpenStudio model object
|
9
|
+
# @return [Hash] hash of exterior lighting value types and building type and model specific values
|
10
|
+
def self.model_get_exterior_lighting_sizes(model)
|
11
|
+
# load parking file and convert to hash table
|
12
|
+
parking_csv = "#{__dir__}/data/parking.csv"
|
13
|
+
unless File.exist?(parking_csv)
|
14
|
+
OpenStudio.logFree(OpenStudio::Error, 'openstudio.standards.ExteriorLighting', "Unable to find file: #{parking_csv}")
|
15
|
+
return false
|
16
|
+
end
|
17
|
+
parking_tbl = CSV.table(parking_csv, encoding: 'ISO8859-1:utf-8')
|
18
|
+
parking_hsh = parking_tbl.map(&:to_hash)
|
19
|
+
|
20
|
+
# load entryways file and convert to hash table
|
21
|
+
entryways_csv = "#{__dir__}/data/entryways.csv"
|
22
|
+
unless File.exist?(entryways_csv)
|
23
|
+
OpenStudio.logFree(OpenStudio::Error, 'openstudio.standards.ExteriorLighting', "Unable to find file: #{entryways_csv}")
|
24
|
+
return false
|
25
|
+
end
|
26
|
+
entryways_tbl = CSV.table(entryways_csv, encoding: 'ISO8859-1:utf-8')
|
27
|
+
entryways_hsh = entryways_tbl.map(&:to_hash)
|
28
|
+
|
29
|
+
# get space properties from the model
|
30
|
+
space_type_hash = OpenstudioStandards::CreateTypical.model_get_space_type_information(model)
|
31
|
+
|
32
|
+
# populate building_type_hashes from space_type_hash
|
33
|
+
building_type_hashes = {}
|
34
|
+
space_type_hash.each do |space_type, hash|
|
35
|
+
# if space type standards building type already exists,
|
36
|
+
# add data to that standards building type in building_type_hashes
|
37
|
+
if building_type_hashes.key?(hash[:standards_building_type])
|
38
|
+
building_type_hashes[hash[:standards_building_type]][:effective_number_of_spaces] += hash[:effective_number_of_spaces]
|
39
|
+
building_type_hashes[hash[:standards_building_type]][:floor_area] += hash[:floor_area]
|
40
|
+
building_type_hashes[hash[:standards_building_type]][:number_of_people] += hash[:number_of_people]
|
41
|
+
building_type_hashes[hash[:standards_building_type]][:number_of_students] += hash[:number_of_students]
|
42
|
+
building_type_hashes[hash[:standards_building_type]][:number_of_units] += hash[:number_of_units]
|
43
|
+
building_type_hashes[hash[:standards_building_type]][:number_of_beds] += hash[:number_of_beds]
|
44
|
+
else
|
45
|
+
# initialize hash for this building type
|
46
|
+
building_type_hash = {}
|
47
|
+
building_type_hash[:effective_number_of_spaces] = hash[:effective_number_of_spaces]
|
48
|
+
building_type_hash[:floor_area] = hash[:floor_area]
|
49
|
+
building_type_hash[:number_of_people] = hash[:number_of_people]
|
50
|
+
building_type_hash[:number_of_students] = hash[:number_of_students]
|
51
|
+
building_type_hash[:number_of_units] = hash[:number_of_units]
|
52
|
+
building_type_hash[:number_of_beds] = hash[:number_of_beds]
|
53
|
+
building_type_hashes[hash[:standards_building_type]] = building_type_hash
|
54
|
+
end
|
55
|
+
end
|
56
|
+
|
57
|
+
# rename Office to SmallOffice, MediumOffice or LargeOffice depending on size
|
58
|
+
if building_type_hashes.key?('Office')
|
59
|
+
floor_area = building_type_hashes['Office'][:floor_area]
|
60
|
+
office_type = if floor_area < 2750
|
61
|
+
'SmallOffice'
|
62
|
+
elsif floor_area < 25_250
|
63
|
+
'MediumOffice'
|
64
|
+
else
|
65
|
+
'LargeOffice'
|
66
|
+
end
|
67
|
+
building_type_hashes[office_type] = building_type_hashes.delete('Office')
|
68
|
+
end
|
69
|
+
|
70
|
+
# initialize parking areas and drives area variables
|
71
|
+
parking_area_and_drives_area = 0.0
|
72
|
+
main_entries = 0.0
|
73
|
+
other_doors = 0.0
|
74
|
+
rollup_doors = 0.0
|
75
|
+
drive_through_windows = 0.0
|
76
|
+
canopy_entry_area = 0.0
|
77
|
+
canopy_emergency_area = 0.0
|
78
|
+
ground_story_ext_wall_area = 0.0
|
79
|
+
|
80
|
+
# temporary std for model_effective_num_stories method
|
81
|
+
std = Standard.build('90.1-2013')
|
82
|
+
|
83
|
+
# calculate exterior lighting properties for each building type
|
84
|
+
building_type_hashes.each do |building_type, hash|
|
85
|
+
# calculate floor area and ground floor area in IP units
|
86
|
+
floor_area_ft2 = OpenStudio.convert(hash[:floor_area], 'm^2', 'ft^2').get
|
87
|
+
effective_num_stories = std.model_effective_num_stories(model)
|
88
|
+
ground_floor_area_ft2 = floor_area_ft2 / effective_num_stories[:above_grade]
|
89
|
+
|
90
|
+
# load parking area properties for standards building type
|
91
|
+
parking_properties = parking_hsh.select { |h| h[:building_type] == building_type }
|
92
|
+
|
93
|
+
if parking_properties.nil? || parking_properties.empty?
|
94
|
+
OpenStudio.logFree(OpenStudio::Warn, 'openstudio.prototype.ExteriorLighting', "Could not find parking data for #{building_type}. Will not add exterior parking lighting. The building type data needs to be added to the parking lighting data.")
|
95
|
+
return {}
|
96
|
+
end
|
97
|
+
parking_properties = parking_properties[0]
|
98
|
+
|
99
|
+
# calculate number of parking spots
|
100
|
+
num_spots = 0.0
|
101
|
+
if !parking_properties[:building_area_per_spot].nil?
|
102
|
+
num_spots += floor_area_ft2 / parking_properties[:building_area_per_spot].to_f
|
103
|
+
elsif !parking_properties[:units_per_spot].nil?
|
104
|
+
num_spots += hash[:number_of_units] / parking_properties[:units_per_spot].to_f
|
105
|
+
elsif !parking_properties[:students_per_spot].nil?
|
106
|
+
num_spots += hash[:number_of_students] / parking_properties[:students_per_spot].to_f
|
107
|
+
elsif !parking_properties[:beds_per_spot].nil?
|
108
|
+
num_spots += hash[:number_of_beds] / parking_properties[:beds_per_spot].to_f
|
109
|
+
end
|
110
|
+
|
111
|
+
# add to cumulative parking area
|
112
|
+
parking_area_and_drives_area += num_spots * parking_properties[:parking_area_per_spot]
|
113
|
+
|
114
|
+
# load entryways properties for standards building type
|
115
|
+
entryways_properties = entryways_hsh.select { |eh| eh[:building_type] == building_type }
|
116
|
+
|
117
|
+
if entryways_properties.nil? || entryways_properties.empty?
|
118
|
+
OpenStudio.logFree(OpenStudio::Error, 'openstudio.prototype.ExteriorLighting', "Could not find entryway data for #{building_type}.")
|
119
|
+
return {}
|
120
|
+
end
|
121
|
+
entryways_properties = entryways_properties[0]
|
122
|
+
|
123
|
+
# calculate door, window, and canopy length properties for exterior lighting
|
124
|
+
# main entries
|
125
|
+
unless entryways_properties[:entrance_doors_per_10000_ft2].nil?
|
126
|
+
main_entries += (ground_floor_area_ft2 / 10_000.0) * entryways_properties[:entrance_doors_per_10000_ft2]
|
127
|
+
end
|
128
|
+
|
129
|
+
# other doors
|
130
|
+
unless entryways_properties[:other_doors_per_10000_ft2].nil?
|
131
|
+
other_doors += (ground_floor_area_ft2 / 10_000.0) * entryways_properties[:other_doors_per_10000_ft2]
|
132
|
+
end
|
133
|
+
|
134
|
+
# rollup doors
|
135
|
+
unless entryways_properties[:rollup_doors_per_10000_ft2].nil?
|
136
|
+
rollup_doors += (ground_floor_area_ft2 / 10_000.0) / entryways_properties[:rollup_doors_per_10000_ft2].to_f
|
137
|
+
end
|
138
|
+
|
139
|
+
# drive through windows
|
140
|
+
unless entryways_properties[:floor_area_per_drive_through_window].nil?
|
141
|
+
drive_through_windows += ground_floor_area_ft2 / entryways_properties[:floor_area_per_drive_through_window].to_f
|
142
|
+
end
|
143
|
+
|
144
|
+
# entrance canopies
|
145
|
+
if !entryways_properties[:entrance_canopies].nil? && !entryways_properties[:canopy_size].nil?
|
146
|
+
canopy_entry_area += entryways_properties[:entrance_canopies] * entryways_properties[:canopy_size]
|
147
|
+
end
|
148
|
+
|
149
|
+
# emergency canopies
|
150
|
+
if !entryways_properties[:emergency_canopies].nil? && !entryways_properties[:canopy_size].nil?
|
151
|
+
canopy_emergency_area += entryways_properties[:emergency_canopies] * entryways_properties[:canopy_size]
|
152
|
+
end
|
153
|
+
|
154
|
+
# building_facades
|
155
|
+
# determine effective number of stories to find first above grade story exterior wall area
|
156
|
+
ground_story = effective_num_stories[:story_hash].keys[effective_num_stories[:below_grade]]
|
157
|
+
ground_story_ext_wall_area_m2 = effective_num_stories[:story_hash][ground_story][:ext_wall_area]
|
158
|
+
ground_story_ext_wall_area += OpenStudio.convert(ground_story_ext_wall_area_m2, 'm^2', 'ft^2').get
|
159
|
+
end
|
160
|
+
|
161
|
+
# no source for width of different entry types
|
162
|
+
main_entry_width_ft = 8.0
|
163
|
+
other_doors_width_ft = 4.0
|
164
|
+
rollup_door_width_ft = 8.0
|
165
|
+
|
166
|
+
# ensure the building has at least 1 main entry
|
167
|
+
main_entries = [1.0, main_entries].max
|
168
|
+
|
169
|
+
# populate hash
|
170
|
+
area_length_count_hash = {}
|
171
|
+
area_length_count_hash[:parking_area_and_drives_area] = parking_area_and_drives_area
|
172
|
+
area_length_count_hash[:main_entries] = main_entries * main_entry_width_ft
|
173
|
+
area_length_count_hash[:other_doors] = other_doors * other_doors_width_ft
|
174
|
+
area_length_count_hash[:rollup_doors] = rollup_doors * rollup_door_width_ft
|
175
|
+
area_length_count_hash[:drive_through_windows] = drive_through_windows
|
176
|
+
area_length_count_hash[:canopy_entry_area] = canopy_entry_area
|
177
|
+
area_length_count_hash[:canopy_emergency_area] = canopy_emergency_area
|
178
|
+
area_length_count_hash[:building_facades] = ground_story_ext_wall_area
|
179
|
+
|
180
|
+
return area_length_count_hash
|
181
|
+
end
|
182
|
+
|
183
|
+
# get exterior lighting properties by lighting generation
|
184
|
+
#
|
185
|
+
# @param lighting_generation [String] lighting generation
|
186
|
+
# @return [Hash] hash of exterior lighting properties
|
187
|
+
def self.model_get_exterior_lighting_properties(lighting_generation: 'default',
|
188
|
+
lighting_zone: 3)
|
189
|
+
# load typical exterior lighting data
|
190
|
+
data = JSON.parse(File.read("#{__dir__}/data/typical_exterior_lighting.json"))
|
191
|
+
exterior_lighting_properties = data['exterior_lighting'].select { |hash| (hash['lighting_generation'] == lighting_generation) && (hash['lighting_zone'] == lighting_zone) }[0]
|
192
|
+
|
193
|
+
# make sure lighting properties were found
|
194
|
+
if exterior_lighting_properties.nil?
|
195
|
+
OpenStudio.logFree(OpenStudio::Warn, 'openstudio.standards.ExteriorLighting', "Exterior lighting properties not found for lighting generation #{lighting_generation}, exterior lighting zone #{lighting_zone}.")
|
196
|
+
return nil
|
197
|
+
end
|
198
|
+
|
199
|
+
return exterior_lighting_properties
|
200
|
+
end
|
201
|
+
end
|
202
|
+
end
|
@@ -262,7 +262,7 @@ module OpenstudioStandards
|
|
262
262
|
# @!group Information:Space
|
263
263
|
|
264
264
|
# Calculate the space envelope area.
|
265
|
-
# According to the 90.1 definition, building envelope
|
265
|
+
# According to the 90.1 definition, the building envelope includes:
|
266
266
|
# 1. "the elements of a building that separate conditioned spaces from the exterior"
|
267
267
|
# 2. "the elements of a building that separate conditioned space from unconditioned
|
268
268
|
# space or that enclose semiheated spaces through which thermal energy may be
|
@@ -912,7 +912,7 @@ module OpenstudioStandards
|
|
912
912
|
model.getBuildingStorys.sort.each do |story|
|
913
913
|
z = OpenstudioStandards::Geometry.building_story_get_minimum_height(story)
|
914
914
|
if (minimum_height - z).abs < tolerance
|
915
|
-
OpenStudio.logFree(OpenStudio::Debug, 'openstudio.standards.
|
915
|
+
OpenStudio.logFree(OpenStudio::Debug, 'openstudio.standards.Geometry.Information', "The story with a min z value of #{minimum_height.round(2)} is #{story.name}.")
|
916
916
|
matched_story = story
|
917
917
|
end
|
918
918
|
end
|
@@ -1172,6 +1172,53 @@ module OpenstudioStandards
|
|
1172
1172
|
return perimeter
|
1173
1173
|
end
|
1174
1174
|
|
1175
|
+
|
1176
|
+
# Calculate the model envelope area.
|
1177
|
+
# According to the 90.1 definition, the building envelope includes:
|
1178
|
+
# 1. "the elements of a building that separate conditioned spaces from the exterior"
|
1179
|
+
# 2. "the elements of a building that separate conditioned space from unconditioned
|
1180
|
+
# space or that enclose semiheated spaces through which thermal energy may be
|
1181
|
+
# transferred to or from the exterior, to or from unconditioned spaces or to or
|
1182
|
+
# from conditioned spaces."
|
1183
|
+
#
|
1184
|
+
# Outside boundary conditions currently supported:
|
1185
|
+
# - Adiabatic
|
1186
|
+
# - Surface
|
1187
|
+
# - Outdoors
|
1188
|
+
# - Foundation
|
1189
|
+
# - Ground
|
1190
|
+
# - GroundFCfactorMethod
|
1191
|
+
# - OtherSideCoefficients
|
1192
|
+
# - OtherSideConditionsModel
|
1193
|
+
# - GroundSlabPreprocessorAverage
|
1194
|
+
# - GroundSlabPreprocessorCore
|
1195
|
+
# - GroundSlabPreprocessorPerimeter
|
1196
|
+
# - GroundBasementPreprocessorAverageWall
|
1197
|
+
# - GroundBasementPreprocessorAverageFloor
|
1198
|
+
# - GroundBasementPreprocessorUpperWall
|
1199
|
+
# - GroundBasementPreprocessorLowerWall
|
1200
|
+
#
|
1201
|
+
# Surface type currently supported:
|
1202
|
+
# - Floor
|
1203
|
+
# - Wall
|
1204
|
+
# - RoofCeiling
|
1205
|
+
#
|
1206
|
+
# @param model [OpenStudio::Model::Model] OpenStudio model object
|
1207
|
+
# @param multiplier [Boolean] account for space multipliers
|
1208
|
+
# @return [Double] area in m^2
|
1209
|
+
def self.model_get_envelope_area(model, multiplier: true)
|
1210
|
+
building_envelope_area_m2 = 0
|
1211
|
+
model.getSpaces.each do |space|
|
1212
|
+
building_envelope_area_m2 += OpenstudioStandards::Geometry.space_get_envelope_area(space)
|
1213
|
+
end
|
1214
|
+
if building_envelope_area_m2 < 0.01
|
1215
|
+
OpenStudio.logFree(OpenStudio::Warn, 'openstudio.standards.Geometry.Information', 'Calculated building envelope area is 0 m2')
|
1216
|
+
return 0.0
|
1217
|
+
end
|
1218
|
+
|
1219
|
+
return building_envelope_area_m2
|
1220
|
+
end
|
1221
|
+
|
1175
1222
|
# @!endgroup Information:Model
|
1176
1223
|
end
|
1177
1224
|
end
|
@@ -0,0 +1,169 @@
|
|
1
|
+
module OpenstudioStandards
|
2
|
+
# The HVAC module provides methods create, modify, and get information about HVAC systems in the model
|
3
|
+
module HVAC
|
4
|
+
# @!group Component:Create
|
5
|
+
# Methods to create HVAC component objects
|
6
|
+
|
7
|
+
# creates HeatExchangerAirToAirSensibleAndLatent object with user-input effectiveness values
|
8
|
+
#
|
9
|
+
# @param model [<OpenStudio::Model::Model>] OpenStudio model
|
10
|
+
# @param name [String]
|
11
|
+
# @param type [String] Heat Exchanger Type. One of 'Plate', 'Rotary'
|
12
|
+
# @param economizer_lockout [Boolean] whether hx is locked out during economizing
|
13
|
+
# @param supply_air_outlet_temperature_control [Boolean]
|
14
|
+
# @param frost_control_type [String] HX frost control type. One of 'None', 'ExhaustAirRecirculation', 'ExhaustOnly', 'MinimumExhaustTemperature'
|
15
|
+
# @param nominal_electric_power [Float] Nominal electric power
|
16
|
+
# @param sensible_heating_100_eff [Float]
|
17
|
+
# @param sensible_heating_75_eff [Float]
|
18
|
+
# @param latent_heating_100_eff [Float]
|
19
|
+
# @param latent_heating_75_eff [Float]
|
20
|
+
# @param sensible_cooling_100_eff [Float]
|
21
|
+
# @param sensible_cooling_75_eff [Float]
|
22
|
+
# @param latent_cooling_100_eff [Float]
|
23
|
+
# @param latent_cooling_75_eff [Float]
|
24
|
+
# @return [<OpenStudio::Model::HeatExchangerAirToAirSensibleAndLatent>]
|
25
|
+
def self.create_hx_air_to_air_sensible_and_latent(model,
|
26
|
+
name: nil,
|
27
|
+
type: nil,
|
28
|
+
economizer_lockout: nil,
|
29
|
+
supply_air_outlet_temperature_control: nil,
|
30
|
+
frost_control_type: nil,
|
31
|
+
nominal_electric_power: nil,
|
32
|
+
sensible_heating_100_eff: nil,
|
33
|
+
sensible_heating_75_eff: nil,
|
34
|
+
latent_heating_100_eff: nil,
|
35
|
+
latent_heating_75_eff: nil,
|
36
|
+
sensible_cooling_100_eff: nil,
|
37
|
+
sensible_cooling_75_eff: nil,
|
38
|
+
latent_cooling_100_eff: nil,
|
39
|
+
latent_cooling_75_eff: nil)
|
40
|
+
|
41
|
+
hx = OpenStudio::Model::HeatExchangerAirToAirSensibleAndLatent.new(model)
|
42
|
+
hx.setName(name) unless name.nil?
|
43
|
+
|
44
|
+
unless type.nil?
|
45
|
+
if OpenStudio::Model::HeatExchangerAirToAirSensibleAndLatent.heatExchangerTypeValues.include?(type)
|
46
|
+
hx.setHeatExchangerType(type)
|
47
|
+
else
|
48
|
+
OpenStudio.logFree(OpenStudio::Warn, 'openstudio.model.Hvac', "Entered heat exchanger type #{type} not a valid type value. Enter one of #{OpenStudio::Model::HeatExchangerAirToAirSensibleAndLatent.heatExchangerTypeValues}")
|
49
|
+
end
|
50
|
+
end
|
51
|
+
|
52
|
+
unless frost_control_type.nil?
|
53
|
+
if OpenStudio::Model::HeatExchangerAirToAirSensibleAndLatent.frostControlTypeValues.include?(frost_control_type)
|
54
|
+
hx.setFrostControlType(frost_control_type)
|
55
|
+
else
|
56
|
+
OpenStudio.logFree(OpenStudio::Warn, 'openstudio.model.Hvac', "Entered heat exchanger frost control type #{frost_control_type} not a valid type value. Enter one of #{OpenStudio::Model::HeatExchangerAirToAirSensibleAndLatent.frostControlTypeValues}")
|
57
|
+
end
|
58
|
+
end
|
59
|
+
|
60
|
+
hx.setEconomizerLockout(economizer_lockout) unless economizer_lockout.nil?
|
61
|
+
hx.setSupplyAirOutletTemperatureControl(supply_air_outlet_temperature_control) unless supply_air_outlet_temperature_control.nil?
|
62
|
+
hx.setNominalElectricPower(nominal_electric_power) unless nominal_electric_power.nil?
|
63
|
+
|
64
|
+
if model.version < OpenStudio::VersionString.new('3.8.0')
|
65
|
+
hx.setSensibleEffectivenessat100HeatingAirFlow(sensible_heating_100_eff) unless sensible_heating_100_eff.nil?
|
66
|
+
hx.setSensibleEffectivenessat75HeatingAirFlow(sensible_heating_75_eff) unless sensible_heating_75_eff.nil?
|
67
|
+
hx.setLatentEffectivenessat100HeatingAirFlow(latent_heating_100_eff) unless latent_heating_100_eff.nil?
|
68
|
+
hx.setLatentEffectivenessat75HeatingAirFlow(latent_heating_75_eff) unless latent_heating_75_eff.nil?
|
69
|
+
hx.setSensibleEffectivenessat100CoolingAirFlow(sensible_cooling_100_eff) unless sensible_cooling_100_eff.nil?
|
70
|
+
hx.setSensibleEffectivenessat75CoolingAirFlow(sensible_cooling_75_eff) unless sensible_cooling_75_eff.nil?
|
71
|
+
hx.setLatentEffectivenessat100CoolingAirFlow(latent_cooling_100_eff) unless latent_cooling_100_eff.nil?
|
72
|
+
hx.setLatentEffectivenessat75CoolingAirFlow(latent_cooling_75_eff) unless latent_cooling_75_eff.nil?
|
73
|
+
else
|
74
|
+
effectiveness_inputs = Hash.new { |hash, key| hash[key] = {} }
|
75
|
+
effectiveness_inputs['Sensible Heating'][0.75] = sensible_heating_75_eff.to_f unless sensible_heating_75_eff.nil?
|
76
|
+
effectiveness_inputs['Sensible Heating'][1.0] = sensible_heating_100_eff.to_f unless sensible_heating_100_eff.nil?
|
77
|
+
effectiveness_inputs['Latent Heating'][0.75] = latent_heating_75_eff.to_f unless latent_heating_75_eff.nil?
|
78
|
+
effectiveness_inputs['Latent Heating'][1.0] = latent_heating_100_eff.to_f unless latent_heating_100_eff.nil?
|
79
|
+
effectiveness_inputs['Sensible Cooling'][0.75] = sensible_cooling_75_eff.to_f unless sensible_cooling_75_eff.nil?
|
80
|
+
effectiveness_inputs['Sensible Cooling'][1.0] = sensible_cooling_100_eff.to_f unless sensible_cooling_100_eff.nil?
|
81
|
+
effectiveness_inputs['Latent Cooling'][0.75] = latent_cooling_75_eff.to_f unless latent_cooling_75_eff.nil?
|
82
|
+
effectiveness_inputs['Latent Cooling'][1.0] = latent_cooling_100_eff.to_f unless latent_cooling_100_eff.nil?
|
83
|
+
|
84
|
+
if effectiveness_inputs.values.all?(&:empty?)
|
85
|
+
OpenStudio.logFree(OpenStudio::Info, 'openstudio.model.Hvac', 'Creating HX with historical effectiveness curves')
|
86
|
+
defaults = true
|
87
|
+
else
|
88
|
+
defaults = false
|
89
|
+
end
|
90
|
+
|
91
|
+
OpenstudioStandards::HVAC.heat_exchanger_air_to_air_set_effectiveness_values(hx, defaults: defaults, values: effectiveness_inputs)
|
92
|
+
end
|
93
|
+
|
94
|
+
return hx
|
95
|
+
end
|
96
|
+
|
97
|
+
# creates LookupTable objects to define effectiveness of HeatExchangerAirToAirSensibleAndLatent objects
|
98
|
+
#
|
99
|
+
# @param hx [<OpenStudio::Model::HeatExchangerAirToAirSensibleAndLatent>] OpenStudio HX object to update
|
100
|
+
# @param type [String] type of curve to create. one of 'Sensible Heating', 'Latent Heating, 'Sensible Cooling', 'Latent Cooling'
|
101
|
+
# @param values_hash [Hash{Float=>Float}] user_input flow decimal fraction => effectiveness decimal fraction pairs, e.g. {0.75 => 0.81, 1.0 => 0.76}
|
102
|
+
# @return [<OpenStudio::Model::TableLookup>] lookup table object
|
103
|
+
def self.create_hx_effectiveness_table(hx, type, values_hash)
|
104
|
+
# validate inputs
|
105
|
+
types = ['Sensible Heating', 'Latent Heating', 'Sensible Cooling', 'Latent Cooling']
|
106
|
+
unless types.include? type
|
107
|
+
OpenStudio.logFree(OpenStudio::Error, 'openstudio.model.Hvac', "#{__method__} requires effectiveness type as one of #{types}")
|
108
|
+
return false
|
109
|
+
end
|
110
|
+
|
111
|
+
def self.validate_effectiveness_hash(values_hash)
|
112
|
+
values_hash.all? do |key, value|
|
113
|
+
key.is_a?(Float) && value.is_a?(Float) && key.between?(0.0, 1.0) && value.between?(0.0, 1.0)
|
114
|
+
end
|
115
|
+
end
|
116
|
+
|
117
|
+
if !validate_effectiveness_hash(values_hash)
|
118
|
+
OpenStudio.logFree(OpenStudio::Error, 'openstudio.model.Hvac', "#{__method__} require values_hash to have keys and values between 0.0 and 1.0: #{values_hash}")
|
119
|
+
return false
|
120
|
+
end
|
121
|
+
|
122
|
+
# look for existing curve
|
123
|
+
type_a = type.split
|
124
|
+
method_name = "#{type_a[0].downcase}Effectivenessof#{type_a[1]}AirFlowCurve"
|
125
|
+
|
126
|
+
# use existing independent variable object if found and matches inputs
|
127
|
+
iv = nil
|
128
|
+
table = OpenStudio::Model::OptionalTableLookup.new
|
129
|
+
if hx.send(method_name).is_initialized
|
130
|
+
table = hx.send(method_name).get.to_TableLookup
|
131
|
+
curve = table.get
|
132
|
+
iv_existing = curve.independentVariables.first
|
133
|
+
if values_hash.keys.sort == iv_existing.values.sort
|
134
|
+
iv = iv_existing
|
135
|
+
end
|
136
|
+
end
|
137
|
+
|
138
|
+
# otherwise create new independent variable
|
139
|
+
if iv.nil?
|
140
|
+
iv = OpenStudio::Model::TableIndependentVariable.new(hx.model)
|
141
|
+
iv.setName("#{hx.name.get}_#{type.gsub(' ', '')}_IndependentVariable")
|
142
|
+
iv.setInterpolationMethod('Linear')
|
143
|
+
iv.setExtrapolationMethod('Linear')
|
144
|
+
iv.setMinimumValue(0.0)
|
145
|
+
iv.setMaximumValue(10.0)
|
146
|
+
iv.setUnitType('Dimensionless')
|
147
|
+
values_hash.keys.sort.each { |k| iv.addValue(k) }
|
148
|
+
end
|
149
|
+
|
150
|
+
# create new lookup table
|
151
|
+
t = OpenStudio::Model::TableLookup.new(hx.model)
|
152
|
+
t.setName("#{hx.name.get}_#{type.gsub(/ible|ent|ing|\s/, '')}Eff")
|
153
|
+
t.addIndependentVariable(iv)
|
154
|
+
t.setNormalizationMethod('DivisorOnly')
|
155
|
+
t.setMinimumOutput(0.0)
|
156
|
+
t.setMaximumOutput(10.0)
|
157
|
+
t.setOutputUnitType('Dimensionless')
|
158
|
+
values = values_hash.sort.map { |a| a[1] }
|
159
|
+
# protect against setting normalization divisor to zero for zero effectiveness
|
160
|
+
values[-1].zero? ? t.setNormalizationDivisor(1) : t.setNormalizationDivisor(values[-1])
|
161
|
+
values.each { |v| t.addOutputValue(v) }
|
162
|
+
|
163
|
+
# remove curve if found
|
164
|
+
table.get.remove if table.is_initialized
|
165
|
+
|
166
|
+
return t
|
167
|
+
end
|
168
|
+
end
|
169
|
+
end
|
@@ -0,0 +1,42 @@
|
|
1
|
+
module OpenstudioStandards
|
2
|
+
# The HVAC module provides methods create, modify, and get information about HVAC systems in the model
|
3
|
+
module HVAC
|
4
|
+
# @!group Component:Modify
|
5
|
+
# Methods to modify HVAC Component objects
|
6
|
+
|
7
|
+
# Applies historical default or user-input effectiveness values to a HeatExchanger:AirToAir:SensibleAndLatent object
|
8
|
+
#
|
9
|
+
# @param hx [<OpenStudio::Model::HeatExchangerAirToAirSensibleAndLatent>] OpenStudio HX object to update
|
10
|
+
# @param defaults [Boolean] flag to apply historical default curves
|
11
|
+
# @param values [Hash{String=>Hash{Float=>Float}}] user-input effectiveness values, where keys are one of
|
12
|
+
# 'Sensible Heating', 'Latent Heating, 'Sensible Cooling', 'Latent Cooling'
|
13
|
+
# and value is a hash of {flow decimal fraction => effectivess decimal fraction}, e.g. {0.75 => 0.81, 1.0 => 0.76}
|
14
|
+
# @return [<OpenStudio::Model::HeatExchangerAirToAirSensibleAndLatent>] modified OpenStudio HX object
|
15
|
+
def self.heat_exchanger_air_to_air_set_effectiveness_values(hx, defaults: false, values: nil)
|
16
|
+
if defaults
|
17
|
+
hx.assignHistoricalEffectivenessCurves
|
18
|
+
if values.nil?
|
19
|
+
return hx
|
20
|
+
end
|
21
|
+
elsif values.nil?
|
22
|
+
OpenStudio.logFree(OpenStudio::Warn, 'openstudio.model.Hvac', "#{__method__} called with defaults=false and no values provided. #{hx.name.get} will not be modified")
|
23
|
+
return hx
|
24
|
+
end
|
25
|
+
|
26
|
+
values.each do |type, values_hash|
|
27
|
+
# ensure values_hash has one value at 100% flow
|
28
|
+
unless values_hash.key?(1.0)
|
29
|
+
OpenStudio.logFree(OpenStudio::Error, 'openstudio.model.Hvac', "Effectiveness Values for #{type} do not include 100% flow effectivenss. Cannot set effectiveness curves")
|
30
|
+
return false
|
31
|
+
end
|
32
|
+
|
33
|
+
lookup_table = OpenstudioStandards::HVAC.create_hx_effectiveness_table(hx, type, values_hash)
|
34
|
+
type_a = type.split
|
35
|
+
hx.send("set#{type_a[0]}Effectivenessat100#{type_a[1]}AirFlow", values_hash[1.0])
|
36
|
+
hx.send("set#{type_a[0]}Effectivenessof#{type_a[1]}AirFlowCurve", lookup_table)
|
37
|
+
end
|
38
|
+
|
39
|
+
return hx
|
40
|
+
end
|
41
|
+
end
|
42
|
+
end
|
@@ -0,0 +1,108 @@
|
|
1
|
+
module OpenstudioStandards
|
2
|
+
# The HVAC module provides methods create, modify, and get information about HVAC systems in the model
|
3
|
+
module HVAC
|
4
|
+
# @!group Exhaust
|
5
|
+
# Methods to create exhaust fans
|
6
|
+
|
7
|
+
# Create and add an exhaust fan to a thermal zone.
|
8
|
+
#
|
9
|
+
# @param exhaust_zone [OpenStudio::Model::ThermalZone] The zone with the exhaust fan
|
10
|
+
# @param make_up_air_source_zone [OpenStudio::Model::ThermalZone] An optional source zone for make-up air
|
11
|
+
# @param make_up_air_fraction [Double] The fraction of make-up sourced from make_up_air_source_zone
|
12
|
+
# @return [OpenStudio::Model::FanZoneExhaust] The created exhaust fan
|
13
|
+
def self.create_exhaust_fan(exhaust_zone,
|
14
|
+
make_up_air_source_zone: nil,
|
15
|
+
make_up_air_fraction: 0.5)
|
16
|
+
# load exhaust fan data
|
17
|
+
data = JSON.parse(File.read("#{__dir__}/data/typical_exhaust.json"), symbolize_names: true)
|
18
|
+
|
19
|
+
# loop through spaces to get standards space information
|
20
|
+
space_type_hash = {}
|
21
|
+
exhaust_zone.spaces.each do |space|
|
22
|
+
next unless space.spaceType.is_initialized
|
23
|
+
next unless space.partofTotalFloorArea
|
24
|
+
|
25
|
+
space_type = space.spaceType.get
|
26
|
+
if space_type_hash.key?(space_type)
|
27
|
+
space_type_hash[space_type][:floor_area_m2] += space.floorArea * space.multiplier
|
28
|
+
else
|
29
|
+
next unless space_type.standardsBuildingType.is_initialized
|
30
|
+
next unless space_type.standardsSpaceType.is_initialized
|
31
|
+
|
32
|
+
|
33
|
+
standards_space_type = space_type.standardsSpaceType.get
|
34
|
+
standards_building_type = space_type.standardsBuildingType.get
|
35
|
+
|
36
|
+
exhaust_fan_properties = data[:space_types].select { |hash| (hash[:space_type] == standards_space_type) && (hash[:building_type] == standards_building_type) }
|
37
|
+
|
38
|
+
# skip spaces with no exhaust fan information defined
|
39
|
+
next if exhaust_fan_properties.empty?
|
40
|
+
|
41
|
+
exhaust_fan_properties = exhaust_fan_properties[0]
|
42
|
+
|
43
|
+
space_type_hash[space_type] = {}
|
44
|
+
space_type_hash[space_type][:floor_area_m2] = space.floorArea * space.multiplier
|
45
|
+
space_type_hash[space_type][:exhaust_cfm_per_area_ft2] = exhaust_fan_properties[:exhaust_per_area]
|
46
|
+
end
|
47
|
+
end
|
48
|
+
|
49
|
+
# total exhaust
|
50
|
+
exhaust_m3_per_s = 0.0
|
51
|
+
space_type_hash.each do |space_type, fields|
|
52
|
+
floor_area_ft2 = OpenStudio.convert(fields[:floor_area_m2], 'm^2', 'ft^2').get
|
53
|
+
cfm = fields[:exhaust_cfm_per_area_ft2].to_f * floor_area_ft2.to_f
|
54
|
+
exhaust_m3_per_s += OpenStudio.convert(cfm, 'cfm', 'm^3/s').get
|
55
|
+
end
|
56
|
+
|
57
|
+
if exhaust_m3_per_s.zero?
|
58
|
+
OpenStudio.logFree(OpenStudio::Warn, 'openstudio.standards.HVAC.create_exhaust_fan', "Calculated zero flow rate for thermal zone #{exhaust_zone.name}. No exhaust fan added.")
|
59
|
+
return nil
|
60
|
+
end
|
61
|
+
|
62
|
+
# placeholders for exhaust schedules
|
63
|
+
# @todo get the building HVAC schedule
|
64
|
+
exhaust_availability_schedule = exhaust_zone.model.alwaysOnDiscreteSchedule
|
65
|
+
exhaust_flow_fraction_schedule = exhaust_zone.model.alwaysOnDiscreteSchedule
|
66
|
+
|
67
|
+
# add exhaust fan
|
68
|
+
zone_exhaust_fan = OpenStudio::Model::FanZoneExhaust.new(exhaust_zone.model)
|
69
|
+
zone_exhaust_fan.setName("#{exhaust_zone.name} Exhaust Fan")
|
70
|
+
zone_exhaust_fan.setAvailabilitySchedule(exhaust_availability_schedule)
|
71
|
+
zone_exhaust_fan.setFlowFractionSchedule(exhaust_flow_fraction_schedule)
|
72
|
+
zone_exhaust_fan.setMaximumFlowRate(exhaust_m3_per_s)
|
73
|
+
zone_exhaust_fan.setEndUseSubcategory('Zone Exhaust Fans')
|
74
|
+
zone_exhaust_fan.addToThermalZone(exhaust_zone)
|
75
|
+
|
76
|
+
# add objects to account for makeup air
|
77
|
+
unless make_up_air_source_zone.nil?
|
78
|
+
# add balanced exhaust schedule to zone_exhaust_fan
|
79
|
+
balanced_exhaust_schedule = OpenstudioStandards::Schedules.create_constant_schedule_ruleset(make_up_air_source_zone.model, make_up_air_fraction,
|
80
|
+
name: "#{exhaust_zone.name} Balanced Exhaust Fraction Schedule",
|
81
|
+
schedule_type_limit: 'Fraction')
|
82
|
+
zone_exhaust_fan.setBalancedExhaustFractionSchedule(balanced_exhaust_schedule)
|
83
|
+
|
84
|
+
# use max value of balanced exhaust fraction schedule for maximum flow rate
|
85
|
+
max_sch_val = OpenstudioStandards::Schedules.schedule_get_min_max(balanced_exhaust_schedule)['max']
|
86
|
+
transfer_air_m3_per_s = exhaust_m3_per_s * max_sch_val
|
87
|
+
|
88
|
+
# add dummy exhaust fan to account for loss of transfer air
|
89
|
+
transfer_air_source_zone_exhaust = OpenStudio::Model::FanZoneExhaust.new(exhaust_zone.model)
|
90
|
+
transfer_air_source_zone_exhaust.setName("#{exhaust_zone.name} Transfer Air Source")
|
91
|
+
transfer_air_source_zone_exhaust.setAvailabilitySchedule(exhaust_availability_schedule)
|
92
|
+
transfer_air_source_zone_exhaust.setMaximumFlowRate(transfer_air_m3_per_s)
|
93
|
+
transfer_air_source_zone_exhaust.setFanEfficiency(1.0)
|
94
|
+
transfer_air_source_zone_exhaust.setPressureRise(0.0)
|
95
|
+
transfer_air_source_zone_exhaust.setEndUseSubcategory('Zone Exhaust Fans')
|
96
|
+
transfer_air_source_zone_exhaust.addToThermalZone(make_up_air_source_zone)
|
97
|
+
|
98
|
+
# add zone mixing
|
99
|
+
zone_mixing = OpenStudio::Model::ZoneMixing.new(exhaust_zone)
|
100
|
+
zone_mixing.setSchedule(exhaust_flow_fraction_schedule)
|
101
|
+
zone_mixing.setSourceZone(make_up_air_source_zone)
|
102
|
+
zone_mixing.setDesignFlowRate(transfer_air_m3_per_s)
|
103
|
+
end
|
104
|
+
|
105
|
+
return zone_exhaust_fan
|
106
|
+
end
|
107
|
+
end
|
108
|
+
end
|