Guardar valores recibidos por mqtt en un archivo de texto (Linux)

Objetivo: Vamos a realizar un script sencillo para almacenar los datos que se van recibiendo cuando estamos conectados a un broker mqtt.

Requisitos:

Tener instalado mosquitto en Linux:

En caso de Ubuntu, linux Mint y raspberry pi:

sudo apt-get update ; sudo apt-get install mosquitto mosquitto-clients python-mosquitto

Para Openwrt:

opkg-update ; opkg install mosquitto mosquitto-client libmosquitto

Este script lo ejecutaremos en background e irá almacenando todos los valores que publica un sensor en un topic concreto. Lo almacenaremos todo en un archivo de texto junto a un valor de timestamp que recogerá la fecha y hora en la que leemos cada valor.

captura-mqtt
Los valores que almacenará el script tendrán el siguiente formato:

Timestamp, valor_recibido
 1467719582,84.2
 1467719584,86.0
 1467719585,84.2
 1467719587,82.4
 1467719588,84.2
 1467719590,84.2
 1467719598,84.2
 1467719599,84.2
 1467719602,84.2
 1467719602,84.2
 1467719605,82.4

en nuestro caso guarda la fecha en formato Unix. Para guardarlo de otra manera sólo tenemos que cambiar el formato en la variable ts.

En el siguiente enlace se muestran ejemplos de formatos para fechas en Linux.

http://www.cyberciti.biz/faq/linux-unix-formatting-dates-for-display/

Podríamos cambiar la línea:

ts=$(date +%s)

por

ts=$(date "+%Y-%m-%d %H:%M:%S")

Los valores almacenados con el cambio anterior tendrán el siguiente formato:

...
2016-07-05 15:07:26,87.8
2016-07-05 15:07:28,87.8
...

A continuación el script

El script será el siguiente:

#!/bin/bash
# Con openwrt debemos cambiar lo anterior por #!/bin/sh
# Configuración del broker y topic a escuchar.
# Cambiar por valores propios las siguientes variables:
broker="test.mosquitto.org" 
port="1883"
topic="temperature/inside"
archivo="$HOME/valores.dat"
#------------------------------------
#Ponemos el cliente de mosquitto escuchando
mosquitto_sub -t $topic -h $broker -p $port | while read value; do
ts=$(date +%s) # Guardamos la fecha y hora actual en una variable.
# Guardamos valores uno detrás de otro:
echo "$ts,$value" >> $archivo
done

Guardamos y le damos permisos de ejecución:

chmod +x guarda.sh

Ejecutamos el script:

./guarda.sh

Testear el script

Para probar este script vamos a utilizar un broker público para realizar pruebas que es test.mosquitto.org. En este broker hay muchas personas realizando pruebas por lo que podemos utilizarlo para guardar lo que otros están enviando.

Vamos a suscribirnos a dicho broker por línea de comandos con la orden:

mosquitto_sub -h test.mosquitto.org -t "#" -v

Nos devolverá un montón de valores ya que estamos viendo en tiempo real todo lo que la gente está publicando. Pulsaremos CTRL+C para pararlo.

A continuación vemos una porción de lo que me ha devuelto a mi en color rojo vemos el topic utilizado por otros dispositivos:

...
ssjh/sensor/4/device/11/reading 289
ssjh/sensor/4/reading 289
ssjh/readings/device/11/sensor/4/reading 289
ssjh/readings/sensor/4/device/11/reading 289
mqtt/feedback/esp/builtin/led 0
temperature/board 96.44
Light/Level 765
temperature/soil 75.56
revspace/sensors/temperature/2/2 22.25 °C
smartflat/arduino/1/room/1/temperature/status 22
smartflat/arduino/1/room/1/humidity/status 37
smartflat/arduino/1/room/2/temperature/status 23
smartflat/arduino/1/room/2/CO/status 1021
...

A continuación probamos a ver sólo lo que se envía en un topic. En nuestro caso vamos a hacerlo con uno de ellos que es temperature/board (Atención los topics distinguen entre minúsculas y mayúsculas).

mosquitto_sub -h test.mosquitto.org -t "temperature/board" -v

me devuelve:

temperature/board 96.98
temperature/board 97.7
temperature/board 96.98
temperature/board 96.98
temperature/board 96.98
temperature/board 96.98
...

Con esto he comprobado que se actualiza regularmente. En mi caso aproximadamente cada segundo.

Edito el script y cambio el topic por el que me interesa y lo pruebo.

Lo ejecuto y lo dejo un rato funcionando. Los valores me los guardará en el archivo valores.dat dentro del directorio home del usuario que está ejecutando el script.

Ejecutar en background

Para ejecutar en background lo ejecutaremos de la siguiente manera:

./guarda.sh&

 

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *