Monitoraggio dello stato del nostro robot aspirapolvere Xiaomi Mi Vacuum a Grafana

Se abbiamo il meraviglioso e onnipotente robot aspirapolvere Xiaomi e vuoi visualizzare i suoi dati in una dashboard Grafana, Questo è il tuo post! In esso vedremo come collegarsi all'aspirapolvere, come possiamo farti domande e ottenere tutti i tipi di dati interessanti, e poi memorizzarlo in un database MySQL che attaccheremo con Grafana per visualizzare ed elaborare queste metriche.

 

Avviato, lo más importante, vamos a utilizar una grandiosa librería que tenemos en GitHub para controlar la aspiradora o para obtener información de su estado o consumibles.

 

Comenzamos como siempre con los requisitos, lo primero y más importante será tener Python 3.5, instalado y como predeterminado, si lo estáis haciendo desde una Raspbian es posible que tengas que seguir estos pasos para instalarlo y seleccionarlo:

[Codice sorgente]sudo update-alternativesinstall /usr/bin/python python /usr/bin/python2.7 1
sudo update-alternativesinstall /usr/bin/python python /usr/bin/python3.5 2

sudo update-alternativesconfig python
python –Versione
python -m pip uninstall pip
pip install construct==2.9.31[/Codice sorgente]

 

Instalamos virtualenv, y usamos dicho directorio como entorno virtualenv, instalamos ya por fín mirobo y algunos requisitos que también necesitaremos:

[Codice sorgente]sudo pip install virtualenv
mkdir mirobo
virtualenv -p /usr/bin/python3 mirobo
cd mirobo
source bin/activate
sudo apt-get install libffi-dev libssl-dev -y
pip install python-miio[/Codice sorgente]

 

Avanzamos! ya podremos ejecutar ‘mirobo discoverpara buscar nuestra aspiradora en la red, si tenemos suerte (que no) veremos el token que necesitamos, en caso contrario tendremos que ingeniárnoslas para obtenerlo, Nel mio caso, al tener la app de Xiaomi Home instalada en mi teléfono móvil con Android, con un Explorador de archivos en el movil, iremos al path ‘/SmartHome/logs/Plug_Devicemanager/y buscaremos en ficheros en texto plano con formato AAAA-MM-DD.txt nuestro token, visualiza el fichero más reciente que lo verás fácil.

 

Y finalmente ya podremos usar sin pegas la aplicación para por ejemplo ver su estado, los consumibles, el historialpodríamos incluso controlarla y mandarla a limpiar….

[Codice sorgente]export MIROBO_IP=DIRECCION_IP_DE_LA_ASPIRADORA
export MIROBO_TOKEN=TOKEN_DE_AUTH_DE_LA_ASPIRADORA

mirobo
Stato: Caricamento
Batteria: 100 %
Fanspeed: 60 %
Cleaning since: 0:33:27
Cleaned area: 35.48

mirobo consumables
Main brush: 22:26:19 (A sinistra 11 days, 13:33:41)
Side brush: 22:26:19 (A sinistra 7 days, 9:33:41)
Filtro: 22:26:19 (A sinistra 5 days, 7:33:41)
Sensor dirty: 22:26:19 (A sinistra 7:33:41)

mirobo cleaning-history
Total clean count: 301
Cleaned for: 10 days, 18:31:57 (area: 13288.1575 )

Clean #0: 2019-06-27 17:42:06-2019-06-27 18:15:33 (complete: Vero, errore: No error)
Area cleaned: 35.48
Durata: (0:33:27)

Clean #1: 2019-06-21 21:16:55-2019-06-21 21:59:12 (complete: Vero, errore: No error)

…[/Codice sorgente]

 

Si os apetece exportar esto a una base de datos de MySQL os dejo el txurro de script que hice, por si os vale. Este script ‘chekea_aspiradora_consumibles.shse ejecuta mediante cron cada 5 verbale, y almacena en una tabla de una BD los datos que nos interesarán para luego tratarlos con Grafana, como es el estado de la aspiradora Xiaomi, el estado de la bateria, limpiezas, recorrido… :

[Codice sorgente]#! /bin/bash
cd /home/pi/mirobo
source bin/activate
export MIROBO_IP=DIRECCION_IP_DE_LA_ASPIRADORA
export MIROBO_TOKEN=TOKEN_DE_AUTH_DE_LA_ASPIRADORA

mirobo > mirobo_general.txt

estado=`cat mirobo_general.txt |grep State | aw '{Stampare $2}’`
estado=\’$estado\
bateria=`cat mirobo_general.txt |grep Battery | aw '{Stampare $2}’`
velocidad=`cat mirobo_general.txt |grep Fanspeed | aw '{Stampare $2}’`

