Creación de canales ThingSpeak mediante API REST


En el siguiente post os voy a explicar cómo crear y configurar un canal en ThingSpeak utilizando la API REST que facilita la plataforma, y código Python. Toda la documentación correspondiente y un conjunto de ejemplos podéis encontrarlos en el siguiente enlace:

Al fin y al cabo, la arquitectura REST se basa en las peticiones GET, PUT, POST y DELETE del protocolo HTTP. Concretamente, utilizaremos la API REST con formato JSON, ya que nos es más cómodo que el formato XML si vamos a codificar en Python, dado el parecido de la sintaxis entre ambos.

Así pues, en primer lugar necesitáis crear un archivo con extensión .py, en el cual codificaremos la solución. A continuación, introducid las siguientes lineas en el archivo a fin de importar las siguientes librerías:

import httplib
import urllib
import json

Para poder crear un canal y configurarlo necesitaréis vuestro User ID y User API Key. Además, tenéis que asignar un nombre al canal. También será necesario obtener la Write API Key y Read API Key del canal, para posteriormente poder subir y descargar datos de ese canal:

Write_API_Key = ""
Read_API_Key = ""
User_API_Key = "API_KEY_USUARIO"
UserName = "USER_ID_USUARIO"
Channel_Name = 'Canal TICs'
existe = False

El primer paso es establecer comunicación entre el dispositivo en el que se ejecutará el código y la plataforma ThingSpeak. Dado que se va a utilizar HTTP, la comunicación se basará en una conexión TCP/IP:

conn_TCP = httplib.HTTPSConnection("api.thingspeak.com")
conn_TCP.connect()

A continuación, mediante una petición GET se obtienen todos los canales de los que disponemos y se consulta si el canal que queremos crear ya existe:

metodo = "GET"
uri = "/users/"+str(UserName)+"/channels.json"
cabeceras = {'Host': 'api.thingspeak.com'}
body = ""

conn_TCP.request(metodo, uri,headers=cabeceras, body=body)

respuesta = conn_TCP.getresponse()
estatus = respuesta.status
contenido_respuesta = respuesta.read()
contenido_respuesta_parseado=json.loads(contenido_respuesta)

numChannels = len(contenido_respuesta_parseado['channels'])

i=1
for i in range(numChannels):
   nombre = contenido_respuesta_parseado['channels'][i]['name']
   if (nombre == Channel_Name):
     existe = True
     Channel_Id = contenido_respuesta_parseado['channels'][i]['id']
     break

En el caso de que el canal ya exista, se realiza otra petición GET para obtener la Write API Key y Read API Key del canal, así como su ID:

metodo = "GET"
uri = "/channels/"+str(Channel_Id)+".json"
params = {'api_key': User_API_Key}
params_encoded=urllib.urlencode(params)
cabeceras = {'Host': 'api.thingspeak.com',
             'content-type': 'application/x-www-form-urlencoded'}

data = {'api_key' : User_API_Key}
body = urllib.urlencode(data)
cabeceras['Content-Length'] = len(body)

conn_TCP.request(metodo, uri,headers=cabeceras, body=body)

respuesta = conn_TCP.getresponse()
estatus = respuesta.status
contenido = respuesta.read()
contenido_parseado = json.loads(contenido)

Write_API_Key = contenido_parseado['api_keys'][0]['api_key']
Read_API_Key = contenido_parseado['api_keys'][1]['api_key']

Si el canal no existiera, tenemos que crearlo. Para ello, realizamos una petición POST en la que enviamos el nombre y los campos que queremos que tenga ese canal. También podemos indicar si queremos que el canal sea público o privado:

metodo = "POST"
uri = "/channels.json"
cabeceras = {'Host': 'api.thingspeak.com',
             'Conect-Type': 'application/x-www-form-urlencoded'}
params = {'api_key' : User_API_Key,
          'field1' : 'Temperatura(ºC)',
          'field2' : 'Humedad(%)',
          'field3' : 'PuntoRocio(ºC)',
          'field4' : 'Presion(Pa)',
          'name' : Channel_Name,
          'public_flag' : 'true'}
params_encoded = urllib.urlencode(params)
cabeceras = {'Content-Length': len(params_encoded)}

conn_TCP.request(metodo,uri, headers=cabeceras, body=params_encoded)

respuesta = conn_TCP.getresponse()
estatus = respuesta.status
contenido = respuesta.read()
contenido_parseado = json.loads(contenido)

Write_API_Key = contenido_parseado['api_keys'][0]['api_key']
Read_API_Key = contenido_parseado['api_keys'][1]['api_key']
Channel_Id = contenido_parseado['id']

Si por ejemplo, ejecutáis este archivo en vuestro PC con un entorno de desarrollo Python (PyCharm,etc.) o en una RaspberryPI configurada previamente para interpretar Python y conectarse a Internet (Configuración RaspberryPI) y todo funciona correctamente, en vuestra cuenta ThingSpeak deberíais encontrar un nuevo canal con este aspecto:

Fig. 1: Canal creado mediante código Python y API REST

¡Espero que este post os haya sido de utilidad, y no dudéis en dejar vuestras preguntas en el apartado de comentarios!

Comentarios