Gure Xiaomi Mi Vacuum iragazlearen egoera Grafana-n monitorizatzea

Si tenemos el maravilloso y todo poderoso robot aspirador de Xiaomi y te apetece visualizar sus datos en un dashboard de Grafana, este es tu post! En él veremos cómo conectarnos al aspirador, cómo podremos hacerle consultas y obtener todo tipo de dato interesante, y luego almacenarlo en una base de datos de MySQL que atacaremos con Grafana para visualizar y tratar estas métricas.

 

Empezamos, garrantzitsuena, erabiliko dugu dugun liburutegi bikaina GitHub aspiradorea kontrolatzeko edo bere egoera edo kontsumigarriak lortzeko.

 

Bete gara beti bezala beharrezkoekin, lehena eta garrantzitsuena Python izatea izango da 3.5, instalatuta eta lehenespen bezala, Raspbian batetik egiten ari bazarete, agian urrats hauek jarraitu behar dituzue instalatu eta hautatzeko:

[sourcecode]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 –version
python -m pip uninstall pip
pip install construct==2.9.31[/sourcecode]

 

Instalatzen dugu virtualenv, eta direktorio hori erabiltzen dugu virtualenv ingurunetzat, akasgabe instalatzen dugu mirobo eta beharrezko bestelako batzuk:

[sourcecode]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[/sourcecode]

 

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, en mi 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 historial… guk baita kontrolatu eta garbitzera bidal dezakegu….

[sourcecode]export MIROBO_IP=ASPIRADOREAREN_IP_HELBIDEA
export MIROBO_TOKEN=ASPIRADOREAREN_AUTH_TOKEN

mirobo
Egoera: Kargatzen
Bateria: 100 %
Hautsiaren abiadura: 60 %
Garbitzen hasi da: 0:33:27
Garbitutako eremua: 35.48 m²

mirobo kontsumigarriak
Ardatz nagusia: 22:26:19 (left 11 egun, 13:33:41)
Altxoko eskuila: 22:26:19 (left 7 egun, 9:33:41)
Iragazkia: 22:26:19 (left 5 egun, 7:33:41)
Zentzumenean zikina: 22:26:19 (left 7:33:41)

mirobo garbiketa-historia
Garbiketa kopuru osoa: 301
Garbitu den denbora: 10 egun, 18:31:57 (eremua: 13288.1575 m²)

Garbitu #0: 2019-06-27 17:42:06-2019-06-27 18:15:33 (osatua: Egiazko, errorea: Ez da errorea)
Garbiketa eremua: 35.48 m²
Iraupena: (0:33:27)

Garbitu #1: 2019-06-21 21:16:55-2019-06-21 21:59:12 (osatua: Egiazko, errorea: Ez da errorea)

…[/sourcecode]

 

MySQL datu-base batera esportatu nahi baduzue, hemen utziko dizuet script txurroa egin nuena, balio badizu. Script honek ‘chekea_aspiradora_consumibles.sh’ cron bidez exekutatzen da egunero 5 minutu, eta BD bateko taula batean datuak gordetzen ditu, gero Grafanarekin tratatzeko interesgarriak direnak, Xiaomi aspiradorearen egoera nola den, bateriaren egoera, garbiketak, ibilbidea… :

[sourcecode]#! /bin/bash
cd /home/pi/mirobo
source bin/activate
export MIROBO_IP=ASPIRADOREAREN_IP_HELBIDEA
export MIROBO_TOKEN=ASPIRADOREAREN_AUTH_TOKEN

mirobo > mirobo_general.txt

egoera=`cat mirobo_general.txt |grep Egoera | awk ‘{inprimatu $2}’`
estado=\’$estado\
bateria=`cat mirobo_general.txt |grep Battery | awk ‘{inprimatu $2}’`
velocidad=`cat mirobo_general.txt |grep Fanspeed | awk ‘{inprimatu $2}’`

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

