Colega... ¿dónde está mi coche?

En este post voy a tratar de explicar cómo prototipar de forma muy sencilla un sistema con el que seremos capaces de monitorizar la localización de nuestro coche, bicicleta... o cualquier objeto, cosa, animal o persona siendo capaces de recibir una alerta 📳 si la localización de nuestro, de ahora en adelante, 'activo', ha sobrepasado los límites de una zona definida a nuestra propia elección.

ℹ️ La solución está basada en la red abierta y neutral para el Internet de las Cosas, The Things Network

Pero antes...os voy a contar la motivación que me ha llevado a experimentar y desarrollar este proyecto.

Curiosidad 🤔 = Motivación 💪

Veréis, en la ciudad de Gijón, recientemente varias empresas privadas de alquiler de vehículos de movilidad compartida 🚗🚲🛴 han desplegado sus servicios.

Toda una flota de bicicletas, coches y patinetes eléctricos han pasado a formar parte de nuestro día a día 'inundando' las calles, barrios y diversas zonas de la ciudad.

Y es aquí, donde la curiosidad Maker, de nuevo, entra en escena 🎬

Personalmente, como ciudadano y usuario, decidí probar alguno de estos servicios.

Dichos servicios están ligados a una aplicación móvil 📱 que te permite saber en todo momento, los activos de su flota más cercanos a tu localización 📍 GPS en tiempo real, facilitando la reserva del medio de transporte desde el dispositivo móvil y permitirte así desplazarte por la ciudad previo pago 💸 del alquiler.

Entonces, me hice la siguiente pregunta 🤔:

¿Cómo saben en todo momento la localización de los mismos?

Desconozco a nivel técnico la solución desarrollada por cada empresa, lo que está claro es que todas, han implementado una solución basada en Internet de las Cosas.

🤔💡 A grandes rasgos: seguramente, cada activo disponga de un módulo GPS que envía sus datos a través de una red de telecomunicaciones a un servidor central. Este a su vez registre la posición 📍, nivel de batería 🔋 y metadatos en una base de datos.

La aplicación móvil, sencillamente, a través de una serie de servicios y llamadas, muestra entonces los activos más cercanos a tu posición situándolos en el mapa 📍🗺️ con sus correspondientes datos.

PD: sí, más de una vez se me ha pasado por la cabeza desarmar 🛠️ uno de esos patinetes eléctricos y comprobar que lleva dentro... 😅

Fue entonces, cuando me decidí a experimentar y tratar de desarrollar una solución DIY (Do It Yourself ) basada en los mismos principios, pero para uso personal.

Ya sabes, filosofía conocida comúnmente como Juan Palomo o Hazlo Tú Mismo 👨‍🍳

🤔 Y es que... ¿por qué no desarrollar una solución libre y abierta que me permitiera conocer la localización de mi coche, bicicleta, patinete, etc?

Una solución así, abre todo un abanico de posibilidades y soluciones a nivel práctico para distintos casos de uso, sirvan de ejemplo:

  • Ser notificado, en caso de robo 🕵️‍♂️, si nuestro activo ha sobrepasado la zona en la que vivimos.
  • Imagina que tienes un familiar que tiene tendencia a desorientarse 👵👴 al salir a la calle. Se podría disponer de un sistema que notificara a algún familiar si ha sobrepasado ciertos límites alrededor de la casa o barrio en el que reside.
  • O imagina que tu mascota 🐶🐱 decide en algún momento... irse de paseo y se te escapa sin que te des cuenta.

Seguramente, tú ya estarás pensando 🧠 en alguno más que se ajuste a una necesidad que te gustaría cubrir...

Y es que de eso se trata, de dar vida a las ideas💡

Prototipando la solución 🛠️

Ahora que contamos con cierta cobertura de la red The Things Network, en ciertas ciudades, la motivación era máxima para prototipar una solución basada en el uso de esta red.

No había excusa para no hacerlo... ¡Otro caso de uso más a prototipar! 😃

