e-data 1.2.22__tar.gz → 2.0.0b2__tar.gz

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 (65) hide show
  1. e_data-2.0.0b2/.python-version +1 -0
  2. e_data-2.0.0b2/MANIFEST.in +22 -0
  3. e_data-2.0.0b2/Makefile +51 -0
  4. e_data-2.0.0b2/PKG-INFO +216 -0
  5. e_data-2.0.0b2/README.md +166 -0
  6. e_data-2.0.0b2/e_data.egg-info/SOURCES.txt +43 -0
  7. e_data-2.0.0b2/edata/connectors/datadis.py +544 -0
  8. e_data-2.0.0b2/edata/connectors/redata.py +88 -0
  9. e_data-2.0.0b2/edata/const.py +56 -0
  10. e_data-2.0.0b2/edata/helpers.py +312 -0
  11. e_data-2.0.0b2/edata/models/__init__.py +22 -0
  12. e_data-2.0.0b2/edata/models/base.py +105 -0
  13. e_data-2.0.0b2/edata/models/consumption.py +101 -0
  14. e_data-2.0.0b2/edata/models/contract.py +52 -0
  15. e_data-2.0.0b2/edata/models/database.py +136 -0
  16. e_data-2.0.0b2/edata/models/maximeter.py +39 -0
  17. e_data-2.0.0b2/edata/models/pricing.py +174 -0
  18. e_data-2.0.0b2/edata/models/supply.py +71 -0
  19. e_data-2.0.0b2/edata/scripts/__init__.py +1 -0
  20. e_data-2.0.0b2/edata/scripts/dump.py +408 -0
  21. e_data-2.0.0b2/edata/services/__init__.py +18 -0
  22. e_data-2.0.0b2/edata/services/billing.py +1046 -0
  23. e_data-2.0.0b2/edata/services/consumption.py +742 -0
  24. e_data-2.0.0b2/edata/services/contract.py +343 -0
  25. e_data-2.0.0b2/edata/services/database.py +468 -0
  26. e_data-2.0.0b2/edata/services/maximeter.py +409 -0
  27. e_data-2.0.0b2/edata/services/supply.py +389 -0
  28. e_data-2.0.0b2/edata/tests/__init__.py +0 -0
  29. e_data-2.0.0b2/edata/tests/connectors/__init__.py +0 -0
  30. e_data-2.0.0b2/edata/tests/connectors/test_datadis_connector.py +178 -0
  31. e_data-2.0.0b2/edata/tests/connectors/test_redata_connector.py +29 -0
  32. e_data-2.0.0b2/edata/tests/services/__init__.py +0 -0
  33. e_data-2.0.0b2/edata/tests/services/test_billing_service.py +1169 -0
  34. e_data-2.0.0b2/edata/tests/services/test_consumption_service.py +955 -0
  35. e_data-2.0.0b2/edata/tests/services/test_contract_service.py +216 -0
  36. e_data-2.0.0b2/edata/tests/services/test_database_service.py +415 -0
  37. e_data-2.0.0b2/edata/tests/services/test_maximeter_service.py +83 -0
  38. e_data-2.0.0b2/edata/tests/services/test_supply_service.py +251 -0
  39. e_data-2.0.0b2/edata/tests/test_helpers.py +612 -0
  40. {e_data-1.2.22/edata/processors → e_data-2.0.0b2/edata}/utils.py +72 -56
  41. e_data-2.0.0b2/pyproject.toml +104 -0
  42. {e_data-1.2.22 → e_data-2.0.0b2}/setup.cfg +0 -2
  43. e_data-1.2.22/MANIFEST.in +0 -13
  44. e_data-1.2.22/PKG-INFO +0 -136
  45. e_data-1.2.22/README.md +0 -106
  46. e_data-1.2.22/e_data.egg-info/PKG-INFO +0 -136
  47. e_data-1.2.22/e_data.egg-info/SOURCES.txt +0 -24
  48. e_data-1.2.22/e_data.egg-info/dependency_links.txt +0 -1
  49. e_data-1.2.22/e_data.egg-info/requires.txt +0 -8
  50. e_data-1.2.22/e_data.egg-info/top_level.txt +0 -1
  51. e_data-1.2.22/edata/connectors/datadis.py +0 -528
  52. e_data-1.2.22/edata/connectors/redata.py +0 -70
  53. e_data-1.2.22/edata/const.py +0 -3
  54. e_data-1.2.22/edata/definitions.py +0 -329
  55. e_data-1.2.22/edata/helpers.py +0 -769
  56. e_data-1.2.22/edata/processors/base.py +0 -27
  57. e_data-1.2.22/edata/processors/billing.py +0 -215
  58. e_data-1.2.22/edata/processors/consumption.py +0 -139
  59. e_data-1.2.22/edata/processors/maximeter.py +0 -56
  60. e_data-1.2.22/edata/storage.py +0 -46
  61. e_data-1.2.22/setup.py +0 -142
  62. {e_data-1.2.22 → e_data-2.0.0b2}/LICENSE +0 -0
  63. {e_data-1.2.22 → e_data-2.0.0b2}/edata/__init__.py +0 -0
  64. {e_data-1.2.22 → e_data-2.0.0b2}/edata/connectors/__init__.py +0 -0
  65. /e_data-1.2.22/edata/processors/__init__.py → /e_data-2.0.0b2/edata/scripts/__main__.py +0 -0
