Tracking consumption and cost

Published

December 20, 2025

Date range:

2024-08-01 to 2025-12-18

STH consumption

Linton consumption

Gas consumption

Export

Costs

Gas tariff

get_gas_tariff <- function(property_index, out = meter_details){

    res <- out$properties[[property_index]]$gas_meter_points

    df <- bind_rows(res, .id = "source")

    gas_tariff <- df |>
        unnest_auto("agreements") |>
        mutate(valid = ymd(str_sub(valid_from, 1, 10)),
               valid_to = ifelse(!is.na(valid_to), ymd(str_sub(valid_to, 1, 10)), NA),
               end = as.Date(ifelse(is.na(valid_to), Sys.Date(), valid_to)),
               duration = end - valid
        ) |>
        arrange(desc(valid))

    gas_code <- gas_tariff[is.na(gas_tariff$valid_to), "tariff_code"]
    trunc_gas <- gas_code |>
        str_remove("G-1R-") |>
        str_remove("-[AZ]$")
    urlsgas <- paste0("https://api.octopus.energy/v1/products/", trunc_gas, "/gas-tariffs/", gas_code, "/standing-charges/")
    urlugasur <- paste0("https://api.octopus.energy/v1/products/", trunc_gas, "/gas-tariffs/", gas_code, "/standard-unit-rates/")
    scg <- request(urlsgas) |> req_perform() |>
        resp_body_json() |>
        enframe() |>
        filter(name == "results") |>
        unnest(value) |>
        unnest_auto(value) |>
        filter(payment_method == "DIRECT_DEBIT")

    urg <- request(urlugasur) |> req_perform() |>
        resp_body_json() |>
        enframe() |>
        filter(name == "results") |>
        unnest(value) |>
        unnest_auto(value) |>
        filter(payment_method == "DIRECT_DEBIT")

    return(list(gas_standing_charges = scg, gas_unit_rates = urg)
    )
}

Electricity tariff

get_electricity_tariff <- function(property_index, out = meter_details){

    res <- out$properties[[property_index]]$electricity_meter_points

    df <- bind_rows(res, .id = "source")
    el_tariff <- df |>
        unnest_auto("agreements") |>
        mutate(valid = ymd(str_sub(valid_from, 1, 10)),
               valid_to = ifelse(!is.na(valid_to), ymd(str_sub(valid_to, 1, 10)), NA),
               end = as.Date(ifelse(is.na(valid_to), Sys.Date(), valid_to)),
               duration = end - valid
        ) |>
        arrange(desc(valid))

    elec_code <- el_tariff[is.na(el_tariff$valid_to), "tariff_code"]

    trunc_elec <- elec_code |>
        mutate(code = str_remove(tariff_code, "E-1R-"),
               code = str_remove(code, "-[AZ]$"),
               urls_sc = paste0("https://api.octopus.energy/v1/products/", code, "/electricity-tariffs/", tariff_code, "/standing-charges/"),
               urls_ur = paste0("https://api.octopus.energy/v1/products/", code, "/electricity-tariffs/", tariff_code, "/standard-unit-rates/"))

    sce_import <- request(trunc_elec$urls_sc[2]) |> req_perform() |>
        resp_body_json() |>
        enframe() |>
        filter(name == "results") |>
        unnest(value) |>
        unnest_auto(value)

    ure_import <- request(trunc_elec$urls_ur[2]) |> req_perform() |>
        resp_body_json() |>
        enframe() |>
        filter(name == "results") |>
        unnest(value) |>
        unnest_auto(value)

    sce_export <- request(trunc_elec$urls_ur[1]) |> req_perform() |>
        resp_body_json() |>
        enframe() |>
        filter(name == "results") |>
        unnest(value) |>
        unnest_auto(value)

    return(list(elec_standing_charges = sce_import, elec_unit_rates = ure_import, elec_export_rates = sce_export
    )
    )
}