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.
- e_data-2.0.0b2/.python-version +1 -0
- e_data-2.0.0b2/MANIFEST.in +22 -0
- e_data-2.0.0b2/Makefile +51 -0
- e_data-2.0.0b2/PKG-INFO +216 -0
- e_data-2.0.0b2/README.md +166 -0
- e_data-2.0.0b2/e_data.egg-info/SOURCES.txt +43 -0
- e_data-2.0.0b2/edata/connectors/datadis.py +544 -0
- e_data-2.0.0b2/edata/connectors/redata.py +88 -0
- e_data-2.0.0b2/edata/const.py +56 -0
- e_data-2.0.0b2/edata/helpers.py +312 -0
- e_data-2.0.0b2/edata/models/__init__.py +22 -0
- e_data-2.0.0b2/edata/models/base.py +105 -0
- e_data-2.0.0b2/edata/models/consumption.py +101 -0
- e_data-2.0.0b2/edata/models/contract.py +52 -0
- e_data-2.0.0b2/edata/models/database.py +136 -0
- e_data-2.0.0b2/edata/models/maximeter.py +39 -0
- e_data-2.0.0b2/edata/models/pricing.py +174 -0
- e_data-2.0.0b2/edata/models/supply.py +71 -0
- e_data-2.0.0b2/edata/scripts/__init__.py +1 -0
- e_data-2.0.0b2/edata/scripts/dump.py +408 -0
- e_data-2.0.0b2/edata/services/__init__.py +18 -0
- e_data-2.0.0b2/edata/services/billing.py +1046 -0
- e_data-2.0.0b2/edata/services/consumption.py +742 -0
- e_data-2.0.0b2/edata/services/contract.py +343 -0
- e_data-2.0.0b2/edata/services/database.py +468 -0
- e_data-2.0.0b2/edata/services/maximeter.py +409 -0
- e_data-2.0.0b2/edata/services/supply.py +389 -0
- e_data-2.0.0b2/edata/tests/__init__.py +0 -0
- e_data-2.0.0b2/edata/tests/connectors/__init__.py +0 -0
- e_data-2.0.0b2/edata/tests/connectors/test_datadis_connector.py +178 -0
- e_data-2.0.0b2/edata/tests/connectors/test_redata_connector.py +29 -0
- e_data-2.0.0b2/edata/tests/services/__init__.py +0 -0
- e_data-2.0.0b2/edata/tests/services/test_billing_service.py +1169 -0
- e_data-2.0.0b2/edata/tests/services/test_consumption_service.py +955 -0
- e_data-2.0.0b2/edata/tests/services/test_contract_service.py +216 -0
- e_data-2.0.0b2/edata/tests/services/test_database_service.py +415 -0
- e_data-2.0.0b2/edata/tests/services/test_maximeter_service.py +83 -0
- e_data-2.0.0b2/edata/tests/services/test_supply_service.py +251 -0
- e_data-2.0.0b2/edata/tests/test_helpers.py +612 -0
- {e_data-1.2.22/edata/processors → e_data-2.0.0b2/edata}/utils.py +72 -56
- e_data-2.0.0b2/pyproject.toml +104 -0
- {e_data-1.2.22 → e_data-2.0.0b2}/setup.cfg +0 -2
- e_data-1.2.22/MANIFEST.in +0 -13
- e_data-1.2.22/PKG-INFO +0 -136
- e_data-1.2.22/README.md +0 -106
- e_data-1.2.22/e_data.egg-info/PKG-INFO +0 -136
- e_data-1.2.22/e_data.egg-info/SOURCES.txt +0 -24
- e_data-1.2.22/e_data.egg-info/dependency_links.txt +0 -1
- e_data-1.2.22/e_data.egg-info/requires.txt +0 -8
- e_data-1.2.22/e_data.egg-info/top_level.txt +0 -1
- e_data-1.2.22/edata/connectors/datadis.py +0 -528
- e_data-1.2.22/edata/connectors/redata.py +0 -70
- e_data-1.2.22/edata/const.py +0 -3
- e_data-1.2.22/edata/definitions.py +0 -329
- e_data-1.2.22/edata/helpers.py +0 -769
- e_data-1.2.22/edata/processors/base.py +0 -27
- e_data-1.2.22/edata/processors/billing.py +0 -215
- e_data-1.2.22/edata/processors/consumption.py +0 -139
- e_data-1.2.22/edata/processors/maximeter.py +0 -56
- e_data-1.2.22/edata/storage.py +0 -46
- e_data-1.2.22/setup.py +0 -142
- {e_data-1.2.22 → e_data-2.0.0b2}/LICENSE +0 -0
- {e_data-1.2.22 → e_data-2.0.0b2}/edata/__init__.py +0 -0
- {e_data-1.2.22 → e_data-2.0.0b2}/edata/connectors/__init__.py +0 -0
- /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
|
e_data-2.0.0b2/Makefile
ADDED
|
@@ -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
|
e_data-2.0.0b2/PKG-INFO
ADDED
|
@@ -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
|
+
[](https://pepy.tech/project/e-data)
|
|
52
|
+
[](https://pepy.tech/project/e-data)
|
|
53
|
+
[](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.
|
e_data-2.0.0b2/README.md
ADDED
|
@@ -0,0 +1,166 @@
|
|
|
1
|
+
[](https://pepy.tech/project/e-data)
|
|
2
|
+
[](https://pepy.tech/project/e-data)
|
|
3
|
+
[](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
|