Monitorando o status do nosso aspirador de pó robô Xiaomi Mi Vacuum no Grafana
Se temos o maravilhoso e todo-poderoso aspirador robô Xiaomi e você quer visualizar seus dados em um painel Grafana, Esta é a sua postagem! Nele vamos ver como se conectar ao aspirador, como podemos fazer-lhe perguntas e obter todos os tipos de dados interessantes, e, em seguida, armazená-lo em um banco de dados MySQL que atacaremos com o Grafana para visualizar e processar essas métricas.
Começou, o mais importante, vamos utilizar uma ótima biblioteca que temos em GitHub para controlar o aspirador ou para obter informação sobre o seu estado ou consumíveis.
Começamos como sempre com os requisitos, o primeiro e mais importante será ter o Python 3.5, instalado e como predefinido, se estiverem a fazê-lo a partir de um Raspbian é possível que tenham de seguir estes passos para instalar e selecionar:
[Código-fonte]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 –Versão
python -m pip uninstall pip
pip install construct==2.9.31[/Código-fonte]
Instalamos virtualenv, e usamos esse diretório como ambiente virtualenv, instalamos finalmente mirobo e alguns requisitos que também precisaremos:
[Código-fonte]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[/Código-fonte]
Avanzamos! ya podremos ejecutar ‘mirobo discover’ para buscar nuestra aspiradora en la red, si tenemos suerte (que não) veremos el token que necesitamos, en caso contrario tendremos que ingeniárnoslas para obtenerlo, No meu 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… podríamos incluso controlarla y mandarla a limpiar….
[Código-fonte]export MIROBO_IP=DIRECCION_IP_DE_LA_ASPIRADORA
export MIROBO_TOKEN=TOKEN_DE_AUTH_DE_LA_ASPIRADORA
mirobo
Estado: Carregamento
Battery: 100 %
Fanspeed: 60 %
Cleaning since: 0:33:27
Cleaned area: 35.48 m²
mirobo consumables
Main brush: 22:26:19 (Esquerda 11 Dias, 13:33:41)
Side brush: 22:26:19 (Esquerda 7 Dias, 9:33:41)
Filtro: 22:26:19 (Esquerda 5 Dias, 7:33:41)
Sensor dirty: 22:26:19 (Esquerda 7:33:41)
mirobo cleaning-history
Total clean count: 301
Cleaned for: 10 Dias, 18:31:57 (area: 13288.1575 m²)
Clean #0: 2019-06-27 17:42:06-2019-06-27 18:15:33 (complete: Verdadeiro, erro: No error)
Area cleaned: 35.48 m²
Duração: (0:33:27)
Clean #1: 2019-06-21 21:16:55-2019-06-21 21:59:12 (complete: Verdadeiro, erro: No error)
…[/Código-fonte]
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 ata, 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… :
[Código-fonte]#! /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 »{imprimir $2}’`
estado=\’$estado\’
bateria=`cat mirobo_general.txt |grep Battery | aw »{imprimir $2}’`
velocidad=`cat mirobo_general.txt |grep Fanspeed | aw »{imprimir $2}’`
mirobo cleaning-history > mirobo_historial.txt
limpiezas=`cat mirobo_historial.txt |grep ‘Total clean count’ | aw »{imprimir $4}’`
recorrido=`cat mirobo_historial.txt |grep ‘Cleaned for’ | aw »{imprimir $7}’`
dias=`cat mirobo_historial.txt |grep ‘Cleaned for’ | aw »{imprimir $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 »{imprimir $3; sair}’`
ultima_limpieza=`cat mirobo_historial.txt |grep ‘Clean #0’ | aw »{imprimir $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`
escovilha_pri_ini=`echo $escovilha_pri_ini | cut -d ‘:’ -f1`
escovilha_pri=`echo ${linea:$escovilha_pri_ini+23:15}| tr -dc ‘0-9’`
escovilha_pri_restante=$((1080000-$escovilha_pri))
echo "INSERT INTO aspiradora (Estado,bateria,velocidade,limpiezas,recorrido,total_tempo,tempo_limpeza,metros_limpeza,ultima_limpeza,filtro,filtro_restante,escobilla_lat,escovilha_lat_restante,sensor,sensor_restante,escovilha_pri,escovilha_pri_restante) VALORES ($Estado,$bateria,$velocidade,$limpiezas,$recorrido,$total_tempo,$tempo_limpeza,$metros_limpeza,$ultima_limpeza,$filtro,$filtro_restante,$escobilla_lat,$escovilha_lat_restante,$sensor,$sensor_restante,$escovilha_pri,$escovilha_pri_restante);" | mysql -uUTILIZADOR -pSENHA -h IP_SERVIDOR_MYSQL BASE_DE_DADOS;[/Código-fonte]
Deixo-vos um exemplo do código que podem utilizar no MySQL para criar esta tabela chamada 'aspiradora'’ com 18 campos onde iremos armazenando tudo o que nos retorna o script anterior. Assim poderemos armazenar toda esta informação interessante e mais tarde explorá-la com o Grafana!
[Código-fonte]CREATE TABLE `aspiradora` (
`estado` CHAR(20) NULL DEFAULT NULL,
`bateria` FLOAT NULL DEFAULT NULL,
`velocidade` FLOAT NULL DEFAULT NULL,
`limpezas` FLOAT NULL DEFAULT NULL,
`percorrido` 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 PADRÃO CURRENT_TIMESTAMP NA ATUALIZAÇÃO CURRENT_TIMESTAMP
)
COLLATE=’utf8mb4_general_ci’
ENGINE=InnoDB;[/Código-fonte]
E nada, como de costume, 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:
[Código-fonte]SELECIONAR escobilla_pri_restante DE aspiradora ORDENAR POR fecha DESC LIMIT 1[/Código-fonte]
- Escova lateral:
[Código-fonte]SELECIONAR escobilla_lat_restante DE aspiradora ORDENAR POR fecha DESC LIMIT 1[/Código-fonte]
- Filtro:
[Código-fonte]SELECIONAR filtro_restante DE aspiradora ORDENAR POR fecha DESC LIMIT 1[/Código-fonte]
- Limpar sensores:
[Código-fonte]SELECIONAR sensor_restante DE aspiradora ORDENAR POR fecha DESC LIMIT 1[/Código-fonte]
- Última limpeza:
[Código-fonte]SELECIONAR timestamp(FORMATAR_DATA(ultima_limpeza, ‘%Y/%m/%d %H:%eu:%s’)) como time_sec DE aspiradora ORDENAR POR fecha DESC LIMIT 1[/Código-fonte]
- Aspirando (dependerá do tempo selecionado para indicar o tempo que esteve a aspirar), eu multiplico por 5 já que no meu cron eu executo a cada 5 ata:
[Código-fonte]SELECIONAR (CONTAR(*) * 5) DE aspiradora ONDE estado = ‘Cleaning’ e $__timeFilter(data)[/Código-fonte]
- Limpezas totais:
[Código-fonte]SELECIONAR limpiezas DE aspiradora ORDENAR POR fecha DESC LIMIT 1[/Código-fonte]
- Distância total percorrida:
[Código-fonte]SELECIONAR recorrido DE aspiradora ORDENAR POR fecha DESC LIMIT 1[/Código-fonte]
- Total a limpar:
[Código-fonte]SELECIONAR total_tiempo DE aspiradora ORDENAR POR fecha DESC LIMIT 1[/Código-fonte]
- E no gráfico mostra-se 2 coisas, (eu) os metros quadrados limpos e (Ii) o tempo dedicado, através destas 2 diferentes selects:
[Código-fonte]SELECIONAR UNIX_TIMESTAMP(ultima_limpeza) Então time_sec, metros_limpieza como valor, "Metros" como métrica DE aspiradora ONDE $__timeFilter(ultima_limpeza) ORDENAR POR ultima_limpieza, time_sec ASC[/Código-fonte]
[Código-fonte]SELECIONAR UNIX_TIMESTAMP(ultima_limpeza) Então time_sec, tiempo_limpieza como valor, "Tiempo" como métrica DE aspiradora ONDE $__timeFilter(ultima_limpeza) ORDENAR POR ultima_limpieza, time_sec ASC[/Código-fonte]
Poço, espero que vos seja interessante, outro aparelhinho mais controlado e aproveitado! Como vemos, com Grafana e a combinação de múltiplos produtos podemos ir tornando a nossa casa mais inteligente, onde temos painéis de controlo, o de sempre, Espero que tenham achado interessante!













































