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!

Aprender a usar MongoDB: Guía 7

Ya sabemos mucho acerca de mongo, hemos insertado datos, añadido indices para hacerlo realmente rápido, y creado nuestras consultas para utilizarlo en nuestra aplicación… pero en algún momento podríamos querer analizar los datos y entender qué tenemos ahí dentro, para sacar provecho de todas esa información y hacer las cosas aún mejor.

Para el análisis de datos, agrupación, ordenaciones, proyecciones, y un montón de otros tratamientos, MongoDB nos entrega una herramienta realmente poderosa: Aggregation Framework. Hoy vamos a ver rápidamente un montón de operaciones que podríamos hacer con él.

Anteriormente

Guía 6: Crear, manejar y entender los índices

Análisis de datos con el Framework de Agregación en MongoDB

Aprender a usar MongoDB: Guía 6

Ahora que ya hemos aprendido a diseñar correctamente la estructura de los datos en MongoDB, y que sabemos realizar todo tipo de consultas, seguro que se nos ocurren multitud de posibilidades con documentos anidados y estructuras complejas para que nuestra aplicación sea realmente rápida.

Sin embargo, cuando tengamos una cantidad masiva de datos, por defecto MongoDB solo nos ofrecerá un alto rendimiento cuando las consultas utilicen filtros que utilicen el identificador (_id) del documento raiz, ya que de otro modo MongoDB deberá buscar sobre todos los elementos de la colección antes de empezar a procesar los resultados. En la publicación de hoy vamos a aprender a crear otros indices que nos permitan realizar operaciones eficientes sobre otros atributos, así como algunos detalles sobre su uso.

Anteriormente

Guía 5: Esquema de datos dirigido por la aplicación

Trabajar con índices en MongoDB

Aprender a usar MongoDB: Guía 5

En publicaciones anteriores hemos aprendido a utilizar multitud de comandos y operadores para consultar y manipular nuestros datos en MongoDB… pero aún no hemos visto una de las cosas que más diferencias tienen en una base de datos noSQL frente a un entorno tradicional SQL o relacional: el hecho de que el esquema de datos está determinado por la aplicación (es decir, por el uso que se va a hacer de los mismos) y no por su propio esquema o modelo de dominio. Este será el tema que abordemos en este post.

Anteriormente

Guía 4: Comandos y operaciones avanzadas

Esquema dirigido por la aplicación (Application-driven Schema)

Aprender a usar MongoDB: Guía 4

Anteriormente hemos visto como introducir datos en la base de datos MongoDB, y cómo realizar todo tipo de consultas para obtener los datos almacenados con distintos tipos de filtro.

En el post de hoy, vamos a trabajar en las operaciones que quedan, como las actualizaciones, borrado de datos, paginación y consultas por cursor.

Anteriormente

Guía 3: Comandos y operaciones esenciales

Operaciones avanzadas en MongoDB

Aprender a usar MongoDB: Guía 3

En posts anteriores hemos visto una introducción a mongodb y cómo se pone en marcha, e incluso como se puede hacer una importación de datos.

En esta nueva publicación vamos a empezar a trastear con la base de datos, introduciendo algunos datos y jugando con ellos para aprender algunos comandos esenciales. Es un post largo, ya que es un listado de operaciones, ¡pero espero que sea útil!

Anteriormente

Guía 2: Arrancar MongoDB e importar datos  ‎

Comandos esenciales en MongoDB

Aprender a usar MongoDB: Guía 1

Hace algún tiempo completé uno de los fantásticos curso de mongo university y me encantó. A veces, cuando utilizo mongo, me toca rebuscar entre los apuntes para recordar algún dato de los que habitualmente pueden caer en el olvido… y para evitarlo: a modo de nota personal, y para compartirlo con vosotros, he pensado en escribir un breve resumen del aprendizaje obtenido en dicho curso en una serie de varios posts. Espero que os guste, y no dudéis en hacer preguntas ¡o en comentar vuestras experiencias si también hicisteis el curso!

MongoDB, introducción, propósito y conceptos clave.

8 razones por las que tu producto podría fracasar

El mundo que nos rodea es altamente creativo (aunque a veces no se note), genera ideas, se apasiona con ellas, y las pone en marcha… y como además el tiempo apremia en todos los ámbitos, esto se hace a una velocidad vertiginosa: de hecho cada día se publican más de 2700 nuevas apps, por ejemplo.

Lamentablemente, muchos de estos productos no alcanzan los objetivos necesarios para su supervivencia o fracasan estrepitosamente. La piedra filosofal, la mano del Rey Midas, o la lanza de Longinos quedan fuera de nuestro alcance de momento, por lo que nada nos asegura el éxito, pero nunca está de más tener en consideración aquellos factores reconocidos por los que el lanzamiento de nuestro producto podría fallar, pues evitarlos nos facilitará las cosas.