Estadísticas de sistemas de Raspberry Pi

En mi casa tengo una Raspberry Pi como servidor casero, cumple tareas de broker y también la utilizo para descargar algunos archivos cuando no quiero utilizar la pc; como aun no la tengo dentro de un gabinete, me interesa monitorear la temperatura de la Raspberry para asegurarme que no tenga problemas.

La forma mas sencilla que encontré es crear un canal en thingspeak donde enviar los datos para poder verlo desde cualquier parte, en el canal definí tres campos a utilizar, siempre puedo volver y agregar uno mas: temperatura, cpu y idle (este ultimo quizás no es el más útil).

Es posible agregar mas campos si fuera necesario.

Mediante un simple script en Python recolectamos los datos del sistema de la RPI y los enviamos a ThingSpeak.

Para tomar el valor de uso de la CPU del sistema utilizo un programa llamado iostat , se instala en la RPI con:


1
sudo apt-get install iostat

Afortunadamente iostat tiene un parámetro que permite que la salida del comando sea en formato JSON lo cual hace mucho mas sencillo, si en la terminal ejecutamos:


1
iotstat -c -o JSON

Para ejecutar instrucciones del sistema desde Python importamos la libreria subprocess y lo realizamos de la siguiente manera:


1
2
3
4
5
6
import subprocess
import json
import requests

p = subprocess.Popen(['iostat','-c','-o','JSON'], stdout=subprocess.PIPE,stderr=subprocess.PIPE)
out, err = p.communicate()

Será necesario procesar out para tomar solo los valores que nos interesa:


1
2
3
4
data = json.loads(out)

system = data['sysstat']['hosts'][0]['statistics'][0]['avg-cpu']['system']
idle = data['sysstat']['hosts'][0]['statistics'][0]['avg-cpu']['idle']

Para obtener la temperatura del sistema utilizamos otro comando:


1
vcgencmd measure_temp

De igual forma que para obtener los valores de cpu realizamos


1
2
3
4
p = subprocess.Popen(['vcgencmd', 'measure_temp'], stdout=subprocess.PIPE,stderr=subprocess.PIPE)
out, err = p.communicate()

temp = out[5:9]

Por ultimo realizamos un request a ThingSpeak con los datos de los campos y nuestro api key para que actualice el canal:


1
2
3
4
apiKey = "XXXXXXXXXXX" #Replace with your own
url = "https://api.thingspeak.com/update?api_key"+apiKey+"&field1="+str(temp)+"&field2="+str(system)+"&field3="+str(idle)
r = requests.get(url)
print r.status_code

En el siguiente link pueden encontrar el programa completo

Si ejecutamos el programa vamos a informar, pero necesitaríamos programarlo para que se realice de forma periódica, para ello creamos un script bash llamado stats.sh:


1
2
#!/bin/bash
python stats1.py

Damos permisos de ejecución al script con chmod +x stats.py y agregamos la tarea a cron utilizando crontab -e y la siguiente linea:


1
*/5 * * * 0-7 /home/pi/stats.sh

Esto va a reportar los datos cada 5 minutos, si queremos alterar la frecuencia simplemente modificamos los valores de cron (dejo un link donde se explica como utilizarlo en detalle).

De esta forma tendremos la estadística del sistema de nuestra RPI en ThingSpeak

MQTT a Excel

Un inconveniente que me suelo encontrar al trabajar con sensores remotos es el hecho de monitorear las mediciones y recolectar los datos de forma sencilla. Si bien existen herramientas geniales como ThingSpeak que nos permiten ver los datos en un gráfico; muchas veces trabajamos con equipos que solo implementan un protocolo MQTT y lo necesitamos para operar.

Para ello arme un pequeño programa en Python que permite conectarse a un servidor broker, suscribirse a uno o mas tópicos del servidor e ir registrando en una planilla de cálculo os datos de estos dispositivos remotos.

Además del nombre del servidor, toma el nombre con el que se va a guardar el archivo Excel y la cantidad de registros que deseamos almacenar; si no indicamos este ultimo parámetro la librería solo tomara 10 registros.

Serán los primeros 10 que lleguen, es decir si le indicamos que se suscriba a dos tópicos: TOPIC1 y TOPIC2, y recibimos 9 mensajes de TOPIC1 y solo 1 de TOPIC2 esos serán los 10 registros que se almacenaran en la planilla.

El link al repositorio es el siguiente:
https://github.com/gsampallo/mqtt2excel

Antes de comenzar a utilizarlo será necesario tener instalado Python en la pc además de dos librerías:

1. xlwt Para el manejo de la planilla de cálculo, se instala por medio de pip:

pip install xlwt

2. paho.mqtt brinda la posibilidad de conectarnos a un servidor broker, también lo instalamos por medio de pip:

pip install paho.mqtt

Luego que se haya completado el paso anterior, podemos editar el archivo example.py para adecuarlo a nuestro uso; solo necesitamos modificar en dos puntos:


1
2
3
4
5
6
7
8
9
10
11
12
13
from MQTT2Excel import MQTT2Excel

broker_server = "AQUI INDICAMOS EL SERVIDOR BROKER"

m2e = MQTT2Excel(broker_server,"demo1.xls")

m2e.setRecordsNumber(50) #indicamos que registre 50 lecturas (la suma de todos los mensajes de los topicos)

m2e.addTopics("TOPICO1") #Indicamos el nombre del topico al que queremos suscribirnos
# Si tuvieramos mas simplemente agregamos una linea con el nombre del segundo topico
# m2e.addTopics("TOPICO2")

m2e.start()

De esta forma el programa tomara 50 lecturas y las almacenara en una planilla excel junto con la fecha y hora en que fue recibido el mensaje.

Luego simplemente es cuestion de ejecutar el programa example.py (pueden cambiarle el nombre si lo desean)

Comenzaremos a ver los datos que llegan desde el dispositivo.

Al cabo de un tiempo tendremos completos los 50 registros (salvo que cambiemos la cantidad que requerimos) y el programa se detendrá.

En ese punto ya dispondremos de nuestro archivo excel.

Como se puede apreciar es bastante sencillo de utilizar, quedan algunas cosas por pulir por ejemplo parametrizar si el servidor broker requiere un usuario y clave (aunque solo basta agregar dos lineas); y llegado el caso detectar el tipo de dato que se recibe para formatear la celda, pero no es un problema mayor en mi caso.