⚠️A diferencia de la solución desplegada por las distintas empresas del sector privado para el alquiler de vehículos de movilidad compartida:

Cuya solución, digamos, está cerrada a sus propios servicios (como es lógico 💰💲💰) y contando con su propia red para el envío de datos (si es que disponen de una, ya que quizás utilicen la red GSM🛰️)

La solución que a continuación se desarrolla es de uso personal, para cubrir tu propia necesidad y con el ánimo de invitarte a experimentar una nueva solución del Internet de las Cosas.

Node-RED ❤️

Me declaro, una vez más, un auténtico apasionado de esta herramienta opensource.

Permite conectar dispositivos hardware, APIs y servicios en línea de forma sencilla gracias a su programación gráfica a través de un navegador. Su lógica está basada en la interconexión de flujos y eventos y además cuenta con una amplia gama de nodos para realizar distintas funciones gracias al desarrollo de la comunidad.

¿Y por qué menciono esta herramienta? Bueno, la respuesta es sencilla, la solución desarrollada está basada en la misma 😄

El esquema de la solución piloto desarrollada es el siguiente:

Aunque parezca increíble, con la configuración y programación de varios nodos, se puede lograr una solución totalmente funcional.

¿No es sorprendente? 🤩

A continuación explicaré en detalle, nodo a nodo, cómo funciona el flujo de la información a través de ellos.

Nodo MQTT: recepción de las coordenadas GPS 📡📍

Gracias a este nodo, se reciben las coordenadas GPS que nuestro dispositivo envía mediante LoRa.

Los mensajes, serán recibidos por algún o algunos de los gateways de la red TTN donde haya cobertura, permitiendo conocer así la localización 📍 en la que se encuentra nuestro activo.

💡 Como dispositivo de seguimiento, se puede utilizar cualquier nodo que cuente con GPS + módulo de radio LoRa.

ℹ️ Existen nodos comerciales...o siempre tienes la opción de hacerte tú mismo uno (ejemplo nodo desarrollado por @akirasan)
Ejemplos: TTGO T-Beam, RAK WisBlock y Heltec CubeCell GPS-6502

El nodo MQTT se ha de configurar acorde a los valores de tu cuenta TTN.

En mi caso, he creado una aplicación en la consola de TTN que decodifica los datos GPS (latitud, longitud, altitud, nivel de batería y número de satélites) enviados por el dispositivo.

Función definida en la consola de TTN para decodificar los datos GPS recibidos por el dispositivo
Ejemplo configuración nodo MQTT

En el topic wisblock_example_app/devices/+/up se reciben los datos de todos los dispositivos registrados en la aplicación.

Si sólo contaras con un dispositivo, puedes sustituir el + por el nombre específico de tu dispositivo registrado en la consola TTN.

En la configuración del servidor (🖊️) y la pestañan Connection, se ha de configurar el broker MQTT de TTN que tus aplicaciones utilicen.

Ejemplo configuración para el broker MQTT de TTN Europeo

En la pestaña Security, los campos Username y Password se han de configurar con el nombre de la aplicación creada en la consola TTN y su clave de acceso (Access Keys) respectivamente.

Configuración de los campos Username y Password
Clave de Acceso de la aplicación en TTN

Nodo función: extrayendo los datos necesarios ⚙️

Una vez se reciben los datos de las coordenadas GPS de nuestro activo, lo siguiente es quedarse únicamente con aquellos campos que nos interesan.

En nuestro caso, sabiendo la latitud y longitud, sabremos la localización GPS de nuestro activo.

Se crea, por tanto, un nuevo mensaje que contiene únicamente dichos campos y se envía al siguiente nodo.

Detalle del nodo Función donde se extraen las coordenadas GPS (Latitud y Longitud)

Nodo función: registrar las coordenadas sobre un mapa 🎯📍

Se añaden los datos necesarios al mensaje para poder ir registrando sobre un mapa, las distintas localizaciones por las que nuestro activo se vaya desplazando.

