datadis_python.utils.constants module
Constantes y configuraciones para el SDK de Datadis.
Este módulo centraliza todas las constantes utilizadas para interactuar con la API de Datadis, incluyendo URLs base, endpoints, códigos de distribuidores y configuraciones por defecto. Proporciona soporte para ambas versiones de la API (V1 y V2) manteniendo compatibilidad hacia atrás.
La API de Datadis es la plataforma oficial del gobierno español para acceder a datos de consumo eléctrico de las distribuidoras eléctricas. Este módulo abstrae toda la configuración necesaria para facilitar el desarrollo con el SDK.
- Organización de constantes:
URLs base: URLs principales de autenticación y API
Endpoints por versión: V1 (estables) y V2 (modernos con mejoras)
Códigos de distribuidores: Mapeo completo de todas las distribuidoras españolas
Configuraciones por defecto: Timeouts, reintentos y otros parámetros optimizados
Tipos de medida y punto: Constantes para clasificar datos eléctricos
Ejemplo
Uso básico de constantes:
from datadis_python.utils.constants import (
DATADIS_API_BASE,
API_V2_ENDPOINTS,
DISTRIBUTOR_CODES,
DEFAULT_TIMEOUT
)
# Construir URL de endpoint V2
supplies_url = f"{DATADIS_API_BASE}{API_V2_ENDPOINTS['supplies']}"
# Usar código de distribuidor por nombre
endesa_code = DISTRIBUTOR_CODES["E_DISTRIBUCION"] # "2"
# Configurar timeout por defecto
requests.get(url, timeout=DEFAULT_TIMEOUT)
Migración de V1 a V2:
# V1 (endpoints legacy)
v1_endpoint = API_V1_ENDPOINTS["consumption"] # "/get-consumption-data"
# V2 (endpoints modernos)
v2_endpoint = API_V2_ENDPOINTS["consumption"] # "/get-consumption-data-v2"
Nota
Los endpoints V2 incluyen funcionalidades adicionales como manejo de errores por distribuidor y estructuras de respuesta mejoradas. Se recomienda usar V2 para nuevas implementaciones.
Advertencia
La constante API_ENDPOINTS está marcada como DEPRECATED y se mantiene
solo para compatibilidad hacia atrás. Use API_V1_ENDPOINTS o API_V2_ENDPOINTS
según la versión de API que necesite.
- author:
TacoronteRiveroCristian
- datadis_python.utils.constants.DATADIS_BASE_URL = 'https://datadis.es'
URL principal del portal web de Datadis
- datadis_python.utils.constants.DATADIS_AUTH_URL = 'https://datadis.es/nikola-auth/tokens/login'
URL específica para autenticación de usuarios
- datadis_python.utils.constants.DATADIS_API_BASE = 'https://datadis.es/api-private/api'
URL base para todas las peticiones a la API privada de Datadis
- datadis_python.utils.constants.AUTH_ENDPOINTS = {'login': '/nikola-auth/tokens/login'}
Endpoints para operaciones de autenticación y gestión de tokens. Estos endpoints son compartidos por todas las versiones de la API.
- datadis_python.utils.constants.API_V1_ENDPOINTS = {'consumption': '/get-consumption-data', 'contracts': '/get-contract-detail', 'distributors': '/get-distributors-with-supplies', 'max_power': '/get-max-power', 'supplies': '/get-supplies'}
Endpoints para la API V1 de Datadis.
La versión 1 de la API proporciona respuestas directas (listas o diccionarios simples) sin estructuras de error por distribuidor. Es la versión original y más estable de la API, pero carece de algunas funcionalidades modernas.
- Características de V1:
Respuestas simples: List[SupplyData], List[ConsumptionData], etc.
Sin manejo de errores por distribuidor
Funcionalidad básica completa
Mayor compatibilidad con sistemas legacy
Ejemplo
Construir URL de endpoint V1:
from datadis_python.utils.constants import DATADIS_API_BASE, API_V1_ENDPOINTS supplies_url = f"{DATADIS_API_BASE}{API_V1_ENDPOINTS['supplies']}" # Resultado: "https://datadis.es/api-private/api/get-supplies"
- datadis_python.utils.constants.API_V2_ENDPOINTS = {'consumption': '/get-consumption-data-v2', 'contracts': '/get-contract-detail-v2', 'distributors': '/get-distributors-with-supplies-v2', 'max_power': '/get-max-power-v2', 'reactive_data': '/get-reactive-data-v2', 'supplies': '/get-supplies-v2'}
Endpoints para la API V2 de Datadis.
La versión 2 de la API introduce mejoras significativas incluyendo manejo robusto de errores por distribuidor, estructuras de respuesta tipadas y funcionalidades adicionales como datos de energía reactiva.
- Mejoras de V2 sobre V1:
Manejo de errores por distribuidor: Información detallada de fallos
Respuestas estructuradas: SuppliesResponse, ConsumptionResponse, etc.
Funcionalidad extendida: Acceso a datos de energía reactiva
Mejor compatibilidad: Preparada para futuras funcionalidades
Nota
Se recomienda usar la API V2 para nuevas implementaciones. Los endpoints V2 mantienen compatibilidad de interfaz con V1 pero devuelven estructuras de datos más robustas que incluyen información de errores detallada.
Ejemplo
Comparación de endpoints V1 vs V2:
# V1 - Respuesta simple v1_url = f"{DATADIS_API_BASE}{API_V1_ENDPOINTS['supplies']}" # GET /get-supplies → List[SupplyData] # V2 - Respuesta estructurada con manejo de errores v2_url = f"{DATADIS_API_BASE}{API_V2_ENDPOINTS['supplies']}" # GET /get-supplies-v2 → SuppliesResponse (includes distributor_error)
- datadis_python.utils.constants.AUTHORIZATION_ENDPOINTS = {'cancel_authorization': '/cancel-authorization', 'list_authorization': '/list-authorization', 'new_authorization': '/new-authorization'}
Endpoints para gestión de autorizaciones entre usuarios.
Estos endpoints permiten gestionar autorizaciones para que un usuario pueda consultar los datos de consumo de otro usuario (por ejemplo, un gestor energético consultando datos de sus clientes con autorización previa).
- Flujo de autorización:
new_authorization: Crear nueva autorización
list_authorization: Listar autorizaciones activas
cancel_authorization: Cancelar autorización existente
Nota
Esta funcionalidad requiere configuración especial en la cuenta de Datadis y está orientada a usuarios avanzados como gestores energéticos o empresas de servicios energéticos.
- datadis_python.utils.constants.DEFAULT_TIMEOUT = 90
Timeout por defecto para peticiones HTTP en segundos.
El valor de 90 segundos está optimizado para la API de Datadis, que puede ser notablemente lenta debido a la necesidad de consultar múltiples sistemas de distribuidoras eléctricas en tiempo real.
Nota
La API de Datadis puede tardar hasta 60-80 segundos en responder consultas complejas, especialmente cuando debe agregar datos de múltiples distribuidores o procesar rangos de fechas extensos.
- datadis_python.utils.constants.MAX_RETRIES = 5
Número máximo de reintentos automáticos para peticiones fallidas.
Se incrementa a 5 reintentos debido a la naturaleza inestable de algunos endpoints de Datadis y la dependencia de sistemas externos de las distribuidoras eléctricas. Los reintentos usan backoff exponencial para evitar sobrecargar el servidor.
- datadis_python.utils.constants.TOKEN_EXPIRY_HOURS = 24
Duración estimada de validez de los tokens de autenticación en horas.
Los tokens de Datadis tienen una validez limitada. Aunque la duración exacta no está documentada oficialmente, la experiencia práctica sugiere que expiran en aproximadamente 24 horas.
Nota
El SDK maneja automáticamente la renovación de tokens cuando detecta errores 401 (Unauthorized), por lo que este valor es principalmente informativo.
- datadis_python.utils.constants.MEASUREMENT_TYPES = {'CONSUMPTION': 0, 'GENERATION': 1}
Constantes para los tipos de medida eléctrica soportados por Datadis.
La API de Datadis distingue entre consumo (energía tomada de la red) y generación (energía inyectada a la red, típicamente de instalaciones fotovoltaicas u otras fuentes renovables).
- Valores válidos:
CONSUMPTION (0): Energía consumida desde la red eléctrica
GENERATION (1): Energía generada e inyectada a la red
Ejemplo
Usar constantes de tipo de medida:
from datadis_python.utils.constants import MEASUREMENT_TYPES # Obtener datos de consumo consumption_data = client.get_consumption( cups="ES001234567890123456AB", distributor_code="2", date_from="2024/01", date_to="2024/12", measurement_type=MEASUREMENT_TYPES["CONSUMPTION"] # 0 ) # Obtener datos de generación (ej: paneles solares) generation_data = client.get_consumption( cups="ES001234567890123456AB", distributor_code="2", date_from="2024/01", date_to="2024/12", measurement_type=MEASUREMENT_TYPES["GENERATION"] # 1 )
- datadis_python.utils.constants.POINT_TYPES = {'AUXILIARY_SERVICES': 4, 'AUXILIARY_SERVICES_ALT': 5, 'BORDER': 1, 'CONSUMPTION': 2, 'GENERATION': 3}
Constantes para los tipos de punto de medida eléctrica según normativa española.
Los tipos de punto definen la naturaleza y propósito del punto de medida eléctrica según la normativa del sistema eléctrico español. Cada tipo tiene características específicas y se usa en diferentes contextos de la red eléctrica.
- Tipos de punto válidos:
BORDER (1): Punto de frontera - Intercambio entre sistemas
CONSUMPTION (2): Punto de consumo - Usuarios finales domésticos/comerciales
GENERATION (3): Punto de generación - Plantas de generación eléctrica
AUXILIARY_SERVICES (4): Servicios auxiliares - Equipos de soporte al sistema
AUXILIARY_SERVICES_ALT (5): Servicios auxiliares alternativos
Nota
El tipo de punto más común para usuarios domésticos y comerciales es CONSUMPTION (2). Los tipos de generación se usan principalmente para instalaciones con autoconsumo que inyectan energía a la red.
Ejemplo
Filtrar por tipo de punto específico:
from datadis_python.utils.constants import POINT_TYPES # Datos de consumo doméstico típico consumption_data = client.get_consumption( cups="ES001234567890123456AB", distributor_code="2", date_from="2024/01", date_to="2024/12", point_type=POINT_TYPES["CONSUMPTION"] # 2 ) # Datos de instalación de generación generation_data = client.get_consumption( cups="ES001234567890123456AB", distributor_code="2", date_from="2024/01", date_to="2024/12", point_type=POINT_TYPES["GENERATION"] # 3 )
- datadis_python.utils.constants.DISTRIBUTOR_CODES = {'ASEME': '4', 'CIDE': '7', 'EOSA': '6', 'E_DISTRIBUCION': '2', 'E_REDES': '3', 'IDE': '8', 'UFD': '5', 'VIESGO': '1'}
Mapeo completo de todas las distribuidoras eléctricas españolas con sus códigos oficiales.
Este diccionario proporciona el mapeo entre nombres de distribuidoras y sus códigos numéricos oficiales utilizados por la API de Datadis. Los códigos son asignados por el sistema eléctrico español y son únicos para cada distribuidora.
- Distribuidoras por código:
«1» - VIESGO: Cantabria, Asturias (norte de España)
«2» - E-DISTRIBUCIÓN: Filial de Endesa, cobertura nacional amplia
«3» - E-REDES: Galicia y zonas de Castilla y León
«4» - ASEME: Ciudad autónoma de Melilla
«5» - UFD (Naturgy): Cobertura nacional, especialmente este y sur
«6» - EOSA: Aragón y zonas del noreste
«7» - CIDE: Ciudad autónoma de Ceuta
«8» - IDE: Islas Baleares
- Coverage geográfico:
Nacional: E-distribución (Endesa), UFD (Naturgy)
Regional: Viesgo (norte), E-redes (noroeste), EOSA (noreste)
Insular/Local: IDE (Baleares), ASEME (Melilla), CIDE (Ceuta)
Ejemplo
Usar nombres de distribuidoras en lugar de códigos:
from datadis_python.utils.constants import DISTRIBUTOR_CODES # Buscar suministros de Endesa por nombre endesa_code = DISTRIBUTOR_CODES["E_DISTRIBUCION"] # "2" supplies = client.get_supplies(distributor_code=endesa_code) # Buscar suministros de Naturgy por nombre naturgy_code = DISTRIBUTOR_CODES["UFD"] # "5" supplies = client.get_supplies(distributor_code=naturgy_code) # Iterar sobre todas las distribuidoras for name, code in DISTRIBUTOR_CODES.items(): print(f"Distribuidor {name}: código {code}")
Nota
Los códigos de distribuidor son strings (no enteros) para mantener consistencia con la API de Datadis. El SDK acepta tanto strings como enteros y convierte automáticamente al tipo correcto.
- datadis_python.utils.constants.API_ENDPOINTS = {'cancel_authorization': '/cancel-authorization', 'consumption': '/get-consumption-data', 'consumption_v2': '/get-consumption-data-v2', 'contracts': '/get-contract-detail', 'contracts_v2': '/get-contract-detail-v2', 'distributors': '/get-distributors-with-supplies', 'distributors_v2': '/get-distributors-with-supplies-v2', 'list_authorization': '/list-authorization', 'login': '/nikola-auth/tokens/login', 'max_power': '/get-max-power', 'max_power_v2': '/get-max-power-v2', 'new_authorization': '/new-authorization', 'reactive_data_v2': '/get-reactive-data-v2', 'supplies': '/get-supplies', 'supplies_v2': '/get-supplies-v2'}
Diccionario unificado de endpoints para compatibilidad hacia atrás.
Obsoleto desde la versión 2.0: Use
API_V1_ENDPOINTSoAPI_V2_ENDPOINTSsegún la versión de API que necesite. Este diccionario se mantiene solo para compatibilidad con código legacy y será eliminado en futuras versiones.Este diccionario combina todos los endpoints disponibles en un solo lugar, pero no proporciona la claridad de separación entre versiones que ofrecen las constantes específicas por versión.
- Problemas con este enfoque:
Ambigüedad de versión: No queda claro qué versión de API se está usando
Mantenimiento complejo: Requiere sincronización manual entre versiones
Falta de tipado: No aprovecha las mejoras de tipos de V2
- Migration path:
Reemplazar uso de API_ENDPOINTS:
# ❌ Deprecated - No usar old_endpoint = API_ENDPOINTS["supplies"] # ✅ Recomendado - Usar versión específica v1_endpoint = API_V1_ENDPOINTS["supplies"] # Para compatibilidad v2_endpoint = API_V2_ENDPOINTS["supplies"] # Para nuevas funcionalidades
Advertencia
Esta constante será eliminada en la versión 3.0 del SDK. Migre su código para usar las constantes específicas por versión.