> Almacenamiento de datos en “El Internet de las Cosas”: COSM

Introducción

Según Wikipedia, al hablar de “Internet de las Cosas” (“Internet of Things”, en inglés), nos referimos a una red de objetos cotidianos interconectados (mediante Internet). En su concepción inicial, se trata de una interconexión de multitud de objetos relativamente sencillos y con cierta inteligencia, en la forma de una red compleja, en la que el objetivo final es sensorizar, monitorizar, registrar y almacenar toda la información posible.

Es evidente que los avances de la electrónica permiten hoy en día disponer de sistemas electrónicos compactos, de reducido consumo y de bajo precio; con un amplio abanico de sistemas de distintas características: desde sistemas sencillos de muy bajo coste (microcontroladores de todo tipo, como los incluidos en la familia de los Arduino), hasta sistemas capaces de hacer un sistema operativo completo (como los Beagleboard, o Raspberry).

Pero… ¿qué sucede con el almacenamiento de los datos que recogen?

La opción más habitual a día de hoy, ha sido la de montar un servidor en el que tengamos una base de datos a la que estos equipos vayan volcando sus datos. En este caso, la alternativa “clásica” era la de emplear una base de datos “normal” (MySQL, SQL Server, PostgreSQL…), aunque recientemente, en función del volumen y características de los datos, van tomando fuerza como posible alternativa a estas bases de datos el uso de sistemas “NoSQL”: MongoDB, CouchDB, Redis, … (por cierto, aquí hay una buena comparativa de algunos de ellos).

¿Pero no está de moda eso del “Cloud“? ¿Si todo acaba siendo un servicio… por qué no usar un servicio que nos ayude a recoger esos datos de nuestros elementos del “Internet de las Cosas”?

En realidad, existen ya varios servicios que nos ofrecen más o menos eso, como por ejemplo:

 

La mayoría (Sen.se, Thingspeak, Cosm, … ) ofrecen APIs abiertas de tipo REST, por lo que para su uso basta con registrarse, conseguir un identificador de usuario y comenzar a trabajar… Como es normal, cada proyecto tiene distinto grado de madurez y apertura, desde el “alfa” de Paraimpu, pasando por iDigi (sistema de la empresa Digi orientado a trabajar con sus equipos), hasta Pachube: un sistema maduro y abierto (recientemente renombrado como “Cosm”, al haber sido comprado por la empresa LogMeIn).

Por ser abierto, y por su madurez, en este post probaremos Cosm.

Sistema de pruebas

Para las pruebas, emplearemos el equipo IMx de Iddei. Se trata de un equipo con conectividad MBus, Modbus, E/S y GPRS.

En este equipo, para esta prueba hemos programado el protocolo MBUS, que permite la lectura remota de contadores de agua caliente, calefacción, caudalímetros… la información de varios contadores es leída y registrada en el equipo, y la tarjeta GPRS permite su envío a Internet.

Una vez terminada la programación del protocolo MBUS, tras conectar el equipo a un contador con conectividad MBUS (un contador Pulsonic II en este caso), nos registramos en la Web de COSM.

COSM

El registro se realiza en https://cosm.com/

…y así podremos pasar a dar de alta nuestra instalación.

En Cosm, cada instalación es un “Feed”. Cada “Feed” es un conjunto de datos asociados a un contexto (un lugar concreto, una zona concreta, un equipo concreto… lo que queramos). Cada “Feed” tiene asociados uno o más “Datastream” (fuentes de datos), que a su vez están formados por un conjunto de “Datapoint” (cada “Datapoint” es el valor concreto de una variable en un momento concreto).

En nuestro caso, una vez dentro de Cosm, damos de alta un nuevo “Feed” (“Iddei Demo 1″, en nuestro caso), y un nuevo “Datastream” (Data1).


Al crear el “Feed”, Cosm le asignará un identificador numérico que será el que debamos emplear en lo sucesivo.

A continuación, creamos dos claves: una para escritura de datos y otra para lectura. Para ello, vamos a la zona “Keys” y añadimos dos nuevas “key” una con permisos de lectura/escritura (“read” & “update”) y otra para sólo leer datos (“read”):

 

Estas claves numéricas, permitirán el acceso a la API REST de COSM.

Ok! Ya casi está hecho…

ENVÍO DE DATOS

La API de COSM permite enviar los datos en 3 formatos: CSV, XML y JSON. En nuestro caso, por simplificar el desarrollo a realizar en nuestra placa, optaremos por la opción de enviar los datos en formato CSV.

(Hay que destacar que COSM soporta escritura mediante “PUSH”: nuestro dispositivo le envia el dato, o mediante “PULL”: COSM se conecta a nuestro dispositivo. En nuestro caso, hemos optado por la modalidad PUSH…)

El envío de datos es muy sencillo: basta con realizar una petición HTTP PUT en la dirección http://api.cosm.com, incluyendo una cabecera (header) especial “X-ApiKey” en la que indiquemos la clave de escritura antes generada.

Podemos simular la petición PUT utilizando Telnet en el puerto 80, por ejemplo. De este modo, haciendo “telnet api.cosm.com 80“, deberíamos escribir:

PUT /v2/feeds/<el identificador del "feed" que has generado>.csv HTTP/1.1
Host: api.cosm.com
X-ApiKey: <la clave de escritura antes generada>
Content-Length: 10
Connection: close

Data1,199

Los únicos comentarios aquí son:

  • Ojo a poner bien el identificador del “feed”  y la clave de escritura que has generado antes
  • “Content-length” debe indicar la longitud de la información que le vas a pasar
  • Después de “Connection: close” hay dos saltos de línea (en vez de uno, como en las líneas anteriores)

 

Si todo ha ido bien, si estamos registrados y entramos en “https://cosm.com/feeds/<Id de nuestro Feed>”, podremos ver el valor que acabamos de actualizar.

Llegados a este punto, sólo queda programar esta petición en nuestro sistema que recoge la información MBUS, y hacer que la envíe cada cierto tiempo a COSM. Si todo va bien, en “https://cosm.com/feeds/<Id de nuestro Feed>” deberíamos ver la evolución del valor:

Y con esto vemos que los datos están siendo recogidos correctamente de MBUS, se envían por GPRS a COSM, y allí son almacenados. El siguiente paso sería desarrollar un interface que recogiese los datos de COSM y los representase de una forma amigable y útil… pero eso lo dejamos para otra ocasión.

Un saludo!

 


Leave a Comment


*