Inputs

#Selections
MeasAppType <- 'NR'
BldgType <- 'SFm'
SZ <- 'med'
ClimateZone <- 12
HeatPumpHVAC_res <- 'SWHC045'  
HPWH_res <- 'SWWH025'
EU_HP_HVAC<-'DEER:HVAC_Eff_HP'
EU_HPWH<-'DEER:Res_ClothesDishWasher'
EUL_Claims_HeatPumpHVAC_res <- 15 #2024 Study recommends 23 years
EUL_Claims_HPWH_res <- 10 #2024 Study recommends 20 years
EUL_New_HeatPumpHVAC_res <- 23 #2024 Study recommends 23 years
EUL_New_HPWH_res <- 20 #2024 Study recommends 20 years
#Constants
PGE_WACC_A <- 0.0734 #Source:ACC, discount Rate
PGE_WACC_Q <- PGE_WACC_A/4
Divider_discount <- PGE_WACC_Q + 1

Benefits Analysis

Data Sources

The data inputs are shown below:

• Claims data was pulled from CEDARS in April 2024: https://cedars.sound-data.com/reports/download-record-level-report/claims/2023/

• Load Shapes profiles with Avoided Costs are from CEDARS: https://file.ac/l1-GqhWF8OU/

The data from the online sources were truncated and renamed to simplify this analysis; the names of these files are listed below.

#Read in Fuel Sub Claims 2023 Q1-Q4
FS23 <- read_excel("C:\\Users\\mmh\\R  Programming\\subtests\\FS_NewBens\\23_FS_Claims_PGE.xlsx") #Normal Replacement Only (No New Construction)

#Read in Load Shapes (accessible at https://file.ac/l1-GqhWF8OU/)
Gas_LS_QRT <- read_excel("C:\\Users\\mmh\\R  Programming\\subtests\\FS_NewBens\\G_LS_QRT.xlsx") #Quarterly LS

Calculate Benefits: Gas Commodity, T&D, Missing Methane GHG Adder Included

#Calculated Quarterly Avoided Costs (energy x LS) over EUL of the Claims
#Generate the Claim Year Quarters
EUL_Claims_HeatPumpHVAC_res <-  list(Quarters$EUL_15) 
EUL_Claims_HeatPumpHVAC_res<- as.data.frame(EUL_Claims_HeatPumpHVAC_res)

EUL_Claims_HPWH_res <-  list(Quarters$EUL_10) 
colnames(EUL_Claims_HeatPumpHVAC_res) <- c('CYQtr')
EUL_Claims_HPWH_res<- as.data.frame(EUL_Claims_HPWH_res)
colnames(EUL_Claims_HPWH_res) <- c('CYQtr')

EUL_New_HeatPumpHVAC_res <-  list(Quarters$EUL_23) 
EUL_New_HeatPumpHVAC_res<- as.data.frame(EUL_New_HeatPumpHVAC_res)

EUL_New_HPWH_res <-  list(Quarters$EUL_20) 
colnames(EUL_New_HeatPumpHVAC_res) <- c('CYQtr')
EUL_New_HPWH_res<- as.data.frame(EUL_New_HPWH_res)
colnames(EUL_New_HPWH_res) <- c('CYQtr')

#Total Therm Savings from Claims Data 
Therm_TotalAnnual_HVAC <- c(sum(df_HeatPumpHVAC_res$`Therm_TotalAnnual`))
Therm_TotalAnnual_HPWH <- c(sum(df_HPWH_res$`Therm_TotalAnnual`))

#Generate the NPV of Commodity and T&D Avoided Costs
generate_qtrly_npv_1 <- function(load_shape, 
                               considered_qtrs, discount_rate, Therms) {
  filtered_load_shape <- filter(load_shape, 
                                Qtr %in% considered_qtrs$CYQt) %>% 
    mutate(Qtr_step = 1:n()) %>% 
    mutate(Qtr_ID = Qtr_step-1) %>% 
    mutate(Total_Discounted = (Total/(discount_rate^Qtr_ID)))
  
  result_1 <- c(sum(filtered_load_shape$'Total_Discounted'*Therms))
  return (result_1)
}

GasComTD_HeatPumpHVAC_res <- 
  generate_qtrly_npv_1(Gas_LS_QRT, 
                     EUL_Claims_HeatPumpHVAC_res, Divider_discount,
                     Therm_TotalAnnual_HVAC)

GasComTD_HPWH_res <- 
  generate_qtrly_npv_1(Gas_LS_QRT, EUL_Claims_HPWH_res,
                     Divider_discount, Therm_TotalAnnual_HPWH )

GasComTD_HeatPumpHVAC_res_new <- 
  generate_qtrly_npv_1(Gas_LS_QRT, 
                     EUL_New_HeatPumpHVAC_res, Divider_discount,
                     Therm_TotalAnnual_HVAC)

GasComTD_HPWH_res_new <- 
  generate_qtrly_npv_1(Gas_LS_QRT, EUL_New_HPWH_res,
                     Divider_discount, Therm_TotalAnnual_HPWH )
