e-data 1.3.2__tar.gz → 2.0.0__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-1.3.2/e_data.egg-info → e_data-2.0.0}/PKG-INFO +120 -76
- e_data-2.0.0/README.md +148 -0
- {e_data-1.3.2 → e_data-2.0.0/e_data.egg-info}/PKG-INFO +120 -76
- e_data-2.0.0/e_data.egg-info/SOURCES.txt +32 -0
- e_data-2.0.0/e_data.egg-info/requires.txt +13 -0
- e_data-2.0.0/edata/cli.py +145 -0
- e_data-2.0.0/edata/core/utils.py +76 -0
- e_data-2.0.0/edata/database/__init__.py +1 -0
- e_data-2.0.0/edata/database/controller.py +473 -0
- e_data-2.0.0/edata/database/models.py +162 -0
- e_data-2.0.0/edata/database/queries.py +237 -0
- e_data-2.0.0/edata/database/utils.py +33 -0
- e_data-2.0.0/edata/models/__init__.py +3 -0
- e_data-2.0.0/edata/models/bill.py +73 -0
- e_data-2.0.0/edata/models/data.py +89 -0
- e_data-2.0.0/edata/models/supply.py +40 -0
- e_data-2.0.0/edata/providers/__init__.py +2 -0
- {e_data-1.3.2/edata/connectors → e_data-2.0.0/edata/providers}/datadis.py +141 -156
- {e_data-1.3.2/edata/connectors → e_data-2.0.0/edata/providers}/redata.py +13 -8
- e_data-2.0.0/edata/services/bill_service.py +446 -0
- e_data-2.0.0/edata/services/data_service.py +488 -0
- {e_data-1.3.2 → e_data-2.0.0}/edata/tests/test_datadis_connector.py +169 -134
- {e_data-1.3.2 → e_data-2.0.0}/edata/tests/test_redata_connector.py +3 -2
- e_data-2.0.0/edata/tests/test_services.py +234 -0
- {e_data-1.3.2 → e_data-2.0.0}/pyproject.toml +15 -13
- e_data-1.3.2/README.md +0 -106
- e_data-1.3.2/e_data.egg-info/SOURCES.txt +0 -28
- e_data-1.3.2/e_data.egg-info/requires.txt +0 -10
- e_data-1.3.2/edata/definitions.py +0 -329
- e_data-1.3.2/edata/helpers.py +0 -769
- e_data-1.3.2/edata/processors/base.py +0 -27
- e_data-1.3.2/edata/processors/billing.py +0 -215
- e_data-1.3.2/edata/processors/consumption.py +0 -139
- e_data-1.3.2/edata/processors/maximeter.py +0 -56
- e_data-1.3.2/edata/processors/utils.py +0 -148
- e_data-1.3.2/edata/storage.py +0 -46
- e_data-1.3.2/edata/tests/__init__.py +0 -0
- e_data-1.3.2/edata/tests/test_helpers.py +0 -52
- e_data-1.3.2/edata/tests/test_processors.py +0 -106
- {e_data-1.3.2 → e_data-2.0.0}/LICENSE +0 -0
- {e_data-1.3.2 → e_data-2.0.0}/MANIFEST.in +0 -0
- {e_data-1.3.2 → e_data-2.0.0}/e_data.egg-info/dependency_links.txt +0 -0
- {e_data-1.3.2 → e_data-2.0.0}/e_data.egg-info/top_level.txt +0 -0
- {e_data-1.3.2 → e_data-2.0.0}/edata/__init__.py +0 -0
- {e_data-1.3.2/edata/connectors → e_data-2.0.0/edata/core}/__init__.py +0 -0
- {e_data-1.3.2/edata → e_data-2.0.0/edata/core}/const.py +0 -0
- {e_data-1.3.2/edata/processors → e_data-2.0.0/edata/tests}/__init__.py +0 -0
- {e_data-1.3.2 → e_data-2.0.0}/setup.cfg +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: e-data
|
|
3
|
-
Version:
|
|
3
|
+
Version: 2.0.0
|
|
4
4
|
Summary: Python library for managing spanish energy data from various web providers
|
|
5
5
|
Author-email: VMG <vmayorg@outlook.es>
|
|
6
6
|
License: GNU GENERAL PUBLIC LICENSE
|
|
@@ -681,23 +681,25 @@ License: GNU GENERAL PUBLIC LICENSE
|
|
|
681
681
|
Project-URL: Homepage, https://github.com/uvejota/python-edata
|
|
682
682
|
Classifier: License :: OSI Approved :: GNU General Public License v3 (GPLv3)
|
|
683
683
|
Classifier: Programming Language :: Python
|
|
684
|
-
Classifier: Programming Language :: Python :: 3.11
|
|
685
684
|
Classifier: Programming Language :: Python :: 3.12
|
|
686
685
|
Classifier: Programming Language :: Python :: Implementation :: CPython
|
|
687
686
|
Classifier: Programming Language :: Python :: Implementation :: PyPy
|
|
688
|
-
Requires-Python: >=3.
|
|
687
|
+
Requires-Python: >=3.12.0
|
|
689
688
|
Description-Content-Type: text/markdown
|
|
690
689
|
License-File: LICENSE
|
|
691
|
-
Requires-Dist:
|
|
692
|
-
Requires-Dist:
|
|
693
|
-
Requires-Dist:
|
|
694
|
-
Requires-Dist:
|
|
695
|
-
Requires-Dist:
|
|
696
|
-
Requires-Dist:
|
|
697
|
-
Requires-Dist:
|
|
698
|
-
Requires-Dist:
|
|
699
|
-
Requires-Dist:
|
|
700
|
-
Requires-Dist:
|
|
690
|
+
Requires-Dist: aiohttp<4,>=3.12
|
|
691
|
+
Requires-Dist: dateparser<2,>=1.2
|
|
692
|
+
Requires-Dist: diskcache<6,>=5.6
|
|
693
|
+
Requires-Dist: freezegun<2,>=1.5
|
|
694
|
+
Requires-Dist: holidays<1,>=0.50
|
|
695
|
+
Requires-Dist: Jinja2<4,>=3.1
|
|
696
|
+
Requires-Dist: pydantic<3,>=2.10
|
|
697
|
+
Requires-Dist: python_dateutil<3,>=2.8
|
|
698
|
+
Requires-Dist: Requests<3,>=2.31
|
|
699
|
+
Requires-Dist: SQLAlchemy<3,>=2.0
|
|
700
|
+
Requires-Dist: sqlmodel<0.1,>=0.0.22
|
|
701
|
+
Requires-Dist: typer<1,>=0.12
|
|
702
|
+
Requires-Dist: aiosqlite<1,>=0.21
|
|
701
703
|
Dynamic: license-file
|
|
702
704
|
|
|
703
705
|
[](https://pepy.tech/project/e-data)
|
|
@@ -706,7 +708,7 @@ Dynamic: license-file
|
|
|
706
708
|
|
|
707
709
|
# python-edata
|
|
708
710
|
|
|
709
|
-
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.
|
|
711
|
+
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. Soporta facturación con PVPC (según disponibilidad de datos de REData) y tarificación fija personalizable mediante fórmulas. Todos los datos se almacenan localmente en una base de datos SQLite. Es el corazón de la integración [homeassistant-edata](https://github.com/uvejota/homeassistant-edata).
|
|
710
712
|
|
|
711
713
|
_**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.**_
|
|
712
714
|
|
|
@@ -726,83 +728,125 @@ pip install -r requirements.txt
|
|
|
726
728
|
|
|
727
729
|
## Estructura
|
|
728
730
|
|
|
729
|
-
El paquete consta de
|
|
731
|
+
El paquete consta de varios módulos:
|
|
730
732
|
|
|
731
|
-
* **
|
|
732
|
-
|
|
733
|
-
|
|
733
|
+
* **Proveedores** (`providers`): Conectores para consultar diferentes fuentes de datos.
|
|
734
|
+
- `datadis.py`: Conector para la API privada de Datadis (datos de consumo, potencia, contratos y suministros).
|
|
735
|
+
- `redata.py`: Conector para la API pública de REData (precios PVPC en tiempo real).
|
|
734
736
|
|
|
735
|
-
|
|
737
|
+
* **Servicios** (`services`): Capa de lógica de negocio que gestiona la sincronización y procesamiento de datos.
|
|
738
|
+
- `data_service.py`: Servicio para gestionar datos de telemetría (consumo, potencia, estadísticas).
|
|
739
|
+
- `bill_service.py`: Servicio para gestionar la facturación y cálculo de costes.
|
|
736
740
|
|
|
737
|
-
|
|
738
|
-
|
|
739
|
-
|
|
740
|
-
|
|
741
|
-
|
|
742
|
-
|
|
743
|
-
|
|
744
|
-
|
|
745
|
-
|
|
746
|
-
|
|
747
|
-
|
|
748
|
-
|
|
749
|
-
|
|
750
|
-
· utils.py
|
|
751
|
-
· helpers.py
|
|
752
|
-
```
|
|
741
|
+
* **Modelos** (`models`): Definiciones de estructuras de datos usando Pydantic.
|
|
742
|
+
- `supply.py`: Modelos de suministros (`Supply`) y contratos (`Contract`).
|
|
743
|
+
- `data.py`: Modelos de datos de telemetría (`Energy`, `Power`, `Statistics`).
|
|
744
|
+
- `bill.py`: Modelos de facturación (`Bill`, `EnergyPrice`, `BillingRules`, `PVPCBillingRules`).
|
|
745
|
+
|
|
746
|
+
* **Base de datos** (`database`): Gestión de persistencia local con SQLite.
|
|
747
|
+
- `controller.py`: Controlador principal de la base de datos (`EdataDB`).
|
|
748
|
+
- `models.py`: Modelos SQLModel para las tablas de la base de datos.
|
|
749
|
+
- `queries.py`: Consultas SQL predefinidas.
|
|
750
|
+
|
|
751
|
+
* **Utilidades** (`core`): Funciones auxiliares para cálculos de tarifas, fechas, etc.
|
|
752
|
+
|
|
753
|
+
* **CLI** (`cli.py`): Interfaz de línea de comandos para operaciones básicas.
|
|
753
754
|
|
|
754
755
|
## Ejemplo de uso
|
|
755
756
|
|
|
756
|
-
|
|
757
|
+
### Usando los servicios (recomendado)
|
|
758
|
+
|
|
759
|
+
Partimos de que tenemos credenciales en [Datadis.es](https://datadis.es). Algunas aclaraciones:
|
|
757
760
|
* No es necesario solicitar API pública en el registro (se utilizará la API privada habilitada por defecto)
|
|
758
761
|
* El username suele ser el NIF del titular
|
|
759
|
-
* Copie el CUPS de la web de Datadis, algunas comercializadoras adhieren caracteres adicionales en el CUPS mostrado en su factura
|
|
760
|
-
* La herramienta acepta el uso de NIF autorizado para consultar el suministro de otro titular
|
|
762
|
+
* Copie el CUPS de la web de Datadis, algunas comercializadoras adhieren caracteres adicionales en el CUPS mostrado en su factura
|
|
763
|
+
* La herramienta acepta el uso de NIF autorizado para consultar el suministro de otro titular
|
|
761
764
|
|
|
762
765
|
``` python
|
|
766
|
+
import asyncio
|
|
763
767
|
from datetime import datetime
|
|
764
|
-
import
|
|
768
|
+
from edata.services.data_service import DataService
|
|
769
|
+
from edata.services.bill_service import BillService
|
|
770
|
+
from edata.models.bill import PVPCBillingRules
|
|
771
|
+
|
|
772
|
+
async def main():
|
|
773
|
+
# Crear el servicio de datos
|
|
774
|
+
data_service = DataService(
|
|
775
|
+
cups="ES0000000000000000XX", # Tu CUPS
|
|
776
|
+
datadis_user="12345678A", # Tu NIF/usuario
|
|
777
|
+
datadis_pwd="tu_password",
|
|
778
|
+
storage_path="./my_data" # Directorio para la BD
|
|
779
|
+
datadis_authorized_nif=None, # NIF autorizado (opcional)
|
|
780
|
+
)
|
|
781
|
+
|
|
782
|
+
# Actualizar todos los datos disponibles
|
|
783
|
+
await data_service.update()
|
|
784
|
+
|
|
785
|
+
# Obtener suministros y contratos
|
|
786
|
+
supplies = await data_service.get_supplies()
|
|
787
|
+
contracts = await data_service.get_contracts()
|
|
788
|
+
|
|
789
|
+
# Obtener datos de consumo y potencia
|
|
790
|
+
energy = await data_service.get_energy()
|
|
791
|
+
power = await data_service.get_power()
|
|
792
|
+
|
|
793
|
+
# Obtener estadísticas agregadas (diarias o mensuales)
|
|
794
|
+
daily_stats = await data_service.get_statistics("day")
|
|
795
|
+
monthly_stats = await data_service.get_statistics("month")
|
|
796
|
+
|
|
797
|
+
# Crear el servicio de facturación
|
|
798
|
+
bill_service = BillService(
|
|
799
|
+
cups="ES0000000000000000XX",
|
|
800
|
+
storage_path="./my_data" # Mismo directorio que data_service
|
|
801
|
+
)
|
|
802
|
+
|
|
803
|
+
# Definir reglas de facturación PVPC (valores por defecto españoles)
|
|
804
|
+
pvpc_rules = PVPCBillingRules(
|
|
805
|
+
p1_kw_year_eur=30.67266, # Término potencia P1 (€/kW/año)
|
|
806
|
+
p2_kw_year_eur=1.4243591, # Término potencia P2 (€/kW/año)
|
|
807
|
+
meter_month_eur=0.81, # Alquiler contador (€/mes)
|
|
808
|
+
market_kw_year_eur=3.113, # Otros cargos (€/kW/año)
|
|
809
|
+
electricity_tax=1.0511300560, # Impuesto eléctrico
|
|
810
|
+
iva_tax=1.21 # IVA (21%)
|
|
811
|
+
)
|
|
812
|
+
|
|
813
|
+
# Actualizar facturación con PVPC
|
|
814
|
+
start_date = datetime(2024, 1, 1)
|
|
815
|
+
end_date = datetime(2024, 12, 31)
|
|
816
|
+
await bill_service.update(start_date, end_date, billing_rules=pvpc_rules, is_pvpc=True)
|
|
817
|
+
|
|
818
|
+
# Obtener facturas calculadas
|
|
819
|
+
bills = await bill_service.get_bills(start_date, end_date, type_="hour")
|
|
820
|
+
daily_bills = await bill_service.get_bills(start_date, end_date, type_="day")
|
|
821
|
+
monthly_bills = await bill_service.get_bills(start_date, end_date, type_="month")
|
|
822
|
+
|
|
823
|
+
# Mostrar resumen
|
|
824
|
+
total_cost = sum(b.value_eur for b in bills)
|
|
825
|
+
print(f"Coste total: {total_cost:.2f} €")
|
|
826
|
+
print(f"Consumo total: {sum(e.value_kwh for e in energy):.2f} kWh")
|
|
765
827
|
|
|
766
|
-
#
|
|
767
|
-
|
|
768
|
-
|
|
769
|
-
from edata.helpers import EdataHelper
|
|
770
|
-
# importamos el procesador de utilidades
|
|
771
|
-
from edata.processors import utils
|
|
828
|
+
# Ejecutar
|
|
829
|
+
asyncio.run(main())
|
|
830
|
+
```
|
|
772
831
|
|
|
773
|
-
|
|
774
|
-
PRICING_RULES_PVPC = PricingRules(
|
|
775
|
-
p1_kw_year_eur=30.67266,
|
|
776
|
-
p2_kw_year_eur=1.4243591,
|
|
777
|
-
meter_month_eur=0.81,
|
|
778
|
-
market_kw_year_eur=3.113,
|
|
779
|
-
electricity_tax=1.0511300560,
|
|
780
|
-
iva_tax=1.05,
|
|
781
|
-
# podemos rellenar los siguientes campos si quisiéramos precio fijo (y no pvpc)
|
|
782
|
-
p1_kwh_eur=None,
|
|
783
|
-
p2_kwh_eur=None,
|
|
784
|
-
p3_kwh_eur=None,
|
|
785
|
-
)
|
|
832
|
+
### Usando la CLI
|
|
786
833
|
|
|
787
|
-
|
|
788
|
-
# 'authorized_nif' permite indicar el NIF de la persona que nos autoriza a consultar su CUPS.
|
|
789
|
-
# 'data' permite "cargar" al helper datos anteriores (resultado edata.data de una ejecución anterior), para evitar volver a consultar los mismos.
|
|
790
|
-
edata = EdataHelper(
|
|
791
|
-
"datadis_user",
|
|
792
|
-
"datadis_password",
|
|
793
|
-
"cups",
|
|
794
|
-
datadis_authorized_nif=None,
|
|
795
|
-
pricing_rules=PRICING_RULES_PVPC, # si se le pasa None, no aplica tarificación
|
|
796
|
-
data=None, # aquí podríamos cargar datos anteriores
|
|
797
|
-
)
|
|
834
|
+
El paquete incluye una interfaz de línea de comandos para operaciones básicas:
|
|
798
835
|
|
|
799
|
-
|
|
800
|
-
|
|
836
|
+
``` bash
|
|
837
|
+
# Ver suministros disponibles
|
|
838
|
+
python -m edata.cli show-supplies <username>
|
|
801
839
|
|
|
802
|
-
#
|
|
803
|
-
|
|
804
|
-
json.dump(utils.serialize_dict(edata.data), file) # se puede utilizar deserialize_dict para la posterior lectura del backup
|
|
840
|
+
# Descargar todos los datos de un CUPS
|
|
841
|
+
python -m edata.cli download-all --cups ES0000000000000000XX <username>
|
|
805
842
|
|
|
806
|
-
#
|
|
807
|
-
|
|
843
|
+
# Actualizar facturación con tarifa fija
|
|
844
|
+
python -m edata.cli update-custom-bill \
|
|
845
|
+
--cups ES0000000000000000XX \
|
|
846
|
+
--p1-kw-year-eur 30.67 \
|
|
847
|
+
--p2-kw-year-eur 1.42 \
|
|
848
|
+
--p1-kwh-eur 0.15 \
|
|
849
|
+
--p2-kwh-eur 0.10 \
|
|
850
|
+
--p3-kwh-eur 0.08 \
|
|
851
|
+
--meter-month-eur 0.81
|
|
808
852
|
```
|
e_data-2.0.0/README.md
ADDED
|
@@ -0,0 +1,148 @@
|
|
|
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. Soporta facturación con PVPC (según disponibilidad de datos de REData) y tarificación fija personalizable mediante fórmulas. Todos los datos se almacenan localmente en una base de datos SQLite. 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
|
+
pip install -r requirements.txt
|
|
23
|
+
```
|
|
24
|
+
|
|
25
|
+
## Estructura
|
|
26
|
+
|
|
27
|
+
El paquete consta de varios módulos:
|
|
28
|
+
|
|
29
|
+
* **Proveedores** (`providers`): Conectores para consultar diferentes fuentes de datos.
|
|
30
|
+
- `datadis.py`: Conector para la API privada de Datadis (datos de consumo, potencia, contratos y suministros).
|
|
31
|
+
- `redata.py`: Conector para la API pública de REData (precios PVPC en tiempo real).
|
|
32
|
+
|
|
33
|
+
* **Servicios** (`services`): Capa de lógica de negocio que gestiona la sincronización y procesamiento de datos.
|
|
34
|
+
- `data_service.py`: Servicio para gestionar datos de telemetría (consumo, potencia, estadísticas).
|
|
35
|
+
- `bill_service.py`: Servicio para gestionar la facturación y cálculo de costes.
|
|
36
|
+
|
|
37
|
+
* **Modelos** (`models`): Definiciones de estructuras de datos usando Pydantic.
|
|
38
|
+
- `supply.py`: Modelos de suministros (`Supply`) y contratos (`Contract`).
|
|
39
|
+
- `data.py`: Modelos de datos de telemetría (`Energy`, `Power`, `Statistics`).
|
|
40
|
+
- `bill.py`: Modelos de facturación (`Bill`, `EnergyPrice`, `BillingRules`, `PVPCBillingRules`).
|
|
41
|
+
|
|
42
|
+
* **Base de datos** (`database`): Gestión de persistencia local con SQLite.
|
|
43
|
+
- `controller.py`: Controlador principal de la base de datos (`EdataDB`).
|
|
44
|
+
- `models.py`: Modelos SQLModel para las tablas de la base de datos.
|
|
45
|
+
- `queries.py`: Consultas SQL predefinidas.
|
|
46
|
+
|
|
47
|
+
* **Utilidades** (`core`): Funciones auxiliares para cálculos de tarifas, fechas, etc.
|
|
48
|
+
|
|
49
|
+
* **CLI** (`cli.py`): Interfaz de línea de comandos para operaciones básicas.
|
|
50
|
+
|
|
51
|
+
## Ejemplo de uso
|
|
52
|
+
|
|
53
|
+
### Usando los servicios (recomendado)
|
|
54
|
+
|
|
55
|
+
Partimos de que tenemos credenciales en [Datadis.es](https://datadis.es). Algunas aclaraciones:
|
|
56
|
+
* No es necesario solicitar API pública en el registro (se utilizará la API privada habilitada por defecto)
|
|
57
|
+
* El username suele ser el NIF del titular
|
|
58
|
+
* Copie el CUPS de la web de Datadis, algunas comercializadoras adhieren caracteres adicionales en el CUPS mostrado en su factura
|
|
59
|
+
* La herramienta acepta el uso de NIF autorizado para consultar el suministro de otro titular
|
|
60
|
+
|
|
61
|
+
``` python
|
|
62
|
+
import asyncio
|
|
63
|
+
from datetime import datetime
|
|
64
|
+
from edata.services.data_service import DataService
|
|
65
|
+
from edata.services.bill_service import BillService
|
|
66
|
+
from edata.models.bill import PVPCBillingRules
|
|
67
|
+
|
|
68
|
+
async def main():
|
|
69
|
+
# Crear el servicio de datos
|
|
70
|
+
data_service = DataService(
|
|
71
|
+
cups="ES0000000000000000XX", # Tu CUPS
|
|
72
|
+
datadis_user="12345678A", # Tu NIF/usuario
|
|
73
|
+
datadis_pwd="tu_password",
|
|
74
|
+
storage_path="./my_data" # Directorio para la BD
|
|
75
|
+
datadis_authorized_nif=None, # NIF autorizado (opcional)
|
|
76
|
+
)
|
|
77
|
+
|
|
78
|
+
# Actualizar todos los datos disponibles
|
|
79
|
+
await data_service.update()
|
|
80
|
+
|
|
81
|
+
# Obtener suministros y contratos
|
|
82
|
+
supplies = await data_service.get_supplies()
|
|
83
|
+
contracts = await data_service.get_contracts()
|
|
84
|
+
|
|
85
|
+
# Obtener datos de consumo y potencia
|
|
86
|
+
energy = await data_service.get_energy()
|
|
87
|
+
power = await data_service.get_power()
|
|
88
|
+
|
|
89
|
+
# Obtener estadísticas agregadas (diarias o mensuales)
|
|
90
|
+
daily_stats = await data_service.get_statistics("day")
|
|
91
|
+
monthly_stats = await data_service.get_statistics("month")
|
|
92
|
+
|
|
93
|
+
# Crear el servicio de facturación
|
|
94
|
+
bill_service = BillService(
|
|
95
|
+
cups="ES0000000000000000XX",
|
|
96
|
+
storage_path="./my_data" # Mismo directorio que data_service
|
|
97
|
+
)
|
|
98
|
+
|
|
99
|
+
# Definir reglas de facturación PVPC (valores por defecto españoles)
|
|
100
|
+
pvpc_rules = PVPCBillingRules(
|
|
101
|
+
p1_kw_year_eur=30.67266, # Término potencia P1 (€/kW/año)
|
|
102
|
+
p2_kw_year_eur=1.4243591, # Término potencia P2 (€/kW/año)
|
|
103
|
+
meter_month_eur=0.81, # Alquiler contador (€/mes)
|
|
104
|
+
market_kw_year_eur=3.113, # Otros cargos (€/kW/año)
|
|
105
|
+
electricity_tax=1.0511300560, # Impuesto eléctrico
|
|
106
|
+
iva_tax=1.21 # IVA (21%)
|
|
107
|
+
)
|
|
108
|
+
|
|
109
|
+
# Actualizar facturación con PVPC
|
|
110
|
+
start_date = datetime(2024, 1, 1)
|
|
111
|
+
end_date = datetime(2024, 12, 31)
|
|
112
|
+
await bill_service.update(start_date, end_date, billing_rules=pvpc_rules, is_pvpc=True)
|
|
113
|
+
|
|
114
|
+
# Obtener facturas calculadas
|
|
115
|
+
bills = await bill_service.get_bills(start_date, end_date, type_="hour")
|
|
116
|
+
daily_bills = await bill_service.get_bills(start_date, end_date, type_="day")
|
|
117
|
+
monthly_bills = await bill_service.get_bills(start_date, end_date, type_="month")
|
|
118
|
+
|
|
119
|
+
# Mostrar resumen
|
|
120
|
+
total_cost = sum(b.value_eur for b in bills)
|
|
121
|
+
print(f"Coste total: {total_cost:.2f} €")
|
|
122
|
+
print(f"Consumo total: {sum(e.value_kwh for e in energy):.2f} kWh")
|
|
123
|
+
|
|
124
|
+
# Ejecutar
|
|
125
|
+
asyncio.run(main())
|
|
126
|
+
```
|
|
127
|
+
|
|
128
|
+
### Usando la CLI
|
|
129
|
+
|
|
130
|
+
El paquete incluye una interfaz de línea de comandos para operaciones básicas:
|
|
131
|
+
|
|
132
|
+
``` bash
|
|
133
|
+
# Ver suministros disponibles
|
|
134
|
+
python -m edata.cli show-supplies <username>
|
|
135
|
+
|
|
136
|
+
# Descargar todos los datos de un CUPS
|
|
137
|
+
python -m edata.cli download-all --cups ES0000000000000000XX <username>
|
|
138
|
+
|
|
139
|
+
# Actualizar facturación con tarifa fija
|
|
140
|
+
python -m edata.cli update-custom-bill \
|
|
141
|
+
--cups ES0000000000000000XX \
|
|
142
|
+
--p1-kw-year-eur 30.67 \
|
|
143
|
+
--p2-kw-year-eur 1.42 \
|
|
144
|
+
--p1-kwh-eur 0.15 \
|
|
145
|
+
--p2-kwh-eur 0.10 \
|
|
146
|
+
--p3-kwh-eur 0.08 \
|
|
147
|
+
--meter-month-eur 0.81
|
|
148
|
+
```
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: e-data
|
|
3
|
-
Version:
|
|
3
|
+
Version: 2.0.0
|
|
4
4
|
Summary: Python library for managing spanish energy data from various web providers
|
|
5
5
|
Author-email: VMG <vmayorg@outlook.es>
|
|
6
6
|
License: GNU GENERAL PUBLIC LICENSE
|
|
@@ -681,23 +681,25 @@ License: GNU GENERAL PUBLIC LICENSE
|
|
|
681
681
|
Project-URL: Homepage, https://github.com/uvejota/python-edata
|
|
682
682
|
Classifier: License :: OSI Approved :: GNU General Public License v3 (GPLv3)
|
|
683
683
|
Classifier: Programming Language :: Python
|
|
684
|
-
Classifier: Programming Language :: Python :: 3.11
|
|
685
684
|
Classifier: Programming Language :: Python :: 3.12
|
|
686
685
|
Classifier: Programming Language :: Python :: Implementation :: CPython
|
|
687
686
|
Classifier: Programming Language :: Python :: Implementation :: PyPy
|
|
688
|
-
Requires-Python: >=3.
|
|
687
|
+
Requires-Python: >=3.12.0
|
|
689
688
|
Description-Content-Type: text/markdown
|
|
690
689
|
License-File: LICENSE
|
|
691
|
-
Requires-Dist:
|
|
692
|
-
Requires-Dist:
|
|
693
|
-
Requires-Dist:
|
|
694
|
-
Requires-Dist:
|
|
695
|
-
Requires-Dist:
|
|
696
|
-
Requires-Dist:
|
|
697
|
-
Requires-Dist:
|
|
698
|
-
Requires-Dist:
|
|
699
|
-
Requires-Dist:
|
|
700
|
-
Requires-Dist:
|
|
690
|
+
Requires-Dist: aiohttp<4,>=3.12
|
|
691
|
+
Requires-Dist: dateparser<2,>=1.2
|
|
692
|
+
Requires-Dist: diskcache<6,>=5.6
|
|
693
|
+
Requires-Dist: freezegun<2,>=1.5
|
|
694
|
+
Requires-Dist: holidays<1,>=0.50
|
|
695
|
+
Requires-Dist: Jinja2<4,>=3.1
|
|
696
|
+
Requires-Dist: pydantic<3,>=2.10
|
|
697
|
+
Requires-Dist: python_dateutil<3,>=2.8
|
|
698
|
+
Requires-Dist: Requests<3,>=2.31
|
|
699
|
+
Requires-Dist: SQLAlchemy<3,>=2.0
|
|
700
|
+
Requires-Dist: sqlmodel<0.1,>=0.0.22
|
|
701
|
+
Requires-Dist: typer<1,>=0.12
|
|
702
|
+
Requires-Dist: aiosqlite<1,>=0.21
|
|
701
703
|
Dynamic: license-file
|
|
702
704
|
|
|
703
705
|
[](https://pepy.tech/project/e-data)
|
|
@@ -706,7 +708,7 @@ Dynamic: license-file
|
|
|
706
708
|
|
|
707
709
|
# python-edata
|
|
708
710
|
|
|
709
|
-
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.
|
|
711
|
+
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. Soporta facturación con PVPC (según disponibilidad de datos de REData) y tarificación fija personalizable mediante fórmulas. Todos los datos se almacenan localmente en una base de datos SQLite. Es el corazón de la integración [homeassistant-edata](https://github.com/uvejota/homeassistant-edata).
|
|
710
712
|
|
|
711
713
|
_**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.**_
|
|
712
714
|
|
|
@@ -726,83 +728,125 @@ pip install -r requirements.txt
|
|
|
726
728
|
|
|
727
729
|
## Estructura
|
|
728
730
|
|
|
729
|
-
El paquete consta de
|
|
731
|
+
El paquete consta de varios módulos:
|
|
730
732
|
|
|
731
|
-
* **
|
|
732
|
-
|
|
733
|
-
|
|
733
|
+
* **Proveedores** (`providers`): Conectores para consultar diferentes fuentes de datos.
|
|
734
|
+
- `datadis.py`: Conector para la API privada de Datadis (datos de consumo, potencia, contratos y suministros).
|
|
735
|
+
- `redata.py`: Conector para la API pública de REData (precios PVPC en tiempo real).
|
|
734
736
|
|
|
735
|
-
|
|
737
|
+
* **Servicios** (`services`): Capa de lógica de negocio que gestiona la sincronización y procesamiento de datos.
|
|
738
|
+
- `data_service.py`: Servicio para gestionar datos de telemetría (consumo, potencia, estadísticas).
|
|
739
|
+
- `bill_service.py`: Servicio para gestionar la facturación y cálculo de costes.
|
|
736
740
|
|
|
737
|
-
|
|
738
|
-
|
|
739
|
-
|
|
740
|
-
|
|
741
|
-
|
|
742
|
-
|
|
743
|
-
|
|
744
|
-
|
|
745
|
-
|
|
746
|
-
|
|
747
|
-
|
|
748
|
-
|
|
749
|
-
|
|
750
|
-
· utils.py
|
|
751
|
-
· helpers.py
|
|
752
|
-
```
|
|
741
|
+
* **Modelos** (`models`): Definiciones de estructuras de datos usando Pydantic.
|
|
742
|
+
- `supply.py`: Modelos de suministros (`Supply`) y contratos (`Contract`).
|
|
743
|
+
- `data.py`: Modelos de datos de telemetría (`Energy`, `Power`, `Statistics`).
|
|
744
|
+
- `bill.py`: Modelos de facturación (`Bill`, `EnergyPrice`, `BillingRules`, `PVPCBillingRules`).
|
|
745
|
+
|
|
746
|
+
* **Base de datos** (`database`): Gestión de persistencia local con SQLite.
|
|
747
|
+
- `controller.py`: Controlador principal de la base de datos (`EdataDB`).
|
|
748
|
+
- `models.py`: Modelos SQLModel para las tablas de la base de datos.
|
|
749
|
+
- `queries.py`: Consultas SQL predefinidas.
|
|
750
|
+
|
|
751
|
+
* **Utilidades** (`core`): Funciones auxiliares para cálculos de tarifas, fechas, etc.
|
|
752
|
+
|
|
753
|
+
* **CLI** (`cli.py`): Interfaz de línea de comandos para operaciones básicas.
|
|
753
754
|
|
|
754
755
|
## Ejemplo de uso
|
|
755
756
|
|
|
756
|
-
|
|
757
|
+
### Usando los servicios (recomendado)
|
|
758
|
+
|
|
759
|
+
Partimos de que tenemos credenciales en [Datadis.es](https://datadis.es). Algunas aclaraciones:
|
|
757
760
|
* No es necesario solicitar API pública en el registro (se utilizará la API privada habilitada por defecto)
|
|
758
761
|
* El username suele ser el NIF del titular
|
|
759
|
-
* Copie el CUPS de la web de Datadis, algunas comercializadoras adhieren caracteres adicionales en el CUPS mostrado en su factura
|
|
760
|
-
* La herramienta acepta el uso de NIF autorizado para consultar el suministro de otro titular
|
|
762
|
+
* Copie el CUPS de la web de Datadis, algunas comercializadoras adhieren caracteres adicionales en el CUPS mostrado en su factura
|
|
763
|
+
* La herramienta acepta el uso de NIF autorizado para consultar el suministro de otro titular
|
|
761
764
|
|
|
762
765
|
``` python
|
|
766
|
+
import asyncio
|
|
763
767
|
from datetime import datetime
|
|
764
|
-
import
|
|
768
|
+
from edata.services.data_service import DataService
|
|
769
|
+
from edata.services.bill_service import BillService
|
|
770
|
+
from edata.models.bill import PVPCBillingRules
|
|
771
|
+
|
|
772
|
+
async def main():
|
|
773
|
+
# Crear el servicio de datos
|
|
774
|
+
data_service = DataService(
|
|
775
|
+
cups="ES0000000000000000XX", # Tu CUPS
|
|
776
|
+
datadis_user="12345678A", # Tu NIF/usuario
|
|
777
|
+
datadis_pwd="tu_password",
|
|
778
|
+
storage_path="./my_data" # Directorio para la BD
|
|
779
|
+
datadis_authorized_nif=None, # NIF autorizado (opcional)
|
|
780
|
+
)
|
|
781
|
+
|
|
782
|
+
# Actualizar todos los datos disponibles
|
|
783
|
+
await data_service.update()
|
|
784
|
+
|
|
785
|
+
# Obtener suministros y contratos
|
|
786
|
+
supplies = await data_service.get_supplies()
|
|
787
|
+
contracts = await data_service.get_contracts()
|
|
788
|
+
|
|
789
|
+
# Obtener datos de consumo y potencia
|
|
790
|
+
energy = await data_service.get_energy()
|
|
791
|
+
power = await data_service.get_power()
|
|
792
|
+
|
|
793
|
+
# Obtener estadísticas agregadas (diarias o mensuales)
|
|
794
|
+
daily_stats = await data_service.get_statistics("day")
|
|
795
|
+
monthly_stats = await data_service.get_statistics("month")
|
|
796
|
+
|
|
797
|
+
# Crear el servicio de facturación
|
|
798
|
+
bill_service = BillService(
|
|
799
|
+
cups="ES0000000000000000XX",
|
|
800
|
+
storage_path="./my_data" # Mismo directorio que data_service
|
|
801
|
+
)
|
|
802
|
+
|
|
803
|
+
# Definir reglas de facturación PVPC (valores por defecto españoles)
|
|
804
|
+
pvpc_rules = PVPCBillingRules(
|
|
805
|
+
p1_kw_year_eur=30.67266, # Término potencia P1 (€/kW/año)
|
|
806
|
+
p2_kw_year_eur=1.4243591, # Término potencia P2 (€/kW/año)
|
|
807
|
+
meter_month_eur=0.81, # Alquiler contador (€/mes)
|
|
808
|
+
market_kw_year_eur=3.113, # Otros cargos (€/kW/año)
|
|
809
|
+
electricity_tax=1.0511300560, # Impuesto eléctrico
|
|
810
|
+
iva_tax=1.21 # IVA (21%)
|
|
811
|
+
)
|
|
812
|
+
|
|
813
|
+
# Actualizar facturación con PVPC
|
|
814
|
+
start_date = datetime(2024, 1, 1)
|
|
815
|
+
end_date = datetime(2024, 12, 31)
|
|
816
|
+
await bill_service.update(start_date, end_date, billing_rules=pvpc_rules, is_pvpc=True)
|
|
817
|
+
|
|
818
|
+
# Obtener facturas calculadas
|
|
819
|
+
bills = await bill_service.get_bills(start_date, end_date, type_="hour")
|
|
820
|
+
daily_bills = await bill_service.get_bills(start_date, end_date, type_="day")
|
|
821
|
+
monthly_bills = await bill_service.get_bills(start_date, end_date, type_="month")
|
|
822
|
+
|
|
823
|
+
# Mostrar resumen
|
|
824
|
+
total_cost = sum(b.value_eur for b in bills)
|
|
825
|
+
print(f"Coste total: {total_cost:.2f} €")
|
|
826
|
+
print(f"Consumo total: {sum(e.value_kwh for e in energy):.2f} kWh")
|
|
765
827
|
|
|
766
|
-
#
|
|
767
|
-
|
|
768
|
-
|
|
769
|
-
from edata.helpers import EdataHelper
|
|
770
|
-
# importamos el procesador de utilidades
|
|
771
|
-
from edata.processors import utils
|
|
828
|
+
# Ejecutar
|
|
829
|
+
asyncio.run(main())
|
|
830
|
+
```
|
|
772
831
|
|
|
773
|
-
|
|
774
|
-
PRICING_RULES_PVPC = PricingRules(
|
|
775
|
-
p1_kw_year_eur=30.67266,
|
|
776
|
-
p2_kw_year_eur=1.4243591,
|
|
777
|
-
meter_month_eur=0.81,
|
|
778
|
-
market_kw_year_eur=3.113,
|
|
779
|
-
electricity_tax=1.0511300560,
|
|
780
|
-
iva_tax=1.05,
|
|
781
|
-
# podemos rellenar los siguientes campos si quisiéramos precio fijo (y no pvpc)
|
|
782
|
-
p1_kwh_eur=None,
|
|
783
|
-
p2_kwh_eur=None,
|
|
784
|
-
p3_kwh_eur=None,
|
|
785
|
-
)
|
|
832
|
+
### Usando la CLI
|
|
786
833
|
|
|
787
|
-
|
|
788
|
-
# 'authorized_nif' permite indicar el NIF de la persona que nos autoriza a consultar su CUPS.
|
|
789
|
-
# 'data' permite "cargar" al helper datos anteriores (resultado edata.data de una ejecución anterior), para evitar volver a consultar los mismos.
|
|
790
|
-
edata = EdataHelper(
|
|
791
|
-
"datadis_user",
|
|
792
|
-
"datadis_password",
|
|
793
|
-
"cups",
|
|
794
|
-
datadis_authorized_nif=None,
|
|
795
|
-
pricing_rules=PRICING_RULES_PVPC, # si se le pasa None, no aplica tarificación
|
|
796
|
-
data=None, # aquí podríamos cargar datos anteriores
|
|
797
|
-
)
|
|
834
|
+
El paquete incluye una interfaz de línea de comandos para operaciones básicas:
|
|
798
835
|
|
|
799
|
-
|
|
800
|
-
|
|
836
|
+
``` bash
|
|
837
|
+
# Ver suministros disponibles
|
|
838
|
+
python -m edata.cli show-supplies <username>
|
|
801
839
|
|
|
802
|
-
#
|
|
803
|
-
|
|
804
|
-
json.dump(utils.serialize_dict(edata.data), file) # se puede utilizar deserialize_dict para la posterior lectura del backup
|
|
840
|
+
# Descargar todos los datos de un CUPS
|
|
841
|
+
python -m edata.cli download-all --cups ES0000000000000000XX <username>
|
|
805
842
|
|
|
806
|
-
#
|
|
807
|
-
|
|
843
|
+
# Actualizar facturación con tarifa fija
|
|
844
|
+
python -m edata.cli update-custom-bill \
|
|
845
|
+
--cups ES0000000000000000XX \
|
|
846
|
+
--p1-kw-year-eur 30.67 \
|
|
847
|
+
--p2-kw-year-eur 1.42 \
|
|
848
|
+
--p1-kwh-eur 0.15 \
|
|
849
|
+
--p2-kwh-eur 0.10 \
|
|
850
|
+
--p3-kwh-eur 0.08 \
|
|
851
|
+
--meter-month-eur 0.81
|
|
808
852
|
```
|