tariffkit 0.2.0__py3-none-any.whl

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.
Files changed (83) hide show
  1. tariffkit/__init__.py +52 -0
  2. tariffkit/account/__init__.py +41 -0
  3. tariffkit/account/cli.py +493 -0
  4. tariffkit/account/errors.py +25 -0
  5. tariffkit/account/model.py +641 -0
  6. tariffkit/account/rates.py +61 -0
  7. tariffkit/account/repository.py +329 -0
  8. tariffkit/billing/__init__.py +56 -0
  9. tariffkit/billing/engine.py +505 -0
  10. tariffkit/billing/ledger.py +365 -0
  11. tariffkit/billing/models.py +274 -0
  12. tariffkit/billing/netting.py +137 -0
  13. tariffkit/billing/trueup.py +498 -0
  14. tariffkit/cca.py +122 -0
  15. tariffkit/cli.py +809 -0
  16. tariffkit/config.py +296 -0
  17. tariffkit/data/__init__.py +40 -0
  18. tariffkit/data/cca/mce/2023-01-01.toml +61 -0
  19. tariffkit/data/cca/mce/2026-04-01.toml +152 -0
  20. tariffkit/data/export/pge/acc_plus/2023-04-15.toml +43 -0
  21. tariffkit/data/export/pge/nbt00.json.gz +0 -0
  22. tariffkit/data/export/pge/nbt23.json.gz +0 -0
  23. tariffkit/data/export/pge/nbt24.json.gz +0 -0
  24. tariffkit/data/export/pge/nbt25.json.gz +0 -0
  25. tariffkit/data/export/pge/nbt26.json.gz +0 -0
  26. tariffkit/data/holidays.toml +36 -0
  27. tariffkit/data/manifest.json +56 -0
  28. tariffkit/data/nsc/pge.toml +57 -0
  29. tariffkit/data/tariff/pge/eelec/2025-01-01.toml +151 -0
  30. tariffkit/data/tariff/pge/eelec/2025-03-01.toml +150 -0
  31. tariffkit/data/tariff/pge/eelec/2025-09-01.toml +150 -0
  32. tariffkit/data/tariff/pge/eelec/2026-01-01.toml +153 -0
  33. tariffkit/data/tariff/pge/eelec/2026-03-01.toml +157 -0
  34. tariffkit/data/tariff/pge/etouc/2025-01-01.toml +222 -0
  35. tariffkit/data/tariff/pge/etouc/2025-03-01.toml +221 -0
  36. tariffkit/data/tariff/pge/etouc/2025-09-01.toml +221 -0
  37. tariffkit/data/tariff/pge/etouc/2026-01-01.toml +224 -0
  38. tariffkit/data/tariff/pge/etouc/2026-03-01.toml +231 -0
  39. tariffkit/data/tariff/pge/ev2a/2025-01-01.toml +144 -0
  40. tariffkit/data/tariff/pge/ev2a/2025-03-01.toml +143 -0
  41. tariffkit/data/tariff/pge/ev2a/2025-09-01.toml +143 -0
  42. tariffkit/data/tariff/pge/ev2a/2026-01-01.toml +146 -0
  43. tariffkit/data/tariff/pge/ev2a/2026-03-01.toml +153 -0
  44. tariffkit/data/tax/ca_energy_resources/2025-01-01.toml +27 -0
  45. tariffkit/data/tax/ca_energy_resources/2026-01-01.toml +27 -0
  46. tariffkit/data/versioned.py +118 -0
  47. tariffkit/engine.py +82 -0
  48. tariffkit/errors.py +19 -0
  49. tariffkit/export/__init__.py +5 -0
  50. tariffkit/export/nbt.py +207 -0
  51. tariffkit/interop/__init__.py +21 -0
  52. tariffkit/interop/emhass.py +79 -0
  53. tariffkit/interop/predbat.py +102 -0
  54. tariffkit/interop/slots.py +63 -0
  55. tariffkit/models.py +164 -0
  56. tariffkit/mqtt/__init__.py +6 -0
  57. tariffkit/mqtt/discovery.py +84 -0
  58. tariffkit/mqtt/publisher.py +305 -0
  59. tariffkit/providers/__init__.py +1 -0
  60. tariffkit/providers/pge/__init__.py +33 -0
  61. tariffkit/providers/pge/reconcile.py +828 -0
  62. tariffkit/providers/pge/statements/__init__.py +26 -0
  63. tariffkit/providers/pge/statements/errors.py +20 -0
  64. tariffkit/providers/pge/statements/model.py +320 -0
  65. tariffkit/providers/pge/statements/ocr.py +193 -0
  66. tariffkit/providers/pge/statements/parse.py +813 -0
  67. tariffkit/py.typed +0 -0
  68. tariffkit/secrets.py +164 -0
  69. tariffkit/sources/__init__.py +71 -0
  70. tariffkit/sources/greenbutton.py +318 -0
  71. tariffkit/sources/homeassistant.py +342 -0
  72. tariffkit/sources/influx.py +359 -0
  73. tariffkit/sources/pge.py +1153 -0
  74. tariffkit/tariff/__init__.py +5 -0
  75. tariffkit/tariff/retail.py +271 -0
  76. tariffkit/timeutil.py +120 -0
  77. tariffkit/web/__init__.py +5 -0
  78. tariffkit/web/app.py +220 -0
  79. tariffkit-0.2.0.dist-info/METADATA +260 -0
  80. tariffkit-0.2.0.dist-info/RECORD +83 -0
  81. tariffkit-0.2.0.dist-info/WHEEL +4 -0
  82. tariffkit-0.2.0.dist-info/entry_points.txt +2 -0
  83. tariffkit-0.2.0.dist-info/licenses/LICENSE +21 -0