total_tiempo=$((dias+horas+minutos+segundos))
hora_desde=`cat mirobo_historial.txt |grep ‘Clean #0’ | awk ‘{print substr($4,1,8)}’`
hora_hasta=`cat mirobo_historial.txt |grep ‘Clean #0’ | awk ‘{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’ | awk ‘{inprimatu $3; exit}’`
ultima_limpieza=`cat mirobo_historial.txt |grep ‘Clean #0’ | awk ‘{inprimatu $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))

 

### 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-$sensor))

### 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 (estado,bateria,velocidad,garbiketak,ibilbidea,total_tiempo,tiempo_limpieza,metros_limpieza,ultima_limpieza,filtro,filtro_restante,escobilla_lat,escobilla_lat_restante,sensor,sensor_restante,escobilla_pri,escobilla_pri_restante) BALIOAK ($estado,$bateria,$velocidad,$garbiketak,$ibilbidea,$total_tiempo,$tiempo_limpieza,$metros_limpieza,$ultima_limpieza,$filtro,$filtro_restante,$escobilla_lat,$escobilla_lat_restante,$sensor,$sensor_restante,$escobilla_pri,$escobilla_pri_restante);" | mysql -uUSUARIO -pCONTRASEÑA -h IP_SERVIDOR_MYSQL BASE_DE_DATOS;[/sourcecode]

 

 

Adierazten dizuet MySQL-en erabil dezakezuen kode adibide bat 'aspiradora' izeneko taula hau sortzeko’ con 18 eremuak non aurreko scriptak ematen digun guztia gordeko dugun. Modu honetan informazio interesgarri hau guztia gorde ahal izango dugu eta gero Grafana-rekin aztertu!

[sourcecode]CREATE TABLE `aspiradora` (
`estado` 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,
'fecha' TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP
)
COLLATE=’utf8mb4_general_ci
ENGINE=InnoDB;[/sourcecode]

 

Eta ezer, como siempre, 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:

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

  • Escobilla lateral:

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

  • Filtro:

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

  • Limpiar sensores:

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

  • Última limpieza:

[sourcecode]SELECT timestamp(DATE_FORMAT(ultima_limpieza, ‘%Y/%m/%d %H:%i:%s’)) as time_sec FROM aspiradora ORDER BY fecha DESC LIMIT 1[/sourcecode]

  • 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 minutu:

[sourcecode]SELECT (COUNT(*) * 5) FROM aspiradora WHERE estado = ‘Cleaningand $__timeFilter(fecha)[/sourcecode]

  • Limpiezas totales:

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

  • Total distancia recorrida:

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

  • Total limpiando:

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

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

[sourcecode]SELECT UNIX_TIMESTAMP(ultima_limpieza) time_sec gisa, metros_limpieza as value, "Metros" as metric FROM aspiradora WHERE $__timeFilter(ultima_limpieza) ORDER BY ultima_limpieza, time_sec ASC[/sourcecode]

[sourcecode]SELECT UNIX_TIMESTAMP(ultima_limpieza) time_sec gisa, tiempo_limpieza as value, "Tiempo" as metric FROM aspiradora WHERE $__timeFilter(ultima_limpieza) ORDER BY ultima_limpieza, time_sec ASC[/sourcecode]

 

Onena, espero os resulte interesante, otro cacharro más controlado y exprimido! como vemos, con Grafana y la combinación de múltiples productos podemos ir haciendo nuestro hogar más inteligente, donde tengamos paneles de control, Beti bezalaxe, espero dut interesgarria iruditu zaizuela!

 

Izenburuko mezuak

Egilea

nheobug@bujarra.com
Autor del blog Bujarra.com Cualquier necesidad que tengas, ez zalantzarik izan nirekin harremanetan jartzeko, ahal duzun guztietan laguntzen saiatuko naiz, partekatu ahal dudan guztietan ;) . Dokumentuez gozatu!!!