mirobo cleaning-history > mirobo_historial.txt
limpiezas=`cat mirobo_historial.txt |grep ‘Total clean count’ | aw '{Stampare $4}’`
recorrido=`cat mirobo_historial.txt |grep ‘Cleaned for’ | aw '{Stampare $7}’`
dias=`cat mirobo_historial.txt |grep ‘Cleaned for’ | aw '{Stampare $3}’`
dias=`echo $((dias*24*60*60))`
horas=`cat mirobo_historial.txt |grep ‘Cleaned for’ | aw '{print substr($5,1,2)}’`
horas=`echo $((horas*60*60))`
minutos=`cat mirobo_historial.txt |grep ‘Cleaned for’ | aw '{print substr($5,4,2)}’`
minutos=`echo $((minutos*60))`
segundos=`cat mirobo_historial.txt |grep ‘Cleaned for’ | aw '{print substr($5,7,2)}’`

total_tiempo=$((dias+horas+minutos+segundos))
hora_desde=`cat mirobo_historial.txt |grep ‘Clean #0’ | aw '{print substr($4,1,8)}’`
hora_hasta=`cat mirobo_historial.txt |grep ‘Clean #0’ | aw '{print substr($5,1,8)}’`
hora_desde=`date -d $hora_desde +%s`
hora_hasta=`date -d $hora_hasta +%s`
tiempo_limpieza=`echo $(( hora_hasta-hora_desde ))`

metros_limpieza=`cat mirobo_historial.txt |grep ‘Area cleaned’ | aw '{Stampare $3; uscita}’`
ultima_limpieza=`cat mirobo_historial.txt |grep ‘Clean #0’ | aw '{Stampare $3, substr($4,1,8)}’`
ultima_limpieza=\’$ultima_limpieza\

mirobo -d consumables &> mirobo_consumibles.txt

##### FILTRO
linea=`cat mirobo_consumibles.txt |grep filter_work_time`
filtro_ini=`cat mirobo_consumibles.txt |grep filter_work_time | grep -b -o filter_work_time`
filtro_ini=`echo $filtro_ini | cut -d ‘:’ -f1`
filtro=`echo ${linea:$filtro_ini+19:15}| tr -dc ‘0-9’`
filtro_restante=$((540000-$filtro))

### ESCOBILLA LATERAL
linea=`cat mirobo_consumibles.txt |grep side_brush_work_time`
escobilla_lat_ini=`cat mirobo_consumibles.txt |grep side_brush_work_time | grep -b -o side_brush_work_time`
escobilla_lat_ini=`echo $escobilla_lat_ini | cut -d ‘:’ -f1`
escobilla_lat=`echo ${linea:$escobilla_lat_ini+23:15}| tr -dc ‘0-9’`
escobilla_lat_restante=$((720000-$escobilla_lat))

&Registro delle emissioni;

### SENSOR
linea=`cat mirobo_consumibles.txt |grep sensor_dirty_time`
sensor_ini=`cat mirobo_consumibles.txt |grep sensor_dirty_time | grep -b -o sensor_dirty_time`
sensor_ini=`echo $sensor_ini | cut -d ‘:’ -f1`
sensor=`echo ${linea:$sensor_ini+19:15}| tr -dc ‘0-9’`
sensor_restante=$((108000-$sensore))

### ESCOBILLA PRINCIPAL
linea=`cat mirobo_consumibles.txt |grep main_brush_work_time`
escobilla_pri_ini=`cat mirobo_consumibles.txt |grep main_brush_work_time | grep -b -o main_brush_work_time`
escobilla_pri_ini=`echo $escobilla_pri_ini | cut -d ‘:’ -f1`
escobilla_pri=`echo ${linea:$escobilla_pri_ini+23:15}| tr -dc ‘0-9’`
escobilla_pri_restante=$((1080000-$escobilla_pri))

echo "INSERT INTO aspiradora (stato,Batteria,velocità,limpiezas,recorrido,total_tiempo,tiempo_limpieza,metros_limpieza,ultima_limpieza,filtro,filtro_restante,escobilla_lat,escobilla_lat_restante,sensore,sensor_restante,escobilla_pri,escobilla_pri_restante) VALORI ($stato,$Batteria,$velocità,$limpiezas,$recorrido,$total_tiempo,$tiempo_limpieza,$metros_limpieza,$ultima_limpieza,$filtro,$filtro_restante,$escobilla_lat,$escobilla_lat_restante,$sensore,$sensor_restante,$escobilla_pri,$escobilla_pri_restante);" | mysql -uUSUARIO -pCONTRASEÑA -h IP_SERVIDOR_MYSQL BASE_DE_DATOS;[/Codice sorgente]

 

 

Os dejo un ejemplo del código que podéis utilizar en MySQL para crear esta tabla llamada ‘aspiradora’ con 18 campos donde iremos almacenando todo lo que nos escupe el script anterior. Podremos así almacenar toda esta info interesante y más tarde explotarla con Grafana!

