Nuevos avances. La última vez que utilicé WhatsApp como sistema de control remoto (Riego de jardín con WhatsApp y radiofrecuencia) hice uso de la versión 1 de Yowsup, librería de comunicación con WhatsApp escrita en python. Pero algún tiempo después esta primera versión de Yowsup dejó de ser funcional, y aunque tiempo después fue reescrita en una segunda versión, todo el código que había desarrollado para ello no era compatible.
Después de algunos trasteos, y de comprender cómo funciona esta nueva librería, he conseguido volver a hacer operativo el sistema de comunicación. E incluso el código ha quedado bastante más limpio. Recopilemos: se envía desde un terminal móvil un mensaje de control. Este mensaje es recibido gracias a una aplicación que hace uso de Yowsup, instalada en una Raspberry Pi. El programa interpreta el mensaje, y toma la acción oportuna. Hasta este momento, encender y apagar un relé durante un número de segundos indicado en el mensaje; relé que no se encuentra conectado directamente a la RPi, sino controlado por un chip Attiny85. La RPi, haciendo uso de un emisor de RF de 433 MHz, da las órdenes de encendido y apagado al Attiny85. El Attiny, que se encuentra a la espera de mensajes en un modo de bajo consumo, recibe la señal de interrupción hardware provocada por el receptor de 433 MHz. Sale del modo de bajo consumo, y activa el relé. Posteriormente, bajo otra orden de apagado por parte de la RPi, desactiva el relé y vuelve al modo de bajo consumo.
Teniendo en cuenta que aquí en Irlanda un sistema de riego automático es algo que carece de utilidad (el propio clima es un sistema de riego automático ), ¿qué se puede querer controlar de manera remota? He aquí la respuesta:
En cuanto a la preocupación por el consumo, éste ha mejorado de manera considerable. El Attiny se encuentra alimentado por una batería de móvil de 2100 mAh, conectada a un panel solar que recarga la batería. Hasta el momento, lleva 4 días funcionando de manera ininterrumpida, y la última medición de la batería indica que la carga es de 3.85v. Un enorme avance con respecto a la anterior versión del reloj de riego de jardín.
Etiquetas: attiny85, python, raspberry pi, whatsapp, yowsup
Ahora sí que sí. Escribía hace unos días que había implementado un sistema de control de relés a través de la Raspberry, utilizando como sistema de mensajería WhatsApp. Pero que ese sistema, que combinaba el uso de una librería en python para procesar el paso de mensajes con un script programado en bash, no era del todo funcional. Pues bien, después de un tiempo de trasteo, he conseguido que todo el sistema funcione:
Finalmente he optado por prescindir del script en bash, y programar la lógica necesaria dentro de la librería python. Para ello, he extendido la funcionalidad de la misma: existía una funcionalidad que permitía el intercambio interactivo de mensajes entre línea de comandos y el contacto remoto. He copiado este sistema de mensajería en una nueva funcionalidad, que en vez de mostrar los mensajes por pantalla, los parsea y ejecuta.
Para ello, he importado el sistema de control de los GPIO que proporciona WebIOPi dentro de yowsup, y a partir de ahí, tan sólo se ha tratado de adaptar la lógica del script bash a la función que procesa los mensajes parseados que se reciben por parte del contacto móvil.
Si alguien está interesado, puedo pasar el fichero py, pero que no espere mucha belleza en el código, ya que es mi primer programa python.
Etiquetas: domótica, electroválvula, python, raspberry, webiopi, whatsapp, yowsup
Seguimos con los trasteos. Como complemento al sistema de control de los relés, pensé que sería interesante poder controlar los mismos de múltiples maneras. Hasta el momento, tenía implementados los siguientes:
Además, me encontraba con otro problema: los dos sistemas anteriores permiten controlar -cada uno con sus ventajas e inconvenientes- los relés, pero dan poca información sobre el estado de la Raspberry y los puertos de E/S. Así que pensé que sería divertido poder comunicarse con la RPi mediante un sistema de mensajería. Y dentro de la diversión, la opción más divertida era el hacerlo por WhatsApp.
Para ello, tenía que acometer dos fases principales. Primera: montar un sistema de envío de mensajes a través de WhatsApp. Segunda: modificar el sistema de recepción de mensajes para que fuera capaz de interpretar un mensaje como un comando, y procesarlo en consecuencia.
En lo referente a la primera fase, encontré un artículo que trataba sobre cómo enviar mensajes de estado de la Raspberry mediante WhatsApp: Notificación de la temperatura de la CPU por WhatsApp. El proceso, en líneas generales, es el siguiente:
Dicho y hecho. Lo más importante de todo esto es yowsup. Es una librería escrita en Python que permite utilizar WhatsApp como interfaz de mensajería para aplicaciones. En el artículo anterior se utilizaba para enviar mensajes, pero también tiene la capacidad de recibirlos. Y por tanto, abre la posibilidad de tratar dichos mensajes para procesar instrucciones. La segunda fase podía ser acometida.
La idea general era modificar la función de recepción de mensajes para que no sólo los mostrara por pantalla, sino que también se pudieran procesar. Tras trastear un poco, encontré que el fichero yowsup/src/Examples/ListenerClient.py contiene dicha función, en concreto, la función onMessageReceived. Por defecto, procesa el mensaje recibido y lo muestra por pantalla.
La idea más básica para ejecutar comandos era aprovechar mi script bash, que tendría que ser llamado por la librería python. Por suerte, Python puede llamar a comandos del sistema operativo, y pasarles comandos. Así que con una sencilla línea, se pueden tratar los mensajes recibidos como comandos del sistema operativo:
subprocess.check_call(shlex.split(messageContent))
Esta instrucción parte el mensaje recibido de una sola cadena a una lista de instrucciones, y las procesa como una llamada al sistema. Con esta simple instrucción, se puede ejecutar cualquier comando de éste, junto con sus variables asociadas.
Y lo mejor es que funciona.
…o al menos, casi del todo. De esta manera, sólo funciona en la primera ejecución. El problema viene por lo siguiente: para poder recibir mensajes, es necesario tener el yowsup funcionando de manera continua en segundo plano. Esto se puede hacer combinando screen con el comando necesario para lanzar yowsup:
screen -dmS whatsapp python /home/pi/yowsup/src/yowsup-cli -c /home/pi/yowsup/src/config.example -l -a -k
Una vez que yowsup se ejecuta constantemente en segundo plano, podemos recibir los mensajes que enviamos. Pero cuando ejecutamos dichos comandos con el script bash, lanzamos un nuevo proceso yowsup para enviar el mensaje de estado. Y esto no le sienta especialmente bien al sistema. Cierra el proceso en segundo plano que actúa de receptor de mensajes, y ya no es posible seguir controlando la Raspberry por WhatsApp.
La solución es simple: convertir el script de bash a una función python para yowsup que cumpla la misma función, y que use las funciones del mismo para realizar el envío. Pero esto ya quedará para otro día.
Etiquetas: bash, python, raspberry pi, relés, whatsapp, yowsup