Por una vez, y sin que sirva de precedente, vamos a dejar las mariconadas en este blog a un lado para adentrarnos en temas bastante friki-tecnológicos-informáticos. Si eres un lector habitual del blog al que no le interesan estas cosas ni te molestes en seguir leyendo porque va a ser largo y aburrido para ti. No te lo tendremos en cuenta.
La idea de automatizar la casa pastosa surge por varios motivos:
- Eficiencia energética.
- Comodidad y automatización de tareas.
- Diversión frikeando con diversas tecnologías.
- Vanidad geek.
Para entender el contexto es necesaria una breve descripción de la casa pastosa y sus peculiaridades. Es un el típico piso de soltero (aunque tiene habitación de invitados) con calefacción individual, una tele LCD grande, un amplificador estéreo inglés para la música conectado a un reproductor de cds con unos altavoces B&W y un amplificador 5.1 para la televisión, reproducción de películas y playstation 3 con sus 6 altavoces Infinity. Además son destacables los hecho de que el señor pastoso se pase el día escuchando música y suele hacer bastantes fiestas.
Entremos pues en materia. El corazón del sistema es esta pequeña joya:
Raspberry Pi
una Raspberry Pi: un miniordenador de bajo consumo con chip ARM, conectores USB y ethernet, salida HDMI y funcionando con Linux (Debian) por menos de 35 dólares.
Media center
Un software de media center nos permitirá a través de una interfaz intuitiva y sencilla ver todas las películas y series descargadas en la televisión. En este caso el software elegido es el estupendo XBMC. El primer paso es conectar la Pi a la red local, a un disco duro externo por USB y su salida HDMI al amplificador 5.1 (que está conectado a su vez a la tele).
Raspberry en su caja conectada por HDMI y al disco duro
La instalación del XBMC es trivial, pues hay disponible una versión compilada específicamente para la Pi. Para controlar el media center desde el móvil disponemos de una aplicación maravillosa llamada Yatse:
Ejemplo de listado de series
Ejemplo de control de la reproducción
Ya podemos ver las películas y series que tenemos descargadas. Ahora es necesario automatizar la descarga de nuevas películas y series (hay que aprovechar antes de que el gobierno criminalice la copia privada). Para descargar utilizamos rtorrent en la Pi, principalmente porque puede funcionar en background sin necesidad de un interfaz, porque se puede controlar programáticamente y porque permite ejecutar comandos y scripts tras ciertos eventos. Configuramos rtorrent para que cualquier fichero torrent que aparezca en un directorio determinado comience a descargarse. Ahora compartimos ese directorio de la Pi por red con el resto de ordenadores de la casa y voilà. Pero con las series podemos ir un poco más lejos: utilizar un feed rss se las series que seguimos para descargarlas automáticamente. En este caso usamos un feed personalizado que previamente hemos creado en dailytvtorrents.org. Con un pequeño script en python que se ejecuta cada hora descargamos el RSS con los torrents de las series, lo parseamos y comprobamos si hay algún capítulo que no tengamos, en cuyo caso lo descarga y lo deja en el directorio donde rtorrent lo cogerá para empezar la descarga. Una vez se han completado las descargas de los torrents necesitamos “inyectar” esos vídeos en la base de datos del media center. Para eso usamos el evento de rtorrent de descarga completada para ejecute otro script en python que mueve el fichero al directorio que tenemos configurado en el media center para series o películas con el nombre apropiado y que avise al media center mediante el interfaz jsonrpc de que hay nuevos vídeos y necesita reescanear el directorio.
Control por infrarojos de televisión, cd y amplificador
Para empezar a ver una película no basta con iniciar la reproducción en el media center. Es necesario encender la televisión, poner el canal de entrada HDMI, encender el amplificador y seleccionar también su canal de entrada (uno es el de la Pi y el otro la playstation 3). Para esto son necesario dos mandos a distancia, que unidos al tercer mando para controlar el reproductor de CDs se convierten en un engorro. ¿La solución? Construirnos un emisor de infrarrojos para la Raspberry que nos permita controlar estos tres aparatos. Bueno, como construir un cacharrito de tan bajo nivel puede llevar mucho tiempo optamos por el USB IR Toy de Dangerous prototypes:
Emisor/receptor de infrarrojos por USB
Esta pequeña placa es una maravilla: hardware y firmware completamente open source que podemos modificar a nuestro antojo. Tras instalarle el firmware y comprobar que recibe y emite correctamente tendremos que toquetear los fuentes de lirc para que lo acepte como dispositivo de infrarrojos. Después viene la tediosa tarea de “grabar” los comandos de cada mando a distancia para que luego podamos reproducirlos con el comando “irsend”.
Aplicación de control central
Nuestra Raspberry Pi ya puede encender y apagar la tele, cambiar los canales, subir el volumen del amplificador, etc… Pero como la televisión, el amplificador y el reproductor de CDs solo reciben comandos por infrarrojos y no emiten nada no hay manera de saber su estado. Y es necesario saber el estado porque todos estos aparatos no tienen un comando de encendido y otro de apagado sino uno genérico de “power” que o bien los apaga o bien los enciende dependiendo de cómo estuvieran. Por tanto necesitamos programar una aplicación de control que por un lado mantenga el estado y por otro centralice los comandos a enviar (de momento solo los infrarrojos, pero más adelante añadiremos más funcionalidades). Esto lo haremos con un programa sencillo escrito en JavaScript y ejecutado con node js. Además será el encargado de, mediante un interfaz jsonrpc, permitir el control remoto de todas las funcionalidades, bien desde el móvil, bien desde una aplicación web. Como es importante la seguridad (no queremos que nadie ande jugando con nuestra casa) esta aplicación confiará en cualquier petición que llegue por la red local (es decir, que esté conectada al router por cable o bien por wifi mediante contraseña WPA2) pero a cualquier petición que venga desde internet le exigirá que firme la petición con una clave privada RSA que solo nosotros poseemos. Para poder conectarnos remotamente a la aplicación central necesitaremos o bien una IP fija pública de internet o bien una DNS dinámica. Como nuestro caso es el segundo, hemos configurado la Pi para que utlice una entrada de DNS dinámica de no-ip.org.
Código de la aplicación de control
El estado de la casa está definido por modos como “Ver la televisión”, “Trabajar”, “Ver serie o película”, “Escuchar música”, “Dormir”, etc… y en función del estado la aplicación central colocará los aparatos en el estado correspondiente.
Aplicación de control desde el móvil
Para controlar los estados usaremos en un principio una aplicación para un móvil Android. Cuando la aplicación detecte que el móvil se encuentra conectado a la wifi de casa enviará los comandos tal cual y cuando esté usando otra red wifi o la red móvil enviará los comandos firmados. Esta aplicación Android es prácticamente un interfaz tonto que envía los comandos a la aplicación central.
Selección de modo
Control de la televisión
Música maestro
Para la música en CD hay poco misterio porque sigue siendo necesario levantarse a meter el CD y tiene su amplificador propio conectado a los altavoces. Simplemente añadir los comandos para su control por infrarrojos a la aplicación central y unos cuantos botones para la aplicación de control remoto del móvil.
Lo interesante y lo que más posibilidades nos da es la música en mp3 y flac almacenada en el disco duro externo y la música que está reproduciendo el PC. Queremos poder gestionar playlists de los mp3 y flac y reproducirlas en cualquier lugar de la casa y escuchar el audio del pc también en cualquier lugar de la casa (spotify, youtube o cualquier otra cosa). Los puntos de escucha de la música van a ser el salón (mediante el amplificador 5.1), la ducha y el dormitorio. ¿Y como enviamos la música de una parte a otra sin dejarnos una pasta en aparatos airPlay? Sencillo, reciclando hardware obsoleto y usando la wifi para hacer streaming.
El streaming lo resolvemos con un servidor icecast en la Raspberry Pi. Así el PC podrá iniciar un streaming con su audio, la propia Pi podrá inciar un streaming con la playlist de mp3 almacenados y los clientes (la propia pi para el amplificador, la “ducha” y el “dormitorio”) podrán reproducir dicho stream. Puede sonar un poco redundante que para escuchar música en mp3 en el salón la Pi haga streaming de ese mp3 y que ese stream lo reproduzca la propia Pi, pero es la mejor manera de mantener una arquitectura simple y coherente para todo el sistema.
Para que el PC inicie o detenga el streaming de su audio necesitaremos una pequeña aplicación que se registre con la aplicación de control central y acepte las órdenes que esta le va a dar (básicamente iniciar y detener streaming). Realizar streaming del audio que está sonando en un PC es muy sencillo si utilizamos linux:
gst-launch-0.10 pulsesrc device=alsa_output.pci-0000_00_1b.0.analog-stereo.monitor ! \
audioconvert ! audio/x-raw-int,rate=44100,channels=2 ! lamemp3enc bitrate=128 ! \
shout2send ip=pi port=8000 password=mipassword mount=/homeMusic.mp3
Cuando solicitemos desde el control remoto que queremos escuchar el streaming del PC o bien la playlist en el salón la propia aplicación de control reproducirá ese stream (recordemos que la Pi tiene conectada su salida HDMI al amplificador). Si queremos escucharlo en la ducha o en el dormitorio la aplicación central ordenará a los dispositivos instalados en la ducha y en el dormitorio que inicien la reproducción por red del streaming.
Habíamos dicho más arriba que íbamos a reciclar hardware para hacer nuestros reproductores de música. La primera opción fue usar una tablet Android rooteada conectada a unos altavoces… pero la tablet consume mucha electricidad como para dejarla encendida todo el día así que la opción fue hackear un ebook viejo para poder instalar la aplicación que reciba las órdenes.
Hackeando un ebook
Este de arriba es el que está instalado en la ducha. Para el dormitorio y a falta de otro ebook (se aceptan donaciones) optamos por utilizar… ¡otra Raspberry Pi!, esta vez el modelo barato de 25 dólares sin ethernet y con un solo usb (que usaremos para la conexión wifi):
Otra Pi para reproducir música en la cama
La elección de los altavoces es también importante porque queremos que estén encendidos todo el día sin consumir. Así que optamos por unos JBL con una estupenda relación calidad/precio que se apagan automáticamente cuando llevan un rato sin recibir señal por el jack de audio. Una maravilla. El sistema de colgado en la pared dio sin embargo más problemas:
Las mallas nunca fueron lo mío
Luces
Siguiendo con la automatización de la casa el siguiente paso son las luces. Tras descartar muchas opciones como sistemas X10 para controlar el encendido y apagado la opción elegida fueron bombillas LED con interfaz ZigBee Light Link que permiten regular la intensidad y el color. En concreto un pack Philips Hue que viene con su su propio controlador ZigBee que se conecta a la red y oferece una interfaz REST+json amigable para hackers. En total tres bombillas: dos en el salón y una en el dormitorio. Implementamos en la aplicación de control central el soporte para controlar estas luces y su gestión, incialmente en dos modos:
- Manual: las luces se están quietas y se puede controlar mediante el móvil
- Automático: las luces se ajustan al modo actual de la casa y a la hora
Podríamos haber añadido a la Pi un sensor de luz para que esta supiera cuando es de noche y de día y pudiera encender y apagar las luces cuando estuvieran en modo automático. Sin embargo las matemáticas son mucho más divertidas (y más baratas) y conociendo la latitud y la longitud de Madrid y la hora actual con un par de ecuaciones podemos calcular a qué hora va a salir y ponerse el sol ese día. Así, en modo automáticos las luces del salón se irán encendiendo progresivamente según nos acerquemos a la puesta de sol y se apagarán automáticamente al amanecer. Todo eso suponiendo que estemos trabajando, claro. Si estamos en modo “durmiendo” todas las luces estarán apagadas, si estamos en modo “televisión” o “películas” las luces estarán encendidas pero muy suaves y con tonos pastel.
Para la aplicación de control de Android reutilizamos código libre para hacer bonitos diálogos que nos permitan seleccionar el color e intensidad de cada una de las luces manualmente:
Control de luces
Alarma
¿Hartos de los malditos despertadores? Nuestra casa inteligente viene en nuestra ayuda. Pudiendo controlar la luz del dormitorio y su “música” programamos en la aplicación de control central un sistema de alarmas configurables desde el móvil para que nuestro despertar sea un agradable sonido de pajarillos (o el amanecer de Peer Gynt de Grieg) combinados con un aumento gradual de la luz azul que simule un amanecer.
El amo no está en casa
Recordemos que nuestra aplicación de móvil ya sabía si estaba conectado a la wifi de casa o no para usar los comandos sin firmar o firmados. ¡Aprovechemos eso para automatizar aún más la gestión de la casa!. Implementando un pequeño broadcast receiver de Android que se escuche los cambios de conectividad podemos hacer que el móvil avise a la aplicación de control si estamos en casa o no y la aplicación de control se encargará de apagar las luces, la tele y la música cuando nos vayamos (en la práctica al poco de meternos en el ascensor) y de ir encendiendo las luces para cuando lleguemos.
Alertas visuales
Las luces no solo sirven para darnos luz sino que también podemos utilizarlas para darnos información. ¿Nos llaman al móvil? Cinco parpadeos de luces en toda la casa (solo si el amo está en casa, claro). ¿Mete un gol el Madrid? Un parpadeo en blanco de la la luz de la derecha. ¿Es el gol en contra? Un Parpadeo en rojo.
Luces y música
¿Queremos que las fiestas en nuestra casa no tengan nada que envidiarle a las de las discotecas? ¿O simplemente queremos escuchar y sentir mejor la ópera? Con nuestras luces configurables podemos. Recordemos que la música del salón suena a través de nuestra Raspberry Pi… así que podemos analizar por sofware la onda de sonido para ajustar las luces a ella. Para ajustar la intensidad de la luz al volumen de la música nos vale con parsear la salida del reproductor alsa (que el el que reproduce el streaming) para ir capturando los volúmenes. Pero nuestras luces no solo son capaces de cambiar de intensidad sino también de color. ¿Y qué podemos asociar al color? El timbre de la música. Pero para esto nos toca meternos en el barro y modificar el aplay para antes de enviar el sonido a la salida analizar el buffer para intentar analizar las muestras y sacar la nota predominante. Wow, suena como a muchas matemáticas. Afortunadamente el mundo del software libre sale en nuestra ayuda y podemos encontrar por internet el código de dywapitchtrack que hace precisamente esto. Nuestro trabajo será solo adaptar ese código para incorporarlo al aplay y generar una salida parseable por nuestra aplicación de control. El resultado es este:
El vídeo no se aprecia muy bien pero se hacen una idea 🙂
Ambilight casero
Hemos adaptador las luces a la música… ¿Por qué no hacerlo también a la imagen? Se trata de copiar el sistema ambilight ese que tiene algunas teles carísimas con lo que ya tenemos. Pero esto no va a ser tan fácil. Si para el caso del audio podíamos analizar la onda final fácilmente con el vídeo nos encontramos con un problema: la Raspberry Pi decodifica y renderiza el vídeo por hardware gracias a un chip especializados (si no difícilmente iba a poder reproducir h264 a 720p tan suavemente). Toca mirarse el código fuente del omxplayer, el reproductor de vídeo que utiliza el hadware de la Raspberry. Lo que queremos es capturar de algún modo las imágenes que se van a renderizar por la salida HDMI. Aprendemos que todo el proceso se hace con pipelines de OpenMax. Vamos a la documentación de Broadcom (el fabricante del SoC de la Raspberry) y vemos que implementan un elemento llamado video_splitter que duplica el stream de vídeo hasta cuatro veces. Esto nos sirve. Tenemos que colocar este splitter a la salida del elemento “decoder” y conectar una de las patas al elemento “render” (que es el que lo saca por el HDMI) y otra a un elemento nuestro que sea el que analice los colores de la imágen. Tras unas cuantas horas de hacking en el código de omxplayer con OpenMax tenemos por fin los datos del color predominante en formato hsv que podemos enviar a nuestra aplicación de control para que ajuste la luz trasera de la televisión.
Código modificado de omxplayer
Lo más divertido de esto fue ver que alguien había hecho básicamente lo mismo para controlar sus luces (mediante otro sistema). En cualquier caso se aprende bastante intentando hacer las cosas uno solo. También tuvo su gracia “hackear” una lámpara de ikea de brazo flexible para cambiarle el casquillo y usar uno que funcionara con nuestra bombilla. El resultado:
Reconocimiento de voz
Otra característica que siempre se plantea con los temas de automatización es el control mediante reconocimiento voz. Las pruebas con pocketsphinx no fueron del todo mal (aunque tardaba en procesar lo suyo). Sin embargo dos problemas fundamentales hicieron descartar la idea:
- Uno tiende a sentirse más gilipollas hablando solo que dándole a un botón en el móvil
- Con pocketsphinix no hay manera de distinguir voces de un hablante u otro y el sistema se ponía a hacer cosas si en una película decían determinadas palabras. Una posible solución habría sido utilizar palabras muy poco frecuentes como comandos de control como por ejemplo nombres de pájaros raros: archaeopteryx, ornotirrinco, enantiornithes… pero claro, si uno se siente gilipollas hablando solo… hablando solo con esas palabras ni les cuento.
Próximos pasos
Hasta aquí hemos llegado. Los siguientes pasos probablemente sean:
- Control de la calefacción: recuperando la Pi que hay en el dormitorio se acoplaría a la caldera y mediante un relé conectado a una GPIO de salida de la pi (plaquita mediante) y a los pines de entrada de la caldera (originalmente pensados para un termostato) seríamos capaces de encender y apagar la calefacción a nuestro gusto. Implementaríamos un modo manual y otro automático que la encendiera si “el amo está en casa” y “no está durmiendo” en función de la hora, la fecha, la temperatura exterior y la temperatura interior (un sensor de 2 dólares para la Pi). La parte más divertida sería automatizar el “voy a encender la calefacción desde el móvil porque en 30 minutos estoy en casa”. Porque el móvil con su GPS, localización por wifi y un poco de magia debería ser capaz de detectar que uno se está aproximando a la casa el línea recta de manera continua e inexorable (¡hay que evitar que ponga la calefacción cuando uno esta de cañas por la zona!)
- Control del portero automático. De nuevo con otra Pi, relés y conversores ADC que le permitan al sistema central saber cuándo llaman y abrir la puerta. Lo de hablar por el telefonillo desde el móvil sería para nota y podría dejar muy picuetos a los vecinos
- Cerradura electrónica de la puerta de casa.
Conclusiones
Las únicas conclusiones posibles son:
- Soy un poco geek
- Tengo tiempo libre
- Necesito un novio
Si se les ocurre alguna otra idea o se animan a hacer algo parecido háganlo saber en los comentarios. Hemos omitido deliberadamente cualquier listado de código fuente porque el artículo ya iba a ser ladrillo de por sí pero si alguien está interesado, lo mismo, a los comentarios y en un periquete montamos un repositorio en github con el código de todas las piezas de este frikisistema.