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,56 @@
1
+ {
2
+ "archive_sha256": "9b554698025ed0cdaea0d48ab1ed1a58834f30d4af4e2cad2b879349626356d3",
3
+ "source_url": "https://www.pge.com/assets/pge/docs/vanities/PGE-Solar-Billing-Plan-Export-Rates.zip",
4
+ "vintages": {
5
+ "NBT00": {
6
+ "exact_through": 2035,
7
+ "file": "export/pge/nbt00.json.gz",
8
+ "member": "PG&E NBT EEC Values Floating Vintage.csv",
9
+ "member_sha256": "6e93d289a54c0d0f253bdaa2c7560555047cf91db85dc1810cc9ec1e9a003f6d",
10
+ "years": [
11
+ 2025,
12
+ 2044
13
+ ]
14
+ },
15
+ "NBT23": {
16
+ "exact_through": 2043,
17
+ "file": "export/pge/nbt23.json.gz",
18
+ "member": "PG&E NBT EEC Values 2023 Vintage.csv",
19
+ "member_sha256": "d1d26b9ba0f7e89ed2b494c1b3b0ba49c3a3a23aa705af4d5ef0f90015136a14",
20
+ "years": [
21
+ 2024,
22
+ 2043
23
+ ]
24
+ },
25
+ "NBT24": {
26
+ "exact_through": 2043,
27
+ "file": "export/pge/nbt24.json.gz",
28
+ "member": "PG&E NBT EEC Values 2024 Vintage.csv",
29
+ "member_sha256": "e5740de7b9e19d05d59ac06640544de4fdf8aa74b8f9b87fd061b9de7efa4b16",
30
+ "years": [
31
+ 2024,
32
+ 2043
33
+ ]
34
+ },
35
+ "NBT25": {
36
+ "exact_through": 2035,
37
+ "file": "export/pge/nbt25.json.gz",
38
+ "member": "PG&E NBT EEC Values 2025 Vintage.csv",
39
+ "member_sha256": "5886394c72b435d899083a5ed86f8f33a3344909057bf395ad607b57559dfb85",
40
+ "years": [
41
+ 2025,
42
+ 2044
43
+ ]
44
+ },
45
+ "NBT26": {
46
+ "exact_through": 2036,
47
+ "file": "export/pge/nbt26.json.gz",
48
+ "member": "PG&E NBT EEC Values 2026 Vintage.csv",
49
+ "member_sha256": "a288b8124939b0a87ba8f56ef01973d9dae75d9974288ee260585d737d617fa3",
50
+ "years": [
51
+ 2026,
52
+ 2045
53
+ ]
54
+ }
55
+ }
56
+ }
@@ -0,0 +1,57 @@
1
+ # Pacific Gas and Electric Net Surplus Compensation (NSC) rates, by true-up month.
2
+ #
3
+ # Source: https://www.pge.com/assets/pge/docs/clean-energy/solar/AB920-RateTable.pdf
4
+ #
5
+ # GENERATED by `python -m tools.regen nsc` -- do not hand-edit.
6
+ #
7
+ # Definition, from the table's own footnote: per D.11-06-016, the
8
+ # electricity portion of the NSC rate is the simple rolling average of the
9
+ # utility's default load aggregation point price from 7 a.m. to 5 p.m.,
10
+ # corresponding to the customer's 12-month true-up period. Schedule NBT
11
+ # adds the mechanics: the rate is calculated monthly, effective the first
12
+ # of that month, and applies to any Net Surplus Generator whose Relevant
13
+ # Period completed in it.
14
+ #
15
+ # READ THIS BEFORE USING IT FOR A CCA ACCOUNT. Schedule NBT, Special
16
+ # Condition 5.a bars net surplus generators taking Direct Access or
17
+ # Community Choice Aggregation service from receiving NSC from the utility,
18
+ # and applicability is limited to bundled generators. For a CCA account
19
+ # this table is NOT the rate that will be paid -- the CCA's own tariff
20
+ # governs, and MCE determines its rate at cash-out rather than publishing
21
+ # it ahead. It is vendored because it is the only published, auditable NSC
22
+ # series there is, which makes it a usable stand-in until a real cash-out
23
+ # statement exists. Anything computed from it for a CCA account is an
24
+ # estimate and is flagged as one.
25
+ #
26
+ # A row is added each month; the series here ends at 2026-08. A true-up
27
+ # month later than that has no published rate yet, which is the normal
28
+ # case rather than an edge one.
29
+
30
+ schema = 1
31
+ utility = "PGE"
32
+ currency = "USD/kWh"
33
+ source_url = "https://www.pge.com/assets/pge/docs/clean-energy/solar/AB920-RateTable.pdf"
34
+ decision = "D.11-06-016"
35
+
36
+ # Keyed by true-up month: the month in which a Relevant Period completes.
37
+ [rates]
38
+ "2025-01" = 0.03396
39
+ "2025-02" = 0.03087
40
+ "2025-03" = 0.03043
41
+ "2025-04" = 0.03041
42
+ "2025-05" = 0.02919
43
+ "2025-06" = 0.02965
44
+ "2025-07" = 0.03089
45
+ "2025-08" = 0.03040
46
+ "2025-09" = 0.02999
47
+ "2025-10" = 0.03130
48
+ "2025-11" = 0.03094
49
+ "2025-12" = 0.03145
50
+ "2026-01" = 0.03116
51
+ "2026-02" = 0.03025
52
+ "2026-03" = 0.02962
53
+ "2026-04" = 0.02860
54
+ "2026-05" = 0.02897
55
+ "2026-06" = 0.02862
56
+ "2026-07" = 0.03089
57
+ "2026-08" = 0.02684
@@ -0,0 +1,151 @@
1
+ # Pacific Gas and Electric Schedule E-ELEC -- retail time-of-use rates.
2
+ #
3
+ # Source: https://www.pge.com/tariffs/assets/pdf/tariffbook/ELEC_SCHEDS_E-ELEC.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 eelec
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 = "E-ELEC"
23
+ effective = "2025-01-01"
24
+ advice_letter = "7469-E"
25
+ source_url = "https://www.pge.com/tariffs/assets/pdf/tariffbook/ELEC_SCHEDS_E-ELEC.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.31659
44
+ distribution = 0.23528
45
+
46
+ [energy.summer.part_peak]
47
+ generation = 0.21748
48
+ distribution = 0.17251
49
+
50
+ [energy.summer.off_peak]
51
+ generation = 0.17238
52
+ distribution = 0.16093
53
+
54
+ [energy.winter.peak]
55
+ generation = 0.15446
56
+ distribution = 0.1659
57
+
58
+ [energy.winter.part_peak]
59
+ generation = 0.13449
60
+ distribution = 0.16378
61
+
62
+ [energy.winter.off_peak]
63
+ generation = 0.12114
64
+ distribution = 0.16327
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
+ [base_services_charge]
132
+ unit = "USD/day"
133
+ tier_1 = 0.49281
134
+ tier_2 = 0.49281
135
+ tier_3 = 0.49281
136
+
137
+ [discounts]
138
+ care = 0.35
139
+ fera = 0.18
140
+ care_excludes = ["wildfire_fund_charge"]
141
+
142
+ # The sheet's own published totals; the components above sum to these.
143
+ [totals.summer]
144
+ peak = 0.60728
145
+ part_peak = 0.4454
146
+ off_peak = 0.38872
147
+
148
+ [totals.winter]
149
+ peak = 0.37577
150
+ part_peak = 0.35368
151
+ off_peak = 0.33982
@@ -0,0 +1,150 @@
1
+ # Pacific Gas and Electric Schedule E-ELEC -- retail time-of-use rates.
2
+ #
3
+ # Source: https://www.pge.com/tariffs/assets/pdf/tariffbook/ELEC_SCHEDS_E-ELEC.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 eelec
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 = "E-ELEC"
22
+ effective = "2025-03-01"
23
+ advice_letter = "7516-E"
24
+ source_url = "https://www.pge.com/tariffs/assets/pdf/tariffbook/ELEC_SCHEDS_E-ELEC.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.31659
43
+ distribution = 0.23953
44
+
45
+ [energy.summer.part_peak]
46
+ generation = 0.21748
47
+ distribution = 0.17676
48
+
49
+ [energy.summer.off_peak]
50
+ generation = 0.17238
51
+ distribution = 0.16518
52
+
53
+ [energy.winter.peak]
54
+ generation = 0.15446
55
+ distribution = 0.17014
56
+
57
+ [energy.winter.part_peak]
58
+ generation = 0.13449
59
+ distribution = 0.16802
60
+
61
+ [energy.winter.off_peak]
62
+ generation = 0.12114
63
+ distribution = 0.16751
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
+ [base_services_charge]
131
+ unit = "USD/day"
132
+ tier_1 = 0.49281
133
+ tier_2 = 0.49281
134
+ tier_3 = 0.49281
135
+
136
+ [discounts]
137
+ care = 0.35
138
+ fera = 0.18
139
+ care_excludes = ["wildfire_fund_charge"]
140
+
141
+ # The sheet's own published totals; the components above sum to these.
142
+ [totals.summer]
143
+ peak = 0.61418
144
+ part_peak = 0.4523
145
+ off_peak = 0.39562
146
+
147
+ [totals.winter]
148
+ peak = 0.38266
149
+ part_peak = 0.36057
150
+ off_peak = 0.34671
@@ -0,0 +1,150 @@
1
+ # Pacific Gas and Electric Schedule E-ELEC -- retail time-of-use rates.
2
+ #
3
+ # Source: https://www.pge.com/tariffs/assets/pdf/tariffbook/ELEC_SCHEDS_E-ELEC.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 eelec
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 = "E-ELEC"
22
+ effective = "2025-09-01"
23
+ advice_letter = "7684-E"
24
+ source_url = "https://www.pge.com/tariffs/assets/pdf/tariffbook/ELEC_SCHEDS_E-ELEC.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.31659
43
+ distribution = 0.231
44
+
45
+ [energy.summer.part_peak]
46
+ generation = 0.21748
47
+ distribution = 0.16823
48
+
49
+ [energy.summer.off_peak]
50
+ generation = 0.17238
51
+ distribution = 0.15665
52
+
53
+ [energy.winter.peak]
54
+ generation = 0.15446
55
+ distribution = 0.16162
56
+
57
+ [energy.winter.part_peak]
58
+ generation = 0.13449
59
+ distribution = 0.1595
60
+
61
+ [energy.winter.off_peak]
62
+ generation = 0.12114
63
+ distribution = 0.15899
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
+ [base_services_charge]
131
+ unit = "USD/day"
132
+ tier_1 = 0.49281
133
+ tier_2 = 0.49281
134
+ tier_3 = 0.49281
135
+
136
+ [discounts]
137
+ care = 0.35
138
+ fera = 0.18
139
+ care_excludes = ["wildfire_fund_charge"]
140
+
141
+ # The sheet's own published totals; the components above sum to these.
142
+ [totals.summer]
143
+ peak = 0.6043
144
+ part_peak = 0.44242
145
+ off_peak = 0.38574
146
+
147
+ [totals.winter]
148
+ peak = 0.37279
149
+ part_peak = 0.3507
150
+ off_peak = 0.33684
@@ -0,0 +1,153 @@
1
+ # Pacific Gas and Electric Schedule E-ELEC -- retail time-of-use rates.
2
+ #
3
+ # Source: https://www.pge.com/tariffs/assets/pdf/tariffbook/ELEC_SCHEDS_E-ELEC.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 eelec
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 = "E-ELEC"
23
+ effective = "2026-01-01"
24
+ advice_letter = "7797-E"
25
+ source_url = "https://www.pge.com/tariffs/assets/pdf/tariffbook/ELEC_SCHEDS_E-ELEC.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.26299
44
+ distribution = 0.23076
45
+
46
+ [energy.summer.part_peak]
47
+ generation = 0.16388
48
+ distribution = 0.16799
49
+
50
+ [energy.summer.off_peak]
51
+ generation = 0.11878
52
+ distribution = 0.15641
53
+
54
+ [energy.winter.peak]
55
+ generation = 0.10086
56
+ distribution = 0.16137
57
+
58
+ [energy.winter.part_peak]
59
+ generation = 0.08089
60
+ distribution = 0.15925
61
+
62
+ [energy.winter.off_peak]
63
+ generation = 0.06754
64
+ distribution = 0.15874
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
+ [base_services_charge]
134
+ unit = "USD/day"
135
+ tier_1 = 0.49281
136
+ tier_2 = 0.49281
137
+ tier_3 = 0.49281
138
+
139
+ [discounts]
140
+ care = 0.35
141
+ fera = 0.18
142
+ care_excludes = ["wildfire_fund_charge"]
143
+
144
+ # The sheet's own published totals; the components above sum to these.
145
+ [totals.summer]
146
+ peak = 0.57908
147
+ part_peak = 0.4172
148
+ off_peak = 0.36052
149
+
150
+ [totals.winter]
151
+ peak = 0.34756
152
+ part_peak = 0.32547
153
+ off_peak = 0.31161