#Gas GHG Adder
Gas_GHG_Adder <- 0.1 #$/tonne CO2 for 2023. Adjusted for 36 GWP, 100yr. The ACC inflates the $114 each year in the equivalent amount of the discount. So, when you discount the costs each yr, the values end up being constant. 

Therm_gas_yrly_HVAC <- df_HeatPumpHVAC_res %>% mutate(Therm_TotalAnnual = df_HeatPumpHVAC_res$`Unit Therm First Baseline` * df_HeatPumpHVAC_res$`Number of Units`)
Therm_gas_yrly_HVAC <-c(sum(df_HeatPumpHVAC_res$`Therm_TotalAnnual`))

Therm_gas_yrly_HPWH <- df_HPWH_res %>% mutate(Therm_TotalAnnual = df_HPWH_res$`Unit Therm First Baseline` * df_HPWH_res$`Number of Units`)
Therm_gas_yrly_HPWH <- c(sum(df_HPWH_res$`Therm_TotalAnnual`))

Therm_HeatPumpHVAC_res <-  (Therm_gas_yrly_HVAC* Gas_GHG_Adder)* EUL_HVAC_old
Therm_HPWH_res <-  ( Therm_gas_yrly_HPWH* Gas_GHG_Adder)* EUL_HPWH_old

Therm_HeatPumpHVAC_res_new <-(Therm_gas_yrly_HVAC* Gas_GHG_Adder) * EUL_HVAC_new
Therm_HPWH_res_new <- ( Therm_gas_yrly_HPWH* Gas_GHG_Adder) * EUL_HPWH_new
  
#Calculate Total Gas Benefits
Calc_GasBen_HeatPumpHVAC_res <-  GasComTD_HeatPumpHVAC_res 
Calc_GasBen_HPWH_res <-  GasComTD_HPWH_res 

Calc_GasBen_HeatPumpHVAC_res_new <-  GasComTD_HeatPumpHVAC_res_new 
Calc_GasBen_HPWH_res_new <-  GasComTD_HPWH_res_new 


Calc_GasBen_wGasGHG_HVAC <- Calc_GasBen_HeatPumpHVAC_res_new  + Therm_HeatPumpHVAC_res_new 
Calc_GasBenwGasGHG_HPWH <- Calc_GasBen_HPWH_res_new + Therm_HPWH_res_new

percent_inc_GasGHG_HVAC <- (Calc_GasBen_wGasGHG_HVAC - Calc_GasBen_HeatPumpHVAC_res_new )/Calc_GasBen_HeatPumpHVAC_res_new 
percent_inc_GasGHG_HPWH <- (Calc_GasBenwGasGHG_HPWH - Calc_GasBen_HPWH_res_new )/Calc_GasBen_HPWH_res_new 

Cost Analysis

Data Sources

The data inputs are shown below:

• Claims data was pulled from CEDARS in April 2024: https://cedars.sound-data.com/reports/download-record-level-report/claims/2023/

• Load Shapes profiles with Avoided Costs are from CEDARS: https://file.ac/l1-GqhWF8OU/

The data from the online sources were truncated and renamed to simplify this analysis; the names of these files are listed below.

#Read in Fuel Sub Claims 2023 Q1-Q4
FS23 <- read_excel("C:\\Users\\mmh\\R  Programming\\subtests\\FS_NewBens\\23_FS_Claims_PGE.xlsx") #Normal Replacement Only (No New Construction)
#Read in Load Shapes (accessible at https://file.ac/l1-GqhWF8OU/)
kWh_LS_QRT <- read_excel("C:\\Users\\mmh\\R  Programming\\subtests\\FS_NewBens\\E_LS_QRT_22.xlsx") #Quarterly LS

Calculate Costs: Electric Supply Costs Increased from EUL

kWh_TotalAnnual_HVAC <- c(sum(df_HeatPumpHVAC_res$`kWh_TotalAnnual`))
kWh_TotalAnnual_HPWH <- c(sum(df_HPWH_res$`kWh_TotalAnnual`))

#Generate the NPV of CO2 Avoided Costs
generate_qtrly_npv_e <- function(load_shape, climate_zone, end_use, 
                                 considered_qtrs, discount_rate,
                                 kWh_TotalAnnual, AC) {
  filtered_load_shape <- filter(load_shape, CZ == climate_zone, EU == end_use, 
                                Qtr %in% considered_qtrs$CYQt) %>% 
    mutate(Qtr_step = 1:n()) %>% 
    mutate(Qtr_ID = Qtr_step-1) %>% 
    mutate(AC_type_discounted = (!!sym(AC)/(discount_rate^Qtr_ID)))
  
 result3 <- c(sum(filtered_load_shape$AC_type_discounted*kWh_TotalAnnual))
  return (result3)
 
}
#old EUL
AC_Sum_Gen_E_HeatPumpHVAC_res <-
  generate_qtrly_npv_e(kWh_LS_QRT, ClimateZone, EU_HP_HVAC,
                     EUL_Claims_HeatPumpHVAC_res, Divider_discount,
                     kWh_TotalAnnual_HVAC,'Gen')
