Monitoritzant amb Grafana el nostre tallacesped Bosch Indego

Vingui, seguim amb un post una mica friki, però que si tens jardí et pot interessar… el cas és que tinc un robot d'aquests que tallen la gespa a casa, en concret un Bosch Indego 350, i mitjançant una API que ens dona el fabricant podrem conèixer l'estat del tallacesped en tot moment, a més de tenir accés a alguns valors interessants; i per cert, amb aquesta API també podrem controlar-la, al final del post veurem com tenim el temps i si no està plorant, doncs la manem a tallar 😉

 

Bé, utilizarem aquesta aplicació genial Aplicació de controlador i API per a Bosch Indego Connect, primer instal·laré els requisits, Maven, nos descarreguem la última construcció, la compilamos i instal·lar-nos. Verem que generem un binari totalment funcional per a la nostra distribució, en aquest cas recordaré que estic utilitzant una Raspbian Stretch, os deixo els passos per tenerlo listo:

[sourcecode]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-0.8/
mvn compile
mvn package
mvn install
cd bosch-indego-controller-dist/target
descomprimir bosch-indego-controller-dist-0.8-bin.zip
cd bosch-indego-controller-dist-0.8/bin/
./IndegoController[/sourcecode]

 

Vamos al directorio donde nos dejó el binario, y probamos a executarlo, enviarem com a paràmetres amb -u nostre usuari amb el que hem registrat el cortacesped Indego i -p la senyal de la compte, amb -q podem fer una consulta i veure les dades del nostre aparell, veremos consumos, tiempos, completado… con -c podrem enviar comandos, com per exemple MOW para que salga a donar el passeig i tallar la hierba.

[sourcecode]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*****@**IL.ESO -p CONTRASEÑA -q
./IndegoController -u US*****@**IL.ESO -p CONTRASEÑA -c MOW -q[/sourcecode]

 

Si tenemos problemes a la hora de ejecutarlo por temes 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:

[sourcecode]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[/sourcecode]

 

I res probamos de nou el script i verem com obtenemos les nostres dades! Si volem explotarlos, os dejo un exemple de un script cutrecillo lque tengo called '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.

[sourcecode]#!/bin/bash
/home/pi/indego/bin/IndegoController -u US*****@**IL.ESO -p CONTRASEÑA -q > /home/pi/indego/estado.txt
completado=`cat /home/pi/indego/estado.txt | grep Completed| awk '{print $2}’`
completado=`echo "${completado//\,/.}"`
session_operate=`cat /home/pi/indego/estado.txt | grep ‘Runtime session / operate:’| awk '{print $5}’`
session_operate=`echo "${session_operate//\,/.}"`
session_charge=`cat /home/pi/indego/estado.txt | grep ‘Runtime session / charge’| awk '{print $5}’`
session_charge=`echo "${session_charge//\,/.}"`
total_operate=`cat /home/pi/indego/estado.txt | grep ‘Runtime total / operate’| awk '{print $5}’`
total_operate=`echo "${total_operate//\,/.}"`
total_charge='cat /home/pi/indego/estado.txt | grep ‘Runtime total / charge’| awk '{print $5}’`
total_charge=`echo "${total_charge//\,/.}"`
estado='cat /home/pi/indego/estado.txt | grep 'DeviceStatus'| awk '{print $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, estat) VALUES ($completado,$session_operate,$session_charge,$total_operate,$total_charge,$estat);" | mysql -uUSUARIO -pCONTRASEÑA -h SERVIDOR_MYSQL NOMBRE_BD;
[/sourcecode]

 

No debemos oblidar crear en cron la programación que nos interessa para que se execute el script, en el meu cas se executa cada 5 minuts per recolectar informació.

 

Però clar, abans que hem de crear la taula en alguna base de dades del nostre servidor MySQL, com veis molt sencillica, té 7 camps que emmagatzemaran los dades que le mande, os dejo el codi de MySQL por si queréis veure el tipus de columnes:

[sourcecode]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,
'estat' CHAR(20) NULL DEFAULT NULL,
'fecha' TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP
)
COLLATE='utf8mb4_general_ci’
ENGINE = InnoDB
ROW_FORMAT = COMPACT;[/sourcecode]

I llest! Con la BD alimentándose, ya podremos configurar un dashboard con los paneles que nos interese, os dejo este ejemplo, 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:

[sourcecode]SELECT timestamp(DATE_FORMAT(data, '%Y/%m/%d %H:%i:%s’)) as time_sec FROM cortacesped where estado = ‘MowingORDER BY fecha DESC LIMIT 1[/sourcecode]

  • Jardín segado:

[sourcecode]SELECT completado FROM cortacesped ORDER BY fecha DESC LIMIT 1[/sourcecode]

  • Consulta per la gràfica de los últims 15 dies, donde vemos el % avançat a lo largo del tiempo:

[sourcecode]SELECT UNIX_TIMESTAMP(data) as time_sec, completado com a valor, "Tiempo" com a mètrica DES de cortacesped ON $__timeFilter(data) i estat = 'Tallant’ ORDRE PER fecha, time_sec ASC[/sourcecode]

  • Segats totals:

[sourcecode]SELECT COUNT(*) DES de cortacesped on estado = 'Segant’ i completado = 0[/sourcecode]

  • Total cortando:

[sourcecode]SELECCIONA total_operate DE cortacesped ORDRE PER fecha DESC LIMIT 1[/sourcecode]

 

I ja que estem, si os interessa, és un script txorra que utilitza per programar que salga el robot a cortar el césped, primerament en cron le tengo que se execute los Lunes, Miercoles y Viernes a las 8:30am, i lo que fa primer es checkear el tiempo, mira el tiempo actual y el que hará a lo largo del dia, si va a hacer malo (lluvia, nieve, granizo…) pues no saldrá a segar, le llamo enciende_cortacesped.sh:

[sourcecode]#!/bin/bash
curl wttr.in/Bilbao?1 > /tmp/eltiempo.txt
if grep ‘rain\|drizzle\|snow\|sleet\|freez\thunder’ /tmp/eltiempo.txt > /dev/null
then
echo "Hará o hace malo"
else
echo "Hará o hace bueno"
/home/pi/indego/bin/IndegoController -u US*****@**IL.ESO -p CONTRASEÑA -c MOW
fi[/sourcecode]

 

Espero us hagi resultat interessant, es poden fer moltes més coses que anirem veient amb el temps, així que, com he dit, espero que us hagi agradat!

 

Posts recomanats

Autor

nheobug@bujarra.com
Autor del blog Bujarra.com Cualquier necesidad que tengas, no dubtis a contactar amb mi, us intentareu ajudar sempre que pugui, compartir és viure ;) . Gaudir dels documents!!!