监控我们在 Grafana 的小米米扫地机器人吸尘器的状态
Si tenemos el maravilloso y todo poderoso robot aspirador de Xiaomi y te apetece visualizar sus datos en un dashboard de Grafana, 这是您的帖子! 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.
开始, 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:
[源代码]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 –版本
python -m pip uninstall pip
pip install construct==2.9.31[/源代码]
安装 virtualenv, 并使用该目录作为 virtualenv 环境, 最后安装 mirobo 以及一些我们也需要的依赖:
[源代码]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[/源代码]
继续! 我们现在可以执行 ‘mirobo discover'’ 来搜索网络中的吸尘器, 如果幸运的话 (我说不) 我们将看到所需的 token, 否则我们需要想办法获取它, 就我而言, 我手机上已安装 Xiaomi Home 应用(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….
[源代码]export MIROBO_IP=DIRECCION_IP_DE_LA_ASPIRADORA
export MIROBO_TOKEN=TOKEN_DE_AUTH_DE_LA_ASPIRADORA
mirobo
州: 充电
电池: 100 %
Fanspeed: 60 %
Cleaning since: 0:33:27
Cleaned area: 35.48 m²
mirobo consumables
Main brush: 22:26:19 (左 11 日, 13:33:41)
Side brush: 22:26:19 (左 7 日, 9:33:41)
滤波器: 22:26:19 (左 5 日, 7:33:41)
Sensor dirty: 22:26:19 (左 7:33:41)
mirobo cleaning-history
Total clean count: 301
Cleaned for: 10 日, 18:31:57 (area: 13288.1575 m²)
Clean #0: 2019-06-27 17:42:06-2019-06-27 18:15:33 (complete: 真, 错误: No error)
Area cleaned: 35.48 m²
期间: (0:33:27)
Clean #1: 2019-06-21 21:16:55-2019-06-21 21:59:12 (complete: 真, 错误: No error)
…[/源代码]
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 纪要, 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… :
[源代码]#! /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 | 噢 '{打印 $2}’`
estado=\’$estado\’
bateria=`cat mirobo_general.txt |grep Battery | 噢 '{打印 $2}’`
velocidad=`cat mirobo_general.txt |grep Fanspeed | 噢 '{打印 $2}’`
mirobo cleaning-history > mirobo_historial.txt
limpiezas=`cat mirobo_historial.txt |grep ‘Total clean count’ | 噢 '{打印 $4}’`
recorrido=`cat mirobo_historial.txt |grep ‘Cleaned for’ | 噢 '{打印 $7}’`
dias=`cat mirobo_historial.txt |grep ‘Cleaned for’ | 噢 '{打印 $3}’`
dias=`echo $((dias*24*60*60))`
horas=`cat mirobo_historial.txt |grep ‘Cleaned for’ | 噢 '{print substr($5,1,2)}’`
horas=`echo $((horas*60*60))`
minutos=`cat mirobo_historial.txt |grep ‘Cleaned for’ | 噢 '{print substr($5,4,2)}’`
minutos=`echo $((minutos*60))`
segundos=`cat mirobo_historial.txt |grep ‘Cleaned for’ | 噢 '{print substr($5,7,2)}’`
total_tiempo=$((dias+horas+minutos+segundos))
hora_desde=`cat mirobo_historial.txt |grep ‘Clean #0’ | 噢 '{print substr($4,1,8)}’`
hora_hasta=`cat mirobo_historial.txt |grep ‘Clean #0’ | 噢 '{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’ | 噢 '{打印 $3; 退出}’`
ultima_limpieza=`cat mirobo_historial.txt |grep ‘Clean #0’ | 噢 '{打印 $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-$传感器))
### 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 (州,电池,速度,limpiezas,recorrido,total_tiempo,tiempo_limpieza,metros_limpieza,ultima_limpieza,filtro,filtro_restante,escobilla_lat,escobilla_lat_restante,传感器,sensor_restante,escobilla_pri,escobilla_pri_restante) 值 ($州,$电池,$速度,$limpiezas,$recorrido,$total_tiempo,$tiempo_limpieza,$metros_limpieza,$ultima_limpieza,$filtro,$filtro_restante,$escobilla_lat,$escobilla_lat_restante,$传感器,$sensor_restante,$escobilla_pri,$escobilla_pri_restante);" | mysql -uUSUARIO -pCONTRASEÑA -h IP_SERVIDOR_MYSQL BASE_DE_DATOS;[/源代码]
Os dejo un ejemplo del código que podéis utilizar en MySQL para crear esta tabla llamada ‘aspiradora’ 跟 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!
[源代码]CREATE TABLE `aspiradora` (
`estado` CHAR(20) NULL 默认 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 默认 NULL,
`sensor_restante` FLOAT NULL 默认 NULL,
`escobilla_pri` FLOAT NULL 默认 NULL,
`escobilla_pri_restante` FLOAT NULL 默认 NULL,
'date' 时间戳 NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP
)
COLLATE='utf8mb4_general_ci'’
引擎=InnoDB;[/源代码]
什么都没有, 照常, 数据库中已有数据, 我们可以在 Grafana 中对该 MySQL 数据库创建一个数据源,并开始创建我们的仪表板,并向其中添加一些面板, 给大家举几个例子以及我用来获取这些数据的查询:
- 主刷:
[源代码]SELECT escobilla_pri_restante FROM aspiradora ORDER BY fecha DESC LIMIT 1[/源代码]
- 侧刷:
[源代码]SELECT escobilla_lat_restante FROM aspiradora ORDER BY fecha DESC LIMIT 1[/源代码]
- 滤波器:
[源代码]SELECT filtro_restante FROM aspiradora ORDER BY fecha DESC LIMIT 1[/源代码]
- 清洁传感器:
[源代码]SELECT sensor_restante FROM aspiradora ORDER BY fecha DESC LIMIT 1[/源代码]
- 最后清洁:
[源代码]SELECT timestamp(DATE_FORMAT(ultima_limpieza, ‘%Y/%m/%d %H:%我:%s’)) 作为 time_sec 从 aspiradora 按 fecha 降序排序限制 1[/源代码]
- 清洁中 (将取决于选择的时间,会显示吸尘时间), 我把它乘以 5 因为我在我的定时任务中每隔执行一次 5 纪要:
[源代码]选择 (计数(*) * 5) 从 aspiradora 在 estado = ‘Cleaning 的情况下’ 和 $__timeFilter(日期)[/源代码]
- 总清洁次数:
[源代码]SELECT limpiezas 从 aspiradora 按 fecha 降序排序限制 1[/源代码]
- 总行驶距离:
[源代码]SELECT recorrido 从 aspiradora 按 fecha 降序排序限制 1[/源代码]
- 总清洁时间:
[源代码]SELECT total_tiempo 从 aspiradora 按 fecha 降序排序限制 1[/源代码]
- 并且在图表中显示 2 东西, (我) 清洁的平方米和 (第二) 所花费的时间, 通过这些 2 不同的选择:
[源代码]SELECT UNIX_TIMESTAMP(ultima_limpieza) 所以time_sec, metros_limpieza 作为 value, "Metros" 作为 metric 从 aspiradora 在 $__timeFilter 的情况下(ultima_limpieza) 按 ultima_limpieza 排序, time_sec ASC[/源代码]
[源代码]SELECT UNIX_TIMESTAMP(ultima_limpieza) 所以time_sec, tiempo_limpieza 作为 value, "Tiempo" 作为 metric 从 aspiradora 在 $__timeFilter 的情况下(ultima_limpieza) 按 ultima_limpieza 排序, time_sec ASC[/源代码]
井, 希望对你们有趣, otro cacharro más controlado y exprimido! 正如我们所见, con Grafana y la combinación de múltiples productos podemos ir haciendo nuestro hogar más inteligente, donde tengamos paneles de control, 通常的, espero os haya parecido interesante!













































