Ahora que he captado tu atención con todas las keyword del título voy a contarte mi pequeña historia.

Resulta que hace poco se ha mudado a casa una nueva compañera de piso, y como no podía ser de otro modo, antes de que se instalase nos aseguramos de que la habitación estuviese presentable y lista para la mudanza. Cosa curiosa sobre la habitación: Se le ganó al piso el espacio de la terraza, por lo que la habitación es muy espaciosa.

Aún así se ve que, durante la obra, no se tuvo en cuenta la instalación eléctrica, y a alguien se le olvidó poner el interruptor de la luz de la antigua terraza dentro del nuevo cuarto, por lo que una de las luces de la habitación no puede ser controlada desde dentro, si no que hay que salir al salón hasta alcanzar el interruptor perdido. Mala noticia para la nueva compañera.

I wanted to create a photograph that a smart phone could not produce.
Photo by Sean Patrick Murphy / Unsplash

Dándole vueltas durante unos días sobre cómo podría apañar el asunto creí dar con una solución más o menos aceptable (ya que el tema de modificar la instalación eléctrica es algo que estaba fuera de toda opción desde el principio) y que además sería divertida de hacer.

No quiero entrar en demasiados tecnicismos ni detalles de implementación sobre la idea, porque me parece muy aburrido y me parece más divertido comentar la solución en su conjunto, y dicha solución pasa por los siguientes ingredientes:

  • Un kit de iluminación TRÅDFRI de IKEA (yo ya tenía la instalación hecha en el salón)
  • Un botón Amazon Dash Button (cualquiera vale, yo tenía uno para pedir café sin usar, aunque creo que ya solo venden una versión para IoT)
  • Una Raspberry Pi para ejecutar el software (también puedes hacerlo con tu PC normal, aunque la ventaja de la raspberry es que está siempre encendida)
  • Una instalación de NodeJS (yo tengo el editor en una máquina virtual de desarrollo y luego en la raspberry también instalado node para ejecutar la aplicación)

La idea general

La idea general es montar un servicio en node que exponga un endpoint que será el encargado de hacer toggle de la luz, es decir, que haga de interruptor comunicándose con el puente de IKEA (ya veremos cómo se hace eso). Para atacar dicho endpoint yo lo que hago es usar una pequeña aplicación en Python que permite configurar acciones arbitrarias sobre los Dash Button, así que configuro el mío para que haga un GET contra dicho endpoint cada vez que se activa.

Tanto el servicio en node como esta aplicación funcionan sobre la raspberry, por lo que podría pasar del endpoint e invocar un script directamente desde python, aunque me gusta dejarlo así porque se puede controlar la luz fácilmente desde cualquier cacharro que sea capaz de tirar un GET al endpoint.

El servicio

Para montar el servicio de Node necesitamos esta biblioteca que nos permite hablar con la pasarela de comunicación de IKEA TRADFRI desde js sin dependencias externas. No voy a entrar en detalles de como se usa la biblioteca, creo que la documentación es bastante buena y si no, puedes echarle un ojo a mi proyectito personal para el control de las luces de casa, que está montado con dicha biblioteca. Al final el código del handler es bastante chorra gracias a la facilidad que da la biblioteca para operar con los dispositivos estos de IKEA

{
    path: '/interruptor',
    method: 'get',
    handler: asyncHandler(async function(_req, res) {
        const config = readConfig();
        const group = GroupsRepository.findByName(config.group);
        await Operator.doWithClient(async client => await client.operateGroup(group, { onOff: !group.onOff }));
        res.status(200).send(`${group.onOff ? 'Apagando' : 'Encendiendo'} ${group.name}`);
    })
}

Con 4 líneas de código tenemos un endpoint que hago un toggle sobre la bombilla o bombillas del cuarto en cuestión. Este servicio yo lo he levantado usando ExpressJS sin más historia, apenas tiene un par de dependencias.

El interruptor

Para la parte del interruptor, y como he comentado, me sirvo de un Dash Button configurado para que no pida nada cuando se pulsa (no quiero que me lleguen unos yogures o algo así cada vez que enciendo o apago una luz) y una aplicación en Python muy apañada. La aplicación en cuestion es amazon-dash y es muy facilita de configurar y de poner a funcionar. Además se configura todo a través de un archivo Yaml muy bobo

# amazon-dash.yml
# ---------------
settings:
  delay: 10
devices:
  mac_del_boton: # Command example
    name: Interruptor
    user: pi
    cmd: curl http://localhost:puerto_del_servicio/endpoint_del_servicio

Con esto tengo configurado mi botón para atacar a mi servicio de interruptor cada vez que lo pulse.

La verdad es que no queda mucho más que contar, salvo ver el resultado final:

No es la mejor solución, pero al menos funciona y no hace falta andar dando paseos para apagar las luces a la hora de irse a dormir :)