All Posts in “API”

Termostato remoto con Intel Edison y NodeJS

Motivación

Hace algún tiempo participé en un hackathon de movilforum_ donde los evangelizadores de Intel anunciaban la placa Intel Edison (entre ellos mi amigo @franbuitragoPa).

El hackathon estaba orientado al desarrollo de proyectos relacionados con IoT (el famoso Internet de las Cosas) y mi compañero @dennyf11 y yo mismo nos pusimos a currar hombro con hombro y finalmente presentamos un proyecto para domótica del hogar al que bautizamos como proyecto Aurora.

La idea de partida consistía en un termostato que aprendiese automáticamente cuales eran los mejores patrones para calentar la casa en función del clima en el exterior y en el interior de la casa. En lugar de realizar un estudio de la distribución de las habitaciones y otras características, lo que haría sería aprender para minimizar el tiempo de encendido y proporcionar calorcito en las horas que estuviese programado. Con el tiempo, incluso, podría beneficiarse de la temperatura que emanase de las casas vecinas, si se trataba de un piso, ya que respondería a sus propios patrones de comportamiento e influiria en nuestro “clima”.

Después la verdad es que se nos empezó a “ir la pelota” y empezamos a diseñar una especie de “mente enjambre” que hiciera que los termostatos de todas las casas vecinas funcionasen de forma colaborativa para maximizar este efecto… y muchas cosas más.

Dani, Majs y yo en el hackathon

Majs, Dani y yo en el hackathon

Cuando el hackathon finalizó, nos llevamos cada uno un Intel Edison y un kit de groove a casa, y la vida cotidiana hundió nuestro proyecto en las profundidades más oscuras del armario mas recóndito de la casa…

Pero llegó el invierno, y miré el termostato instalado en mi casa (un botón analógico de encendido apagado con una rueda de temperatura y sin opciones de programación) y decidí rescatar la placa Intel Edison de su olvido y hacer un termostato programable y accesible via HTTP, para programarlo desde el móvil, por ejemplo.

El hardware

Una de las cosas que más me gustó, desde la perspectiva de aquellos a los que nos gusta cacharrear pero o bien no tenemos mucho tiempo, o nuestros conocimientos de electrónica no son envidiables, fue la placa del Groove con sus correspondientes sensores, que tambien pueden adquirirse sueltos.

Con estos pequeños componentes, que se enchufan en plan “plug&play”, prototipar o juguetear con el IoT es pan comido, y para la mayoría de los proyectos no es necesario ni siquiera pararse a dibujar esquemas. Para este proyecto necesitamos los siguiente:

Además, necesitaremos algunos cables, clemas, un enchufe hembra para conectar la alimentación… y yo recomendaría añadir un botón de apagado de corriente, por ejemplo para reiniciar Intel Edison sin tener que desenchufarlo.

Conectamos el display a uno de los I2C de la placa,  botón al D8, sensor de rotación al A1, sensor de temperatura al A0, y el relé al D4. Al relé también habrá que conectar, por supuesto, el par de cables de control que van al termostato de casa y que controlan el encendido y apagado de los radiadores.

Vista del interior

Vista del interior

Para montarlo todo un poco más apañado, compre una caja de cables de esas que se empotran en la pared, lo suficientemente grande para que entrara todo, y lo atornille dentro. Los sensores y botones los dejé fuera, y para sujetarlos hice taladros en el plastico de la tapa de la caja, y pasé un clavo por los agujeros de las placas, poniendo una tuerca de metrica 3 entre la placa y el plastico, para separarlos un poco. Por el lado contrario de la tapa, corté parte del sobrante del clavo con un alicate y lo sujeté con unos toques de la pistola termofusible.

Vista frontal exterior

Vista frontal exterior

Detalle de clavos y tuercas

Detalle de clavos y tuercas

 

El software

Las placas Intel Edison mueven una versión concreta de Linux Yocto, y entre otras cosas puede ejecutar aplicaciones escritas en NodeJS, una tecnología que a mi personalmente me encanta e incluso me divierte. Así que no lo dude dos veces y lo escogí para desarrollar mi programa.

El programa (en su versión inicial) es muy sencillo, basicamente se trata de un API REST, que permite establecer una programación que encienda y apague lo que quiera que haya enchufado al relé (en este caso nuestros radiadores), aunque podrían ser luces, una electroválvula, etc.

