msgbartop
“¿Estás seguro de que ESO es aleatorio?” “Ése es el problema con la aleatoriedad: nunca puedes estar seguro”
msgbarbottom

29 ene 17 Sistema de telemetría y geoposicionamiento para vehículos

Escribía en mi entrada anterior que estaba trabajando en un sistema de telemetría para el Mercedes. Durante estas últimas semanas he estado realizando algunas mejoras en el sistema, y si bien aún es posible incorporar algunas más, en este momento ya empieza a tener un desarrollo bastante definido. En pocas palabras, se trata de un sistema de telemetría que recoge datos de dos fuentes, la centralita del coche y un módulo GPS, para transmitirlo a un servidor donde se almacenan los datos para su posterior tratamiento. En este momento, el tratamiento consiste en dos actividades: representación gráfica de velocidad, revoluciones por minuto y consumo del coche, y geoposicionamiento en mapas en tiempo real. Este es un esquema básico de la plataforma:

Esquema del sistema de telemetría

Esquema del sistema de telemetría

El sistema está compuesto por los siguientes elementos:

  • Sonda de captura de datos: La sonda de captura de datos consiste en una Raspberry Pi que se conecta con la centralita del coche mediante un módulo bluetooth. La centralita del coche se ha equipado, a su vez, con un módulo OBD-II con bluetooth. Esta sonda, de igual manera, dispone de un módulo GPS para proporcionar datos relativos a la posición del vehículo.
  • Programa de telemetría: En la sonda de posicionamiento he desplegado un programa que recopila información de las fuentes anteriores, que he desarrollado en Python. Este programa, en líneas generales, comprueba el estado de las fuentes de datos antes mencionados, recopila la información y la prepara para su transmisión. Para ello, se apoya en un broker MQTT instalado en la propia sonda. Por último, se hace un almacenado local en ficheros csv de la información recopilada, junto con una marca de tiempo.
  • Broker MQTT local: Para realizar la transmisión de datos al servidor de almacenamiento y procesado de datos se hace uso de un broker MQTT local. MQTT es un protocolo ligero de mensajería para pequeños sensores y dispositivos móviles ideado por IBM. Está optimizado para realizar la transmisión de datos incluso en redes no confiables y en entornos de alta latencia, por lo que es ideal para delegar en él la capa de transmisión de datos del programa anterior, ya que es presumible que el vehículo pueda encontrarse en situaciones de escasa cobertura o incluso pérdida total de la misma, además de en situaciones en las que la transmisión de datos haya de efectuarse haciendo uso de redes GSM de escasa capacidad. Además, tiene la ventaja de que produce menos sobrecarga que otros protocolos como HTTP, y (en teoría) hace un menor consumo de datos. La idea es la siguiente: el programa anterior delega en el broker MQTT el establecer el envío de paquetes al servidor. El broker MQTT actúa además como buffer local de los paquetes transmitidos, en caso de pérdida o inestabilidad de las comunicaciones. Este buffer local, gracias a una pequeña base de datos interna, es persistente incluso ante reinicios inesperados de la sonda. El broker MQTT local está sincronizado con otro broker MQTT desplegado en el servidor de recepción de datos, y es capaz de garantizar la correcta sincronización, como se ha comentado, incluso en situaciones de pérdida total de conectividad y reinicios en la sonda de datos.
  • Envío de datos mediante tethering bluetooth: El broker local MQTT es dotado de conectividad a Internet mediante tethering bluetooth con un teléfono móvil. Si bien a priori sería más interesante hacer uso de tethering wifi para esto mismo, hay tres buenas razones para optar por bluetooth: La primera es que al hacer uso de MQTT el volumen de información a intercambiar es bastante reducido, por lo que es posible hacer uso de bluetooth para ello, con el consiguiente impacto positivo en el consumo de energía necesario para establecer el canal de datos. La segunda es una limitación física en la sonda. La Raspberry Pi 2 que utilizo tiene sólo dos puertos USB, uno usado con el módulo GPS y otro con el módulo bluetooth para conectar con la centralita, por lo que no queda sitio para un módulo WiFi. Y la tercera, es que todo es mejor con bluetooth. :mrgreen:
  • Servidor de recepción de datos: El segundo bloque del sistema es el servidor de recepción y análisis de datos. Consiste en líneas generales en un servidor Graphite donde se almacenan los datos proporcionados por la sonda de captura de datos, y que permite su posterior utilización, bien para la representación de gráficas de dichos datos mediante Grafana, bien para la el geoposicionamiento del vehículo en tiempo real, con información añadida del resto de parámetros proporcionados por la sonda.
  • Broker MQTT: La comunicación, como se ha comentado, se realiza mediante un broker MQTT que sincroniza con el broker MQTT de la sonda. Este broker recibe los datos proporcionados por la sonda, y los inyecta, mediante una pasarela desarrollada en Python, en el servidor Graphite. Dado que es posible que la información proporcionada por el broker MQTT de la sonda no se reciba en tiempo real debido a posibles cortes en las comunicaciones, se hace uso de la marca de tiempo incluida en cada transmisión de la sonda remota para inyectar los datos en el servidor Graphite con información de tiempo de creación correcta.
  • Servidor Graphite: El servidor Graphite consolida la información proporcionada por la sonda de captura de datos, la almacena en una sistema de base de datos buffer de corta duración (Carbon) y posteriormente la consolida en una base de datos da larga duración (whisper).
  • Servidor Grafana: Los datos consolidados en el servidor Graphite son consumidos por Grafana, software para visualización de métricas. Se han creado una serie de gráficas que permiten acceder a la información relativa a la velocidad, revoluciones por minuto, entrada de aire en el motor, consumo de combustible y altitud con respecto al mar, así como a sus valores medios en un rango de tiempo establecido. Grafana proporciona, además, la capacidad de integrar estas gráficas en una plataforma de terceros.
  • Captura de posicionamiento de vehículo con datos en tiempo real

    Captura de posicionamiento de vehículo con datos en tiempo real

  • Sistema de geoposicionamiento: El broker MQTT permite, además, el procesamiento de la información proporcionada por la sonda para representar en tiempo real la ubicación geográfica del vehículo, así como la traza de las posiciones anteriores mediante una línea de posición. Además, se proporciona información en tiempo real de los parámetros proporcionados por la sonda. Este sistema está basado en Node-RED, una herramienta desarrollada por IBM para permitir una interconexión sencilla de diversas aplicaciones y dispositivos IoT. También hace uso de OpenStreetMap, mediante la librería WorldMap.

