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, la cosa più importante, useremo una fantastica libreria che abbiamo GitHub per controllare l'aspirapolvere o per ottenere informazioni sul suo stato o sui consumabili.
Iniziamo come sempre con i requisiti, la prima e più importante cosa sarà avere Python 3.5, installato e come predefinito, se lo state facendo da una Raspbian è possibile che dobbiate seguire questi passaggi per installarlo e selezionarlo:
[Codice sorgente]sudo update-alternatives –install /usr/bin/python python /usr/bin/python2.7 1
sudo update-alternatives –install /usr/bin/python python /usr/bin/python3.5 2
sudo update-alternatives –config python
python –Versione
python -m pip uninstall pip
pip install construct==2.9.31[/Codice sorgente]
Installiamo virtualenv, e usiamo questa directory come ambiente virtualenv, installiamo finalmente mirobo e alcuni requisiti che ci serviranno anche:
[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 discover’ para cercare nuestra aspiradora en la red, si tenemos suerte (que no) veremos el token que necessitamos, in caso contrario tendremos que ingeniárnoslas para obtenerlo, Nel mio caso, al tener l'app de Xiaomi Home installada in 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 historial… podrí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 m²
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 m²)
Clean #0: 2019-06-27 17:42:06-2019-06-27 18:15:33 (complete: Vero, errore: No error)
Area cleaned: 35.48 m²
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.sh’ se 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]
Vi lascio un esempio del codice che potete usare in MySQL per creare questa tabella chiamata ‘aspiradora’ con 18 campi dove andremo memorizzando tutto ciò che ci restituisce lo script precedente. Potremo così memorizzare tutte queste informazioni interessanti e successivamente sfruttarle con Grafana!
[Codice sorgente]CREATE TABLE `aspiradora` (
'status' CHAR(20) NULL DEFAULT NULL,
`bateria` FLOAT NULL DEFAULT NULL,
`velocità` FLOAT NULL DEFAULT NULL,
`pulizie` FLOAT NULL DEFAULT NULL,
`percorso` 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]SELECCIONAR escobilla_pri_restante DA aspiradora ORDENAR POR fecha DESC LÍMITE 1[/Codice sorgente]
- Scobilla laterale:
[Codice sorgente]SELECCIONAR escobilla_lat_restante DA aspiradora ORDENAR POR fecha DESC LÍMITE 1[/Codice sorgente]
- Filtro:
[Codice sorgente]SELECCIONAR filtro_restante DA aspiradora ORDENAR POR fecha DESC LÍMITE 1[/Codice sorgente]
- Pulire sensori:
[Codice sorgente]SELECCIONAR sensor_restante DA aspiradora ORDENAR POR fecha DESC LÍMITE 1[/Codice sorgente]
- Ultima pulizia:
[Codice sorgente]SELEZIONA timestamp(DATE_FORMAT(ultima_limpieza, '%Y/%m/%d %H:%io:%s’)) come time_sec DA aspiradora ORDENAR POR fecha DESC LÍMITE 1[/Codice sorgente]
- Pulendo (dipenderà dal tempo selezionato dirà il tempo che ha aspirato), io lo moltiplico x 5 dato che nel mio cron lo eseguo ogni 5 verbale:
[Codice sorgente]SELEZIONARE (COUNT(*) * 5) DA aspiradora DOVE stato = 'Cleaning'’ e $__timeFilter(dattero)[/Codice sorgente]
- Pulizie totali:
[Codice sorgente]SELECCIONAR limpiezas DA aspiradora ORDENAR POR fecha DESC LÍMITE 1[/Codice sorgente]
- Distanza totale percorsa:
[Codice sorgente]SELECCIONAR recorrido DA aspiradora ORDENAR POR fecha DESC LÍMITE 1[/Codice sorgente]
- Totale pulendo:
[Codice sorgente]SELECCIONAR total_tiempo DA aspiradora ORDENAR POR fecha DESC LÍMITE 1[/Codice sorgente]
- E nel grafico vengono mostrati 2 imbottire, (io) i metri quadrati puliti e (Ii) il tempo dedicato, attraverso questi 2 selezioni diverse:
[Codice sorgente]SELEZIONA UNIX_TIMESTAMP(ultima_limpieza) Quindi time_sec, metri_pulizia come valore, "Metros" come metrica DA aspirapolvere DOVE $__timeFilter(ultima_limpieza) ORDINA PER ultima_pulizia, time_sec ASC[/Codice sorgente]
[Codice sorgente]SELEZIONA UNIX_TIMESTAMP(ultima_limpieza) Quindi time_sec, tempo_pulizia come valore, "Tiempo" come metrica DA aspirapolvere DOVE $__timeFilter(ultima_limpieza) ORDINA PER ultima_pulizia, time_sec ASC[/Codice sorgente]
Bene, spero vi risulti interessante, un altro aggeggio più controllato e sfruttato! Come vediamo, con Grafana e la combinazione di più prodotti possiamo rendere la nostra casa più intelligente, dove abbiamo pannelli di controllo, Il solito, Spero che tu l'abbia trovato interessante!











































