msgbartop
Ph´nglui mglw´nafh Cthulhu R´lyeh wgah´nagl fhtagn
msgbarbottom

14 oct 13 Control de Raspberry a través de WhatsApp

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:

  • Uso de la interfaz web de WebIOPi: Permite controlar los relés vía web desde un navegador convencional, o desde un móvil, pero no se lleva demasiado bien con la automatización.
  • Programación de un script bash: Junto con el uso de cron, permite una excelente automatización del sistema, pero es poco ágil para ser gestionado de manera remota, ya que requiere acceso por ssh.

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.

Captura de pantalla del intercambio de mensajes

Captura de pantalla del intercambio de mensajes

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:

  • Instalar python
  • Registrar un número de móvil en Fonyou
  • Utilizar yowsup para registrar el número anterior con WhatsApp
  • Picar un script para automatizar el envío de mensajes. Aunque esto último, en mi caso, no era necesario, ya que disponía del que había hecho para controlar los relés. Tan sólo necesitaba modificar los mensajes de estado, para enviarlos por WhatsApp en vez de por la salida convencional

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. :mrgreen:

…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.

VN:F [1.9.20_1166]
Rating: 10.0/10 (2 votes cast)

Etiquetas: , , , , ,

17 sep 13 Control de relés con una Raspberry Pi

Hace algún tiempo compré junto con mis compañeros de curro una Raspberry Pi. Para quien no sepa qué es este invento, en líneas generales se trata de un microordenador equipado con un procesador ARM (arquitectura que se usa habitualmente en teléfonos móviles), 512 MB de RAM, y una impresionante GPU que permite reproducir vídeos a 1080p Full HD. Y todo por el ridículo precio de 30 euros, aproximadamente. Y con la ventaja de que es un “ordenador de aprendizaje”, que permite hacer mil diabluras y pequeños proyectos, que asombrarían al más pintado.

Solar Powered Raspberry Pi

Solar Powered Raspberry Pi

Desde que la compramos cada uno hemos empezado a hacer pruebas, con la idea de ver hasta dónde podíamos hacer llegar el invento. Lo más convencional ha sido, obviamente, instalar una Debian preparada para esta peculiar máquina (Raspbian, por lo general), y montar pequeños sistemas. Otra de las labores que hemos realizado ha sido instalar sistemas de visualización de vídeo para convertir televisores en auténticos centros multimedia.

Yo, por mi parte, me he entretenido haciendo cosas más o menos sencillitas, hasta que he recuperado un viejo proyecto que llevaba años queriendo implementar: un sistema de domótica casero, para controlar los sistemas de riego por goteo del jardín. Estos sistemas procuran controlar de manera remota una electroválvula, que es la que permite el paso de agua al sistema de riego. Pero para implementar cualquier sistema de domótica que se precie -y un sistema de riego no es una excepción-, es necesario hacer uso de relés para controlar el paso de corriente a los dispositivos que se trata de controlar. Y es aquí donde la Raspberry se porta de maravilla.

Diagrama de conexión GPIO Rasbperry Pi a relés

Diagrama de conexión GPIO Rasbperry Pi a relés

La Raspberry proporciona un sistema GPIO sumamente configurable, mediante un bus de comunicación, que permite comunicarse con dispositivos externos programando el uso de puertos del sistema. Esto permite controlar de una manera sencilla una placa de relés preparada al efecto, y que gracias a la popularización de otro sistema programable empotrado como es Arduino, se pueden encontrar con suma facilidad en sitios como DealExtreme:

Conjunto de relés

Conjunto de relés

Dicho y hecho. No tardé mucho tiempo en hacerme con la placa anterior, y empezar a hacer pruebas de control con una aplicación web, especialmente bien pensada para controlar los puertos GPIO mediante dispositivos móviles. El resultado es el siguiente:

Esta aplicación permite controlar con una sencilla pulsación el cambio de estado del puerto de comunicación escogida, que activa o desactiva el relé. Una vez que puedes controlar los relés, puedes controlar de una manera sencilla algo como una electroválvula, disponiendo de una fuente de alimentación adecuada, cuyo paso de corriente se controla mediante el relé. La siguiente prueba que tengo que hacer es conectar de manera efectiva la salida del relé a la electroválvula.

La aplicación, por supuesto, es apenas el primer paso, ya que su operación es completamente manual y no permite establecer ninguna programación de la activación del sistema de riego, pero permite verificar de una manera muy sencilla que el sistema funciona. A partir de aquí, mi siguiente paso será implementar una aplicación que permita establecer una programación mediante cron o eventos externos.

Seguiremos informando… :mrgreen:

VN:F [1.9.20_1166]
Rating: 10.0/10 (2 votes cast)

Etiquetas: , , ,