Todo este sistema lo he compilado en la siguente web para su visualización: Telemetría (www.eniac2000.com/telemetria)

Dado que la información mostrada en esa URL proporciona datos en tiempo real, he realizado una captura de datos obtenidos en vivo:

Captura del sistema de telemetría

Captura del sistema de telemetría

…así como un vídeo en el que se aprecia la información, si bien realizando la captura de la información desde las dos fuentes de datos separadas, y no desde el mismo portal:

Como comentaba, el sistema está aún en una fase muy temprana, pero el potencial de mejora es grande. Los principales puntos en los que estoy trabajando son los siguientes:

  • Mejora en la seguridad de comunicaciones entre brokers MQTT
  • Mejora en la fiabilidad de la comunicación OBD-II
  • Reemplazo del sistema de base datos de larga duración de Graphite por un sistema NoSQL, presumiblemente un InfluxDB
  • Dotar de redundancia a los elementos de la plataforma
  • Proporcionar un sistema de persistencia de la información
  • Creación de un portal multiusuario con soporte de múltiples dispositivos
  • Otros… :)

Si bien este proyecto empezó como algo personal, con la idea de comprobar cuánto consumía mi coche en los desplazamientos, tengo el convencimiento de que puede convertirse en algo más que en un mero pasatiempo. Esperemos que así sea.

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

Etiquetas: , , , , , , , , , , , ,

23 dic 15 Control remoto de sistemas con WhatApp. Yowsup 2

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 :mrgreen: ), ¿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.

VN:F [1.9.20_1166]
Rating: 10.0/10 (1 vote cast)

Etiquetas: , , , ,

24 ene 14 Código de control de Raspberry Pi por WhatsApp

Llevo desde hace algunos meses trabajando en un sistema de control de domótica controlado por WhatsApp en Raspberry: , , . La parte central del sistema es la librería yowsup, que permite comunicarse por línea de comandos con WhatsApp desde linux. He modificado el código del mismo, para poder capturar los mensajes enviados desde el teléfono, e interactuar con los GPIO de la Raspberry. Este es el código que hasta el momento he desarrollado:

Código fuente de control de Raspberry por WhatsApp

Varios comentarios al mismo:

  • El código es feo de narices, lo sé. Hacía mucho tiempo que no tiraba una sola línea de código, y nunca he sido un especialista en python, lenguaje que he tenido que aprender sobre la marcha. Así que no esperes nada especialmente elegante.
  • La manera menos problemática para ejecutar el sistema es la siguiente:screen -dmS whatsapp sudo python /home/pi/yowsup/src/yowsup-cli -c /home/pi/yowsup/src/config.example -E 346xxxxxxxx -a -k, siendo 6xxxxxxxx el teléfono desde el que queremos comunicarnos. El parámetro “-E” es una de las modificaciones que he efectuado. Permite lanzar el yowsup ejecutando el modo de control de las electroválvulas (Electro.py), que es básicamente donde he metido las zarpas.
  • Aunque se puede lanzar sin hacer uso de screen, aconsejo encarecidamente hacer uso del mismo, ya que nos permitirá recuperar la sesión desde terminales distintos a aquel desde donde hemos lanzado el programa, lo que siempre es una ventaja.
  • Es imperativo lanzar mi modificación de yowsup con sudo (o como root), ya que se trastea con la GPIO.
  • Una buena manera de automatizar el inicio de yowsup cuando se encienda la raspberry es añadiendo el comando anterior a /etc/rc.local
  • Aparte del sistema de control de los relés, también contiene el sistema de control de movimiento con el sensor PIR

Espero que os resulte de utilidad. :mrgreen:

VN:F [1.9.20_1166]
Rating: 10.0/10 (1 vote cast)

Etiquetas: , ,

20 oct 13 (Ahora sí) Control de Raspberry a través de WhatsApp

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:

Captura de pantalla de control de electroválvula

Captura de pantalla de control de electroválvula

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

VN:F [1.9.20_1166]
Rating: 5.0/10 (1 vote cast)

Etiquetas: , , , , , ,

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: , , , , ,