@@ -0,0 +1,144 @@
1
+ # Pacific Gas and Electric Schedule EV2-A -- retail time-of-use rates.
2
+ #
3
+ # Source: https://www.pge.com/tariffs/assets/pdf/tariffbook/ELEC_SCHEDS_EV2%20(Sch).pdf
4
+ #
5
+ # GENERATED by `python -m tools.regen tariff` -- do not hand-edit the rate tables.
6
+ # Regenerate with:
7
+ # python -m tools.regen tariff --provider ev2a
8
+ #
9
+ # A tariff book's sheets revise independently, so each carries its own
10
+ # advice letter and effective date. The snapshot is dated from the sheet
11
+ # carrying the unbundled rate table, which is when these values took
12
+ # force -- not the latest date in the book. Sheets read:
13
+ # Sheet 2: Advice 7469-E, effective 2025-01-01
14
+ # Sheet 4: Advice 7469-E, effective 2025-01-01
15
+ #
16
+ # The unbundled components below sum exactly to the published totals in
17
+ # [totals]; regeneration refuses to write unless they do, which is what
18
+ # makes a silent mis-parse essentially impossible.
19
+
20
+ schema = 1
21
+ utility = "PGE"
22
+ tariff = "EV2-A"
23
+ effective = "2025-01-01"
24
+ advice_letter = "7469-E"
25
+ source_url = "https://www.pge.com/tariffs/assets/pdf/tariffbook/ELEC_SCHEDS_EV2%20(Sch).pdf"
26
+ currency = "USD/kWh"
27
+
28
+ # Structure the sheet does not publish, carried forward from the previous
29
+ # snapshot. Changing any of it is a deliberate human edit.
30
+ has_baseline = false
31
+
32
+ [seasons]
33
+ summer_start = "06-01"
34
+ summer_end = "09-30"
35
+
36
+ [periods]
37
+ peak = [[16, 21]]
38
+ part_peak = [[15, 16], [21, 24]]
39
+
40
+ # Season- and period-dependent components.
41
+
42
+ [energy.summer.peak]
43
+ generation = 0.23985
44
+ distribution = 0.32064
45
+
46
+ [energy.summer.part_peak]
47
+ generation = 0.19514
48
+ distribution = 0.25486
49
+
50
+ [energy.summer.off_peak]
51
+ generation = 0.154
52
+ distribution = 0.09398
53
+
54
+ [energy.winter.peak]
55
+ generation = 0.18298
56
+ distribution = 0.2504
57
+
58
+ [energy.winter.part_peak]
59
+ generation = 0.17049
60
+ distribution = 0.24619
61
+
62
+ [energy.winter.off_peak]
63
+ generation = 0.14701
64
+ distribution = 0.10097
65
+
66
+ # Flat riders applied to all usage in every period and season.
67
+ [adders]
68
+ transmission = 0.05122
69
+ transmission_rate_adjustments = -0.01509
70
+ reliability_services = 0.00032
71
+ public_purpose_programs = 0.02644
72
+ nuclear_decommissioning = -0.00013
73
+ competition_transition_charges = -0.00072
74
+ energy_cost_recovery = 0.00001
75
+ wildfire_fund_charge = 0.00595
76
+ new_system_generation = 0.00574
77
+ wildfire_hardening = 0.00494
78
+ recovery_bond_charge = 0.0065
79
+ recovery_bond_credit = -0.0065
80
+ bundled_pcia = -0.02327
81
+
82
+ # Riders a CCA or Direct Access customer does not pay, because PG&E is not
83
+ # supplying their generation.
84
+ [cca]
85
+ drop_components = ["generation", "bundled_pcia"]
86
+
87
+ # Vintaged PCIA a CCA/DA customer pays instead of the bundled PCIA, keyed
88
+ # by the year their generation service began.
89
+ [cca.pcia_vintages]
90
+ 2009 = 0.01071
91
+ 2010 = 0.01149
92
+ 2011 = 0.01161
93
+ 2012 = 0.01169
94
+ 2013 = 0.01125
95
+ 2014 = 0.01119
96
+ 2015 = 0.01111
97
+ 2016 = 0.0111
98
+ 2017 = 0.01073
99
+ 2018 = 0.0067
100
+ 2019 = 0.00337
101
+ 2020 = 0.00324
102
+ 2021 = -0.01908
103
+ 2022 = -0.01926
104
+ 2023 = -0.02202
105
+ 2024 = -0.02756
106
+ 2025 = -0.02327
107
+
108
+ # Franchise fee surcharge, which a CCA/DA customer pays and a bundled one
109
+ # does not. Published in a separate schedule (E-FFS) and read from it,
110
+ # because carrying it forward would let that schedule be reissued without
111
+ # anything noticing -- it is live rate data on every CCA price.
112
+ [cca.franchise_fee_vintages]
113
+ 2009 = 0.00105
114
+ 2010 = 0.00105
115
+ 2011 = 0.00105
116
+ 2012 = 0.00104
117
+ 2013 = 0.00105
118
+ 2014 = 0.00105
119
+ 2015 = 0.00105
120
+ 2016 = 0.00105
121
+ 2017 = 0.00105
122
+ 2018 = 0.00108
123
+ 2019 = 0.00111
124
+ 2020 = 0.00111
125
+ 2021 = 0.00127
126
+ 2022 = 0.00127
127
+ 2023 = 0.00129
128
+ 2024 = 0.00133
129
+ 2025 = 0.0013
130
+
131
+ # No daily fixed charge on this schedule at this vintage. AB 205's Base
132
+ # Services Charge began 2026-03-01; before it these schedules had none,
133
+ # so the section is absent rather than zeroed.
134
+
135
+ # The sheet's own published totals; the components above sum to these.
136
+ [totals.summer]
137
+ peak = 0.6159
138
+ part_peak = 0.50541
139
+ off_peak = 0.30339
140
+
141
+ [totals.winter]
142
+ peak = 0.48879
143
+ part_peak = 0.47209
144
+ off_peak = 0.30339
@@ -0,0 +1,143 @@
1
+ # Pacific Gas and Electric Schedule EV2-A -- retail time-of-use rates.
2
+ #
3
+ # Source: https://www.pge.com/tariffs/assets/pdf/tariffbook/ELEC_SCHEDS_EV2%20(Sch).pdf
4
+ #
5
+ # GENERATED by `python -m tools.regen tariff` -- do not hand-edit the rate tables.
6
+ # Regenerate with:
7
+ # python -m tools.regen tariff --provider ev2a
8
+ #
9
+ # A tariff book's sheets revise independently, so each carries its own
10
+ # advice letter and effective date. The snapshot is dated from the sheet
11
+ # carrying the unbundled rate table, which is when these values took
12
+ # force -- not the latest date in the book. Sheets read:
13
+ # Sheet 2: Advice 7516-E, effective 2025-03-01
14
+ #
15
+ # The unbundled components below sum exactly to the published totals in
16
+ # [totals]; regeneration refuses to write unless they do, which is what
17
+ # makes a silent mis-parse essentially impossible.
18
+
19
+ schema = 1
20
+ utility = "PGE"
21
+ tariff = "EV2-A"
22
+ effective = "2025-03-01"
23
+ advice_letter = "7516-E"
24
+ source_url = "https://www.pge.com/tariffs/assets/pdf/tariffbook/ELEC_SCHEDS_EV2%20(Sch).pdf"
25
+ currency = "USD/kWh"
26
+
27
+ # Structure the sheet does not publish, carried forward from the previous
28
+ # snapshot. Changing any of it is a deliberate human edit.
29
+ has_baseline = false
30
+
31
+ [seasons]
32
+ summer_start = "06-01"
33
+ summer_end = "09-30"
34
+
35
+ [periods]
36
+ peak = [[16, 21]]
37
+ part_peak = [[15, 16], [21, 24]]
38
+
39
+ # Season- and period-dependent components.
40
+
41
+ [energy.summer.peak]
42
+ generation = 0.23985
43
+ distribution = 0.32486
44
+
45
+ [energy.summer.part_peak]
46
+ generation = 0.19514
47
+ distribution = 0.25908
48
+
49
+ [energy.summer.off_peak]
50
+ generation = 0.154
51
+ distribution = 0.0982
52
+
53
+ [energy.winter.peak]
54
+ generation = 0.18298
55
+ distribution = 0.25462
56
+
57
+ [energy.winter.part_peak]
58
+ generation = 0.17049
59
+ distribution = 0.25041
60
+
61
+ [energy.winter.off_peak]
62
+ generation = 0.14701
63
+ distribution = 0.1052
64
+
65
+ # Flat riders applied to all usage in every period and season.
66
+ [adders]
67
+ transmission = 0.05122
68
+ transmission_rate_adjustments = -0.01213
69
+ reliability_services = 0.00032
70
+ public_purpose_programs = 0.02644
71
+ nuclear_decommissioning = -0.00024
72
+ competition_transition_charges = -0.00072
73
+ energy_cost_recovery = 0.00001
74
+ wildfire_fund_charge = 0.00595
75
+ new_system_generation = 0.00574
76
+ wildfire_hardening = 0.00474
77
+ recovery_bond_charge = 0.00647
78
+ recovery_bond_credit = -0.00647
79
+ bundled_pcia = -0.02327
80
+
81
+ # Riders a CCA or Direct Access customer does not pay, because PG&E is not
82
+ # supplying their generation.
83
+ [cca]
84
+ drop_components = ["generation", "bundled_pcia"]
85
+
86
+ # Vintaged PCIA a CCA/DA customer pays instead of the bundled PCIA, keyed
87
+ # by the year their generation service began.
88
+ [cca.pcia_vintages]
89
+ 2009 = 0.01071
90
+ 2010 = 0.01149
91
+ 2011 = 0.01161
92
+ 2012 = 0.01169
93
+ 2013 = 0.01125
94
+ 2014 = 0.01119
95
+ 2015 = 0.01111
96
+ 2016 = 0.0111
97
+ 2017 = 0.01073
98
+ 2018 = 0.0067
99
+ 2019 = 0.00337
100
+ 2020 = 0.00324
101
+ 2021 = -0.01908
102
+ 2022 = -0.01926
103
+ 2023 = -0.02202
104
+ 2024 = -0.02756
105
+ 2025 = -0.02327
106
+
107
+ # Franchise fee surcharge, which a CCA/DA customer pays and a bundled one
108
+ # does not. Published in a separate schedule (E-FFS) and read from it,
109
+ # because carrying it forward would let that schedule be reissued without
110
+ # anything noticing -- it is live rate data on every CCA price.
111
+ [cca.franchise_fee_vintages]
112
+ 2009 = 0.00105
113
+ 2010 = 0.00105
114
+ 2011 = 0.00105
115
+ 2012 = 0.00104
116
+ 2013 = 0.00105
117
+ 2014 = 0.00105
118
+ 2015 = 0.00105
119
+ 2016 = 0.00105
120
+ 2017 = 0.00105
121
+ 2018 = 0.00108
122
+ 2019 = 0.00111
123
+ 2020 = 0.00111
124
+ 2021 = 0.00127
125
+ 2022 = 0.00127
126
+ 2023 = 0.00129
127
+ 2024 = 0.00133
128
+ 2025 = 0.0013
129
+
130
+ # No daily fixed charge on this schedule at this vintage. AB 205's Base
131
+ # Services Charge began 2026-03-01; before it these schedules had none,
132
+ # so the section is absent rather than zeroed.
133
+
134
+ # The sheet's own published totals; the components above sum to these.
135
+ [totals.summer]
136
+ peak = 0.62277
137
+ part_peak = 0.51228
138
+ off_peak = 0.31026
139
+
140
+ [totals.winter]
141
+ peak = 0.49566
142
+ part_peak = 0.47896
143
+ off_peak = 0.31027
@@ -0,0 +1,143 @@
1
+ # Pacific Gas and Electric Schedule EV2-A -- retail time-of-use rates.
2
+ #
3
+ # Source: https://www.pge.com/tariffs/assets/pdf/tariffbook/ELEC_SCHEDS_EV2%20(Sch).pdf
4
+ #
5
+ # GENERATED by `python -m tools.regen tariff` -- do not hand-edit the rate tables.
6
+ # Regenerate with:
7
+ # python -m tools.regen tariff --provider ev2a
8
+ #
9
+ # A tariff book's sheets revise independently, so each carries its own
10
+ # advice letter and effective date. The snapshot is dated from the sheet
11
+ # carrying the unbundled rate table, which is when these values took
12
+ # force -- not the latest date in the book. Sheets read:
13
+ # Sheet 2: Advice 7684-E, effective 2025-09-01
14
+ #
15
+ # The unbundled components below sum exactly to the published totals in
16
+ # [totals]; regeneration refuses to write unless they do, which is what
17
+ # makes a silent mis-parse essentially impossible.
18
+
19
+ schema = 1
20
+ utility = "PGE"
21
+ tariff = "EV2-A"
22
+ effective = "2025-09-01"
23
+ advice_letter = "7684-E"
24
+ source_url = "https://www.pge.com/tariffs/assets/pdf/tariffbook/ELEC_SCHEDS_EV2%20(Sch).pdf"
25
+ currency = "USD/kWh"
26
+
27
+ # Structure the sheet does not publish, carried forward from the previous
28
+ # snapshot. Changing any of it is a deliberate human edit.
29
+ has_baseline = false
30
+
31
+ [seasons]
32
+ summer_start = "06-01"
33
+ summer_end = "09-30"
34
+
35
+ [periods]
36
+ peak = [[16, 21]]
37
+ part_peak = [[15, 16], [21, 24]]
38
+
39
+ # Season- and period-dependent components.
40
+
41
+ [energy.summer.peak]
42
+ generation = 0.23985
43
+ distribution = 0.3163
44
+
45
+ [energy.summer.part_peak]
46
+ generation = 0.19514
47
+ distribution = 0.25052
48
+
49
+ [energy.summer.off_peak]
50
+ generation = 0.154
51
+ distribution = 0.08965
52
+
53
+ [energy.winter.peak]
54
+ generation = 0.18298
55
+ distribution = 0.24606
56
+
57
+ [energy.winter.part_peak]
58
+ generation = 0.17049
59
+ distribution = 0.24185
60
+
61
+ [energy.winter.off_peak]
62
+ generation = 0.14701
63
+ distribution = 0.09664
64
+
65
+ # Flat riders applied to all usage in every period and season.
66
+ [adders]
67
+ transmission = 0.05122
68
+ transmission_rate_adjustments = -0.01213
69
+ reliability_services = 0.00032
70
+ public_purpose_programs = 0.02644
71
+ nuclear_decommissioning = -0.00024
72
+ competition_transition_charges = -0.00072
73
+ energy_cost_recovery = 0.00001
74
+ wildfire_fund_charge = 0.00595
75
+ new_system_generation = 0.00574
76
+ wildfire_hardening = 0.00339
77
+ recovery_bond_charge = 0.00778
78
+ recovery_bond_credit = -0.00778
79
+ bundled_pcia = -0.02327
80
+
81
+ # Riders a CCA or Direct Access customer does not pay, because PG&E is not
82
+ # supplying their generation.
83
+ [cca]
84
+ drop_components = ["generation", "bundled_pcia"]
85
+
86
+ # Vintaged PCIA a CCA/DA customer pays instead of the bundled PCIA, keyed
87
+ # by the year their generation service began.
88
+ [cca.pcia_vintages]
89
+ 2009 = 0.01071
90
+ 2010 = 0.01149
91
+ 2011 = 0.01161
92
+ 2012 = 0.01169
93
+ 2013 = 0.01125
94
+ 2014 = 0.01119
95
+ 2015 = 0.01111
96
+ 2016 = 0.0111
97
+ 2017 = 0.01073
98
+ 2018 = 0.0067
99
+ 2019 = 0.00337
100
+ 2020 = 0.00324
101
+ 2021 = -0.01908
102
+ 2022 = -0.01926
103
+ 2023 = -0.02202
104
+ 2024 = -0.02756
105
+ 2025 = -0.02327
106
+
107
+ # Franchise fee surcharge, which a CCA/DA customer pays and a bundled one
108
+ # does not. Published in a separate schedule (E-FFS) and read from it,
109
+ # because carrying it forward would let that schedule be reissued without
110
+ # anything noticing -- it is live rate data on every CCA price.
111
+ [cca.franchise_fee_vintages]
112
+ 2009 = 0.00105
113
+ 2010 = 0.00105
114
+ 2011 = 0.00105
115
+ 2012 = 0.00104
116
+ 2013 = 0.00105
117
+ 2014 = 0.00105
118
+ 2015 = 0.00105
119
+ 2016 = 0.00105
120
+ 2017 = 0.00105
121
+ 2018 = 0.00108
122
+ 2019 = 0.00111
123
+ 2020 = 0.00111
124
+ 2021 = 0.00127
125
+ 2022 = 0.00127
126
+ 2023 = 0.00129
127
+ 2024 = 0.00133
128
+ 2025 = 0.0013
129
+
130
+ # No daily fixed charge on this schedule at this vintage. AB 205's Base
131
+ # Services Charge began 2026-03-01; before it these schedules had none,
132
+ # so the section is absent rather than zeroed.
133
+
134
+ # The sheet's own published totals; the components above sum to these.
135
+ [totals.summer]
136
+ peak = 0.61286
137
+ part_peak = 0.50237
138
+ off_peak = 0.30036
139
+
140
+ [totals.winter]
141
+ peak = 0.48575
142
+ part_peak = 0.46905
143
+ off_peak = 0.30036
@@ -0,0 +1,146 @@
1
+ # Pacific Gas and Electric Schedule EV2-A -- retail time-of-use rates.
2
+ #
3
+ # Source: https://www.pge.com/tariffs/assets/pdf/tariffbook/ELEC_SCHEDS_EV2%20(Sch).pdf
4
+ #
5
+ # GENERATED by `python -m tools.regen tariff` -- do not hand-edit the rate tables.
6
+ # Regenerate with:
7
+ # python -m tools.regen tariff --provider ev2a
8
+ #
9
+ # A tariff book's sheets revise independently, so each carries its own
10
+ # advice letter and effective date. The snapshot is dated from the sheet
11
+ # carrying the unbundled rate table, which is when these values took
12
+ # force -- not the latest date in the book. Sheets read:
13
+ # Sheet 2: Advice 7797-E, effective 2026-01-01
14
+ # Sheet 4: Advice 7797-E, effective 2026-01-01
15
+ #
16
+ # The unbundled components below sum exactly to the published totals in
17
+ # [totals]; regeneration refuses to write unless they do, which is what
18
+ # makes a silent mis-parse essentially impossible.
19
+
20
+ schema = 1
21
+ utility = "PGE"
22
+ tariff = "EV2-A"
23
+ effective = "2026-01-01"
24
+ advice_letter = "7797-E"
25
+ source_url = "https://www.pge.com/tariffs/assets/pdf/tariffbook/ELEC_SCHEDS_EV2%20(Sch).pdf"
26
+ currency = "USD/kWh"
27
+
28
+ # Structure the sheet does not publish, carried forward from the previous
29
+ # snapshot. Changing any of it is a deliberate human edit.
30
+ has_baseline = false
31
+
32
+ [seasons]
33
+ summer_start = "06-01"
34
+ summer_end = "09-30"
35
+
36
+ [periods]
37
+ peak = [[16, 21]]
38
+ part_peak = [[15, 16], [21, 24]]
39
+
40
+ # Season- and period-dependent components.
41
+
42
+ [energy.summer.peak]
43
+ generation = 0.1883
44
+ distribution = 0.32361
45
+
46
+ [energy.summer.part_peak]
47
+ generation = 0.14359
48
+ distribution = 0.25783
49
+
50
+ [energy.summer.off_peak]
51
+ generation = 0.10245
52
+ distribution = 0.09696
53
+
54
+ [energy.winter.peak]
55
+ generation = 0.13143
56
+ distribution = 0.25337
57
+
58
+ [energy.winter.part_peak]
59
+ generation = 0.11894
60
+ distribution = 0.24916
61
+
62
+ [energy.winter.off_peak]
63
+ generation = 0.09546
64
+ distribution = 0.10395
65
+
66
+ # Flat riders applied to all usage in every period and season.
67
+ [adders]
68
+ transmission = 0.04638
69
+ transmission_rate_adjustments = 0.00315
70
+ reliability_services = 0.00013
71
+ public_purpose_programs = 0.02829
72
+ nuclear_decommissioning = -0.00002
73
+ competition_transition_charges = 0.00027
74
+ energy_cost_recovery = 0.00002
75
+ wildfire_fund_charge = 0.00591
76
+ new_system_generation = 0.00792
77
+ wildfire_hardening = 0.00339
78
+ recovery_bond_charge = 0.00778
79
+ recovery_bond_credit = -0.00778
80
+ bundled_pcia = -0.01011
81
+
82
+ # Riders a CCA or Direct Access customer does not pay, because PG&E is not
83
+ # supplying their generation.
84
+ [cca]
85
+ drop_components = ["generation", "bundled_pcia"]
86
+
87
+ # Vintaged PCIA a CCA/DA customer pays instead of the bundled PCIA, keyed
88
+ # by the year their generation service began.
89
+ [cca.pcia_vintages]
90
+ 2009 = 0.02973
91
+ 2010 = 0.03366
92
+ 2011 = 0.03492
93
+ 2012 = 0.03676
94
+ 2013 = 0.03708
95
+ 2014 = 0.03686
96
+ 2015 = 0.0368
97
+ 2016 = 0.03687
98
+ 2017 = 0.03661
99
+ 2018 = 0.03679
100
+ 2019 = 0.03725
101
+ 2020 = 0.03632
102
+ 2021 = 0.05264
103
+ 2022 = 0.05272
104
+ 2023 = 0.0538
105
+ 2024 = 0.05066
106
+ 2025 = -0.01011
107
+ 2026 = -0.01011
108
+
109
+ # Franchise fee surcharge, which a CCA/DA customer pays and a bundled one
110
+ # does not. Published in a separate schedule (E-FFS) and read from it,
111
+ # because carrying it forward would let that schedule be reissued without
112
+ # anything noticing -- it is live rate data on every CCA price.
113
+ [cca.franchise_fee_vintages]
114
+ 2009 = 0.00064
115
+ 2010 = 0.00061
116
+ 2011 = 0.0006
117
+ 2012 = 0.00059
118
+ 2013 = 0.00059
119
+ 2014 = 0.00059
120
+ 2015 = 0.00059
121
+ 2016 = 0.00059
122
+ 2017 = 0.00059
123
+ 2018 = 0.00059
124
+ 2019 = 0.00059
125
+ 2020 = 0.00059
126
+ 2021 = 0.00048
127
+ 2022 = 0.00048
128
+ 2023 = 0.00047
129
+ 2024 = 0.00049
130
+ 2025 = 0.00093
131
+ 2026 = 0.00093
132
+
133
+ # No daily fixed charge on this schedule at this vintage. AB 205's Base
134
+ # Services Charge began 2026-03-01; before it these schedules had none,
135
+ # so the section is absent rather than zeroed.
136
+
137
+ # The sheet's own published totals; the components above sum to these.
138
+ [totals.summer]
139
+ peak = 0.59724
140
+ part_peak = 0.48675
141
+ off_peak = 0.28474
142
+
143
+ [totals.winter]
144
+ peak = 0.47013
145
+ part_peak = 0.45343
146
+ off_peak = 0.28474