Datadis
Homepage
At Datadis we connect you with your electricity consumption data, at any distributor where your supply is connected.
Per a registrar-se, cal enviar foto del DNI i ells confirmen per email.
detalls de la API de Datadis
private-api,
user's manual {***}
L'API Datadis ens permet accedir a la informació de consum emmagatzemada a les bases de dades de les diferents distribuïdores d'electricitat, mitjançant una única API.
Podem veure dades dels nostres propis subministraments o de tercers que ens hagin autoritzat o dades agregades per zones, sectors o potències màximes.
Es crea seguint les definicions de l'API
REST -
see REST Architecture
Per poder utilitzar l'API de Datadis és necessari estar registrat a la plataforma
ja que per consumir qualsevol recurs cal disposar d'un token, obtingut a través de la crida exposada a l'apartat Autenticació,
que s'inserirà a la capçalera de la convocatòria a través del capçalera d'Autorització seguida de Bearer <token>.
És una API de només consulta, no afegir, modificar o esborrar informació,
per la qual cosa els únics verbs utilitzats són POST per obtenir el token i GET per demanar informació.
Autenticació POST
Funcio : obté el token d'autenticació per a l'àrea privada.
URL = https://datadis.es/nikola-auth/tokens/login
Paràmetres :
username string required NIF de l'usuari donat d'alta a Datadis.
password string required Contrasenya d'accés a Datadis de l'usuari.
Exemple CURL :
curl -d "username=documentoUsuario&password=contraseña" -X POST https://datadis.es/nikola-auth/tokens/login
usando el token en las diferentes llamadas
curl -X GET "https://datadis.es/api-private/api/get-supplies" -H "accept: application/json" -H "Authorization: Bearer eyJh………………”
/get-distributors-with-supplies GET
Funcio : obté una llista de codis de distribuïdor en què l'usuari té subministraments.
URL = https://datadis.es/api-private/api/get-distributors-with-supplies
Paràmetres ;
authorizedNif string Només en cas que es vulgui obtenir la llista de codis de distribuïdor que disposen de subministraments del NIF autoritzat.
/get-max-power GET
Funcio : cerqueu la potència màxima i el resultat apareixerà en kW
URL = https://datadis.es/api-private/api/get-max-power
Paràmetres :
cups string required Les CUPS que volem conèixer els detalls del contracte
distributorCode string required Codi de distribuïdor, que s'obté amb la sol·licitud d'obtenció de subministraments
startDate string(date-time) required Data d'inici entre les dades de cerca. Format: AAAA/MM. Exemple = 2020/02.
endDate string(date-time) required Data de finalització entre les dades de cerca. Format: AAAA/MM. Exemple = 2020/02.
authorizedNif string --- En cas que vulgueu obtenir el detall del contracte del NIF autoritzat
/get-consumption-data GET
Funcio : cerca les dades de consum
URL = https://datadis.es/api-private/api/get-consumption-data
Paràmetres :
cups string required Les CUPS que volem conèixer les dades de consum
distributorCode string required Codi de distribuïdor, que s'obté amb la sol·licitud d'obtenció de subministraments
startDate string(date-time) required Data d'inici entre les dades de cerca. Format: AAAA/MM. Exemple = 2020/02.
endDate string(date-time) required Data de finalització entre les dades de cerca. Format: AAAA/MM. Exemple = 2020/02.
measurementType string required Establiu-lo a 0 (Zero) si voleu obtenir el consum per hora i en 1 (U) si voleu obtenir el consum per quart d'hora.
El quart d'hora només està disponible per als PointType 1 i 2, i en el cas de la distribuïdora E-distribució també per al PointType 3
pointType string required Codi de tipus de punt, que s'obté amb la sol·licitud d'obtenció de subministraments
authorizedNif string - Només en cas que es vulgui obtenir les dades de consum d'un NIF autoritzat.
Respostes i errors
Datadis utilitza els codis de resposta HTTP habituals per saber si s'ha completat satisfactòriament la sol·licitud.
Bàsicament hi ha 3 tipus de respostes: 2xx Respostes satisfactòries ; 4xx Error del client ; 5xx Error del servidor
- 200 OK
- 400 Bad request
- 401 Unauthorized
- 403 Forbidden
- 404 Not Found
- 429 Too Many Request - com es mesura aixo ?
- 500 Internal Error Server
limit consultes
Existe un control en el sistema que no permite repetir llamadas que hayan sido realizadas en las últimas 24 horas.
Pasado este tiempo, se habilitará la posibilidad de volver a realizar la misma llamada.
Este control va en función de un usuario y los parámetros "cups", "distributorCode", "startDate", "endDate", "measurementType", "pointType" y "authorizedNif".
No se permitirán repetir llamadas que generen errores provocados por parte del usuario tales como parámetros incorrectos, formato erróneo, no disponer de autorización, etc.…
Por favor, tenga en cuenta de que, si necesitan los datos, éstos no podrán volver a ser consultados hasta que no hayan pasado 24 horas.
Les recomendamos que guarden los datos obtenidos.
acces a la API de Datadis
lets use "cURL"
Amb aquest codi :
sebas@minie:~/dades/python/Datadis$ cat 2_post_i_get.sh
#!/usr/bin/bash
MYUSR="38647638D"
MYPWD="Patan.2020.3@"
MYURLLOGIN="https://datadis.es/nikola-auth/tokens/login"
MYURLSUPPLIES="https://datadis.es/api-private/api/get-supplies"
TOK=$(curl -s -d "username=$MYUSR&password=$MYPWD" -X POST $MYURLLOGIN)
rv=$?
echo ">>> POST return code is" $rv
if [ "$rv" -eq 0 ]; then
Htoken="Authorization: Bearer "$TOK
TEXTE=$(curl -s -X GET $MYURLSUPPLIES -H "accept: application/json" -H "$Htoken")
rv=$?
echo ">>> GET return code is" $rv
echo "$TEXTE"
fi
exit 0
... llegim aquestes dades :
sebas@minie:~/dades/python/Datadis$ ./2_post_i_get.sh
>>> POST return code is 0
>>> GET return code is 0
[ {
"address" : "MARITIMO 23 1",
"cups" : "ES0031406371928008EW0F",
"postalCode" : "43803",
"province" : "Tarragona",
"municipality" : "CAP DE FARA",
"distributor" : "EDISTRIBUCIÓN",
"validDateFrom" : "2023/06/16",
"validDateTo" : "",
"pointType" : 5,
"distributorCode" : "2"
}, {
"address" : "M PAS 3 BJO",
"cups" : "ES0031305839349001CV0F",
"postalCode" : "08322",
"province" : "Barcelona",
"municipality" : "CORRELLES DE LLOBREGAT",
"distributor" : "EDISTRIBUCIÓN",
"validDateFrom" : "2023/04/19",
"validDateTo" : "",
"pointType" : 5,
"distributorCode" : "2"
} ]
lets use "requests()" - get supplies
Here is the pyhon code to produce the same result as previous cURL :
sebas@minie:~/dades/python/Datadis$ cat 1_post_get_token_then_GET.py
#!/usr/bin/python3
# -*- coding: UTF-8 -*-
# https://datadis.es/private-api
# https://icaen.gencat.cat/web/.content/20_Energia/210_auditoriesenergetiques/enllacos/MANUAL-API-PRIVADA-Y-AGREGADA.pdf
# https://realpython.com/api-integration-in-python/
# sebas@minie:~/dades/python/llegir_preu_electre/agafem_altres_dades_de_REE$ cat 10073_eolica_no.py
# https://es.stackoverflow.com/questions/607052/peticiones-post-y-get-api-rest
import json
import requests
import sys
NIFautoritzat = '38647638D'
api_url_login = 'https://datadis.es/nikola-auth/tokens/login'
id_params = {'username': NIFautoritzat, 'password': 'Patan.2020.3@'}
api_url_get_supplies = 'https://datadis.es/api-private/api/get-supplies'
try:
print ( '>>> POST request [%s].' % api_url_login )
resposta_post = requests.post(api_url_login, params=id_params)
# ***************************************************************
resposta_post.raise_for_status() # we want http errors (e.g. 401 Unauthorized) to raise exceptions
if resposta_post.status_code == 200:
my_token = resposta_post.text
# print ( '+++ token [%s].' % my_token )
my_bearer = "Bearer {ftoken}".format(ftoken=my_token)
token_header = {"Authorization": my_bearer}
# print( "token header is {%s}" % token_header )
print( ">>> GET SUPPLIES request {%s}" % api_url_get_supplies )
resposta_get = requests.get( api_url_get_supplies, headers=token_header)
# **************************************************************************
my_supplies = resposta_get.text
print ( '+++ supplies [%s].' % my_supplies )
else:
print ( '--- login failed RC [%i].' % resposta_post.status_code )
except requests.exceptions.RequestException as e: # https://stackoverflow.com/questions/16511337/correct-way-to-try-except-using-python-requests-module
raise SystemExit(e)
sys.exit()
lets use "requests()" - get
sebas@minie:~/dades/python/Datadis$ cat 1_post_get_token_then_GET.py
szCUPS = 'ES0032455159339031CV0F' # Marti Mas
api_url_consum = 'https://datadis.es/api-private/api/get-consumption-data?distributorCode=2&measurementType=0&cups={}&pointType=5&endDate=2023/02&startDate=2023/02'.format(szCUPS)
print( ">>> GET CONSUM request {%s}" % api_url_consum )
resposta_consum = requests.get( api_url_consum, headers=token_header)
# **********************************************************************
if resposta_consum.status_code == 200:
my_consum = resposta_consum.text
print ( '+++ TXT consum [%s].' % my_consum )
json_data = resposta_consum.json()
json_string = json.dumps(json_data, indent=4)
print ( '+++ JSON consum [%s].' % json_string )
else:
print ( '--- GET for consum failed - RC [%i].' % resposta_consum.status_code )
manual API privada Datadis {icaen}
python requests() URLs
Datadis vs eDistribucion vs me
Exporto les dades del 2 de Febrer de 2023
Fecha Hora
e-D : AE_kWh AS_KWh
Datadis : consumptionKWh surplusEnergyKWh
02/02/2023 1 2,551 0
02/02/2023 2 2,519 0
02/02/2023 3 1,414 0
02/02/2023 4 0,84 0
02/02/2023 5 0,852 0
02/02/2023 6 0,807 0
02/02/2023 7 0,843 0
02/02/2023 8 0,984 0
02/02/2023 9 0,713 0
02/02/2023 10 0 0,365
02/02/2023 11 0,071 0
02/02/2023 12 0 0,728
02/02/2023 13 0 1,597
02/02/2023 14 2,274 0
02/02/2023 15 2,467 0
02/02/2023 16 2,245 0
02/02/2023 17 2,851 0
02/02/2023 18 2,683 0
02/02/2023 19 3,811 0
02/02/2023 20 2,863 0
02/02/2023 21 2,594 0
02/02/2023 22 2,67 0
02/02/2023 23 2,011 0
02/02/2023 24 0,898 0
---------------------------------------------
38.961 2,69
Aixi les seves dades coincideixen completament, gens extrany