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

Sistema de riego sencilla: timelapse

Siempre me gustaron los timelapse, en especial cuando se trata de algún proceso natural donde vemos crecer algo, es por ello que decidí capturar imágenes durante el tiempo que tarde en crecer las lechugas.

Una imagen tomada hoy. La cámara esta fuera de fecha.

Para lograr esto voy a utilizar una cámara ip que compre en Aliexpress hace un tiempo, que utiliza un protocolo llamada RTSP para transmitir video en tiempo real.

Hace un tiempo había armado un video de como capturar imagen de la cámara ip utilizando Python, pueden verlo aquí:

El repositorio del código del ejemplo lo pueden encontrar:
https://github.com/gsampallo/ipcam_python

El mayor problema que tuve en esto fue lograr instalar opencv en la raspberry, si bien existen numerosos tutoriales en internet no quería descargar de cero y tener que compilarlo; opté por instalar la versión para python3 (junto con python3) por medio de apt, más adelante hablara más sobre este tema.

Esta es una primer aproximación, donde arme un pequeño script -llamado creativamente camara.py- que toma las imágenes de la cámara y lo guarda en formato png; las imágenes pesan alrededor de 2mb, será necesario más adelante preparar alguna otra tarea para que comprima las imágenes.

Usando cron se dejo programado en la raspberry (donde corre el script) para que ejecute la captura de imágenes cada 20 minutos; también hay un segundo script en bash que copia las imágenes a una carpeta especifica, las sube a un servidor ftp (para liberar espacio en la raspberry) y luego las elimina.

Cuando tenga imágenes de algunos días, voy a armar un pequeño timelapse de como avanza el proyecto, por lo pronto no queda más que esperar.

UPDATE

La página esta online, pueden verla acá:

https://gsampallo.com/riego/

La imagen se actualiza cada 5′, aún no corregí la fecha de la cámara.