Obteniendo datos de nuestra báscula Xiaomi Smart Scale con Raspberry Pi

Si tienes la báscula Xiaomi Smart Scale sigue los pasos de este documento y podrás leer tu peso desde una Raspberry Pi, conectando por bluetooth almacenaremos en una base de datos de MySQL los registros, y así si queremos podemos explotarlos super fácil con Grafana! Os iré dejando una serie de documentos que creo son muy interesantes para obtener información de distintos dispositivos que controlan nuestra vida y visualizarlo de una forma super chula!

 

Base de datos,

Por tanto, necesitaremos una Raspberry Pi con Raspbian instalado y actualizado. Luego si no tenemos un servidor de base de datos debemos instalar MySQL y el cliente de manera opcional para gestionar la BD, si no, muy fácilmente si queremos administrar bases remotas de este equipo de forma remota podremos hacerlo desde un Windows con HeidiSQL. Bien, para instalar MySQL:

sudo apt-get install mysql-server mysql-client

 

Tras la instalación, ya nos podemos conectar a nuestro MySQL, crear una Base de datos, y crears una Tabla donde almacenaremos los registros de pesaje, que es muy sencilla, digamos tiene 2 campos, uno inicial que será donde se guarde el peso llamado ‘peso’ como no, y otro llamado ‘created_at’ que se rellenará con la fecha cuando se ejecute el script. Lo hacemos con:

mysql -u root -p
create database NOMBRE_BASE_DATOS;

CREATE TABLE `NOMBRE_TABLA` (
	`peso` DECIMAL(4,2) NOT NULL,
	`created_at` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP
)
;

 

Y esto es lo que habremos creado, si? Nuestra tabla donde almacenaremos todo nuestro peso! y con poco tiempo podremos analizar y ver si engordamos o no!!!

 

Bluetooth,

Tras dejar preparada la BD, ahora configuraremos el acceso de bluetooth de nuestra Raspberry Pi a la báscula Xiaomi Smart Scale, instalaremos los requisitos para usar bluetooth con Python, ejecutando:

sudo apt-get install bluez python-bluez python-mysqldb

 

Antes de seguir, si no estamos usando una Raspberry Pi 3, deberemos conectarle un pequeño dongle bluetooth para poder conectarse a la báscula, para verificar que lo tenemos listo, ejecutamos el siguiente comando que nos debería devolver la dirección MAC de nuestro dispositivo bluetooth si lo ha reconocido la Pi:

hcitool dev

 

Podemos probar a escanear y ver qué dispositivos bluetooth encontramos con:

hcitool scan

 

Script,

Debemos crear el siguiente script de Python que será el que conecte a nuestra báscula, el script que os pongo es una modificación de este en GitHub. En mi caso lo llamaré lee_bascula.py:

import blescan
import sys
import time

import bluetooth._bluetooth as bluez

dev_id = 0

sock = bluez.hci_open_dev(dev_id)

blescan.hci_le_set_scan_parameters(sock)
blescan.hci_enable_le_scan(sock)

measured_anterior = 0

try:
   while True:
      returnedList = blescan.parse_events(sock, 1)
      if len(returnedList) > 0:
         (mac, uuid, major, minor, txpower, rssi) = returnedList[0].split(',', 6)
         # CAMBIAR LA DIRECCION MAC
         if mac == '88:0f:10:XX:XX:XX' and uuid[0:22] == '01880f1096ab190d161d18':
            measunit = uuid[22:24]
            measured = int((uuid[26:28] + uuid[24:26]), 16) * 0.01

            unit = ''

            if measunit.startswith(('03', 'b3')): unit = 'lbs'
            if measunit.startswith(('12', 'b2')): unit = 'jin'
            if measunit.startswith(('22', 'a2')): unit = 'Kg' ; measured = measured / 2

            if unit:
               if measured != measured_anterior:
                  print("measured : %s %s" % (measured, unit))
                  measured_anterior = measured
                  import MySQLdb
                  db = MySQLdb.connect("127.0.0.1","root","CONTRASEÑA_ROOT_MYSQL","NOMBRE_BASE_DATOS")
                  cursor = db.cursor()
                  cursor.execute("""INSERT INTO NOMBRE_TABLA (peso) VALUES (%s) """,(measured))
                  db.commit()
      time.sleep(2)

except KeyboardInterrupt:
sys.exit(1)

 

Si nos fijamos bien en el script con realizar un par de modificaciones lo vas a tener corriendo enseguida! Deberás cambiar la dirección MAC de tu báscula, la contraseña del usuario root de MySQL, el nombre de la BD y poco más! Podemos probar a ejecutarlo con el siguiente comando que se quedará a la escucha de que alguien se pese, mostrará cada pesaje cada vez que te subas a la báscula y a parte de decirte en un mensaje el peso, lo meterá en la BD de MySQL que le estamos diciendo. Probar:

sudo python /home/pi/lee_bascula.py

 

Y ahora, si todo va bien, debemos hacer que cuando la Raspberry Pi se reinicie pues cargue directamente el script y lo tengamos listo! lo hacemos con cron y añadimos:

crontab -e

@reboot sudo python /home/pi/lee_bascula.py

 

Gráficas,

Si nos acordamos, en este documento previo, vimos cómo montar Grafana, si lo tienes desplegado genial ya que lo vamos a utilizar para visualizar los datos y hacernos unos paneles increibles! Y si no lo tienes instalado… te recomiendo que lo instales ya que lo vamos a usar, sigue los pasos de dicho documento para instalarlo en una máquina (virtual) dedicada o mismamente sobre la misma Raspberry Pi.

 

Tras disponer de Grafana montado, lo habitual que deberemos hacer es crear un nuevo Dashboard, en este simple ejemplo haremos uno de tipo gráfica que hará una consulta a la BD de MySQL para mostrarnos los registros que tenemos almacenados, luego cada uno personalizará el gráfico a su gusto. Pero antes de nada, debemos crear un origen de datos de tipo MySQL para hacer consultas desde nuestros Dashboards. Para ello, desde “Data Sources” pulsaremos en “Add” y añadimos una conexión a nuestro servidor de MySQL que es la Raspberry, configuramos la conexión de forma correcta y grabamos con “Save & Test”,

 

Ahora ya podemos crear nuestro Dashboard, le añadimos un Panel de tipo Graph, y lo editamos al pulsar en su título, cambiamos todo como nos interese, colores, información, ejes… pero en la pestaña de “Metrics” deberemos colocar la SELECT que hará la consulta a la BD, especificamos algo como:

SELECT
UNIX_TIMESTAMP(created_at) as time_sec,
peso as value,
"Peso" as metric
FROM basculami
WHERE $__timeFilter(created_at)
ORDER BY created_at, time_sec ASC

 

 

Y nada, tras trastear un ratejo verás que te puedes hacer unas gráficas chulas, eso sí, necesitas rellenar la tabla con registros, así que dale tiempo al tiempo!!! Este post como os digo es un primer paso para una maravilla que vamos a poder hacer, juntando todas las piezas del puzzle… nos vemos pronto, cuidaros mucho!!

 

Héctor Herrero

Autor del blog Bujarra.com
Cualquier necesidad que tengas, no dudes en contactar conmigo, os intentare ayudar siempre que pueda, compartir es vivir 😉 . Disfrutar de los documentos!!!