@@ -0,0 +1 @@
1
+ 3.11
@@ -0,0 +1,22 @@
1
+ # Configuration files
2
+ include pyproject.toml
3
+ include Makefile
4
+ include .python-version
5
+
6
+ # Documentation
7
+ include *.md
8
+
9
+ # License
10
+ include LICENSE
11
+
12
+ # Include tests (setuptools auto-includes package files)
13
+ recursive-include edata/tests *.py
14
+
15
+ # Exclude compiled files and caches
16
+ global-exclude *.pyc
17
+ global-exclude *.pyo
18
+ global-exclude __pycache__
19
+ global-exclude .DS_Store
20
+ prune build
21
+ prune dist
22
+ prune *.egg-info
@@ -0,0 +1,51 @@
1
+ .PHONY: help install install-dev test lint format build clean publish publish-test
2
+
3
+ help: ## Show this help message
4
+ @grep -E '^[a-zA-Z_-]+:.*?## .*$$' $(MAKEFILE_LIST) | sort | awk 'BEGIN {FS = ":.*?## "}; {printf "\033[36m%-20s\033[0m %s\n", $$1, $$2}'
5
+
6
+ install: ## Install the package in development mode
7
+ pip install -e .
8
+
9
+ install-dev: ## Install with development dependencies
10
+ pip install -e ".[dev,test]"
11
+
12
+ test: ## Run tests
13
+ pytest
14
+
15
+ test-cov: ## Run tests with coverage
16
+ pytest --cov=edata --cov-report=html --cov-report=term
17
+
18
+ lint: ## Run linting checks
19
+ flake8 edata/
20
+ mypy edata/
21
+
22
+ format: ## Format code with black
23
+ black edata/
24
+
25
+ format-check: ## Check if code is formatted
26
+ black --check edata/
27
+
28
+ clean: ## Clean build artifacts
29
+ rm -rf build/
30
+ rm -rf dist/
31
+ rm -rf *.egg-info/
32
+ find . -type d -name __pycache__ -exec rm -rf {} +
33
+ find . -type f -name "*.pyc" -delete
34
+
35
+ build: ## Build the package
36
+ python -m build
37
+
38
+ publish-test: ## Publish to TestPyPI
39
+ python -m twine upload --repository testpypi dist/*
40
+
41
+ publish: ## Publish to PyPI
42
+ python -m twine upload dist/*
43
+
44
+ # Combined workflow commands
45
+ dev-setup: install-dev ## Setup development environment
46
+
47
+ pre-commit: format lint test ## Run all pre-commit checks
48
+
49
+ release: clean build publish ## Build and publish to PyPI
50
+
51
+ release-test: clean build publish-test ## Build and publish to TestPyPI
@@ -0,0 +1,216 @@
1
+ Metadata-Version: 2.4
2
+ Name: e-data
3
+ Version: 2.0.0b2
4
+ Summary: Python library for managing spanish energy data from various web providers
5
+ Author-email: VMG <vmayorg@outlook.es>
6
+ License-Expression: 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
+ Requires-Dist: aiohttp>=3.8.0
35
+ Requires-Dist: diskcache>=5.4.0
36
+ Provides-Extra: dev
37
+ Requires-Dist: pytest>=7.1.2; extra == "dev"
38
+ Requires-Dist: freezegun>=1.2.1; extra == "dev"
39
+ Requires-Dist: twine>=4.0.0; extra == "dev"
40
+ Requires-Dist: build>=0.10.0; extra == "dev"
41
+ Requires-Dist: black>=22.0.0; extra == "dev"
42
+ Requires-Dist: flake8>=5.0.0; extra == "dev"
43
+ Requires-Dist: mypy>=1.0.0; extra == "dev"
44
+ Provides-Extra: test
45
+ Requires-Dist: pytest>=7.1.2; extra == "test"
46
+ Requires-Dist: freezegun>=1.2.1; extra == "test"
47
+ Requires-Dist: pytest-cov>=4.0.0; extra == "test"
48
+ Requires-Dist: pytest-asyncio>=0.20.0; extra == "test"
49
+ Dynamic: license-file
50
+
51
+ [![Downloads](https://pepy.tech/badge/e-data)](https://pepy.tech/project/e-data)
52
+ [![Downloads](https://pepy.tech/badge/e-data/month)](https://pepy.tech/project/e-data)
53
+ [![Downloads](https://pepy.tech/badge/e-data/week)](https://pepy.tech/project/e-data)
54
+
55
+ # python-edata
56
+
57
+ 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).
58
+
59
+ _**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.**_
60
+
61
+ ## Instalación
62
+
63
+ Puedes instalar la última versión estable mediante:
64
+
65
+ ``` bash
66
+ pip install e-data
67
+ ```
68
+
69
+ Si quieres probar la versión `dev` o contribuir a su desarrollo, clona este repositorio e instala manualmente las dependencias:
70
+
71
+ ``` bash
72
+ make install-dev
73
+ ```
74
+
75
+ ## Estructura
76
+
77
+ El paquete utiliza una **arquitectura basada en servicios** con los siguientes módulos:
78
+
79
+ * **Conectores** (módulo `connectors`), para definir los métodos de consulta a los diferentes proveedores: Datadis y REData.
80
+ * **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.
81
+ * **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.
82
+ * **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.
83
+
84
+ Estos módulos corresponden a la siguiente estructura del paquete:
85
+
86
+ ```
87
+ edata/
88
+ · __init__.py
89
+ · const.py # Constantes y definiciones de atributos
90
+ · utils.py # Utilidades generales
91
+ · helpers.py # Helper principal (EdataHelper)
92
+ · connectors/
93
+ · __init__.py
94
+ · datadis.py # Conector API Datadis
95
+ · redata.py # Conector API REData (PVPC)
96
+ · models/
97
+ · __init__.py
98
+ · base.py # Modelos base con Pydantic
99
+ · supply.py # Modelo de suministros
100
+ · contract.py # Modelo de contratos
101
+ · consumption.py # Modelo de consumos
102
+ · maximeter.py # Modelo de maxímetro
103
+ · pricing.py # Modelo de reglas de precios
104
+ · database.py # Modelos para SQLite
105
+ · services/
106
+ · __init__.py
107
+ · database.py # Servicio de base de datos SQLite
108
+ · supply.py # Gestión de suministros
109
+ · contract.py # Gestión de contratos
110
+ · consumption.py # Gestión de consumos
111
+ · maximeter.py # Gestión de maxímetro
112
+ · billing.py # Gestión de facturación
113
+ · scripts/
114
+ · __init__.py
115
+ · dump.py # Script interactivo de descarga
116
+ ```
117
+
118
+ ## Script interactivo
119
+
120
+ El paquete incluye un script interactivo que facilita la descarga inicial de datos:
121
+
122
+ ```bash
123
+ # Ejecutar el script interactivo
124
+ python -m edata.scripts.dump
125
+
126
+ # Con directorio personalizado
127
+ python -m edata.scripts.dump --storage-dir /ruta/personalizada
128
+ ```
129
+
130
+ Este script te guiará paso a paso para:
131
+ 1. Configurar credenciales de Datadis
132
+ 2. Seleccionar el suministro a procesar
133
+ 3. Definir el rango de fechas
134
+ 4. Descargar y almacenar todos los datos
135
+
136
+ ## Ejemplo de uso
137
+
138
+ Partimos de que tenemos credenciales en Datadis.es. Algunas aclaraciones:
139
+ * No es necesario solicitar API pública en el registro (se utilizará la API privada habilitada por defecto)
140
+ * El username suele ser el NIF del titular
141
+ * Copie el CUPS de la web de Datadis, algunas comercializadoras adhieren caracteres adicionales en el CUPS mostrado en su factura.
142
+ * La herramienta acepta el uso de NIF autorizado para consultar el suministro de otro titular.
143
+
144
+ ``` python
145
+ import asyncio
146
+ from datetime import datetime
147
+ import json
148
+
149
+ # importamos el modelo de reglas de tarificación
150
+ from edata.models.pricing import PricingRules
151
+ # importamos el helper principal
152
+ from edata.helpers import EdataHelper
153
+ # importamos utilidades para serialización
154
+ from edata import utils
155
+
156
+ # Preparar reglas de tarificación (si se quiere)
157
+ PRICING_RULES_PVPC = PricingRules(
158
+ p1_kw_year_eur=30.67266,
159
+ p2_kw_year_eur=1.4243591,
160
+ meter_month_eur=0.81,
161
+ market_kw_year_eur=3.113,
162
+ electricity_tax=1.0511300560,
163
+ iva_tax=1.05,
164
+ # podemos rellenar los siguientes campos si quisiéramos precio fijo (y no pvpc)
165
+ p1_kwh_eur=None,
166
+ p2_kwh_eur=None,
167
+ p3_kwh_eur=None,
168
+ )
169
+
170
+ async def main():
171
+ # Instanciar el helper
172
+ # 'datadis_authorized_nif' permite indicar el NIF de la persona que nos autoriza a consultar su CUPS.
173
+ # 'storage_dir_path' permite especificar dónde almacenar la base de datos local
174
+ edata = EdataHelper(
175
+ "datadis_user",
176
+ "datadis_password",
177
+ "cups",
178
+ datadis_authorized_nif=None,
179
+ pricing_rules=PRICING_RULES_PVPC, # si se le pasa None, no aplica tarificación
180
+ storage_dir_path=None, # por defecto usa ./edata.storage/
181
+ )
182
+
183
+ # Solicitar actualización de todo el histórico (los datos se almacenan en SQLite)
184
+ success = await edata.update(date_from=datetime(1970, 1, 1), date_to=datetime.today())
185
+
186
+ if success:
187
+ # Imprimir atributos resumen calculados
188
+ print("Atributos calculados:")
189
+ for key, value in edata.attributes.items():
190
+ if value is not None:
191
+ print(f" {key}: {value}")
192
+
193
+ # Los datos se almacenan automáticamente en la base de datos SQLite
194
+ # ubicada en edata.storage/edata.db (por defecto)
195
+ print(f"\nDatos almacenados en la base de datos local")
196
+ else:
197
+ print("Error durante la actualización de datos")
198
+
199
+ # Ejecutar el ejemplo
200
+ if __name__ == "__main__":
201
+ asyncio.run(main())
202
+ ```
203
+
204
+ ## Contribuir
205
+
206
+ Este proyecto está en desarrollo activo. Las contribuciones son bienvenidas:
207
+
208
+ 1. Fork del repositorio
209
+ 2. Crear una rama para tu feature: `git checkout -b feature/nueva-funcionalidad`
210
+ 3. Commit de tus cambios: `git commit -am 'Añadir nueva funcionalidad'`
211
+ 4. Push a la rama: `git push origin feature/nueva-funcionalidad`
212
+ 5. Crear un Pull Request
213
+
214
+ ## Licencia
215
+
216
+ Este proyecto está licenciado bajo GPLv3. Ver el archivo [LICENSE](LICENSE) para más detalles.
@@ -0,0 +1,166 @@
1
+ [![Downloads](https://pepy.tech/badge/e-data)](https://pepy.tech/project/e-data)
2
+ [![Downloads](https://pepy.tech/badge/e-data/month)](https://pepy.tech/project/e-data)
3
+ [![Downloads](https://pepy.tech/badge/e-data/week)](https://pepy.tech/project/e-data)
4
+
5
+ # python-edata
6
+
7
+ 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).
8
+
9
+ _**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.**_
10
+
11
+ ## Instalación
12
+
13
+ Puedes instalar la última versión estable mediante:
14
+
15
+ ``` bash
16
+ pip install e-data
17
+ ```
18
+
19
+ Si quieres probar la versión `dev` o contribuir a su desarrollo, clona este repositorio e instala manualmente las dependencias:
20
+
21
+ ``` bash
22
+ make install-dev
23
+ ```
24
+
25
+ ## Estructura
26
+
27
+ El paquete utiliza una **arquitectura basada en servicios** con los siguientes módulos:
28
+
29
+ * **Conectores** (módulo `connectors`), para definir los métodos de consulta a los diferentes proveedores: Datadis y REData.
30
+ * **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.
31
+ * **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.
32
+ * **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.
33
+
34
+ Estos módulos corresponden a la siguiente estructura del paquete:
35
+
36
+ ```
37
+ edata/
38
+ · __init__.py
39
+ · const.py # Constantes y definiciones de atributos
40
+ · utils.py # Utilidades generales
41
+ · helpers.py # Helper principal (EdataHelper)
42
+ · connectors/
43
+ · __init__.py
44
+ · datadis.py # Conector API Datadis
45
+ · redata.py # Conector API REData (PVPC)
46
+ · models/
47
+ · __init__.py
48
+ · base.py # Modelos base con Pydantic
49
+ · supply.py # Modelo de suministros
50
+ · contract.py # Modelo de contratos
51
+ · consumption.py # Modelo de consumos
52
+ · maximeter.py # Modelo de maxímetro
53
+ · pricing.py # Modelo de reglas de precios
54
+ · database.py # Modelos para SQLite
55
+ · services/
56
+ · __init__.py
57
+ · database.py # Servicio de base de datos SQLite
58
+ · supply.py # Gestión de suministros
59
+ · contract.py # Gestión de contratos
60
+ · consumption.py # Gestión de consumos
61
+ · maximeter.py # Gestión de maxímetro
62
+ · billing.py # Gestión de facturación
63
+ · scripts/
64
+ · __init__.py
65
+ · dump.py # Script interactivo de descarga
66
+ ```
67
+
68
+ ## Script interactivo
69
+
70
+ El paquete incluye un script interactivo que facilita la descarga inicial de datos:
71
+
72
+ ```bash
73
+ # Ejecutar el script interactivo
74
+ python -m edata.scripts.dump
75
+
76
+ # Con directorio personalizado
77
+ python -m edata.scripts.dump --storage-dir /ruta/personalizada
78
+ ```
79
+
80
+ Este script te guiará paso a paso para:
81
+ 1. Configurar credenciales de Datadis
82
+ 2. Seleccionar el suministro a procesar
83
+ 3. Definir el rango de fechas
84
+ 4. Descargar y almacenar todos los datos
85
+
86
+ ## Ejemplo de uso
87
+
88
+ Partimos de que tenemos credenciales en Datadis.es. Algunas aclaraciones:
89
+ * No es necesario solicitar API pública en el registro (se utilizará la API privada habilitada por defecto)
90
+ * El username suele ser el NIF del titular
91
+ * Copie el CUPS de la web de Datadis, algunas comercializadoras adhieren caracteres adicionales en el CUPS mostrado en su factura.
92
+ * La herramienta acepta el uso de NIF autorizado para consultar el suministro de otro titular.
93
+
94
+ ``` python
95
+ import asyncio
96
+ from datetime import datetime
97
+ import json
98
+
99
+ # importamos el modelo de reglas de tarificación
100
+ from edata.models.pricing import PricingRules
101
+ # importamos el helper principal
102
+ from edata.helpers import EdataHelper
103
+ # importamos utilidades para serialización
104
+ from edata import utils
105
+
106
+ # Preparar reglas de tarificación (si se quiere)
107
+ PRICING_RULES_PVPC = PricingRules(
108
+ p1_kw_year_eur=30.67266,
109
+ p2_kw_year_eur=1.4243591,
110
+ meter_month_eur=0.81,
111
+ market_kw_year_eur=3.113,
112
+ electricity_tax=1.0511300560,
113
+ iva_tax=1.05,
114
+ # podemos rellenar los siguientes campos si quisiéramos precio fijo (y no pvpc)
115
+ p1_kwh_eur=None,
116
+ p2_kwh_eur=None,
117
+ p3_kwh_eur=None,
118
+ )
119
+
120
+ async def main():
121
+ # Instanciar el helper
122
+ # 'datadis_authorized_nif' permite indicar el NIF de la persona que nos autoriza a consultar su CUPS.
123
+ # 'storage_dir_path' permite especificar dónde almacenar la base de datos local
124
+ edata = EdataHelper(
125
+ "datadis_user",
126
+ "datadis_password",
127
+ "cups",
128
+ datadis_authorized_nif=None,
129
+ pricing_rules=PRICING_RULES_PVPC, # si se le pasa None, no aplica tarificación
130
+ storage_dir_path=None, # por defecto usa ./edata.storage/
131
+ )
132
+
133
+ # Solicitar actualización de todo el histórico (los datos se almacenan en SQLite)
134
+ success = await edata.update(date_from=datetime(1970, 1, 1), date_to=datetime.today())
135
+
136
+ if success:
137
+ # Imprimir atributos resumen calculados
138
+ print("Atributos calculados:")
139
+ for key, value in edata.attributes.items():
140
+ if value is not None:
141
+ print(f" {key}: {value}")
142
+
143
+ # Los datos se almacenan automáticamente en la base de datos SQLite
144
+ # ubicada en edata.storage/edata.db (por defecto)
145
+ print(f"\nDatos almacenados en la base de datos local")
146
+ else:
147
+ print("Error durante la actualización de datos")
148
+
149
+ # Ejecutar el ejemplo
150
+ if __name__ == "__main__":
151
+ asyncio.run(main())
152
+ ```
153
+
154
+ ## Contribuir
155
+
156
+ Este proyecto está en desarrollo activo. Las contribuciones son bienvenidas:
157
+
158
+ 1. Fork del repositorio
159
+ 2. Crear una rama para tu feature: `git checkout -b feature/nueva-funcionalidad`
160
+ 3. Commit de tus cambios: `git commit -am 'Añadir nueva funcionalidad'`
161
+ 4. Push a la rama: `git push origin feature/nueva-funcionalidad`
162
+ 5. Crear un Pull Request
163
+
164
+ ## Licencia
165
+
166
+ Este proyecto está licenciado bajo GPLv3. Ver el archivo [LICENSE](LICENSE) para más detalles.
@@ -0,0 +1,43 @@
1
+ .python-version
2
+ LICENSE
3
+ MANIFEST.in
4
+ Makefile
5
+ README.md
6
+ pyproject.toml
7
+ edata/__init__.py
8
+ edata/const.py
9
+ edata/helpers.py
10
+ edata/utils.py
11
+ edata/connectors/__init__.py
12
+ edata/connectors/datadis.py
13
+ edata/connectors/redata.py
14
+ edata/models/__init__.py
15
+ edata/models/base.py
16
+ edata/models/consumption.py
17
+ edata/models/contract.py
18
+ edata/models/database.py
19
+ edata/models/maximeter.py
20
+ edata/models/pricing.py
21
+ edata/models/supply.py
22
+ edata/scripts/__init__.py
23
+ edata/scripts/__main__.py
24
+ edata/scripts/dump.py
25
+ edata/services/__init__.py
26
+ edata/services/billing.py
27
+ edata/services/consumption.py
28
+ edata/services/contract.py
29
+ edata/services/database.py
30
+ edata/services/maximeter.py
31
+ edata/services/supply.py
32
+ edata/tests/__init__.py
33
+ edata/tests/test_helpers.py
34
+ edata/tests/connectors/__init__.py
35
+ edata/tests/connectors/test_datadis_connector.py
36
+ edata/tests/connectors/test_redata_connector.py
37
+ edata/tests/services/__init__.py
38
+ edata/tests/services/test_billing_service.py
39
+ edata/tests/services/test_consumption_service.py
40
+ edata/tests/services/test_contract_service.py
41
+ edata/tests/services/test_database_service.py
42
+ edata/tests/services/test_maximeter_service.py
43
+ edata/tests/services/test_supply_service.py