
Monitoritzant l'estat del nostre robot aspirador Xiaomi Mi Vacuum a Grafana
Si tenim el marrec i tot poderós robot aspirador de Xiaomi i t'agrada visualitzar les seves dades en un dashboard de Grafana, aquest és el teu post! Hi veurem com connectar-nos a l'aspirador, com podrem fer-li consultes i obtenir tota mena de dada interessant, i després emmagatzemar-lo en una base de dades de MySQL que atacarem amb Grafana per visualitzar i tractar aquestes mètriques.
Comencem, el més important, vam utilitzar una grandiosa llibreria que tenim en GitHub per controlar l' aspiradora o per obtenir informació del seu estat o consumibles.
Comencem com sempre amb els requisits, el primer i més important serà tenir Python 3.5, instal·lat i com a predeterminat, si ho estàs fent des d'una Raspbian és possible que hagis de seguir aquests passos per instal·lar-lo i seleccionar-lo:
[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]
Instal·lem virtualenv, i fem servir aquest directori com a entorn virtualenv, instal·lem ja per fíngia i alguns requisits que també necessitarem:
[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]
Avancem! ja podrem executar 'mirobo discover’ per buscar la nostra aspiradora a la xarxa, si tenim sort (que no) veurem el token que necessitem, en cas contrari haurem d'engijar-nos-les per obtenir-lo, en el meu cas, en tenir l'app de Xiaomi Home instal·lada al meu telèfon mòbil amb Android, amb un Explorador d'arxius al mobilitzador, anirem al path '/SmartHome/logs/Plug_Devicemanager/’ i buscarem en fitxers en text pla amb format AAAA-MM-DD.txt el nostre token, visualitza el fitxer més recent que ho veuràs fàcil.
I finalment ja podrem fer servir sense pegues l'aplicació per exemple veure el seu estat, els consumibles, l' historial… podríem fins i tot controlar-la i manar-la a netejar….
[sourcecode]export MIROBO_IP = DIRECCION_IP_DE_LA_ASPIRADORA
export MIROBO_TOKEN = TOKEN_DE_AUTH_DE_LA_ASPIRADORA
mirobo
State: Charging
Bateria: 100 %
Fanspeed: 60 %
Cleaning since: 0:33:27
Cleaned area: 35.48 m ²
mirobus consumables
Main brush: 22:26:19 (left 11 days, 13:33:41)
Side brush: 22:26:19 (left 7 days, 9:33:41)
Filter: 22:26:19 (left 5 days, 7:33:41)
Sensor dirty: 22:26:19 (left 7:33:41)
mirobo cleaning-history
Total clean count: 301
Cleaned for: 10 days, 18:31:57 (àrea: 13288.1575 m ²)
Clean #0: 2019-06-27 17:42:06-2019-06-27 18:15:33 (complete: True, error: No error)
Area cleaned: 35.48 m ²
Duration: (0:33:27)
Clean #1: 2019-06-21 21:16:55-2019-06-21 21:59:12 (complete: True, error: No error)
…[/sourcecode]
Si us plau exportar això a una base de dades de MySQL us deixo el txurro de script que hi ha, per si us val. Aquest script 'chekea_aspiradora_consumibles.sh’ s' executa mitjançant cron cada 5 minuts, i emmagatzema en una taula d'una BD les dades que ens interessaran per després tractar-les amb Grafana, com és l'estat de l'aspiradora Xiaomi, l'estat de la bateria, neteges, recorregut… :
[sourcecode]#! /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
estat ='cat mirobo_general.txt |grep State | awk '{print $2}’`
estat ='$estado’
bateria=`cat mirobo_general.txt |grep Battery | awk '{print $2}’`
velocidad=`cat mirobo_general.txt |grep Fanspeed | awk '{print $2}’`
mirobo cleaning-history > mirobo_historial.txt
limpiezas=`cat mirobo_historial.txt |grep ‘Total clean count’ | awk '{print $4}’`
recorrido=`cat mirobo_historial.txt |grep ‘Cleaned for’ | awk '{print $7}’`
dias=`cat mirobo_historial.txt |grep ‘Cleaned for’ | awk '{print $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 '{print $3; exit}’`
ultima_limpieza=`cat mirobo_historial.txt |grep ‘Clean #0’ | awk '{print $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 (estat,bateria,velocitat,neteges,recorregut,total_tiempo,tiempo_limpieza,metros_limpieza,ultima_limpieza,filtro,filtro_restante,escobilla_lat,escobilla_lat_restante,sensor,sensor_restante,escobilla_pri,escobilla_pri_restante) VALUES ($estat,$bateria,$velocitat,$neteges,$recorregut,$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 -uUSUARI -pCONTRASENYA -h IP_SERVIDOR_MYSQL BASE_DE_DATOS;[/sourcecode]
Us deixo un exemple del codi que podeu utilitzar a MySQL per crear aquesta taula anomenada 'aspiradora’ amb 18 camps on anirem emmagatzemant tot el que ens escup l'script anterior. Podrem així emmagatzemar tota aquesta info interessant i més tard explotar-la amb Grafana!
[sourcecode]CREATE TABLE 'aspiradora' (
'estat' 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 PER DEFECTE NULL,
'tiempo_limpieza' FLOAT NULL PER DEFECTE NULL,
'metros_limpieza' FLOAT NULL PER DEFECTE NULL,
'ultima_limpieza' DATETIME NULL PER DEFECTE NULL,
'filtro' FLOAT NULL DEFAULT NULL,
'filtro_restante' FLOAT NULL PER DEFECTE NULL,
'escobilla_lat' FLOAT NULL PER DEFECTE NULL,
'escobilla_lat_restante' FLOAT NULL PER DEFECTE NULL,
'sensor' FLOAT NULL PER DEFECTE NULL,
'sensor_restante' FLOAT NULL PER DEFECTE NULL,
'escobilla_pri' FLOAT NULL PER DEFECTE NULL,
'escobilla_pri_restante' FLOAT NULL PER DEFECTE NULL,
'fecha' TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP
)
COLLATE='utf8mb4_general_ci’
ENGINE = InnoDB;[/sourcecode]
I res, com sempre, ja amb dades en la BD, podrem a Grafana crear un DataSource contra aquesta base de dades de MySQL i començar creant el nostre Dashboard al qual li afegirem alguns panells, us deixo aquests d'exemple i les que utilitzo per obtenir aquestes dades:
- Escobilla principal:
[sourcecode]SELECT escobilla_pri_restante FROM aspiradora ORDER BY data DESC LIMIT 1[/sourcecode]
- Escobilla lateral:
[sourcecode]SELECT escobilla_lat_restante FROM aspiradora ORDER BY data DESC LIMIT 1[/sourcecode]
- Filtre:
[sourcecode]SELECT filtro_restante FROM aspiradora ORDER BY data DESC LIMIT 1[/sourcecode]
- Netejar sensors:
[sourcecode]SELECT sensor_restante FROM aspiradora ORDER BY data DESC LIMIT 1[/sourcecode]
- Última neteja:
[sourcecode]SELECT timestamp(DATE_FORMAT(ultima_limpieza, '%Y/%m/%d %H:%i:%s’)) as time_sec FROM aspiradora ORDER BY data DESC LIMIT 1[/sourcecode]
- Netejant (dependrà del temps seleccionat dirà el temps que va estar aspirant), jo el multiplico x 5 ja que en el meu cron l'executo cada 5 minuts:
[sourcecode]SELECT (COUNT(*) * 5) FROM aspiradora WHERE estat = 'Cleaning’ and $__timeFilter(data)[/sourcecode]
- Neteges totals:
[sourcecode]SELECT netejades FROM aspiradora ORDER BY data DESC LIMIT 1[/sourcecode]
- Total distància recorreguda:
[sourcecode]SELECT recorregut FROM aspiradora ORDER BY data DESC LIMIT 1[/sourcecode]
- Total netejant:
[sourcecode]SELECT total_tiempo FROM aspiradora ORDER BY data DESC LIMIT 1[/sourcecode]
- I en la gràfica es mostren 2 coses, (i) els metres quadrats netejats i (ii) el temps dedicat, mitjançant aquestes 2 selects diferents:
[sourcecode]SELECT UNIX_TIMESTAMP(ultima_limpieza) as time_sec, metros_limpieza as value, "Metres" as metric FROM aspiradora WHERE $__timeFilter(ultima_limpieza) ORDER BY ultima_limpieza, time_sec ASC[/sourcecode]
[sourcecode]SELECT UNIX_TIMESTAMP(ultima_limpieza) as time_sec, tiempo_limpieza as value, "Temps" as metric FROM aspiradora WHERE $__timeFilter(ultima_limpieza) ORDER BY ultima_limpieza, time_sec ASC[/sourcecode]
Bo, espero us resulti interessant, un altre caixet més controlat i exprimit! com veiem, amb Grafana i la combinació de múltiples productes podem anar fent la nostra llar més intel·ligent, on tinguem panells de control, el de sempre, espero us hagi semblat interessant!