{"id":3451,"date":"2013-10-14T23:29:28","date_gmt":"2013-10-14T22:29:28","guid":{"rendered":"http:\/\/bitacora.eniac2000.com\/?p=3451"},"modified":"2013-10-14T23:29:28","modified_gmt":"2013-10-14T22:29:28","slug":"control-de-raspberry-a-traves-de-whatsapp","status":"publish","type":"post","link":"https:\/\/bitacora.eniac2000.com\/?p=3451","title":{"rendered":"Control de Raspberry a trav\u00e9s de WhatsApp"},"content":{"rendered":"<p>Seguimos con los trasteos. Como complemento al sistema de control de los rel\u00e9s, pens\u00e9 que ser\u00eda interesante poder controlar los mismos de m\u00faltiples maneras. Hasta el momento, ten\u00eda implementados los siguientes:<\/p>\n<ul>\n<li><strong>Uso de la interfaz web de WebIOPi:<\/strong> Permite controlar los rel\u00e9s v\u00eda web desde un navegador convencional, o desde un m\u00f3vil, pero no se lleva demasiado bien con la automatizaci\u00f3n.<\/li>\n<li><strong>Programaci\u00f3n de un script bash:<\/strong> Junto con el uso de cron, permite una excelente automatizaci\u00f3n del sistema, pero es poco \u00e1gil para ser gestionado de manera remota, ya que requiere acceso por ssh.<\/li>\n<\/ul>\n<p>Adem\u00e1s, me encontraba con otro problema: los dos sistemas anteriores permiten controlar -cada uno con sus ventajas e inconvenientes- los rel\u00e9s, pero dan poca informaci\u00f3n sobre el estado de la Raspberry y los puertos de E\/S. As\u00ed que pens\u00e9 que ser\u00eda divertido poder comunicarse con la RPi mediante un sistema de mensajer\u00eda. Y dentro de la diversi\u00f3n, la opci\u00f3n m\u00e1s divertida era el hacerlo por WhatsApp.<\/p>\n<figure id=\"attachment_3452\" aria-describedby=\"caption-attachment-3452\" style=\"width: 266px\" class=\"wp-caption aligncenter\"><a href=\"http:\/\/bitacora.eniac2000.com\/wp-content\/uploads\/2013\/10\/screenshot-1381782019147.png\"><img loading=\"lazy\" decoding=\"async\" src=\"http:\/\/bitacora.eniac2000.com\/wp-content\/uploads\/2013\/10\/screenshot-1381782019147-266x400.png\" alt=\"Captura de pantalla del intercambio de mensajes\" title=\"Captura de pantalla del intercambio de mensajes\" width=\"266\" height=\"400\" class=\"size-medium wp-image-3452\" \/><\/a><figcaption id=\"caption-attachment-3452\" class=\"wp-caption-text\">Captura de pantalla del intercambio de mensajes<\/figcaption><\/figure>\n<p>Para ello, ten\u00eda que acometer dos fases principales. Primera: montar un sistema de env\u00edo de mensajes a trav\u00e9s de WhatsApp. Segunda: modificar el sistema de recepci\u00f3n de mensajes para que fuera capaz de interpretar un mensaje como un comando, y procesarlo en consecuencia.<\/p>\n<p>En lo referente a la primera fase, encontr\u00e9 un art\u00edculo que trataba sobre c\u00f3mo enviar mensajes de estado de la Raspberry mediante WhatsApp: <a href=\"http:\/\/portallinux.es\/raspberry-pi-notificacion-de-la-temperatura-de-la-cpu-por-whatsapp\/\">Notificaci\u00f3n de la temperatura de la CPU por WhatsApp<\/a>. El proceso, en l\u00edneas generales, es el siguiente:<\/p>\n<ul>\n<li>Instalar python<\/li>\n<li>Registrar un n\u00famero de m\u00f3vil en Fonyou<\/li>\n<li>Utilizar <a href=\"https:\/\/github.com\/tgalal\/yowsup\">yowsup<\/a> para registrar el n\u00famero anterior con WhatsApp<\/li>\n<li>Picar un script para automatizar el env\u00edo de mensajes. Aunque esto \u00faltimo, en mi caso, no era necesario, ya que dispon\u00eda del que hab\u00eda hecho para controlar los rel\u00e9s. Tan s\u00f3lo necesitaba modificar los mensajes de estado, para enviarlos por WhatsApp en vez de por la salida convencional<\/li>\n<\/ul>\n<p>Dicho y hecho. Lo m\u00e1s importante de todo esto es <a href=\"https:\/\/github.com\/tgalal\/yowsup\">yowsup<\/a>. Es una librer\u00eda escrita en Python que permite utilizar WhatsApp como interfaz de mensajer\u00eda para aplicaciones. En el art\u00edculo anterior se utilizaba para enviar mensajes, pero tambi\u00e9n tiene la capacidad de recibirlos. Y por tanto, abre la posibilidad de tratar dichos mensajes para procesar instrucciones. La segunda fase pod\u00eda ser acometida.<\/p>\n<p>La idea general era modificar la funci\u00f3n de recepci\u00f3n de mensajes para que no s\u00f3lo los mostrara por pantalla, sino que tambi\u00e9n se pudieran procesar. Tras trastear un poco, encontr\u00e9 que el fichero <em>yowsup\/src\/Examples\/ListenerClient.py<\/em> contiene dicha funci\u00f3n, en concreto, la funci\u00f3n <em>onMessageReceived<\/em>. Por defecto, procesa el mensaje recibido y lo muestra por pantalla.<\/p>\n<p>La idea m\u00e1s b\u00e1sica para ejecutar comandos era aprovechar mi script bash, que tendr\u00eda que ser llamado por la librer\u00eda python. Por suerte, Python puede llamar a comandos del sistema operativo, y pasarles comandos. As\u00ed que con una sencilla l\u00ednea, se pueden tratar los mensajes recibidos como comandos del sistema operativo:<\/p>\n<blockquote><p>subprocess.check_call(shlex.split(messageContent))<\/p><\/blockquote>\n<p>Esta instrucci\u00f3n 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\u00f3n, se puede ejecutar cualquier comando de \u00e9ste, junto con sus variables asociadas.<\/p>\n<p>Y lo mejor es que funciona. <img src=\"https:\/\/bitacora.eniac2000.com\/wp-includes\/images\/smilies\/mrgreen.png\" alt=\":mrgreen:\" class=\"wp-smiley\" style=\"height: 1em; max-height: 1em;\" \/><\/p>\n<p>&#8230;o al menos, casi del todo. De esta manera, s\u00f3lo funciona en la primera ejecuci\u00f3n. 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:<\/p>\n<blockquote><p>screen -dmS whatsapp python \/home\/pi\/yowsup\/src\/yowsup-cli -c \/home\/pi\/yowsup\/src\/config.example -l -a -k<\/p><\/blockquote>\n<p>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\u00faa de receptor de mensajes, y ya no es posible seguir controlando la Raspberry por WhatsApp.<\/p>\n<p>La soluci\u00f3n es simple: convertir el script de bash a una funci\u00f3n python para yowsup que cumpla la misma funci\u00f3n, y que use las funciones del mismo para realizar el env\u00edo. Pero esto ya quedar\u00e1 para otro d\u00eda.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Seguimos con los trasteos. Como complemento al sistema de control<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"advanced_seo_description":"","jetpack_seo_html_title":"","jetpack_seo_noindex":false,"_jetpack_memberships_contains_paid_content":false,"footnotes":"","jetpack_publicize_message":"","jetpack_publicize_feature_enabled":true,"jetpack_social_post_already_shared":false,"jetpack_social_options":{"image_generator_settings":{"template":"highway","default_image_id":0,"font":"","enabled":false},"version":2}},"categories":[13],"tags":[207,1361,1381,1411,1781,1810],"series":[],"class_list":["post-3451","post","type-post","status-publish","format-standard","hentry","category-informatica","tag-bash","tag-python","tag-raspberry-pi","tag-reles","tag-whatsapp","tag-yowsup"],"jetpack_publicize_connections":[],"jetpack_featured_media_url":"","jetpack_sharing_enabled":true,"_links":{"self":[{"href":"https:\/\/bitacora.eniac2000.com\/index.php?rest_route=\/wp\/v2\/posts\/3451","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/bitacora.eniac2000.com\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/bitacora.eniac2000.com\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/bitacora.eniac2000.com\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/bitacora.eniac2000.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=3451"}],"version-history":[{"count":0,"href":"https:\/\/bitacora.eniac2000.com\/index.php?rest_route=\/wp\/v2\/posts\/3451\/revisions"}],"wp:attachment":[{"href":"https:\/\/bitacora.eniac2000.com\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=3451"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/bitacora.eniac2000.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=3451"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/bitacora.eniac2000.com\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=3451"},{"taxonomy":"series","embeddable":true,"href":"https:\/\/bitacora.eniac2000.com\/index.php?rest_route=%2Fwp%2Fv2%2Fseries&post=3451"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}