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.
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&