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
@@ -7,7 +7,8 @@ class BTAPData
|
|
7
7
|
|
8
8
|
def initialize(model:, runner: nil, cost_result:, baseline_cost_equipment_total_cost_per_m_sq: -1.0,
|
9
9
|
baseline_cost_utility_neb_total_cost_per_m_sq: -1.0, baseline_energy_eui_total_gj_per_m_sq: -1.0, qaqc:,
|
10
|
-
npv_start_year
|
10
|
+
npv_start_year: 2022, npv_end_year: 2041, npv_discount_rate: 0.03, npv_discount_rate_carbon: 0.03, oerd_utility_pricing: nil,
|
11
|
+
utility_pricing_year: 2020)
|
11
12
|
@model = model
|
12
13
|
@error_warning = []
|
13
14
|
# sets sql file.
|
@@ -17,6 +18,7 @@ class BTAPData
|
|
17
18
|
@btap_data = {}
|
18
19
|
@btap_results_version = 1.00
|
19
20
|
@neb_prices_csv_file_name = File.join(__dir__, 'neb_end_use_prices.csv')
|
21
|
+
@neb_prices_csv_file_name = File.join(__dir__, 'utility_pricing_2025-02-20.csv') if oerd_utility_pricing.to_bool
|
20
22
|
@necb_reference_runs_csv_file_name = File.join(__dir__, 'necb_reference_runs.csv')
|
21
23
|
|
22
24
|
# Conditioned floor area is used so much. May as well make it a object variable.
|
@@ -49,7 +51,7 @@ class BTAPData
|
|
49
51
|
@btap_data.merge!(service_water_heating_data)
|
50
52
|
@btap_data.merge!(energy_eui_data(model))
|
51
53
|
@btap_data.merge!(energy_peak_data)
|
52
|
-
@btap_data.merge!(utility(model))
|
54
|
+
@btap_data.merge!(utility(model: model, utility_pricing_year: utility_pricing_year))
|
53
55
|
@btap_data.merge!(unmet_hours(model))
|
54
56
|
@btap_data.merge!outdoor_air_data(model)
|
55
57
|
|
@@ -87,8 +89,10 @@ class BTAPData
|
|
87
89
|
phius_performance_indicators(model)
|
88
90
|
# The below method calculates energy performance indicators (i.e. TEDI and MEUI) as per BC Energy Step Code
|
89
91
|
bc_energy_step_code_performance_indicators
|
92
|
+
# calculates annual peak electricity cost (dollar)
|
93
|
+
annual_peak_kW_per_m_sq = oerd_electricity_cost(model: model, utility_pricing_year: utility_pricing_year, oerd_utility_pricing: oerd_utility_pricing)
|
90
94
|
# calculate net present value
|
91
|
-
net_present_value(npv_start_year, npv_end_year, npv_discount_rate) unless cost_result.nil?
|
95
|
+
net_present_value(npv_start_year: npv_start_year, npv_end_year: npv_end_year, npv_discount_rate: npv_discount_rate, npv_discount_rate_carbon: npv_discount_rate_carbon, oerd_utility_pricing: oerd_utility_pricing, annual_peak_kW_per_m_sq: annual_peak_kW_per_m_sq) unless cost_result.nil?
|
92
96
|
|
93
97
|
measure_metrics(qaqc)
|
94
98
|
@btap_data
|
@@ -171,35 +175,43 @@ class BTAPData
|
|
171
175
|
return building_data
|
172
176
|
end
|
173
177
|
|
174
|
-
def net_present_value(npv_start_year, npv_end_year, npv_discount_rate)
|
178
|
+
def net_present_value(npv_start_year: 2022, npv_end_year: 2041, npv_discount_rate: 0.03, npv_discount_rate_carbon: 0.03, oerd_utility_pricing: false, annual_peak_kW_per_m_sq: nil)
|
175
179
|
|
176
180
|
# Find end year in the neb data
|
177
181
|
neb_header = CSV.read(@neb_prices_csv_file_name, headers: true).headers
|
178
182
|
neb_header.delete_if { |item| ["building_type", "province", "fuel_type"].include?(item) } # remove "building_type", "province", "fuel_type" from neb_header in order to have only years in neb_header
|
183
|
+
neb_header.delete_if { |item| ["rate_class", "units", "references", "links"].include?(item) } if oerd_utility_pricing # remove additional headers if the OERD data is used
|
179
184
|
neb_header.map(&:to_f) #convert years to float
|
180
185
|
year_max = neb_header.max
|
181
186
|
|
182
187
|
# Convert a string to a float
|
183
|
-
if npv_start_year.instance_of?(String) && npv_start_year != 'NECB_Default' && npv_start_year != 'none'
|
188
|
+
if npv_start_year.instance_of?(String) && npv_start_year != 'NECB_Default' && npv_start_year != 'none' && !npv_start_yeay.nil?
|
184
189
|
npv_start_year = npv_start_year.to_f
|
185
190
|
end
|
186
|
-
if npv_end_year.instance_of?(String) && npv_end_year != 'NECB_Default' && npv_end_year != 'none'
|
191
|
+
if npv_end_year.instance_of?(String) && npv_end_year != 'NECB_Default' && npv_end_year != 'none' && !npv_end_year.nil?
|
187
192
|
npv_end_year = npv_end_year.to_f
|
188
193
|
end
|
189
|
-
if npv_discount_rate.instance_of?(String) && npv_discount_rate != 'NECB_Default' && npv_discount_rate != 'none'
|
194
|
+
if npv_discount_rate.instance_of?(String) && npv_discount_rate != 'NECB_Default' && npv_discount_rate != 'none' && !npv_discount_rate.nil?
|
190
195
|
npv_discount_rate = npv_discount_rate.to_f
|
191
196
|
end
|
197
|
+
if npv_discount_rate_carbon.instance_of?(String) && npv_discount_rate_carbon != 'NECB_Default' && npv_discount_rate_carbon != 'none' && !npv_discount_rate_carbon.nil?
|
198
|
+
npv_discount_rate_carbon = npv_discount_rate_carbon.to_f
|
199
|
+
end
|
200
|
+
|
192
201
|
|
193
202
|
# Set default npv_start_year as 2022, npv_end_year as 2041, npv_discount_rate as 3%
|
194
|
-
if npv_start_year == 'NECB_Default' || npv_start_year
|
203
|
+
if npv_start_year == 'NECB_Default' || npv_start_year.nil? || npv_start_year == 'none'
|
195
204
|
npv_start_year = 2022
|
196
205
|
end
|
197
|
-
if npv_end_year == 'NECB_Default' || npv_end_year
|
206
|
+
if npv_end_year == 'NECB_Default' || npv_end_year.nil? || npv_end_year == 'none'
|
198
207
|
npv_end_year = 2041
|
199
208
|
end
|
200
|
-
if npv_discount_rate == 'NECB_Default' || npv_discount_rate
|
209
|
+
if npv_discount_rate == 'NECB_Default' || npv_discount_rate.nil? || npv_discount_rate == 'none'
|
201
210
|
npv_discount_rate = 0.03
|
202
211
|
end
|
212
|
+
if npv_discount_rate_carbon == 'NECB_Default' || npv_discount_rate_carbon.nil? || npv_discount_rate_carbon == 'none'
|
213
|
+
npv_discount_rate_carbon = 0.03
|
214
|
+
end
|
203
215
|
|
204
216
|
# Set npv_end_year as year_max if users' input > neb's end year
|
205
217
|
if npv_end_year > year_max.to_f
|
@@ -211,7 +223,7 @@ class BTAPData
|
|
211
223
|
# puts "npv_discount_rate is #{npv_discount_rate}"
|
212
224
|
|
213
225
|
# Get energy end-use prices (CER data from https://apps.cer-rec.gc.ca/ftrppndc/dflt.aspx?GoCTemplateCulture=en-CA)
|
214
|
-
@neb_prices_csv_file_name = "#{File.dirname(__FILE__)}/neb_end_use_prices.csv"
|
226
|
+
# @neb_prices_csv_file_name = "#{File.dirname(__FILE__)}/neb_end_use_prices.csv"
|
215
227
|
|
216
228
|
# Create a hash of the neb data.
|
217
229
|
neb_data = CSV.parse(File.read(@neb_prices_csv_file_name), headers: true, converters: :numeric).map(&:to_h)
|
@@ -233,20 +245,36 @@ class BTAPData
|
|
233
245
|
onsite_elec_generation = @btap_data['total_site_eui_gj_per_m_sq'] - @btap_data['net_site_eui_gj_per_m_sq']
|
234
246
|
if onsite_elec_generation > 0.0
|
235
247
|
eui_elec = @btap_data['energy_eui_electricity_gj_per_m_sq'] - onsite_elec_generation
|
248
|
+
# Calculate the saved GHG emissions from onsite electricity generatation (assume it does not emmit GHGs)
|
249
|
+
ghg_saved = get_utility_ghg_kg_per_gj(province: province_abbreviation, fuel_type: "Electricity") * onsite_elec_generation
|
250
|
+
# Convert to tonnes of ghg/m^2
|
251
|
+
ghg_elec = (@btap_data['cost_utility_ghg_electricity_kg_per_m_sq'].to_f - ghg_saved.to_f)/1000.0
|
236
252
|
else
|
237
253
|
eui_elec = @btap_data['energy_eui_electricity_gj_per_m_sq']
|
254
|
+
# Convert to tonnes of ghg/m^2
|
255
|
+
ghg_elec = @btap_data['cost_utility_ghg_electricity_kg_per_m_sq'].to_f/1000.0
|
238
256
|
end
|
239
257
|
# puts "onsite_elec_generation is #{onsite_elec_generation}"
|
240
258
|
# puts "eui_elec is #{eui_elec}"
|
241
259
|
row = neb_data.detect do |data|
|
242
260
|
(data['building_type'] == building_type) && (data['province'] == province) && (data['fuel_type'] == 'Electricity')
|
243
261
|
end
|
262
|
+
row_peak = nil
|
263
|
+
if oerd_utility_pricing && !annual_peak_kW_per_m_sq.nil?
|
264
|
+
row_peak = neb_data.detect do |data|
|
265
|
+
(data['building_type'] == building_type) && (data['province'] == province) && (data['fuel_type'] == 'Electricity Peak')
|
266
|
+
end
|
267
|
+
end
|
244
268
|
npv_elec = 0.0
|
245
269
|
year_index = 1.0
|
270
|
+
npv_elec_ghg = 0.0
|
271
|
+
npv_elec_peak = 0.0
|
246
272
|
if eui_elec > 0.0
|
247
273
|
for year in npv_start_year.to_int..npv_end_year.to_int
|
248
274
|
# puts "year, #{year}, #{row[year.to_s]}, year_index, #{year_index}"
|
249
275
|
npv_elec += (eui_elec * row[year.to_s]) / (1+npv_discount_rate)**year_index
|
276
|
+
npv_elec_ghg += (ghg_elec * get_national_ghg_cost(year: year.to_i)) / (1+npv_discount_rate_carbon)**year_index
|
277
|
+
npv_elec_peak += (annual_peak_kW_per_m_sq * row_peak[year.to_s]) / (1+npv_discount_rate)**year_index unless row_peak.nil? || annual_peak_kW_per_m_sq.nil?
|
250
278
|
year_index += 1.0
|
251
279
|
end
|
252
280
|
end
|
@@ -254,35 +282,46 @@ class BTAPData
|
|
254
282
|
|
255
283
|
# Calculate npv of natural gas
|
256
284
|
eui_ngas= @btap_data['energy_eui_natural_gas_gj_per_m_sq']
|
285
|
+
# Convert to tonnes of ghg/m^2
|
286
|
+
ghg_ngas = @btap_data['cost_utility_ghg_natural gas_kg_per_m_sq'].to_f/1000.0
|
257
287
|
row = neb_data.detect do |data|
|
258
288
|
(data['building_type'] == building_type) && (data['province'] == province) && (data['fuel_type'] == 'Natural Gas')
|
259
289
|
end
|
260
290
|
npv_ngas = 0.0
|
291
|
+
npv_ngas_ghg = 0.0
|
261
292
|
year_index = 1.0
|
262
293
|
for year in npv_start_year.to_int..npv_end_year.to_int
|
263
294
|
npv_ngas += (eui_ngas * row[year.to_s]) / (1+npv_discount_rate)**year_index
|
295
|
+
npv_ngas_ghg += (ghg_ngas * get_national_ghg_cost(year: year.to_i)) / (1+npv_discount_rate_carbon)**year_index
|
264
296
|
year_index += 1.0
|
265
297
|
end
|
266
298
|
# puts "npv_ngas is #{npv_ngas}"
|
267
299
|
|
268
300
|
# Calculate npv of oil
|
269
301
|
eui_oil= @btap_data['energy_eui_additional_fuel_gj_per_m_sq']
|
302
|
+
# Convert to tonnes of ghg/m^2
|
303
|
+
ghg_oil = @btap_data['cost_utility_ghg_oil_kg_per_m_sq'].to_f/1000.0
|
270
304
|
row = neb_data.detect do |data|
|
271
305
|
(data['building_type'] == building_type) && (data['province'] == province) && (data['fuel_type'] == 'Oil')
|
272
306
|
end
|
273
307
|
npv_oil = 0.0
|
308
|
+
npv_oil_ghg = 0.0
|
274
309
|
year_index = 1.0
|
275
310
|
for year in npv_start_year.to_int..npv_end_year.to_int
|
276
311
|
npv_oil += (eui_oil * row[year.to_s]) / (1+npv_discount_rate)**year_index
|
312
|
+
npv_oil_ghg += (ghg_oil * get_national_ghg_cost(year: year.to_i)) / (1+npv_discount_rate_carbon)**year_index
|
277
313
|
year_index += 1.0
|
278
314
|
end
|
279
315
|
# puts "npv_oil is #{npv_oil}"
|
280
316
|
|
281
317
|
# Calculate total npv
|
282
318
|
npv_total = @btap_data['cost_equipment_total_cost_per_m_sq'] + npv_elec + npv_ngas + npv_oil
|
283
|
-
|
319
|
+
npv_ghg_total = npv_elec_ghg + npv_ngas_ghg + npv_oil_ghg
|
320
|
+
npv_total_with_ghg_and_peak = npv_ghg_total + npv_total + npv_elec_peak
|
284
321
|
@btap_data.merge!('npv_total_per_m_sq' => npv_total)
|
285
|
-
|
322
|
+
@btap_data.merge!('npv_carbon_pricing_per_m_sq' => npv_ghg_total)
|
323
|
+
@btap_data.merge!('npv_peak_elec_per_m_sq' => npv_elec_peak)
|
324
|
+
@btap_data.merge!('npv_with_carbon_and_peak_pricing_total_per_m_sq' => npv_total_with_ghg_and_peak)
|
286
325
|
end
|
287
326
|
|
288
327
|
def envelope(model)
|
@@ -515,7 +554,148 @@ class BTAPData
|
|
515
554
|
return geography_data
|
516
555
|
end
|
517
556
|
|
518
|
-
|
557
|
+
### The 'annual_peak_electricity_cost_dollar' function calculates annual peak electricity cost (dollar)
|
558
|
+
### for OEE-Electrification project using the OERD's electricity rates for commercial buildings
|
559
|
+
### that Danielle Krauel of OEE provided to CE-O
|
560
|
+
def oerd_electricity_cost(model:, utility_pricing_year: 2020, oerd_utility_pricing: false)
|
561
|
+
unless oerd_utility_pricing
|
562
|
+
@btap_data.merge!('cost_utility_oerd_electricity_peak_annual_cost_per_m_sq' => 0.00) unless oerd_utility_pricing
|
563
|
+
@btap_data.merge!('cost_utility_oerd_electricity_energy_annual_cost_per_m_sq' => 0.00) unless oerd_utility_pricing
|
564
|
+
return 0.00
|
565
|
+
end
|
566
|
+
|
567
|
+
#===================================================================================================================
|
568
|
+
### OERD's electricity rates for commercial buildings
|
569
|
+
neb_data = CSV.parse(File.read(@neb_prices_csv_file_name), headers: true, converters: :numeric).map(&:to_h)
|
570
|
+
#===================================================================================================================
|
571
|
+
#===================================================================================================================
|
572
|
+
#===================================================================================================================
|
573
|
+
#===================================================================================================================
|
574
|
+
#===================================================================================================================
|
575
|
+
##################### Calculate annual electricity peak cost using OERD's electricity rate #########################
|
576
|
+
#===================================================================================================================
|
577
|
+
#===================================================================================================================
|
578
|
+
### Find index for hourly data of 'ElectricityNet:Facility' (J)
|
579
|
+
query = "
|
580
|
+
SELECT ReportDataDictionaryIndex
|
581
|
+
FROM ReportDataDictionary
|
582
|
+
WHERE Name=='ElectricityNet:Facility' AND ReportingFrequency == 'Hourly' AND Units == 'J'
|
583
|
+
"
|
584
|
+
index_timestep_electricity = model.sqlFile.get.execAndReturnVectorOfInt(query).get[0]
|
585
|
+
number_of_timesteps_per_hour = 1
|
586
|
+
puts "Trying hourly ElectricityNet:Facility"
|
587
|
+
|
588
|
+
### Find index for timestep data of 'Electricity:Facility' (J) if 'ElectricityNet:Facility' data is not available
|
589
|
+
if index_timestep_electricity.nil?
|
590
|
+
query = "
|
591
|
+
SELECT ReportDataDictionaryIndex
|
592
|
+
FROM ReportDataDictionary
|
593
|
+
WHERE Name=='Electricity:Facility' AND ReportingFrequency == 'Zone Timestep' AND Units == 'J'
|
594
|
+
"
|
595
|
+
index_timestep_electricity = model.sqlFile.get.execAndReturnVectorOfInt(query).get[0]
|
596
|
+
number_of_timesteps_per_hour = model.getTimestep.numberOfTimestepsPerHour
|
597
|
+
puts "Trying timestep Electricity:Facility"
|
598
|
+
end
|
599
|
+
|
600
|
+
### Find index for hourly data of 'Electricity:Facility' (J) if timestep data is not available
|
601
|
+
if index_timestep_electricity.nil?
|
602
|
+
query = "
|
603
|
+
SELECT ReportDataDictionaryIndex
|
604
|
+
FROM ReportDataDictionary
|
605
|
+
WHERE Name=='Electricity:Facility' AND ReportingFrequency == 'Hourly' AND Units == 'J'
|
606
|
+
"
|
607
|
+
index_timestep_electricity = model.sqlFile.get.execAndReturnVectorOfInt(query).get[0]
|
608
|
+
number_of_timesteps_per_hour = 1
|
609
|
+
puts "Trying hourly Electricity:Facility"
|
610
|
+
end
|
611
|
+
|
612
|
+
if index_timestep_electricity.nil?
|
613
|
+
puts "No hourly or timestep data available. Peak data not available"
|
614
|
+
@btap_data.merge!('cost_utility_oerd_electricity_peak_annual_cost_per_m_sq' => 0.00) unless oerd_utility_pricing
|
615
|
+
@btap_data.merge!('cost_utility_oerd_electricity_energy_annual_cost_per_m_sq' => 0.00) unless oerd_utility_pricing
|
616
|
+
return 0.00
|
617
|
+
end
|
618
|
+
### Get number of timesteps from the model
|
619
|
+
timestep_second = 3600 / number_of_timesteps_per_hour
|
620
|
+
#===================================================================================================================
|
621
|
+
### Calculate number of timesteps of the whole year, and create dates/times for the whole year
|
622
|
+
number_of_timesteps_of_year = 365 * 24 * number_of_timesteps_per_hour
|
623
|
+
timesteps_of_year = []
|
624
|
+
d = Time.new(2006, 1, 1, 0)
|
625
|
+
(0...number_of_timesteps_of_year).each do |increment|
|
626
|
+
timesteps_of_year << (d + (60 * 60 / number_of_timesteps_per_hour) * increment).strftime('%Y-%m-%d %H:%M')
|
627
|
+
end
|
628
|
+
#===================================================================================================================
|
629
|
+
|
630
|
+
#===================================================================================================================
|
631
|
+
### Get timestep output for Electricity:Facility output.
|
632
|
+
query = "
|
633
|
+
Select VariableValue
|
634
|
+
FROM ReportVariableData
|
635
|
+
WHERE
|
636
|
+
ReportVariableDataDictionaryIndex = #{index_timestep_electricity}
|
637
|
+
"
|
638
|
+
timestep_values = model.sqlFile.get.execAndReturnVectorOfDouble(query).get
|
639
|
+
#===================================================================================================================
|
640
|
+
### Calculate electricity peak (J) for each month of the year
|
641
|
+
# Find month of each timestep
|
642
|
+
keys_month = timesteps_of_year.map{ |timestep| DateTime.parse(timestep).to_date.month }
|
643
|
+
# Create a hash where its keys are months and values for eahc month are electricity energy use (J) of all timesteps for that month
|
644
|
+
hash_months_electricity = keys_month.zip(timestep_values).group_by(&:first).map{|key, value| [key, value.map(&:last)]}.to_h
|
645
|
+
# Find maximum of electricity energy use (J) among all timesteps for each month of the year
|
646
|
+
monthly_peak_J = hash_months_electricity.map { |key, value| [key, value.max()] }.to_h
|
647
|
+
#===================================================================================================================
|
648
|
+
### Convert J to kW of maximum electricity energy use (J)
|
649
|
+
monthly_peak_kW = monthly_peak_J.map { |key, value| [key, value * 0.001 / timestep_second] }.to_h
|
650
|
+
### Normalize by building floor area
|
651
|
+
annual_peak_kW_per_m_sq = monthly_peak_kW.values.sum / @btap_data['bldg_conditioned_floor_area_m_sq'].to_f
|
652
|
+
#===================================================================================================================
|
653
|
+
### Get province of the model and find its peak electricity price from the utility_pricing_2025-02-20.csv
|
654
|
+
province = @btap_data['location_state_province_region']
|
655
|
+
# Find which province the proposed building is located in
|
656
|
+
building_type = 'Commercial'
|
657
|
+
geography_data = climate_data
|
658
|
+
province_abbreviation = geography_data['location_state_province_region']
|
659
|
+
province = @standards_data['province_map'][province_abbreviation]
|
660
|
+
row_peak = neb_data.detect do |data|
|
661
|
+
(data['building_type'] == building_type) && (data['province'] == province) && (data['fuel_type'] == 'Electricity Peak')
|
662
|
+
end
|
663
|
+
province_dollar_kW_month = row_peak[utility_pricing_year.to_i.to_s]
|
664
|
+
#===================================================================================================================
|
665
|
+
### Calculate cost of peak electricity for each month
|
666
|
+
monthly_peak_cost = monthly_peak_kW.map { |key, value| [key, value * province_dollar_kW_month] }.to_h
|
667
|
+
#===================================================================================================================
|
668
|
+
### Calculate cost of peak electricity for the whole year in dollar
|
669
|
+
annual_peak_cost_dollar = monthly_peak_cost.values.sum
|
670
|
+
#===================================================================================================================
|
671
|
+
### Calculate cost of peak electricity for the whole year in dollar normalized by floor area
|
672
|
+
annual_peak_cost_dollar_per_m_sq = annual_peak_cost_dollar / @btap_data['bldg_conditioned_floor_area_m_sq']
|
673
|
+
#===================================================================================================================
|
674
|
+
### Merge the calculated value to @btap_data
|
675
|
+
@btap_data.merge!('cost_utility_oerd_electricity_peak_annual_cost_per_m_sq' => annual_peak_cost_dollar_per_m_sq.round(2))
|
676
|
+
#===================================================================================================================
|
677
|
+
#===================================================================================================================
|
678
|
+
#===================================================================================================================
|
679
|
+
#===================================================================================================================
|
680
|
+
#===================================================================================================================
|
681
|
+
################### Calculate annual electricity energy use cost using OERD's electricity rate #####################
|
682
|
+
#===================================================================================================================
|
683
|
+
### Get province of the model and find its peak electricity price from the pricing_2025-02-20.csv
|
684
|
+
row_elec = neb_data.detect do |data|
|
685
|
+
(data['building_type'] == building_type) && (data['province'] == province) && (data['fuel_type'] == 'Electricity')
|
686
|
+
end
|
687
|
+
province_dollar_kWh = row_elec[utility_pricing_year.to_i.to_s]
|
688
|
+
#===================================================================================================================
|
689
|
+
# Calculate cost of energy electricity for the whole year in dollar normalized by floor area
|
690
|
+
annual_energy_cost_dollar_per_m_sq = @btap_data['energy_eui_electricity_gj_per_m_sq'] * 277.778 * province_dollar_kWh
|
691
|
+
#===================================================================================================================
|
692
|
+
### Merge the calculated value to @btap_data
|
693
|
+
@btap_data.merge!('cost_utility_oerd_electricity_energy_annual_cost_per_m_sq' => annual_energy_cost_dollar_per_m_sq.round(2))
|
694
|
+
#===================================================================================================================
|
695
|
+
return annual_peak_kW_per_m_sq
|
696
|
+
end
|
697
|
+
|
698
|
+
def utility(model:, utility_pricing_year: 2020)
|
519
699
|
economics_data = {}
|
520
700
|
building_type = 'Commercial'
|
521
701
|
province = @standards_data['province_map'][model.getWeatherFile.stateProvinceRegion]
|
@@ -538,12 +718,14 @@ class BTAPData
|
|
538
718
|
neb_data = CSV.parse(File.read(@neb_prices_csv_file_name), headers: true, converters: :numeric).map(&:to_h)
|
539
719
|
|
540
720
|
neb_eplus_fuel_map.each do |neb_fuel, ep_fuel|
|
721
|
+
next if neb_fuel.to_s.downcase == 'electricity peak'
|
541
722
|
row = neb_data.detect do |data|
|
542
|
-
(data['building_type'] == building_type) &&
|
543
|
-
(data['province'] == province) &&
|
544
|
-
(data['fuel_type'] == neb_fuel)
|
723
|
+
(data['building_type'].to_s == building_type) &&
|
724
|
+
(data['province'].to_s == province) &&
|
725
|
+
(data['fuel_type'].to_s == neb_fuel)
|
545
726
|
end
|
546
|
-
|
727
|
+
utility_pricing_year_s = utility_pricing_year.to_i.to_s
|
728
|
+
neb_fuel_cost = row[utility_pricing_year_s]
|
547
729
|
fuel_consumption_gj = 0.0
|
548
730
|
sql_command = "SELECT Value FROM tabulardatawithstrings
|
549
731
|
WHERE ReportName='EnergyMeters'
|
@@ -2282,4 +2464,19 @@ class BTAPData
|
|
2282
2464
|
end
|
2283
2465
|
# def phius_metrics(model)
|
2284
2466
|
end
|
2467
|
+
|
2468
|
+
def get_national_ghg_cost(year:)
|
2469
|
+
raise "Nil year submitted for national ghg cost" if year.nil?
|
2470
|
+
year = year.to_i
|
2471
|
+
if year < 2019
|
2472
|
+
price = 0.0
|
2473
|
+
elsif (year >= 2019) && (year <= 2030)
|
2474
|
+
ghg_price_data = @standards_data["tables"]["canada_national_carbon_pricing"]["table"]
|
2475
|
+
year_price = ghg_price_data.detect { |item| (item["year"].to_i == year) }
|
2476
|
+
price = year_price["price_per_tonne"].to_f
|
2477
|
+
elsif (year > 2030)
|
2478
|
+
price = 170.0
|
2479
|
+
end
|
2480
|
+
return price.to_f
|
2481
|
+
end
|
2285
2482
|
end
|
@@ -84,6 +84,7 @@ class BTAPDatapoint
|
|
84
84
|
@npv_start_year = @options[:npv_start_year]
|
85
85
|
@npv_end_year = @options[:npv_end_year]
|
86
86
|
@npv_discount_rate = @options[:npv_discount_rate]
|
87
|
+
@npv_discount_rate_carbon = @options[:npv_discount_rate_carbon]
|
87
88
|
|
88
89
|
# Save configuration to temp folder.
|
89
90
|
File.open(File.join(@dp_temp_folder, 'run_options.yml'), 'w') { |file| file.write(@options.to_yaml) }
|
@@ -93,6 +94,10 @@ class BTAPDatapoint
|
|
93
94
|
@options[:template] = 'NECB2011' if @options[:algorithm_type] == 'osm_batch'
|
94
95
|
@standard = Standard.build(@options[:template])
|
95
96
|
|
97
|
+
# Set use the convert_arg_to_bool method from the standard class to set the @oerd_utility_pricing_flag
|
98
|
+
@oerd_utility_pricing = @standard.convert_arg_to_bool(variable: @options[:oerd_utility_pricing], default: false)
|
99
|
+
@utility_pricing_year = @standard.convert_arg_to_f(variable: @options[:utility_pricing_year], default: 2020)
|
100
|
+
|
96
101
|
# This allows you to select the skeleton model from our built in starting points. You can add a custom file as
|
97
102
|
# it will search the libary first,.
|
98
103
|
# model = load_osm(@options[:building_type]) # loads skeleton file from path.
|
@@ -178,11 +183,13 @@ class BTAPDatapoint
|
|
178
183
|
tbd_option: @options[:tbd_option],
|
179
184
|
necb_hdd: @options[:necb_hdd],
|
180
185
|
boiler_fuel: @options[:boiler_fuel],
|
181
|
-
boiler_cap_ratio: @options[:boiler_cap_ratio]
|
186
|
+
boiler_cap_ratio: @options[:boiler_cap_ratio],
|
187
|
+
swh_fuel: @options[:swh_fuel],
|
188
|
+
oerd_utility_pricing: @oerd_utility_pricing
|
182
189
|
)
|
183
190
|
end
|
184
191
|
|
185
|
-
# Save model to
|
192
|
+
# Save model to disk.
|
186
193
|
puts "saving model to #{File.join(@dp_temp_folder, 'output.osm')}"
|
187
194
|
BTAP::FileIO.save_osm(model, File.join(@dp_temp_folder, 'output.osm'))
|
188
195
|
|
@@ -252,7 +259,10 @@ class BTAPDatapoint
|
|
252
259
|
qaqc: @qaqc,
|
253
260
|
npv_start_year: @npv_start_year,
|
254
261
|
npv_end_year: @npv_end_year,
|
255
|
-
npv_discount_rate: @npv_discount_rate
|
262
|
+
npv_discount_rate: @npv_discount_rate,
|
263
|
+
npv_discount_rate_carbon: @npv_discount_rate_carbon,
|
264
|
+
oerd_utility_pricing: @oerd_utility_pricing,
|
265
|
+
utility_pricing_year: @utility_pricing_year).btap_data
|
256
266
|
|
257
267
|
# Write Files
|
258
268
|
File.open(File.join(@dp_temp_folder, 'btap_data.json'), 'w') { |f| f.write(JSON.pretty_generate(@btap_data.sort.to_h, allow_nan: true)) }
|
@@ -263,6 +273,9 @@ class BTAPDatapoint
|
|
263
273
|
|
264
274
|
#output hourly data
|
265
275
|
self.output_hourly_data(model,@dp_temp_folder, @options[:datapoint_id])
|
276
|
+
|
277
|
+
# Output timestep data
|
278
|
+
self.output_timestep_data(model,@dp_temp_folder, @options[:datapoint_id])
|
266
279
|
end
|
267
280
|
rescue StandardError => bang
|
268
281
|
puts "Error occured: #{bang}"
|
@@ -361,8 +374,7 @@ class BTAPDatapoint
|
|
361
374
|
return exit_code
|
362
375
|
end
|
363
376
|
|
364
|
-
|
365
|
-
def output_hourly_data(model, output_folder,datapoint_id)
|
377
|
+
def output_hourly_data(model, output_folder, datapoint_id)
|
366
378
|
osm_path = File.join(output_folder, "run_dir/in.osm")
|
367
379
|
sql_path = File.join(output_folder, "run_dir/run/eplusout.sql")
|
368
380
|
csv_output = File.join(output_folder, "hourly.csv")
|
@@ -373,20 +385,18 @@ class BTAPDatapoint
|
|
373
385
|
hours_of_year << (d + (60 * 60) * increment).strftime('%Y-%m-%d %H:%M')
|
374
386
|
end
|
375
387
|
|
376
|
-
|
377
388
|
array_of_hashes = []
|
378
389
|
|
379
|
-
|
380
|
-
#Find hourly outputs available for this datapoint.
|
390
|
+
# Find hourly outputs available for this datapoint.
|
381
391
|
query = "
|
382
392
|
SELECT ReportDataDictionaryIndex
|
383
393
|
FROM ReportDataDictionary
|
384
394
|
WHERE ReportingFrequency == 'Hourly'
|
385
395
|
"
|
386
|
-
# Get hourly data for each output.
|
396
|
+
# Get hourly data for each output.
|
387
397
|
model.sqlFile.get.execAndReturnVectorOfInt(query).get.each do |rdd_index|
|
388
398
|
|
389
|
-
#Get Name
|
399
|
+
# Get Name
|
390
400
|
query = "
|
391
401
|
SELECT Name
|
392
402
|
FROM ReportDataDictionary
|
@@ -394,7 +404,7 @@ class BTAPDatapoint
|
|
394
404
|
"
|
395
405
|
name = model.sqlFile.get.execAndReturnFirstString(query).get
|
396
406
|
|
397
|
-
#Get KeyValue
|
407
|
+
# Get KeyValue
|
398
408
|
query = "
|
399
409
|
SELECT KeyValue
|
400
410
|
FROM ReportDataDictionary
|
@@ -411,7 +421,7 @@ class BTAPDatapoint
|
|
411
421
|
key_value = ""
|
412
422
|
end
|
413
423
|
|
414
|
-
#Get Units
|
424
|
+
# Get Units
|
415
425
|
query = "
|
416
426
|
SELECT Units
|
417
427
|
FROM ReportDataDictionary
|
@@ -419,7 +429,7 @@ class BTAPDatapoint
|
|
419
429
|
"
|
420
430
|
units = model.sqlFile.get.execAndReturnFirstString(query).get
|
421
431
|
|
422
|
-
#Get hourly data
|
432
|
+
# Get hourly data
|
423
433
|
query = "
|
424
434
|
Select Value
|
425
435
|
FROM ReportData
|
@@ -430,7 +440,7 @@ class BTAPDatapoint
|
|
430
440
|
|
431
441
|
hourly_hash = Hash[hours_of_year.zip(hourly_values)]
|
432
442
|
|
433
|
-
data_hash = {"datapoint_id": datapoint_id, "Name": name, "KeyValue": key_value, "Units": units}.merge(hourly_hash)
|
443
|
+
data_hash = { "datapoint_id": datapoint_id, "Name": name, "KeyValue": key_value, "Units": units }.merge(hourly_hash)
|
434
444
|
array_of_hashes << data_hash
|
435
445
|
end
|
436
446
|
|
@@ -443,4 +453,169 @@ class BTAPDatapoint
|
|
443
453
|
end
|
444
454
|
end
|
445
455
|
end
|
446
|
-
|
456
|
+
#=====================================================================================================================
|
457
|
+
def output_timestep_data(model, output_folder,datapoint_id)
|
458
|
+
osm_path = File.join(output_folder, "run_dir/in.osm")
|
459
|
+
sql_path = File.join(output_folder, "run_dir/run/eplusout.sql")
|
460
|
+
csv_output = File.join(output_folder, "timestep.csv")
|
461
|
+
#===================================================================================================================
|
462
|
+
# Get number of timesteps from the model
|
463
|
+
number_of_timesteps_per_hour = model.getTimestep.numberOfTimestepsPerHour
|
464
|
+
#===================================================================================================================
|
465
|
+
# Calculate number of timesteps of the whole year
|
466
|
+
number_of_timesteps_of_year = 365 * 24 * number_of_timesteps_per_hour
|
467
|
+
|
468
|
+
timesteps_of_year = []
|
469
|
+
d = Time.new(2006, 1, 1, 0)
|
470
|
+
(0...number_of_timesteps_of_year).each do |increment|
|
471
|
+
timesteps_of_year << (d + (60 * 60 / number_of_timesteps_per_hour) * increment).strftime('%Y-%m-%d %H:%M')
|
472
|
+
end
|
473
|
+
timesteps_index = Array(0..number_of_timesteps_of_year-1)
|
474
|
+
#===================================================================================================================
|
475
|
+
# Create a hash with indices ('timesteps_index') as keys and timesteps as values ('timesteps_of_year')
|
476
|
+
# Note from Sara Gilani: 'I had to do this, as when I used 'timesteps_of_year' as keys to create all hashes below
|
477
|
+
# (e.g. timestep_hash_datapoint_id, timestep_hash_name, timestep_hash_key_value, ...),
|
478
|
+
# it did not create the right number of timesteps for the whole year'
|
479
|
+
timesteps_of_year_with_index = Hash[timesteps_index.zip(timesteps_of_year)]
|
480
|
+
#===================================================================================================================
|
481
|
+
array_of_hashes = []
|
482
|
+
array_of_hashes_transposed = []
|
483
|
+
#===================================================================================================================
|
484
|
+
# Find timestep outputs available for this datapoint.
|
485
|
+
query = "
|
486
|
+
SELECT ReportDataDictionaryIndex
|
487
|
+
FROM ReportDataDictionary
|
488
|
+
WHERE ReportingFrequency == 'Zone Timestep'
|
489
|
+
"
|
490
|
+
#===================================================================================================================
|
491
|
+
# Get timestep data for each output.
|
492
|
+
model.sqlFile.get.execAndReturnVectorOfInt(query).get.each do |rdd_index|
|
493
|
+
#=================================================================================================================
|
494
|
+
# Get Name
|
495
|
+
query = "
|
496
|
+
SELECT Name
|
497
|
+
FROM ReportDataDictionary
|
498
|
+
WHERE ReportDataDictionaryIndex == #{rdd_index}
|
499
|
+
"
|
500
|
+
name = model.sqlFile.get.execAndReturnFirstString(query).get
|
501
|
+
#=================================================================================================================
|
502
|
+
# Get KeyValue
|
503
|
+
query = "
|
504
|
+
SELECT KeyValue
|
505
|
+
FROM ReportDataDictionary
|
506
|
+
WHERE ReportDataDictionaryIndex == #{rdd_index}
|
507
|
+
"
|
508
|
+
#=================================================================================================================
|
509
|
+
# In some cases KeyValue has a value and sometimes it does not. In some cases KeyValue is null. If the command
|
510
|
+
# below is run and KeyValue is null then the command fails and returns an error. The fix below assumes that if
|
511
|
+
# the command below fails it is because KeyValue is null. In that case the "key_value" variable is set to a
|
512
|
+
# blank.
|
513
|
+
begin
|
514
|
+
key_value = model.sqlFile.get.execAndReturnFirstString(query).get
|
515
|
+
rescue StandardError => bang
|
516
|
+
key_value = ""
|
517
|
+
end
|
518
|
+
#=================================================================================================================
|
519
|
+
# Get Units
|
520
|
+
query = "
|
521
|
+
SELECT Units
|
522
|
+
FROM ReportDataDictionary
|
523
|
+
WHERE ReportDataDictionaryIndex == #{rdd_index}
|
524
|
+
"
|
525
|
+
units = model.sqlFile.get.execAndReturnFirstString(query).get
|
526
|
+
#=================================================================================================================
|
527
|
+
# Get timestep data
|
528
|
+
query = "
|
529
|
+
Select VariableValue
|
530
|
+
FROM ReportVariableData
|
531
|
+
WHERE
|
532
|
+
ReportVariableDataDictionaryIndex = #{rdd_index}
|
533
|
+
"
|
534
|
+
timestep_values = model.sqlFile.get.execAndReturnVectorOfDouble(query).get
|
535
|
+
|
536
|
+
timestep_hash = Hash[timesteps_index.zip(timestep_values)]
|
537
|
+
|
538
|
+
data_hash = { "datapoint_id": datapoint_id, "Name": name, "KeyValue": key_value, "Units": units }.merge(timestep_hash)
|
539
|
+
|
540
|
+
array_of_hashes << data_hash
|
541
|
+
|
542
|
+
#=================================================================================================================
|
543
|
+
# Create a hash of data for having timesteps as rows instead of columns that is used for hourly outputs START
|
544
|
+
number_of_timesteps = timesteps_of_year.length()
|
545
|
+
|
546
|
+
array = [datapoint_id]
|
547
|
+
array_datapoint_id = array.zip(*[array]*number_of_timesteps).flatten
|
548
|
+
timestep_hash_datapoint_id = Hash[timesteps_index.zip(array_datapoint_id)]
|
549
|
+
|
550
|
+
array = [name]
|
551
|
+
array_name = array.zip(*[array]*number_of_timesteps).flatten
|
552
|
+
timestep_hash_name = Hash[timesteps_index.zip(array_name)]
|
553
|
+
|
554
|
+
array = [key_value]
|
555
|
+
array_key_value = array.zip(*[array]*number_of_timesteps).flatten
|
556
|
+
timestep_hash_key_value = Hash[timesteps_index.zip(array_key_value)]
|
557
|
+
|
558
|
+
array = [units]
|
559
|
+
array_units = array.zip(*[array]*number_of_timesteps).flatten
|
560
|
+
timestep_hash_units = Hash[timesteps_index.zip(array_units)]
|
561
|
+
|
562
|
+
timestep_hash_values = Hash[timesteps_index.zip(timestep_values)]
|
563
|
+
|
564
|
+
data_hash_transposed = Hash.new
|
565
|
+
timestep_hash_values.keys.each do |key|
|
566
|
+
data_hash_transposed[key] = [
|
567
|
+
timesteps_of_year_with_index[key],
|
568
|
+
timestep_hash_datapoint_id[key],
|
569
|
+
timestep_hash_name[key],
|
570
|
+
timestep_hash_key_value[key],
|
571
|
+
timestep_hash_units[key],
|
572
|
+
timestep_hash_values[key]
|
573
|
+
]
|
574
|
+
end
|
575
|
+
|
576
|
+
array_of_hashes_transposed << data_hash_transposed
|
577
|
+
# Create a hash of data for having timesteps as rows instead of columns that is used for hourly outputs END
|
578
|
+
#=================================================================================================================
|
579
|
+
|
580
|
+
end #model.sqlFile.get.execAndReturnVectorOfInt(query).get.each do |rdd_index|
|
581
|
+
#===================================================================================================================
|
582
|
+
# # This csv file has timesteps as the first row
|
583
|
+
# CSV.open(csv_output, "wb") do |csv|
|
584
|
+
# unless array_of_hashes.empty?
|
585
|
+
# csv << array_of_hashes.first.keys # adds the attributes name on the first line
|
586
|
+
# array_of_hashes.each do |hash|
|
587
|
+
# csv << hash.values
|
588
|
+
# end
|
589
|
+
# end
|
590
|
+
# end
|
591
|
+
#===================================================================================================================
|
592
|
+
# This csv file has timesteps as the first column
|
593
|
+
header = ['Index', 'Timestep', 'datapoint_id', 'Name', 'KeyValue', 'Units', 'Value']
|
594
|
+
CSV.open(csv_output, "wb") do |csv|
|
595
|
+
csv << header
|
596
|
+
array_of_hashes_transposed.each do |hash|
|
597
|
+
hash.keys().each do |index|
|
598
|
+
row_index = index
|
599
|
+
row_timestep = hash[index][0]
|
600
|
+
row_datapoint_id = hash[index][1]
|
601
|
+
row_name = hash[index][2]
|
602
|
+
row_key_value = hash[index][3]
|
603
|
+
row_units = hash[index][4]
|
604
|
+
row_value = hash[index][5]
|
605
|
+
|
606
|
+
row = CSV::Row.new(header,[])
|
607
|
+
row['Index'] = row_index
|
608
|
+
row['Timestep'] = row_timestep
|
609
|
+
row['datapoint_id'] = row_datapoint_id
|
610
|
+
row['Name'] = row_name
|
611
|
+
row['KeyValue'] = row_key_value
|
612
|
+
row['Units'] = row_units
|
613
|
+
row['Value'] = row_value
|
614
|
+
csv << row
|
615
|
+
end
|
616
|
+
end
|
617
|
+
end
|
618
|
+
#===================================================================================================================
|
619
|
+
end #output_timestep_data
|
620
|
+
#=====================================================================================================================
|
621
|
+
end
|