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,260 @@
1
+ Metadata-Version: 2.5
2
+ Name: tariffkit
3
+ Version: 0.2.0
4
+ Summary: Offline electricity tariff pricing, billing, and integration tools
5
+ Project-URL: Homepage, https://github.com/eman/tariffkit
6
+ Project-URL: Documentation, https://github.com/eman/tariffkit#documentation
7
+ Project-URL: Issues, https://github.com/eman/tariffkit/issues
8
+ Project-URL: Source, https://github.com/eman/tariffkit
9
+ License-Expression: MIT
10
+ License-File: LICENSE
11
+ Keywords: battery,energy,home-assistant,nem3,net-billing-tariff,pge,solar,tariff
12
+ Classifier: Development Status :: 3 - Alpha
13
+ Classifier: Intended Audience :: Developers
14
+ Classifier: Intended Audience :: End Users/Desktop
15
+ Classifier: License :: OSI Approved :: MIT License
16
+ Classifier: Programming Language :: Python :: 3
17
+ Classifier: Programming Language :: Python :: 3.14
18
+ Classifier: Topic :: Home Automation
19
+ Classifier: Typing :: Typed
20
+ Requires-Python: >=3.14
21
+ Provides-Extra: all
22
+ Requires-Dist: fastapi>=0.110; extra == 'all'
23
+ Requires-Dist: httpx>=0.27; extra == 'all'
24
+ Requires-Dist: keyring>=25; extra == 'all'
25
+ Requires-Dist: paho-mqtt>=2.0; extra == 'all'
26
+ Requires-Dist: pypdf>=4.0; extra == 'all'
27
+ Requires-Dist: uvicorn[standard]>=0.29; extra == 'all'
28
+ Requires-Dist: websockets>=12; extra == 'all'
29
+ Provides-Extra: ha
30
+ Requires-Dist: websockets>=12; extra == 'ha'
31
+ Provides-Extra: influx
32
+ Requires-Dist: httpx>=0.27; extra == 'influx'
33
+ Provides-Extra: mqtt
34
+ Requires-Dist: paho-mqtt>=2.0; extra == 'mqtt'
35
+ Provides-Extra: pge
36
+ Requires-Dist: httpx>=0.27; extra == 'pge'
37
+ Provides-Extra: secrets
38
+ Requires-Dist: keyring>=25; extra == 'secrets'
39
+ Provides-Extra: statements
40
+ Requires-Dist: pypdf>=4.0; extra == 'statements'
41
+ Provides-Extra: web
42
+ Requires-Dist: fastapi>=0.110; extra == 'web'
43
+ Requires-Dist: uvicorn[standard]>=0.29; extra == 'web'
44
+ Description-Content-Type: text/markdown
45
+
46
+ # TariffKit
47
+
48
+ An offline electricity tariff engine for pricing, billing, and energy-system
49
+ integrations. The first data provider supports PG&E residential rate plans under
50
+ **NEM 3.0 / the Net Billing Tariff (NBT)**; the package identity is deliberately
51
+ not tied to one utility or tariff program.
52
+
53
+ Three schedules are vendored: **E-ELEC** (Electric Home), **E-TOU-C**
54
+ (Time-of-Use, peak 4–9 p.m. every day), and **EV2-A** (Home Charging).
55
+
56
+ Under NBT your export credit is not a time-of-use schedule: it is an hourly
57
+ Avoided Cost Calculator value that swings from about $0.06/kWh at midday to
58
+ about $1.19/kWh on an August evening. Knowing what a kWh is worth right now, and
59
+ what it will be worth over the next two days, is the input to every useful
60
+ solar-and-battery dispatch decision.
61
+
62
+ ```python
63
+ from tariffkit import RateEngine
64
+
65
+ engine = RateEngine()
66
+ point = engine.price_now()
67
+
68
+ print(point.import_price.total) # $/kWh to draw from the grid
69
+ print(point.export_price.total) # $/kWh earned by exporting
70
+ print(point.spread) # positive => exporting beats self-consuming
71
+
72
+ curve = engine.forecast(hours=48)
73
+ for hour in curve.best_export_hours(3):
74
+ print(hour.start, hour.export_price.total)
75
+ ```
76
+
77
+ ## Why it works offline
78
+
79
+ PG&E publishes 20 years of hourly export rates per vintage, as CPUC Resolution
80
+ E-5301 requires (roughly 40 MB of CSV per vintage). But that file is a lossless
81
+ expansion of a 576-cell matrix per year (12 months × 2 day types × 24 hours) per
82
+ component. `tariffkit` collapses it at build time, verifying losslessness cell by
83
+ cell, so the entire five-vintage dataset ships inside the wheel at **268 KiB**
84
+ and every lookup is a few list indexes.
85
+
86
+ The retail side is similar: these schedules' period boundaries are identical every day
87
+ of the week including holidays and do not shift by season, so an import price is
88
+ fully determined by `(season, hour)`.
89
+
90
+ Nothing here touches the network at runtime.
91
+
92
+ ## Documentation
93
+
94
+ | | |
95
+ |---|---|
96
+ | [Configuration](docs/configuration.md) | Settings, CCA setup, reading your bill |
97
+ | [Library](docs/library.md) | Embedding in Python |
98
+ | [Named account profiles](docs/accounts.md) | Tracking a changing service agreement over time, importing PG&E statements |
99
+ | [Bill calculator](docs/billing.md) | Computing a cycle from interval meter data |
100
+ | [MQTT](docs/mqtt.md) | Publishing, with Home Assistant discovery |
101
+ | [REST API](docs/web.md) | HTTP service |
102
+ | [Home Assistant](docs/home-assistant.md) | Custom component, Energy dashboard, account history, response actions, opt-in Predbat |
103
+ | [Home Assistant quality checklist](docs/home-assistant-quality.md) | Self-assessment against the Integration Quality Scale, with exemptions |
104
+ | [Containers](docs/containers.md) | Local Home Assistant development stack and API/MQTT deployment proposal |
105
+ | [Maintaining rate data](docs/data.md) | Regenerating export rates, updating the retail tariff and CCA cards |
106
+ | [Packaging strategy](docs/packaging_strategy.md) | Architecture decision, boundaries, and release model |
107
+ | [Release procedure](docs/releases.md) | Versioning, Trusted Publishing, verification, and recovery |
108
+
109
+ ## Works with
110
+
111
+ Prices are published in the shapes these already read, via either the custom
112
+ component or the MQTT publisher — no template plumbing on your side. The two
113
+ surfaces differ for EMHASS and Predbat: MQTT always publishes their
114
+ attributes, while the custom component asks for a window on demand and keeps
115
+ Predbat opt-in.
116
+
117
+ | | Custom component | MQTT |
118
+ |---|---|---|
119
+ | **Home Assistant Energy dashboard** | Import/export price entities | Import/export price entities |
120
+ | **EMHASS** | `tariffkit.get_emhass_forecast` action, called with any window | `load_cost_forecast` / `prod_price_forecast` attributes, always published |
121
+ | **Predbat** | `raw_today` / `raw_tomorrow` attributes, only once enabled in options | `raw_today` / `raw_tomorrow` attributes, always published |
122
+
123
+ See [docs/home-assistant.md](docs/home-assistant.md) and
124
+ [docs/mqtt.md](docs/mqtt.md) for setup of each.
125
+
126
+ ## Install
127
+
128
+ ```bash
129
+ pip install tariffkit # core, zero dependencies
130
+ pip install 'tariffkit[mqtt]' # + MQTT publisher with Home Assistant discovery
131
+ pip install 'tariffkit[web]' # + FastAPI service
132
+ pip install 'tariffkit[secrets]' # + OS keyring credential storage
133
+ pip install 'tariffkit[statements]' # + reading local PG&E statement PDFs
134
+ pip install 'tariffkit[all]'
135
+ ```
136
+
137
+ ## CLI
138
+
139
+ ```bash
140
+ tariffkit now # current import/export price
141
+ tariffkit forecast --hours 48 # the upcoming curve
142
+ tariffkit forecast --format json # machine-readable
143
+ tariffkit mqtt --broker 192.168.1.100 # publish hourly, with HA discovery
144
+ tariffkit serve # REST API on :8000
145
+ tariffkit bill intervals.csv # compute a cycle from meter data
146
+ tariffkit info # which data is loaded, and from where
147
+ tariffkit account init home # track a service agreement's history
148
+ tariffkit account source home show ha # inspect profile grid-import/export entities
149
+ ```
150
+
151
+ ## Configuration
152
+
153
+ Defaults target a PG&E-bundled residential customer. Point it at your own
154
+ service agreement via `~/.config/tariffkit/config.toml`:
155
+
156
+ ```toml
157
+ supplier = "bundled" # or "cca"
158
+ interconnection_year = 2026 # selects the NBT vintage and ACC Plus row
159
+ pto_date = "2026-06-03" # starts the nine-year rate lock
160
+ acc_plus_segment = "residential"
161
+ base_services_charge_tier = 3
162
+ ```
163
+
164
+ `TARIFFKIT_*` environment variables override any file setting.
165
+ Long-lived PG&E, Home Assistant, InfluxDB, and MQTT credentials can be stored
166
+ outside that file with `tariffkit credentials set`; see
167
+ [Configuration](docs/configuration.md#credentials).
168
+
169
+ ### What the numbers include
170
+
171
+ - **Import price** is the marginal per-kWh cost: generation + distribution for
172
+ the season and period, plus the flat riders. The AB 205 Base Services Charge
173
+ is a fixed $/day amount and is deliberately *excluded*: folding it into a
174
+ $/kWh figure would corrupt any marginal dispatch decision. Read it separately
175
+ via `engine.daily_fixed_charge()`.
176
+ - **Export credit** is the generation component plus the delivery component,
177
+ plus your ACC Plus adder. Values past your nine-year lock are still returned
178
+ but flagged `locked=False`; PG&E publishes them for illustration only.
179
+
180
+ ### Edge cases in PG&E's published data
181
+
182
+ Found by round-tripping the vendored matrices against all 1.75 million source
183
+ rows. The library handles each; they are documented because they are surprising.
184
+
185
+ - **The autumn DST hour.** The fall-back day has 25 real hours but only 24 rate
186
+ labels. PG&E gives the repeated 01:00 PST the `HS2` label, so it is priced as
187
+ 2am. Pricing it by wall-clock hour returns the wrong value for that hour.
188
+ - **Far-future drift.** From 2036 onward PG&E's own hour labels stop tracking
189
+ Pacific daylight time, and NBT25/26/00 duplicate some holidays onto the
190
+ following day. Each vintage records the last year verified exact; prices past
191
+ it are returned with `exact=False`. Every year inside a nine-year rate lock is
192
+ exact, and those years are already published as illustrative only.
193
+ - **Vintages disagree about holidays** in those same late years, so the holiday
194
+ calendar used for a lookup is the one embedded in that vintage's own file.
195
+ - **Only the June 2026 tariff sheets are vendored**, for each of the three
196
+ schedules. Earlier timestamps raise rather than silently back-dating current
197
+ rates onto an older billing period.
198
+ - **E-TOU-C's baseline credit is not in the marginal price.** It applies to the
199
+ first N kWh of a cycle, which is a quantity rather than a time, so `price_at`
200
+ reports it as `baseline_credit` and the billing engine applies it.
201
+
202
+ ### CCA customers
203
+
204
+ If a Community Choice Aggregator supplies your generation, PG&E still delivers,
205
+ and under NEM 3.0 you receive **only the delivery component** of the export
206
+ credit from PG&E; generation compensation comes from the CCA.
207
+
208
+ An MCE rate card is vendored (generation by season/period, the Cost Relief
209
+ Credit, Deep Green premium, and the 10% Solar Bonus Credit):
210
+
211
+ ```toml
212
+ supplier = "cca"
213
+
214
+ [cca]
215
+ name = "MCE"
216
+ rate_card = "mce"
217
+ pcia_rate = 0.03476 # $/kWh, from your bill
218
+ franchise_fee_surcharge = 0.00042 # $/kWh, from your bill
219
+ ```
220
+
221
+ For other CCAs, supply `generation_rates` directly; see
222
+ [docs/configuration.md](docs/configuration.md). Until generation rates and a
223
+ franchise fee are configured, CCA mode returns delivery-only prices flagged
224
+ `complete = False` rather than quietly understating your rates.
225
+
226
+ Note that a CCA customer's PCIA is a **charge**, while a bundled customer's is a
227
+ **credit**, so CCA service can cost several cents per kWh more on import.
228
+
229
+ ## Keeping rates current
230
+
231
+ Every vendored dataset is regenerated from the document that publishes it, by
232
+ `tools.regen`. Nothing is hand-transcribed and nothing is hand-edited.
233
+
234
+ ```bash
235
+ python -m tools.regen # rebuild every dataset
236
+ python -m tools.regen --check # exit 1 if a publisher moved
237
+ python -m tools.regen tariff --for-date 2025-12-15 # rebuild a superseded vintage
238
+ python -m tools.regen.export --download # the 843 MB export-rate archive
239
+ ```
240
+
241
+ Export matrices come from PG&E's CSV archive, which is large enough to have its
242
+ own entry point; everything else comes from a published PDF. Nothing is written
243
+ unless the rendered file survives being read back by the library code that will
244
+ consume it, so a generator that drifts from the schema fails instead of shipping.
245
+
246
+ A weekly CI job runs `--check`, so a rate change surfaces as a failing build
247
+ rather than as silent drift. Export files are updated by **October 1** of any
248
+ year the CPUC adopts a new Avoided Cost Calculator; retail rates change more
249
+ often, via advice letters — three times in the first half of 2026 alone — which
250
+ is why a superseded vintage can be rebuilt from the filing that adopted it. See
251
+ [docs/data.md](docs/data.md).
252
+
253
+ ## Data sources
254
+
255
+ See [docs/data.md](docs/data.md#data-sources) for the source of every vendored
256
+ table and why OpenEI's URDB is deliberately not used.
257
+
258
+ ## License
259
+
260
+ MIT
@@ -0,0 +1,83 @@
1
+ tariffkit/__init__.py,sha256=S477yWU4sSVRpAL73EQKqpOgCLCSMz5R6qMAbZh5Wbs,1233
2
+ tariffkit/cca.py,sha256=VDdbg6uRKu0m5V6rYBm6yPLeEbEm1SBi748WxtTuQ7o,4787
3
+ tariffkit/cli.py,sha256=V-4d5leaRSrZc-CBPVnaSqKpOIi1Np6_h90eu3QJWFo,33279
4
+ tariffkit/config.py,sha256=JhH5QlGstygfFrzK-onznWWcbrlj0WsnAfbF2GuUims,13582
5
+ tariffkit/engine.py,sha256=oduUNC5RJDaURiZsTAzEKmc7EAUwCAZCN91vw8tgr_U,3683
6
+ tariffkit/errors.py,sha256=ix6HwRAa-GYhpczScF4PYkoEggwSepbdBsm3NAKkanc,515
7
+ tariffkit/models.py,sha256=iVYW0LDYO2cVbGBX2Zat1vFTzJId5Cd4K7vQMur_63I,5303
8
+ tariffkit/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
9
+ tariffkit/secrets.py,sha256=owcRfOMh7WqJMll4Vo2C7beCFTwhaQryhuBn04PWrUs,5480
10
+ tariffkit/timeutil.py,sha256=odsSFaOuQhe-YQ7WO8hsAB3WuBYiJV_LhEt-12uZoOY,4220
11
+ tariffkit/account/__init__.py,sha256=-NYtM2EGW38TkK_AD6tSaVPdChhp9J69ZgHnJBgJS_g,968
12
+ tariffkit/account/cli.py,sha256=ZZLzXy2PsraGwueg-Qv9EKp2RlIpNK9c55H9zfLmYGg,18097
13
+ tariffkit/account/errors.py,sha256=lorGdPWUslXe1tZITs6ja4kN87Cz9-0ZwdPBDRdz1TI,674
14
+ tariffkit/account/model.py,sha256=sGu3mbjulX-Z8Etmp9vVudrikbl4ry7rphVysoIBJic,25895
15
+ tariffkit/account/rates.py,sha256=5zze2tWBWxAFlmvJyks8gN2w0-KWVPiGnExLuSdfxDg,2576
16
+ tariffkit/account/repository.py,sha256=YpBunBdVNKyu_HH6gkqxnRm7es5MY4mm1Fhu9HojAxg,13222
17
+ tariffkit/billing/__init__.py,sha256=EA0kXezmq-1UEan6VSgSnouUs_lfMl6w_WpO-fQXX5E,1202
18
+ tariffkit/billing/engine.py,sha256=SIV2CyZ9QoBvEvPjARMfiq1t9gP9QsPPKODxXa7DuQs,21908
19
+ tariffkit/billing/ledger.py,sha256=ouwz1x2WfCoHsPbTdlDlXwGUSOUjas50NvZ3LCDhjoQ,14795
20
+ tariffkit/billing/models.py,sha256=G0rIChj_ZtHoV-AMLPSvblXpZ1-KhxMmEI2gjb4CGjs,10749
21
+ tariffkit/billing/netting.py,sha256=kAnUrS2w6vX3Q2uQFrpalbzMDp3zC0VOR2V0NbxKk8g,6227
22
+ tariffkit/billing/trueup.py,sha256=0eXmtHM7mNtn4O_olKgNZM-aBdwvuJalGAVjMTDML_A,20799
23
+ tariffkit/data/__init__.py,sha256=r22lEjCzRmYQFZ4EcEISj0IecmqzE-grFO-f-iTHL9Y,1171
24
+ tariffkit/data/holidays.toml,sha256=qvRr63Rc5xSLcvGYufNnsUSAMB7yLv1Fwh6ERvrz1h0,3455
25
+ tariffkit/data/manifest.json,sha256=xIr_Ozgo0hAu90DB2Q0jVvyiiFBWAJFa1pPkId7oWEM,1679
26
+ tariffkit/data/versioned.py,sha256=NhOfof5CVJHBG1oXhKtp95SZNLYxEpiP-gmMyjGEEI8,4686
27
+ tariffkit/data/cca/mce/2023-01-01.toml,sha256=_nbzvTN5_SytJm_Y3dz-iGE2cC3crambHDYCNn316Dk,1852
28
+ tariffkit/data/cca/mce/2026-04-01.toml,sha256=ac6bc8gQpo_KcCYA3x_3dnX_Go3IdV6t5XbXbjMe-5M,6721
29
+ tariffkit/data/export/pge/nbt00.json.gz,sha256=ru0kKwO2ZBfWNWpenYZx5VzUDwd8-ogkXwAAFnGl_mA,55740
30
+ tariffkit/data/export/pge/nbt23.json.gz,sha256=ZnYOef2uT8E9u5VdEranp88rq5_onHyRMS2kkuV_5Bg,54691
31
+ tariffkit/data/export/pge/nbt24.json.gz,sha256=H1oACsGcHuKbHVGB6Wzw0pMpWydHPOQyeTc2ie5-hJw,54692
32
+ tariffkit/data/export/pge/nbt25.json.gz,sha256=1bRAFf8VVnlW7YmFwWIHxrPtgM3PGGtAYR6f4ncRe9Q,55728
33
+ tariffkit/data/export/pge/nbt26.json.gz,sha256=7cIoyPXGvyT8ZVxVE-dDsE57i3UYppwpNAbmtA3joAw,56315
34
+ tariffkit/data/export/pge/acc_plus/2023-04-15.toml,sha256=Hsnepv0CoA-fw5AG_litGgVTRPHlSbs0xT4b7vZKfE0,1463
35
+ tariffkit/data/nsc/pge.toml,sha256=cJYnk0ZVA2-X1yo4sKbaYWqk6_0tKeGu_6daAnWDtEw,2205
36
+ tariffkit/data/tariff/pge/eelec/2025-01-01.toml,sha256=KmW3Z-OTu3DIfamL8imq26Pme1YNkZF6igUeaF-XkOA,3814
37
+ tariffkit/data/tariff/pge/eelec/2025-03-01.toml,sha256=vyL9dMylvDlbhgKZVUcumbQxKotfisS_ciadovMPTis,3766
38
+ tariffkit/data/tariff/pge/eelec/2025-09-01.toml,sha256=pn7wD0aZh3EKPf54HZ0gKHQiSp2JPdD17TNNXOY_ntc,3762
39
+ tariffkit/data/tariff/pge/eelec/2026-01-01.toml,sha256=Mr5T9Eviear9umVGE4XpPiy4RsrHi7YpHLXr4CF2_lc,3842
40
+ tariffkit/data/tariff/pge/eelec/2026-03-01.toml,sha256=0h3AhDmg0Zs5PvwwHWL0sXIBLcmFxcJePzixqVV10OQ,4043
41
+ tariffkit/data/tariff/pge/etouc/2025-01-01.toml,sha256=4DK4Xxr2LYqCxf6DCmMG1WR6sTLf3DXY40DJdgEX-_E,5152
42
+ tariffkit/data/tariff/pge/etouc/2025-03-01.toml,sha256=bjY29UiknWhw5S_pHXCbODv70YTFkWYEFINUxw5Ew6I,5105
43
+ tariffkit/data/tariff/pge/etouc/2025-09-01.toml,sha256=ZjFu93fPqh-qKZ9n9ZtWyav5bG4flWmcd6RXkxW1Y6w,5105
44
+ tariffkit/data/tariff/pge/etouc/2026-01-01.toml,sha256=dCg_DEn1guIQibw_UqH0B-C6_IhjOIRuVi-Uhny6kt0,5178
45
+ tariffkit/data/tariff/pge/etouc/2026-03-01.toml,sha256=hWd2idIVJoxJFU7XrWwDGy2jhiCyoE5LB-AmEugxANA,5253
46
+ tariffkit/data/tariff/pge/ev2a/2025-01-01.toml,sha256=LciIAi2C6uCT_STUdJToKWPVIZU23ZPLlSPzAdrrRKM,3841
47
+ tariffkit/data/tariff/pge/ev2a/2025-03-01.toml,sha256=2ReslXj-_Iymt9fSt82HsxdYODMw7ZBcN4xck0FghS8,3792
48
+ tariffkit/data/tariff/pge/ev2a/2025-09-01.toml,sha256=DsnpoGg0mNH19eQOkj3oMvress6XvT5etLSY0KCZxQQ,3793
49
+ tariffkit/data/tariff/pge/ev2a/2026-01-01.toml,sha256=9tTK-r5MOFwEBI6eS8YFqBuIBw3dKyOZDqXobZszEA8,3871
50
+ tariffkit/data/tariff/pge/ev2a/2026-03-01.toml,sha256=rkV1HYoJL_Cg49PlNYMAt7kEyoAyEkViX7uXO2iYfvk,4020
51
+ tariffkit/data/tax/ca_energy_resources/2025-01-01.toml,sha256=Kt8K-WcrxHZTeaEVqAyn9mCoaADuG8gnKGnL4hbsoxw,1053
52
+ tariffkit/data/tax/ca_energy_resources/2026-01-01.toml,sha256=kub6EKjGCrgB8cGCo7s-v8sbmG9dmNYrS4ulF1Ld3Yo,1057
53
+ tariffkit/export/__init__.py,sha256=D1e1-UsZg03SbJkZUPBrFgvGmBEY0zBv8EzMn6SczxU,119
54
+ tariffkit/export/nbt.py,sha256=y_JGyWUMz9cLuC0ulx1EhIpHKhgCn1t9h-Kz0aKPy6Q,8834
55
+ tariffkit/interop/__init__.py,sha256=QcpygoISuTIOEgSBuo_vzxuauOlasR8kCCNHYQ-zcxE,699
56
+ tariffkit/interop/emhass.py,sha256=dXjfTPuVPoB4WrmbBRQtgDmnHnUD9bX58m3Yb27R-K0,2960
57
+ tariffkit/interop/predbat.py,sha256=QTmCTzf60IV-3dcEEUNAp8YBLo2lz_IQQikj9YZuMCU,3810
58
+ tariffkit/interop/slots.py,sha256=nKgB0OC7DFAYKp7rHKQhP2zHg9DkWL5uMDXIJPlykLU,2613
59
+ tariffkit/mqtt/__init__.py,sha256=2pdXU7nVbEbDe7yJ6EiH1qHViiYxrMdom4VhJ0Za_x0,223
60
+ tariffkit/mqtt/discovery.py,sha256=4p5gyQ2r2CiHzzEooJHUoqBfJf46Y7bj2x_V44PgLhk,2943
61
+ tariffkit/mqtt/publisher.py,sha256=OsNezkf965JhCt2IQLl6ltIxZ0TiHIpisndgAiQ81G4,11699
62
+ tariffkit/providers/__init__.py,sha256=lnAAs-aWuAmc7HZFP0jpBYH7Rq3xu0MpDF0PROHe3Wg,38
63
+ tariffkit/providers/pge/__init__.py,sha256=oo2z1cEkzQhSVCECxlS0BhmSKuI3byxhQE6MJNrYpLM,657
64
+ tariffkit/providers/pge/reconcile.py,sha256=6jWv0bq2VaNnPh_cQV_XS6aTpKqDR9BBG7138n6Sj3g,30003
65
+ tariffkit/providers/pge/statements/__init__.py,sha256=s4lxLsuUlIxssDcj_UYXWxTlyjr-ui1-9hhVdv1UAjo,557
66
+ tariffkit/providers/pge/statements/errors.py,sha256=n2k2CrrQKXBDmI4zFN1aE8DPdZkac9PT4ZmekF1Smaw,651
67
+ tariffkit/providers/pge/statements/model.py,sha256=XNRUh8IkR2ldw_RqIZsnbtyhSZ2wcsEF4VPFRhiZk7Y,14093
68
+ tariffkit/providers/pge/statements/ocr.py,sha256=Q-Ej_Y4QoH-_FBmjqTdVoT-G14xWT8l_Eoz5oMtCk8k,8215
69
+ tariffkit/providers/pge/statements/parse.py,sha256=EJp0cb-CDet_EmB7VRaZPtbb75JbW2nkJ5zxxOJVORI,35687
70
+ tariffkit/sources/__init__.py,sha256=TB4k5byuB7I8obDfD1eJCMtDJ_QUb2kJrpbng0xgUdQ,2682
71
+ tariffkit/sources/greenbutton.py,sha256=5OFadKagrPU-VVKsEVRwGyAD1sb_I-oT_9NnA70ygF0,13344
72
+ tariffkit/sources/homeassistant.py,sha256=of8UTPh6ZgtVTK6dTH65gyvVyg6JPnxuYNX1GQK6iBM,14707
73
+ tariffkit/sources/influx.py,sha256=dUIb0CxTL_V5OY3QI4j15o47RNsmLwnjMzelHt49NSg,15627
74
+ tariffkit/sources/pge.py,sha256=z9G4Smdyrn5rhA1xn3rINnP8fMydZfsirfzh3D_0SA8,49994
75
+ tariffkit/tariff/__init__.py,sha256=NIbdglqi3twhITrdG7Fgifs6eArAKyHhd6P09V2UZIQ,157
76
+ tariffkit/tariff/retail.py,sha256=fDw6W04zBmvEjx7bh811gcxp_BjhN7gj5MGFAIXgJP8,11860
77
+ tariffkit/web/__init__.py,sha256=4-M35KNdG-gBCI4ialkJnCtIMVP0oIPOqbUCoSZWLxw,87
78
+ tariffkit/web/app.py,sha256=jOPMwrJ1NkugrR6IgkFt49NBm5S7Nn3DFSJdRa-1Jn8,8539
79
+ tariffkit-0.2.0.dist-info/METADATA,sha256=xPrZwoC2pKiupLkQQNCcrNuOTDLGppGlQigTxD9uFnU,11955
80
+ tariffkit-0.2.0.dist-info/WHEEL,sha256=zOwg4jB6zX2kU910N-cMawjivD6tO8NEWvE12je1bVk,87
81
+ tariffkit-0.2.0.dist-info/entry_points.txt,sha256=adJcM2RlFdPRysSw0NNaXF0N1XpbYbrQsZCxVbe4qjg,49
82
+ tariffkit-0.2.0.dist-info/licenses/LICENSE,sha256=k52tezaDUPisSFOrkiA1krS8DoHQuZ22uj-X4h1egn8,1065
83
+ tariffkit-0.2.0.dist-info/RECORD,,
@@ -0,0 +1,4 @@
1
+ Wheel-Version: 1.0
2
+ Generator: hatchling 1.32.0
3
+ Root-Is-Purelib: true
4
+ Tag: py3-none-any
@@ -0,0 +1,2 @@
1
+ [console_scripts]
2
+ tariffkit = tariffkit.cli:main
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2026 Emmanuel
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.