Zu diesem Thema ist ein Update verfügbar: ESPhome Bluetooth Low Energy Hub

Homeassistant unterstützt von Haus aus mehr als 1100 Komponenten. Leider zählt die Xiaomi MiScale Personenwaage nicht dazu. Das ist fürs Erste ärgerlich, aber gleichzeitig auch Ansporn kreative Wege einzuschlagen. Wer also gerne seinen Gewicht und ggf. dessen Verlauf im Frontend sehen möchte, braucht ein Programm, das Homeassistant die Daten der Waage in verwertbarer Weise zuspielt. Ich nutze dafür bt-mqtt-gateway. Das Gateway extrahiert die Daten diverser Bluetooth-Geräte und sendet sie über MQTT an Homeassistant.

MAC-Adresse der Waage herausfinden

Das geht am einfachsten mit dem hcitool auf Linux. Einfach sicherstellen, dass Bluetooth am Gerät eingeschaltet ist und dann das Kommando ins Terminal tippen:

sudo hcitool lescan

Nun werden alle Bluetoothgeräte mit MAC-Adresse und Namen gelistet. Die Xiaomi-Waage hat bspw. den Namen MI_SCALE. Die MAC-Adresse wird später benötigt und muss notiert werden.

BT-MQTT-GATEWAY

Installation

Die Installation wird auf der zugehörigen Githubseite ausführlich beschrieben. Zuerst müssen ein paar Abhängigkeiten auf Systemebene installiert werden. Anschließend wird ein virtualenv angelegt, um die Installation der Python-Pakete sauber von den Systempaketen zu trennen.

sudo apt-get install git python3 python3-pip python3-wheel bluetooth bluez libglib2.0-dev
sudo pip3 install virtualenv
git clone https://github.com/zewelor/bt-mqtt-gateway.git
cd bt-mqtt-gateway
virtualenv -p python3 .venv
source .venv/bin/activate
sudo pip3 install -r requirements.txt

Konfiguration

Das Gateway benötigt eine Konfigurationsdatei. Ein Beispiel wird mit dem Gateway mitgeliefert. Dieses kann kopiert werden:

cp config.yaml.example config.yaml
nano config.yaml

Es müssen die Zugangsdaten zum MQTT-Broker und die MAC-Adresse der Waage eingetragen werden. Auch kann das Polling-Intervall angepasst werden, das bestimmt wie oft die Waage ausgelesen werden soll. Die config.yaml sollte am Ende so aussehen:

mqtt:
  host: localhost/IP
  username: USERNAME_MQTT_BROKER
  password: PASSWORD_MQTT_BROKER
 
  manager:
  topic_subscription:
  update_all:
  topic: homeassistant/status
  payload: online
  workers:
  miscale:
  args:
  mac: XX:XX:XX:XX:XX:XX
  topic_prefix: miscale
  update_interval: 3600

Sind alle Daten eingetragen und gespeichert, kann die erstellte Konfiguration getestet werden um zu schauen, ob die Waage erfolgreich ausgelesen wird:

sudo ./gateway.py

Systemd Service zum automatischen Starten anlegen

Es wird eine Beispielkonfiguration für einen Systemd Service mitgeliefert, die jedoch angepasst werden muss. Es muss der korrekte Pfad zum bt-mqtt-gateyway angepasst werden:

sudo cp bt-mqtt-gateway.service /etc/systemd/system/
sudo nano /etc/systemd/system/bt-mqtt-gateway.service (modify path of bt-mqtt-gateway)

Anschließend wird der Dienst registriert und aktiviert:

sudo systemctl daemon-reload
sudo systemctl start bt-mqtt-gateway
sudo systemctl status bt-mqtt-gateway
sudo systemctl enable bt-mqtt-gateway

Homeassistant

MQTT-Sensor für Gewicht

Homeassistant benötigt lediglich einen MQTT-Sensor, um den übermittelten Gewichtswert des Gateways entgegenzunehmen:

- platform: mqtt
  name: "Gewicht"
  state_topic: "miscale/weight/kg"
  unit_of_measurement: "kg"

Template Sensor für BMI

Der Body-Mass-Index ergibt sich wie folgt aus dem Quotienten des Gewichts in Kg und der Körpergröße in Metern zum Quadrat:

BMI-Formel

Da das Gewicht in Kilogramm bereits in Homeassistant vorhanden ist, muss lediglich der hintenangestellte Faktor 1/h² ausrechnet werden. Bei einer Größe von bspw. 1,84m ergibt sich im Kehrwert also 0,29536862. Diesen Wert benötigen wird für den BMI-Sensor in Homeassistant. Der Sensor muss so aussehen und gibt den BMI-Wert auf eine Nachkommastelle heraus:

- platform: template
  sensors:
    bmi:
      friendly_name: BMI
      value_template: "{{ '%.1f' | format(states('sensor.gewicht') | float * 0.29536862) }}"