msgbartop
«Veni, vermini, vomui», ¿llegué, me puse bolinga, vomité?
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)
Control de Raspberry a través de WhatsApp, 10.0 out of 10 based on 2 ratings
Comparte este artículo:
  • Twitter
  • Facebook
  • email
  • StumbleUpon
  • Delicious
  • Google Reader
  • LinkedIn
  • BlinkList

Etiquetas: , , , , ,

Comentarios de los lectores

  1. |

    [...] 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 [...]

    Responder a este comentario
  2. |

    Hola. estoy trabajando con esto pero me lio un poco. Si estoy en “modo escucha” no se salir de ahí.
    ¿Me puedes mandar el fichero.py?
    Gracias.
    jjdejuan@cvsanican.com

    VA:F [1.9.20_1166]
    Rating: 0.0/5 (0 votes cast)
    Responder a este comentario
    • |

      Hola Juanjo. En efecto, cuesta salir un tanto del modo escucha. Si pulsas Ctrl+C, sigue dentro del programa. Yo salgo de él con Ctrl+Z, y luego matando el proceso a mano.

      Sin embargo, no utilizo el modo escucha: he programado un nuevo modo, similar al interactivo, que hace de sistema de control de los relés.

      VN:F [1.9.20_1166]
      Rating: 0.0/5 (0 votes cast)
      Responder a este comentario
  3. |

    Hola me ayudan con este proyecto no he logrado ponerlo a funcionar.

    VA:F [1.9.20_1166]
    Rating: 0.0/5 (0 votes cast)
    Responder a este comentario
  4. |

    genial amigo estoy trabajando en unos arreglos para reciir e enviar
    se me ocurre escribir unos ficheros txt para procesar lo que nos envian

    VA:F [1.9.20_1166]
    Rating: 0.0/5 (0 votes cast)
    Responder a este comentario
  5. |

    Hola estoy trabajando con yowsup 2.2 y toda la estructura es diferente a las versiones anteriores, necesito ayuda en la ejecución de comando, ¿como puedo hacer para que los mensajes recibidos puedan ser procesados?

    VA:F [1.9.20_1166]
    Rating: 5.0/5 (1 vote cast)
    Responder a este comentario

Deje un comentario en Juanjo







4 + nueve =