[Codice sorgente]CREATE TABLE `aspiradora` (
'status' CHAR(20) NULL DEFAULT NULL,
`bateria` FLOAT NULL DEFAULT NULL,
`velocidad` FLOAT NULL DEFAULT NULL,
`limpiezas` FLOAT NULL DEFAULT NULL,
`recorrido` FLOAT NULL DEFAULT NULL,
`total_tiempo` FLOAT NULL DEFAULT NULL,
`tiempo_limpieza` FLOAT NULL DEFAULT NULL,
`metros_limpieza` FLOAT NULL DEFAULT NULL,
`ultima_limpieza` DATETIME NULL DEFAULT NULL,
`filtro` FLOAT NULL DEFAULT NULL,
`filtro_restante` FLOAT NULL DEFAULT NULL,
`escobilla_lat` FLOAT NULL DEFAULT NULL,
`escobilla_lat_restante` FLOAT NULL DEFAULT NULL,
`sensor` FLOAT NULL DEFAULT NULL,
`sensor_restante` FLOAT NULL DEFAULT NULL,
`escobilla_pri` FLOAT NULL DEFAULT NULL,
`escobilla_pri_restante` FLOAT NULL DEFAULT NULL,
'date' TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP
)
COLLATE='utf8mb4_general_ci’
ENGINE=InnoDB;[/Codice sorgente]

 

E niente, come al solito, ya con datos en la BD, podremos en Grafana crear un DataSource contra esa base de datos de MySQL y comenzar creando nuestro Dashboard al que le añadiremos algunos paneles, os dejo estos de ejemplo y las queries que utilicé para obtener dichos datos:

  • Escobilla principal:

[Codice sorgente]SELECT escobilla_pri_restante FROM aspiradora ORDER BY fecha DESC LIMIT 1[/Codice sorgente]

  • Escobilla lateral:

[Codice sorgente]SELECT escobilla_lat_restante FROM aspiradora ORDER BY fecha DESC LIMIT 1[/Codice sorgente]

  • Filtro:

[Codice sorgente]SELECT filtro_restante FROM aspiradora ORDER BY fecha DESC LIMIT 1[/Codice sorgente]

  • Limpiar sensores:

[Codice sorgente]SELECT sensor_restante FROM aspiradora ORDER BY fecha DESC LIMIT 1[/Codice sorgente]

  • Última limpieza:

[Codice sorgente]SELEZIONA timestamp(DATE_FORMAT(ultima_limpieza, '%Y/%m/%d %H:%io:%s’)) as time_sec FROM aspiradora ORDER BY fecha DESC LIMIT 1[/Codice sorgente]

  • Limpiando (dependerá del tiempo seleccionado dirá el tiempo que estuvo aspirando), yo lo multiplico x 5 ya que en mi cron lo ejecuto cada 5 verbale:

[Codice sorgente]SELEZIONARE (COUNT(*) * 5) FROM aspiradora WHERE estado = ‘Cleaningand $__timeFilter(dattero)[/Codice sorgente]

  • Limpiezas totales:

[Codice sorgente]SELECT limpiezas FROM aspiradora ORDER BY fecha DESC LIMIT 1[/Codice sorgente]

  • Total distancia recorrida:

[Codice sorgente]SELECT recorrido FROM aspiradora ORDER BY fecha DESC LIMIT 1[/Codice sorgente]

  • Total limpiando:

[Codice sorgente]SELECT total_tiempo FROM aspiradora ORDER BY fecha DESC LIMIT 1[/Codice sorgente]

  • Y en la gráfica se muestran 2 imbottire, (io) los metros cuadrados limpiados y (Ii) el tiempo dedicado, mediante estas 2 selects distintas:

[Codice sorgente]SELEZIONA UNIX_TIMESTAMP(ultima_limpieza) Quindi time_sec, metros_limpieza as value, "Metros" as metric FROM aspiradora WHERE $__timeFilter(ultima_limpieza) ORDER BY ultima_limpieza, time_sec ASC[/Codice sorgente]

[Codice sorgente]SELEZIONA UNIX_TIMESTAMP(ultima_limpieza) Quindi time_sec, tiempo_limpieza as value, "Tempo" as metric FROM aspiradora WHERE $__timeFilter(ultima_limpieza) ORDER BY ultima_limpieza, time_sec ASC[/Codice sorgente]

 

Bene, espero os resulte interesante, otro cacharro más controlado y exprimido! Come vediamo, con Grafana y la combinación de múltiples productos podemos ir haciendo nuestro hogar más inteligente, donde tengamos paneles de control, Il solito, Spero che tu l'abbia trovato interessante!

 

Post consigliati

Autore

nheobug@bujarra.com
Autor del blog Bujarra.com Cualquier necesidad que tengas, Non esitate a contattarmi, Cercherò di aiutarti ogni volta che potrò, Condividere è vivere ;) . Goditi i documenti!!!