AC_Sum_TD_E_HeatPumpHVAC_res <- 
  generate_qtrly_npv_e(kWh_LS_QRT, ClimateZone, EU_HP_HVAC, 
                    EUL_Claims_HeatPumpHVAC_res, Divider_discount,
                    kWh_TotalAnnual_HVAC,'TD')
AC_Sum_Co2_E_HeatPumpHVAC_res <- 
  generate_qtrly_npv_e(kWh_LS_QRT, ClimateZone, EU_HP_HVAC, 
                     EUL_Claims_HeatPumpHVAC_res, Divider_discount,
                     kWh_TotalAnnual_HVAC,'CO2')


AC_Sum_Gen_E_HPWH_res <- 
  generate_qtrly_npv_e(kWh_LS_QRT, ClimateZone, EU_HPWH, EUL_Claims_HPWH_res,
                     Divider_discount, kWh_TotalAnnual_HPWH,'Gen')
AC_Sum_TD_E_HPWH_res <- 
  generate_qtrly_npv_e(kWh_LS_QRT, ClimateZone, EU_HPWH, EUL_Claims_HPWH_res,
                     Divider_discount, kWh_TotalAnnual_HPWH,'TD')
AC_Sum_Co2_E_HPWH_res <- 
  generate_qtrly_npv_e(kWh_LS_QRT, ClimateZone, EU_HPWH, EUL_Claims_HPWH_res,
                     Divider_discount, kWh_TotalAnnual_HPWH,'CO2')

#new EUL
AC_Sum_Gen_E_HeatPumpHVAC_res_new <-
  generate_qtrly_npv_e(kWh_LS_QRT, ClimateZone, EU_HP_HVAC,
                     EUL_New_HeatPumpHVAC_res, Divider_discount,
                     kWh_TotalAnnual_HVAC,'Gen')
AC_Sum_TD_E_HeatPumpHVAC_res_new <- 
  generate_qtrly_npv_e(kWh_LS_QRT, ClimateZone, EU_HP_HVAC, 
                    EUL_New_HeatPumpHVAC_res , Divider_discount,
                    kWh_TotalAnnual_HVAC,'TD')
AC_Sum_Co2_E_HeatPumpHVAC_res_new <- 
  generate_qtrly_npv_e(kWh_LS_QRT, ClimateZone, EU_HP_HVAC, 
                     EUL_New_HeatPumpHVAC_res , Divider_discount,
                     kWh_TotalAnnual_HVAC,'CO2')


AC_Sum_Gen_E_HPWH_res_new <- 
  generate_qtrly_npv_e(kWh_LS_QRT, ClimateZone, EU_HPWH, EUL_New_HPWH_res,
                     Divider_discount, kWh_TotalAnnual_HPWH,'Gen')
AC_Sum_TD_E_HPWH_res_new <- 
  generate_qtrly_npv_e(kWh_LS_QRT, ClimateZone, EU_HPWH, EUL_New_HPWH_res,
                     Divider_discount, kWh_TotalAnnual_HPWH,'TD')
AC_Sum_Co2_E_HPWH_res_new <- 
  generate_qtrly_npv_e(kWh_LS_QRT, ClimateZone, EU_HPWH, EUL_New_HPWH_res,
                     Divider_discount, kWh_TotalAnnual_HPWH,'CO2')

#Calculate Total Electric Costs 
Calc_ElecCost_HeatPumpHVAC_res <-  (AC_Sum_Gen_E_HeatPumpHVAC_res + AC_Sum_TD_E_HeatPumpHVAC_res + AC_Sum_Co2_E_HeatPumpHVAC_res)*(-1)
Calc_ElecCost_HPWH_res <- (AC_Sum_Gen_E_HPWH_res + AC_Sum_TD_E_HPWH_res + AC_Sum_Co2_E_HPWH_res)*(-1)


Calc_ElecCost_HeatPumpHVAC_res_new <-  (AC_Sum_Gen_E_HeatPumpHVAC_res_new  + AC_Sum_TD_E_HeatPumpHVAC_res_new  + AC_Sum_Co2_E_HeatPumpHVAC_res_new  )*(-1)
Calc_ElecCost_HPWH_res_new  <- (AC_Sum_Gen_E_HPWH_res_new  + AC_Sum_TD_E_HPWH_res_new  + AC_Sum_Co2_E_HPWH_res_new )*(-1)

Results:

Average Total Resource Costs (TRC) for Fuel-Sub Measures
Measure TRC Claims TRC, Increased from EUL Study TRC, Increased from EUL Study, Gas GHG Adder from Methane
HVAC Heat Pump, Residential 0.77 0.92 1.00
Heat Pump Water Heater, Residential 0.40 0.62 0.66