
GrafanaでのXiaomi Mi Vacuumロボット掃除機のステータスの監視
素晴らしくて強力なXiaomiロボット掃除機があり、そのデータをGrafanaダッシュボードで視覚化したい場合, これがあなたの投稿です! その中で、掃除機に接続する方法を見ていきます, 私たちがあなたに質問をし、あらゆる種類の興味深いデータを取得する方法, 次に、それをMySQLデータベースに保存し、Grafanaで攻撃してこれらのメトリックを視覚化および処理します.
開始, 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[/ソースコード]
Instalamos virtualenv, y usamos dicho directorio como entorno virtualenv, instalamos ya por fín mirobo y algunos requisitos que también necesitaremos:
[ソースコード]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[/ソースコード]
Avanzamos! ya podremos ejecutar ‘mirobo discover’ para 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, 私の場合は, 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….
[ソースコード]export MIROBO_IP=DIRECCION_IP_DE_LA_ASPIRADORA
export MIROBO_TOKEN=TOKEN_DE_AUTH_DE_LA_ASPIRADORA
mirobo
状態: Charging
電池: 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… :
[ソースコード]#! /ビン/バッシュ
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` (
'status' 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 DEFAULT NULL,
`sensor_restante` FLOAT NULL DEFAULT NULL,
`escobilla_pri` FLOAT NULL DEFAULT NULL,
`escobilla_pri_restante` FLOAT NULL DEFAULT NULL,
'fecha' タイムスタンプが NULL でない 更新時のデフォルトのCURRENT_TIMESTAMP CURRENT_TIMESTAMP
)
照合='utf8mb4_general_ci’
エンジン=イノDB;[/ソースコード]
そして何もない, いつも通り, 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:
[ソースコード]SELECT escobilla_pri_restante FROM aspiradora ORDER BY fecha DESC LIMIT 1[/ソースコード]
- Escobilla lateral:
[ソースコード]SELECT escobilla_lat_restante FROM aspiradora ORDER BY fecha DESC LIMIT 1[/ソースコード]
- フィルター:
[ソースコード]SELECT filtro_restante FROM aspiradora ORDER BY fecha DESC LIMIT 1[/ソースコード]
- Limpiar sensores:
[ソースコード]SELECT sensor_restante FROM aspiradora ORDER BY fecha DESC LIMIT 1[/ソースコード]
- Última limpieza:
[ソースコード]SELECT タイムスタンプ(DATE_FORMAT(ultima_limpieza, '%Y/%m/%d %H:%私:%s’)) as time_sec FROM aspiradora ORDER BY fecha DESC LIMIT 1[/ソースコード]
- 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 議事録:
[ソースコード]選ぶ (数える(*) * 5) FROM aspiradora WHERE estado = ‘Cleaning’ and $__timeFilter(日付)[/ソースコード]
- Limpiezas totales:
[ソースコード]SELECT limpiezas FROM aspiradora ORDER BY fecha DESC LIMIT 1[/ソースコード]
- Total distancia recorrida:
[ソースコード]SELECT recorrido FROM aspiradora ORDER BY fecha DESC LIMIT 1[/ソースコード]
- Total limpiando:
[ソースコード]SELECT total_tiempo FROM aspiradora ORDER BY fecha DESC LIMIT 1[/ソースコード]
- Y en la gráfica se muestran 2 詰め込む, (私) los metros cuadrados limpiados y (イ) el tiempo dedicado, mediante estas 2 selects distintas:
[ソースコード]セレクトUNIX_TIMESTAMP(ultima_limpieza) とてもtime_sec, metros_limpieza as value, "Metros" as metric FROM aspiradora WHERE $__timeFilter(ultima_limpieza) ORDER BY ultima_limpieza, time_sec ASC[/ソースコード]
[ソースコード]セレクトUNIX_TIMESTAMP(ultima_limpieza) とてもtime_sec, tiempo_limpieza as value, 「時間" as metric FROM aspiradora WHERE $__timeFilter(ultima_limpieza) ORDER BY ultima_limpieza, time_sec ASC[/ソースコード]
まぁ, espero os resulte interesante, 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, いつもの, 面白かっただけたでしょうか!