e-data 1.3.3__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.
Files changed (49) hide show
  1. {e_data-1.3.3/e_data.egg-info → e_data-2.0.0}/PKG-INFO +120 -76
  2. e_data-2.0.0/README.md +148 -0
  3. {e_data-1.3.3 → e_data-2.0.0/e_data.egg-info}/PKG-INFO +120 -76
  4. e_data-2.0.0/e_data.egg-info/SOURCES.txt +32 -0
  5. e_data-2.0.0/e_data.egg-info/requires.txt +13 -0
  6. e_data-2.0.0/edata/cli.py +145 -0
  7. e_data-2.0.0/edata/core/utils.py +76 -0
  8. e_data-2.0.0/edata/database/__init__.py +1 -0
  9. e_data-2.0.0/edata/database/controller.py +473 -0
  10. e_data-2.0.0/edata/database/models.py +162 -0
  11. e_data-2.0.0/edata/database/queries.py +237 -0
  12. e_data-2.0.0/edata/database/utils.py +33 -0
  13. e_data-2.0.0/edata/models/__init__.py +3 -0
  14. e_data-2.0.0/edata/models/bill.py +73 -0
  15. e_data-2.0.0/edata/models/data.py +89 -0
  16. e_data-2.0.0/edata/models/supply.py +40 -0
  17. e_data-2.0.0/edata/providers/__init__.py +2 -0
  18. {e_data-1.3.3/edata/connectors → e_data-2.0.0/edata/providers}/datadis.py +137 -152
  19. {e_data-1.3.3/edata/connectors → e_data-2.0.0/edata/providers}/redata.py +13 -8
  20. e_data-2.0.0/edata/services/bill_service.py +446 -0
  21. e_data-2.0.0/edata/services/data_service.py +488 -0
  22. {e_data-1.3.3 → e_data-2.0.0}/edata/tests/test_datadis_connector.py +169 -134
  23. {e_data-1.3.3 → e_data-2.0.0}/edata/tests/test_redata_connector.py +3 -2
  24. e_data-2.0.0/edata/tests/test_services.py +234 -0
  25. {e_data-1.3.3 → e_data-2.0.0}/pyproject.toml +15 -13
  26. e_data-1.3.3/README.md +0 -106
  27. e_data-1.3.3/e_data.egg-info/SOURCES.txt +0 -29
  28. e_data-1.3.3/e_data.egg-info/requires.txt +0 -10
  29. e_data-1.3.3/edata/cli.py +0 -24
  30. e_data-1.3.3/edata/definitions.py +0 -329
  31. e_data-1.3.3/edata/helpers.py +0 -769
  32. e_data-1.3.3/edata/processors/base.py +0 -27
  33. e_data-1.3.3/edata/processors/billing.py +0 -215
  34. e_data-1.3.3/edata/processors/consumption.py +0 -139
  35. e_data-1.3.3/edata/processors/maximeter.py +0 -56
  36. e_data-1.3.3/edata/processors/utils.py +0 -148
  37. e_data-1.3.3/edata/storage.py +0 -46
  38. e_data-1.3.3/edata/tests/__init__.py +0 -0
  39. e_data-1.3.3/edata/tests/test_helpers.py +0 -52
  40. e_data-1.3.3/edata/tests/test_processors.py +0 -106
  41. {e_data-1.3.3 → e_data-2.0.0}/LICENSE +0 -0
  42. {e_data-1.3.3 → e_data-2.0.0}/MANIFEST.in +0 -0
  43. {e_data-1.3.3 → e_data-2.0.0}/e_data.egg-info/dependency_links.txt +0 -0
  44. {e_data-1.3.3 → e_data-2.0.0}/e_data.egg-info/top_level.txt +0 -0
  45. {e_data-1.3.3 → e_data-2.0.0}/edata/__init__.py +0 -0
  46. {e_data-1.3.3/edata/connectors → e_data-2.0.0/edata/core}/__init__.py +0 -0
  47. {e_data-1.3.3/edata → e_data-2.0.0/edata/core}/const.py +0 -0
  48. {e_data-1.3.3/edata/processors → e_data-2.0.0/edata/tests}/__init__.py +0 -0
  49. {e_data-1.3.3 → 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: 1.3.3
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.11.0
687
+ Requires-Python: >=3.12.0
689
688
  Description-Content-Type: text/markdown
690
689
  License-File: LICENSE
691
- Requires-Dist: dateparser>=1.1.2
692
- Requires-Dist: freezegun>=1.2.1
693
- Requires-Dist: holidays>=0.14.2
694
- Requires-Dist: pytest>=7.1.2
695
- Requires-Dist: python_dateutil>=2.8.2
696
- Requires-Dist: requests>=2.28.1
697
- Requires-Dist: voluptuous>=0.13.1
698
- Requires-Dist: Jinja2>=3.1.2
699
- Requires-Dist: diskcache>=5.6.3
700
- Requires-Dist: aiohttp>=3.12.15
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
  [![Downloads](https://pepy.tech/badge/e-data)](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. 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).
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 tres módulos diferenciados:
731
+ El paquete consta de varios módulos:
730
732
 
731
- * **Conectores** (módulo `connectors`), para definir los métodos de consulta a los diferentes proveedores: Datadis y REData.
732
- * **Procesadores** (módulo `processors`), para procesar datos de consumo, maxímetro, o coste (tarificación). Ahora mismo consta de tres procesadores: `billing`, `consumption` y `maximeter`, además de algunas utilidades ubicadas en `utils`. Los procesadores deben heredar de la clase Processor definida en `base.py`
733
- * **Ayudantes** (módulo `helpers`), para ayudar en el uso y gestión de los anteriores, presentando de momento un único ayudante llamado `EdataHelper` que te permite recopilar `X` días de datos (por defecto 365) y automáticamente procesarlos. Los datos son almacenados en la variable `data`, mientras que los atributos autocalculados son almacenados en la variable `attributes`. Por lo general, primero utilizan los conectores y luego procesan los datos, gestionando varias tareas de recuperación (principalmente para Datadis).
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
- Estos módulos corresponden a la siguiente estructura del paquete:
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
- edata/
739
- · __init__.py
740
- · connectors/
741
- · __init__.py
742
- · datadis.py
743
- · redata.py
744
- · processors/
745
- · __init__.py
746
- · base.py
747
- · billing.py
748
- · consumption.py
749
- · maximeter.py
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
- Partimos de que tenemos credenciales en Datadis.es. Algunas aclaraciones:
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 json
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
- # importamos definiciones de datos que nos interesen
767
- from edata.definitions import PricingRules
768
- # importamos el ayudante
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
- # Preparar reglas de tarificación (si se quiere)
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
- # Instanciar el helper
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
- # Solicitar actualización de todo el histórico (se almacena en edata.data)
800
- edata.update(date_from=datetime(1970, 1, 1), date_to=datetime.today())
836
+ ``` bash
837
+ # Ver suministros disponibles
838
+ python -m edata.cli show-supplies <username>
801
839
 
802
- # volcamos todo lo obtenido a un fichero
803
- with open("backup.json", "w") as file:
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
- # Imprimir atributos
807
- print(edata.attributes)
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
+ [![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. 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: 1.3.3
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.11.0
687
+ Requires-Python: >=3.12.0
689
688
  Description-Content-Type: text/markdown
690
689
  License-File: LICENSE
691
- Requires-Dist: dateparser>=1.1.2
692
- Requires-Dist: freezegun>=1.2.1
693
- Requires-Dist: holidays>=0.14.2
694
- Requires-Dist: pytest>=7.1.2
695
- Requires-Dist: python_dateutil>=2.8.2
696
- Requires-Dist: requests>=2.28.1
697
- Requires-Dist: voluptuous>=0.13.1
698
- Requires-Dist: Jinja2>=3.1.2
699
- Requires-Dist: diskcache>=5.6.3
700
- Requires-Dist: aiohttp>=3.12.15
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
  [![Downloads](https://pepy.tech/badge/e-data)](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. 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).
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 tres módulos diferenciados:
731
+ El paquete consta de varios módulos:
730
732
 
731
- * **Conectores** (módulo `connectors`), para definir los métodos de consulta a los diferentes proveedores: Datadis y REData.
732
- * **Procesadores** (módulo `processors`), para procesar datos de consumo, maxímetro, o coste (tarificación). Ahora mismo consta de tres procesadores: `billing`, `consumption` y `maximeter`, además de algunas utilidades ubicadas en `utils`. Los procesadores deben heredar de la clase Processor definida en `base.py`
733
- * **Ayudantes** (módulo `helpers`), para ayudar en el uso y gestión de los anteriores, presentando de momento un único ayudante llamado `EdataHelper` que te permite recopilar `X` días de datos (por defecto 365) y automáticamente procesarlos. Los datos son almacenados en la variable `data`, mientras que los atributos autocalculados son almacenados en la variable `attributes`. Por lo general, primero utilizan los conectores y luego procesan los datos, gestionando varias tareas de recuperación (principalmente para Datadis).
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
- Estos módulos corresponden a la siguiente estructura del paquete:
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
- edata/
739
- · __init__.py
740
- · connectors/
741
- · __init__.py
742
- · datadis.py
743
- · redata.py
744
- · processors/
745
- · __init__.py
746
- · base.py
747
- · billing.py
748
- · consumption.py
749
- · maximeter.py
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
- Partimos de que tenemos credenciales en Datadis.es. Algunas aclaraciones:
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 json
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
- # importamos definiciones de datos que nos interesen
767
- from edata.definitions import PricingRules
768
- # importamos el ayudante
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
- # Preparar reglas de tarificación (si se quiere)
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
- # Instanciar el helper
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
- # Solicitar actualización de todo el histórico (se almacena en edata.data)
800
- edata.update(date_from=datetime(1970, 1, 1), date_to=datetime.today())
836
+ ``` bash
837
+ # Ver suministros disponibles
838
+ python -m edata.cli show-supplies <username>
801
839
 
802
- # volcamos todo lo obtenido a un fichero
803
- with open("backup.json", "w") as file:
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
- # Imprimir atributos
807
- print(edata.attributes)
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
  ```