Se añaden los campos necesarios para el nodo Worldmap

El nuevo mensaje se envía al nodo worldmap. Este nodo se encargará de mostrar las localizaciones 📍 en un mapa 🗺️ acorde a los estilos definidos por el usuario en la carga útil del mensaje (icono, color, nombre...).

Ejemplo de 'tracking' de un paseo en bicicleta 🚲

Nodo Geofence: donde ocurre la magia ✨

Este maravilloso nodo desarrollado por la comunidad nos permite definir de manera visual un área circular o poligonal sobre un mapa.

node-red-node-geofence
A simple node to filter based on location

Con ello se consigue de forma sencilla filtrar las coordenadas GPS recibidas por nuestro dispositivo y discernir si este se encuentre dentro o fuera del área definida por el usuario.

Detalle de la ayuda ℹ️ del nodo Geofence

Como se aprecia en la imagen, el nodo requiere que como mensaje de entrada contenga una serie de propiedades. En este caso y gracias al nodo función anterior, se ha definido la segunda de las opciones posibles (msg.lat & msg.lon).

Como área de pruebas, al gozar de una buena cobertura de la red TTN en los alrededores del Campus Universitario de la EPI Gijón, he decidido crear un área circular que englobe a este.

💡 También existe la posibilidad de delimitar un área poligonal 📏📐
Detalle del área circular definida sobre el Campus de la EPI Gijón

El área a delimitar es editable sobre el propio mapa. Más sencillo, imposible.

Nodo Función: IN or OUT ⚙️🎯

Si te has fijado bien en la imagen de la descripción de la ayuda ℹ️ del nodo Geofence, a la salida del mismo, se añade un nuevo valor booleano al mensaje: msg.location.inarea

Gracias a este valor, sabremos si las coordenadas GPS enviadas por el dispositivo que lleva nuestro activo se encuentran dentro del área definida o por el contrario, se encuentra fuera.

Definiendo un nuevo nodo función, podremos asignar este nuevo valor (dentro o fuera) como el mensaje de salida para el siguiente nodo.

Evaluación condicional del valor booleano recibido y nueva asignación del mensaje

Nodo RBE: sólo interesa ser notificado cuando el activo se encuentra fuera de nuestros límites

El nodo RBE (Report By Exception) permite continuar el flujo de los mensajes, únicamente si el mensaje ha cambiado.

Detalle de la ayuda ℹ️ del nodo RBE

¿Qué quiere decir esto? Muy sencillo.

Si nuestro activo permanece dentro del área que hemos definido, el nodo siempre estará recibiendo 'dentro' ya que las coordenadas GPS se encuentran dentro del área circular definida.

Sin embargo, en el momento que nuestro activo se desplace a una localización que se encuentre fuera de los límites comprendidos por el área, el nodo detectará dicho cambio del valor asignado, ya que el nuevo valor asignado es 'fuera' como se definió en el anterior nodo.

Esto nos permite entonces, preparar nuestro propio sistema notificación basado en la posición GPS del activo.

No me digáis a mí que... C'est magnifique!!!

Nodos Template/Telegram: configura tu propio sistema de alerta 📲

Los siguientes 3 nodos, forman el sistema de notificación personal de nuestro activo.

Recibiremos una notificación vía Telegram, únicamente, cuando el activo ha salido/entrado del área delimitada.

Mediante 2 nodos Template, se prepara el formato del mensaje a recibir y posteriormente, el nodo Telegram Sender envía el mensaje que recibiremos en nuestro dispositivo móvil.

Configuración primer nodo Template
Configuración segundo nodo Template
💡 En este caso he decidido utilizar Telegram como servicio de notificaciones, pero podrás utilizar el que más se ajuste a tus necesidades.
Notificaciones 💬 recibidas en el Bot de Telegram

Agradecimientos, referencias y enlaces de interés:

Hilo de Twitter