e-data 2.0.0b1__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.
@@ -0,0 +1,214 @@
1
+ Metadata-Version: 2.4
2
+ Name: e-data
3
+ Version: 2.0.0b1
4
+ Summary: Python library for managing spanish energy data from various web providers
5
+ Author-email: VMG <vmayorg@outlook.es>
6
+ License: GPL-3.0-or-later
7
+ Project-URL: Homepage, https://github.com/uvejota/python-edata
8
+ Project-URL: Repository, https://github.com/uvejota/python-edata
9
+ Project-URL: Issues, https://github.com/uvejota/python-edata/issues
10
+ Keywords: energy,data,spain,electricity,consumption
11
+ Classifier: Intended Audience :: Developers
12
+ Classifier: Programming Language :: Python :: 3
13
+ Classifier: Programming Language :: Python :: 3.8
14
+ Classifier: Programming Language :: Python :: 3.9
15
+ Classifier: Programming Language :: Python :: 3.10
16
+ Classifier: Programming Language :: Python :: 3.11
17
+ Classifier: Programming Language :: Python :: 3.12
18
+ Classifier: Programming Language :: Python :: Implementation :: CPython
19
+ Classifier: Topic :: Software Development :: Libraries :: Python Modules
20
+ Classifier: Topic :: Utilities
21
+ Requires-Python: >=3.8
22
+ Description-Content-Type: text/markdown
23
+ License-File: LICENSE
24
+ Requires-Dist: dateparser>=1.1.2
25
+ Requires-Dist: holidays>=0.14.2
26
+ Requires-Dist: python-dateutil>=2.8.2
27
+ Requires-Dist: requests>=2.28.1
28
+ Requires-Dist: voluptuous>=0.13.1
29
+ Requires-Dist: Jinja2>=3.1.2
30
+ Requires-Dist: pydantic>=2.0.0
31
+ Requires-Dist: sqlmodel>=0.0.24
32
+ Requires-Dist: aiosqlite>=0.20.0
33
+ Requires-Dist: sqlalchemy[asyncio]>=2.0.0
34
+ Provides-Extra: dev
35
+ Requires-Dist: pytest>=7.1.2; extra == "dev"
36
+ Requires-Dist: freezegun>=1.2.1; extra == "dev"
37
+ Requires-Dist: twine>=4.0.0; extra == "dev"
38
+ Requires-Dist: build>=0.10.0; extra == "dev"
39
+ Requires-Dist: black>=22.0.0; extra == "dev"
40
+ Requires-Dist: flake8>=5.0.0; extra == "dev"
41
+ Requires-Dist: mypy>=1.0.0; extra == "dev"
42
+ Provides-Extra: test
43
+ Requires-Dist: pytest>=7.1.2; extra == "test"
44
+ Requires-Dist: freezegun>=1.2.1; extra == "test"
45
+ Requires-Dist: pytest-cov>=4.0.0; extra == "test"
46
+ Requires-Dist: pytest-asyncio>=0.20.0; extra == "test"
47
+ Dynamic: license-file
48
+
49
+ [![Downloads](https://pepy.tech/badge/e-data)](https://pepy.tech/project/e-data)
50
+ [![Downloads](https://pepy.tech/badge/e-data/month)](https://pepy.tech/project/e-data)
51
+ [![Downloads](https://pepy.tech/badge/e-data/week)](https://pepy.tech/project/e-data)
52
+
53
+ # python-edata
54
+
55
+ Este paquete proporciona herramientas para la descarga de tus datos de consumo eléctrico (desde Datadis.es) y su posterior procesado. La motivación principal es que conocer el consumo puede ayudarnos a reducirlo, e incluso a elegir una tarifa que mejor se adapte a nuestras necesidades. A día de hoy sus capacidades de facturación (€) son limitadas, soporta PVPC (según disponibilidad de datos de REData) y tarificación fija por tramos. Es el corazón de la integración [homeassistant-edata](https://github.com/uvejota/homeassistant-edata).
56
+
57
+ _**Esta herramienta no mantiene ningún tipo de vinculación con los proveedores de datos anteriormente mencionados, simplemente consulta la información disponible y facilita su posterior análisis.**_
58
+
59
+ ## Instalación
60
+
61
+ Puedes instalar la última versión estable mediante:
62
+
63
+ ``` bash
64
+ pip install e-data
65
+ ```
66
+
67
+ Si quieres probar la versión `dev` o contribuir a su desarrollo, clona este repositorio e instala manualmente las dependencias:
68
+
69
+ ``` bash
70
+ make install-dev
71
+ ```
72
+
73
+ ## Estructura
74
+
75
+ El paquete utiliza una **arquitectura basada en servicios** con los siguientes módulos:
76
+
77
+ * **Conectores** (módulo `connectors`), para definir los métodos de consulta a los diferentes proveedores: Datadis y REData.
78
+ * **Modelos** (módulo `models`), que definen las estructuras de datos usando Pydantic v2 para validación robusta. Incluye modelos para suministros, contratos, consumos, maxímetro, precios y base de datos.
79
+ * **Servicios** (módulo `services`), que implementan la lógica de negocio para cada dominio: gestión de suministros, contratos, consumos, maxímetro, facturación y base de datos SQLite.
80
+ * **Helper principal** (`helpers.py`), que orquesta todos los servicios y proporciona una interfaz simplificada. El `EdataHelper` permite descargar y procesar datos automáticamente, calculando más de 40 atributos de resumen.
81
+
82
+ Estos módulos corresponden a la siguiente estructura del paquete:
83
+
84
+ ```
85
+ edata/
86
+ · __init__.py
87
+ · const.py # Constantes y definiciones de atributos
88
+ · utils.py # Utilidades generales
89
+ · helpers.py # Helper principal (EdataHelper)
90
+ · connectors/
91
+ · __init__.py
92
+ · datadis.py # Conector API Datadis
93
+ · redata.py # Conector API REData (PVPC)
94
+ · models/
95
+ · __init__.py
96
+ · base.py # Modelos base con Pydantic
97
+ · supply.py # Modelo de suministros
98
+ · contract.py # Modelo de contratos
99
+ · consumption.py # Modelo de consumos
100
+ · maximeter.py # Modelo de maxímetro
101
+ · pricing.py # Modelo de reglas de precios
102
+ · database.py # Modelos para SQLite
103
+ · services/
104
+ · __init__.py
105
+ · database.py # Servicio de base de datos SQLite
106
+ · supply.py # Gestión de suministros
107
+ · contract.py # Gestión de contratos
108
+ · consumption.py # Gestión de consumos
109
+ · maximeter.py # Gestión de maxímetro
110
+ · billing.py # Gestión de facturación
111
+ · scripts/
112
+ · __init__.py
113
+ · dump.py # Script interactivo de descarga
114
+ ```
115
+
116
+ ## Script interactivo
117
+
118
+ El paquete incluye un script interactivo que facilita la descarga inicial de datos:
119
+
120
+ ```bash
121
+ # Ejecutar el script interactivo
122
+ python -m edata.scripts.dump
123
+
124
+ # Con directorio personalizado
125
+ python -m edata.scripts.dump --storage-dir /ruta/personalizada
126
+ ```
127
+
128
+ Este script te guiará paso a paso para:
129
+ 1. Configurar credenciales de Datadis
130
+ 2. Seleccionar el suministro a procesar
131
+ 3. Definir el rango de fechas
132
+ 4. Descargar y almacenar todos los datos
133
+
134
+ ## Ejemplo de uso
135
+
136
+ Partimos de que tenemos credenciales en Datadis.es. Algunas aclaraciones:
137
+ * No es necesario solicitar API pública en el registro (se utilizará la API privada habilitada por defecto)
138
+ * El username suele ser el NIF del titular
139
+ * Copie el CUPS de la web de Datadis, algunas comercializadoras adhieren caracteres adicionales en el CUPS mostrado en su factura.
140
+ * La herramienta acepta el uso de NIF autorizado para consultar el suministro de otro titular.
141
+
142
+ ``` python
143
+ import asyncio
144
+ from datetime import datetime
145
+ import json
146
+
147
+ # importamos el modelo de reglas de tarificación
148
+ from edata.models.pricing import PricingRules
149
+ # importamos el helper principal
150
+ from edata.helpers import EdataHelper
151
+ # importamos utilidades para serialización
152
+ from edata import utils
153
+
154
+ # Preparar reglas de tarificación (si se quiere)
155
+ PRICING_RULES_PVPC = PricingRules(
156
+ p1_kw_year_eur=30.67266,
157
+ p2_kw_year_eur=1.4243591,
158
+ meter_month_eur=0.81,
159
+ market_kw_year_eur=3.113,
160
+ electricity_tax=1.0511300560,
161
+ iva_tax=1.05,
162
+ # podemos rellenar los siguientes campos si quisiéramos precio fijo (y no pvpc)
163
+ p1_kwh_eur=None,
164
+ p2_kwh_eur=None,
165
+ p3_kwh_eur=None,
166
+ )
167
+
168
+ async def main():
169
+ # Instanciar el helper
170
+ # 'datadis_authorized_nif' permite indicar el NIF de la persona que nos autoriza a consultar su CUPS.
171
+ # 'storage_dir_path' permite especificar dónde almacenar la base de datos local
172
+ edata = EdataHelper(
173
+ "datadis_user",
174
+ "datadis_password",
175
+ "cups",
176
+ datadis_authorized_nif=None,
177
+ pricing_rules=PRICING_RULES_PVPC, # si se le pasa None, no aplica tarificación
178
+ storage_dir_path=None, # por defecto usa ./edata.storage/
179
+ )
180
+
181
+ # Solicitar actualización de todo el histórico (los datos se almacenan en SQLite)
182
+ success = await edata.update(date_from=datetime(1970, 1, 1), date_to=datetime.today())
183
+
184
+ if success:
185
+ # Imprimir atributos resumen calculados
186
+ print("Atributos calculados:")
187
+ for key, value in edata.attributes.items():
188
+ if value is not None:
189
+ print(f" {key}: {value}")
190
+
191
+ # Los datos se almacenan automáticamente en la base de datos SQLite
192
+ # ubicada en edata.storage/edata.db (por defecto)
193
+ print(f"\nDatos almacenados en la base de datos local")
194
+ else:
195
+ print("Error durante la actualización de datos")
196
+
197
+ # Ejecutar el ejemplo
198
+ if __name__ == "__main__":
199
+ asyncio.run(main())
200
+ ```
201
+
202
+ ## Contribuir
203
+
204
+ Este proyecto está en desarrollo activo. Las contribuciones son bienvenidas:
205
+
206
+ 1. Fork del repositorio
207
+ 2. Crear una rama para tu feature: `git checkout -b feature/nueva-funcionalidad`
208
+ 3. Commit de tus cambios: `git commit -am 'Añadir nueva funcionalidad'`
209
+ 4. Push a la rama: `git push origin feature/nueva-funcionalidad`
210
+ 5. Crear un Pull Request
211
+
212
+ ## Licencia
213
+
214
+ Este proyecto está licenciado bajo GPLv3. Ver el archivo [LICENSE](LICENSE) para más detalles.
@@ -0,0 +1,21 @@
1
+ e_data-2.0.0b1.dist-info/licenses/LICENSE,sha256=OXLcl0T2SZ8Pmy2_dmlvKuetivmyPd5m1q-Gyd-zaYY,35149
2
+ edata/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
3
+ edata/const.py,sha256=280w4loTootYA1pgpI_KeE2qHoFQkcYXAteDWVfp4C4,1763
4
+ edata/helpers.py,sha256=D3o0dRsIzz7qHXDW69bzLJHj-GxvVmofyO2N3KPH2lk,11871
5
+ edata/utils.py,sha256=0A21lN1BgNdainSxjNm2Zaw7ZPu9fn5KJxK5qhuZsv4,4763
6
+ edata/tests/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
7
+ edata/tests/test_helpers.py,sha256=i40TZGMhzW0huY2zUoA50zhfbNe2a0YVmYPYT5BOAsI,22685
8
+ edata/tests/connectors/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
9
+ edata/tests/connectors/test_datadis_connector.py,sha256=dDcam56rzL1C0l74YAkUZ9I41L9IRMloeGSern7dPpA,5419
10
+ edata/tests/connectors/test_redata_connector.py,sha256=XyedugKYeGwg3jmnWXZN5BBW52lJHtCP1hHKSnQazk8,979
11
+ edata/tests/services/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
12
+ edata/tests/services/test_billing_service.py,sha256=s5N3k-4etOw7pGQHYfI7TsUOPwu2j0NuZDeJ0iJu7g8,43871
13
+ edata/tests/services/test_consumption_service.py,sha256=Azds8Cy3JCCal4R7wPGsCDgtQS7mh3az60WmteZ7ARI,36440
14
+ edata/tests/services/test_contract_service.py,sha256=swGYufdVWPgEaIR8xHaULPnNZ8-AVBaZYlRgwfbTvV8,7870
15
+ edata/tests/services/test_database_service.py,sha256=Xbpl69g3BiA1Gb5i29riQeWgrYeR3LrY-RPDQ4tiegI,15372
16
+ edata/tests/services/test_maximeter_service.py,sha256=yT2Ho0d_Qo0ZuMfEWxU4bGR71N3qX4_tZ-V3eLqF3Vs,2839
17
+ edata/tests/services/test_supply_service.py,sha256=HpLe1Cm0FmU8qZyLUrIJsFgSwlD2TNm7oTKmmhcaPcE,8761
18
+ e_data-2.0.0b1.dist-info/METADATA,sha256=RZkHWiIMYghD7LSJ09ibxJkb2QdSG-A7g1a1m7NDGL4,8982
19
+ e_data-2.0.0b1.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
20
+ e_data-2.0.0b1.dist-info/top_level.txt,sha256=Ez-fReWtUVTMcFuH0dzCnoKIgMBHgjLaBuba8QiKC7g,6
21
+ e_data-2.0.0b1.dist-info/RECORD,,
@@ -0,0 +1,5 @@
1
+ Wheel-Version: 1.0
2
+ Generator: setuptools (80.9.0)
3
+ Root-Is-Purelib: true
4
+ Tag: py3-none-any
5
+