Puede configurarse en 3 modos:

  • ON: modo manual, le especificamos la temperatura minima deseada y si se baja de ella, se enciende el rele.
  • OFF: apagado manual, no se encenderá independientemente de la temperatura.
  • SCHEDULE: se encenderá si hay algun programa que coincida con la fecha actual y si la temperatura de la casa es inferior a la que determine ese programa concreto. El programa puede configurarse de forma que se repita los días que se desee (solo se tendrá en cuenta la hora), o para un día específico (una excepción).

En segundo plano, cada X tiempo, comprobará en función del modo en que esté actualmente seleccionado, si se cumplen las condiciones, y se pondrá en marcha o se detendrá paso de corriente por el relé.

Los programas se almacenan usando una base de datos muy sencillita: nedb.

El display mostrará el estado actual, indicando el modo mediante un texto, así como la temperatura interior, exterior y la temperatura deseada. Además, cambiará de color en función de si está en marcha o no:

  • Azul: está en modo SCHEDULE pero no hay ningun programa que coincida ahora mismo.
  • Rojo: el relé esta encendido.
  • Amarillo: esta encendido pero el rele esta apagado, standby.
  • Pantalla apagada: apagado permanente, no se encenderá.

Para obtener la temperatura en el exterior, se conecta al servicio web de darksky.net. Hay que establecer las coordenadas y el API-KEY en el fichero de configuración config.json en la raiz del proyecto.

Una vez configurado el proyecto en el config.json, podemos cargarlo en nuestra placa Intel Edison utilizando el IDE de Intel IoT, y este será accesible mediante el puerto 8000 (tambien configurable).

Testing unitario

Incluí en el proyecto algunas pruebas unitarias para verificar que las programaciones se calculaban correctamente, si se desea lanzar fuera de la placa (por ejemplo ejecutarlo en Windows), algunas dependencias propias de Intel Edison no funcionará, por lo que se utilizarán conectores “fake” para simular los sensores. Para activar esta opción y poder lanzar las pruebas, hay que cambiar “node_env”: “production” por “node_env”: “development” en el fichero de configuración.

Despues, lanzando un “mocha” podremos comprobar la validez de las pruebas unitarias.

No te olvides de volver a poner “production” si quieres ejecutarlo dentro de la placa y leer los sensores…

Funcionamiento

Dentro de la carpeta del proyecto, en la carpeta doc, está disponible la especificación del API en formato RAML, que es fácil de entender y para todos los públicos.

Además, hay más ejemplos para cada llamada y cada caso en “doc/api-ex”

Esta es la pinta que tiene la documentación, que podéis consultar aquí:

doc

Si nos conectamos al API usando Postman, por ejemplo, podemos añadir programas, modificarlos, borrarlos, y cambiar o consultar el estado del termostato. ¡Es muy fácil!

Tened en cuenta que para acceder, hay que añadir el atributo Authorization a la cabecera con el api-key, que es configurable en el config.json, y que en la demo es simplemente “pass”.

Conclusiones y código

Bueno, pues llegamos al final: este proyecto pretendía ser un ejemplo de lo fácil que es hacer algo así con Intel Edison + Groove + NodeJS. Creo que está bastante chulo y en mis pruebas ha funcionado correctamente. Sin embargo, si alguno se anima a reproducirlo, no me hago responsable de la que lieis en casa! pero tened cuidado al manipular cables de corriente, no vayais a tener un disgusto.

Así estaba colgado provisionalmente y enchufado al control de los radiadores de mi casa

Así estaba colgado provisionalmente y enchufado al control de los radiadores de mi casa

Me he quedado (de momento) con ganas de añadirle más cosas al proyecto, como registrar de forma remota (en una base de datos de mongodb, por ejemplo) el estado cada cierto tiempo, para luego hacer algunos análisis de consumo, enfrentandolo a la temperatura exterior, y otros insights.

Además, y sobre todo, esto pide un cliente WEB como el comer… lo mismo me lanzo a desarrollar alguno en Angular, que hace tiempo que no lo toco, por que claro… entrar con Postman está bien para un rato, pero no es para todos los públicos.

En fin, si os animáis, no dudéis en descargar el código fuente desde el repositorio de GitHub:

https://github.com/findemor/aurora-thermostat

¡Y colaborad en crear el termostato definitivo para vuestros hogares!

Guía rápida: generar un API mock con osprey-cli y RAML

Muy a menudo, cuando implementamos una aplicación, una parte importante de su arquitectura será un API REST. Para poder paralelizar el desarrollo de la aplicación cliente (consumidora) y el API REST (servicio remoto), lo ideal será contar lo antes posible con un prototipo del API, interactivo y pseudo-funcional, que además nos sirva para validar la especificación de nuestro API. A este tipo de API, que devuelve datos dummy para testeo, se la conoce como API Mock o fake.