
Monitorização do nosso cortador de relva Bosch Indego com Grafana
Vir, Continuamos com um post um tanto geeky, mas se você tem um jardim, você pode estar interessado… A questão é que eu tenho um daqueles robôs que cortam o gramado em casa, especificamente um Bosch Indego 350, e através de uma API que nos foi dada pelo fabricante poderemos saber o estado do cortador de relva em todos os momentos, além de ter acesso a alguns valores interessantes; E já agora, com esta API também poderemos controlá-la, No final do post vamos ver como verificar o tempo e se não está chovendo, Bem, nós enviamos para ser cortado 😉
Nada mau, utilizaremos esta genial aplicación Controller application and API for Bosch Indego Connect, lo primero será instalar los requisitos, Maven, nos descargamos la última build, la compilamos y la instalamos. Veremos que nos genera un binario totalmente funcional para nuestra distribución, en este caso creo recordar que estoy usando una Raspbian Stretch, os dejo los pasos para tenerlo listo:
[Código-fonte]sudo apt-get install maven
wget https://github.com/zazaz-de/iot-device-bosch-indego-controller/archive/bosch-indego-controller-0.8.zip
unzip bosch-indego-controller-0.8.zip
cd iot-device-bosch-indego-controller-bosch-indego-controller-0.8/
mvn compile
mvn package
mvn install
cd bosch-indego-controller-dist/target
unzip bosch-indego-controller-dist-0.8-bin.zip
cd bosch-indego-controller-dist-0.8/bin/
./IndegoController[/Código-fonte]
Vamos al directorio donde nos dejó el binario, e tentamos executá-lo, le enviaremos como parámetros con -u nuestro usuario con el que hayamos registrado el cortacesped Indego y -p la contraseña de la cuenta, con -q podemos hacer un query y ver los datos de nuestro aparato, veremos consumos, tiempos, completado… con -c podremos enviarle comandos, como por ejemplo MOW para que salga a dar el paseo y corte la hierba.
[Código-fonte]cd ~/iot-device-bosch-indego-controller-bosch-indego-controller-0.8/bosch-indego-controller-dist/target/bosch-indego-controller-dist-0.8/bin
./IndegoController -u US*****@MA**.ESO -p CONTRASEÑA -q
./IndegoController -u US*****@MA**.ESO -p CONTRASEÑA -c MOW -q[/Código-fonte]
Si tenemos problemas a la hora de ejecutarlo por temas de certificados, deberemos importar los certificados de Bosch Indego al keystore de Java. Bajamos los 3 certificados de la cadena de las CA de https://https://api.indego.iot.bosch-si.com mismamente con un Internet Explorer, los guardamos con formato DER X.509.
Y los importamos en el keystore de Java, nos pedirá password, la contraseña por defecto del keystore cacerts es changeit:
[Código-fonte]keytool -import -alias INDEGO_CER -keystore $JAVA_HOME/jre/lib/security/cacerts -file /home/pi/indego.cer
keytool -import -alias INDEGO_CA1 -keystore $JAVA_HOME/jre/lib/security/cacerts -file /home/pi/indegoCA1.cer
keytool -import -alias INDEGO_CA2 -keystore $JAVA_HOME/jre/lib/security/cacerts -file /home/pi/indegoCA2.cer[/Código-fonte]
Y nada probamos de nuevo el script y veremos cómo obtenemos nuestros datos! Si queremos explotarlos, os dejo un ejemplo de un script cutrecillo lque tengo llamado ‘cortacesped_estado.sh’, bien este script lo que hará es buscar ciertas palabras en ese output anterior y guardará los valores obtenidos en una base de datos con MySQL, que luego podremos atacar fácilmente desde Grafana y obtener algún dashboard muy cuco.
[Código-fonte]#!/bin/bash
/home/pi/indego/bin/IndegoController -u US*****@MA**.ESO -p CONTRASEÑA -q > /home/pi/indego/estado.txt
completado=`cat /home/pi/indego/estado.txt | grep Completed| aw »{imprimir $2}’`
completado=`echo "${completado//\,/.}"`
session_operate=`cat /home/pi/indego/estado.txt | grep ‘Runtime session / operate:’| aw »{imprimir $5}’`
session_operate=`echo "${session_operate//\,/.}"`
session_charge=`cat /home/pi/indego/estado.txt | grep ‘Runtime session / charge’| aw »{imprimir $5}’`
session_charge=`echo "${session_charge//\,/.}"`
total_operate=`cat /home/pi/indego/estado.txt | grep ‘Runtime total / operate’| aw »{imprimir $5}’`
total_operate=`echo "${total_operate//\,/.}"`
total_charge=`cat /home/pi/indego/estado.txt | grep ‘Runtime total / charge’| aw »{imprimir $5}’`
total_charge=`echo "${total_charge//\,/.}"`
estado=`cat /home/pi/indego/estado.txt | grep ‘DeviceStatus’| aw »{imprimir $4}’ |sed -e ‘s#.*=\(\)#\1#’ | Rev | cut -c 2- | rev`
estado="’$estado’"
echo "INSERT INTO cortacesped (completado, session_operate, session_charge, total_operate, total_charge, Estado) VALORES ($completado,$session_operate,$session_charge,$total_operate,$total_charge,$Estado);" | mysql -uUSUARIO -pCONTRASEÑA -h SERVIDOR_MYSQL NOMBRE_BD;
[/Código-fonte]
No debemos olvidar crear en cron la programación que nos interese para que se ejecute el script, en mi caso se ejecuta cada 5 minutos para recolectar información.
Pero claro, antes debemos crear la tabla en alguna base de datos de nuestro servidor MySQL, como veis es muy sencillica, Tem 7 campos que almacenarán los datos que le mande, os dejo el código de MySQL por si queréis ver el tipo de columnas:
[Código-fonte]CREATE TABLE `cortacesped` (
`completado` FLOAT NULL DEFAULT NULL,
`session_operate` FLOAT NULL DEFAULT NULL,
`session_charge` FLOAT NULL DEFAULT NULL,
`total_operate` FLOAT NULL DEFAULT NULL,
`total_charge` FLOAT NULL DEFAULT NULL,
`estado` CHAR(20) NULL DEFAULT NULL,
'date' TIMESTAMP NOT NULL PADRÃO CURRENT_TIMESTAMP NA ATUALIZAÇÃO CURRENT_TIMESTAMP
)
COLLATE=’utf8mb4_general_ci’
ENGINE=InnoDB
ROW_FORMAT=COMPACTO;[/Código-fonte]
E é isso! Con la BD alimentándose, ya podremos configurar un dashboard con los paneles que nos interese, Deixo-vos este exemplo, os paso las querys que utilicé. Ah y por cierto, si no tienes el DataSource en Grafana creado contra el servidor MySQL, acuérdate de hacerlo antes 😉
- Último segado:
[Código-fonte]SELECT timestamp(DATE_FORMAT(data, ‘%Y/%m/%d %H:%eu:%s’)) as time_sec FROM cortacesped where estado = ‘Mowing’ ORDER BY fecha DESC LIMIT 1[/Código-fonte]
- Jardín segado:
[Código-fonte]SELECT completado FROM cortacesped ORDER BY fecha DESC LIMIT 1[/Código-fonte]
- Query para la gráfica de los últimos 15 Dias, donde vemos el % avanzado a lo largo del tiempo:
[Código-fonte]SELECT UNIX_TIMESTAMP(data) Então time_sec, completado as value, "Tiempo" as metric FROM cortacesped WHERE $__timeFilter(data) and estado = ‘Mowing’ ORDER BY fecha, time_sec ASC[/Código-fonte]
- Segados totales:
[Código-fonte]SELECIONE CONTAGEM(*) FROM cortacesped where estado = ‘Mowing’ and completado = 0[/Código-fonte]
- Total cortando:
[Código-fonte]SELECT total_operate FROM cortacesped ORDER BY fecha DESC LIMIT 1[/Código-fonte]
E enquanto estamos nisso,, si os interesa, este es un script txorra que utilizo para programar que salga el robot a cortar el césped, primeramente en cron le tengo que se ejecute los Lunes, Miercoles y Viernes a las 8:30am, y lo que hace primero es checkear el tiempo, mira el tiempo actual y el que hará a lo largo del día, si va a hacer malo (lluvia, nieve, granizo…) pues no saldrá a segar, le llamo enciende_cortacesped.sh:
[Código-fonte]#!/bin/bash
curl wttr.in/Bilbao?1 > /tmp/eltiempo.txt
if grep ‘rain\|drizzle\|snow\|sleet\|freez\thunder’ /tmp/eltiempo.txt > /dev/null
em seguida,
echo "Hará o hace malo"
mais
echo "Hará o hace bueno"
/home/pi/indego/bin/IndegoController -u US*****@MA**.ESO -p CONTRASEÑA -c MOW
Fi[/Código-fonte]
Espero que você tenha achado interessante, se pueden hacer muchas cosas más que iremos viendo con el tiempo, así que lo dicho, espero que os haya gustado!