Xiaomi MiScale Waage in Homeassistant integrieren

Xiaomi MiScale Waage in Homeassistant integrieren

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 Bluetoothgeräte und sendet sie über MQTT an Homeassistant. Damit die Daten über MQTT empfangen werden können, muss in der Homeassistantkonfiguration zuvor der bereits integrierte hbmqtt-Broker aktiviert werden oder man installiert einen separaten MQTT-Broker, bspw. Mosquitto.

Die nötigen Schritte werden im Folgenden beschrieben:

MAC-Adresse der Waage herausfinden

Das geht am einfachsten mit dem hcitool von 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 sollte notiert werden.

BT-MQTT-Gateway installieren

Die Installation wird auf der zugehörigen Githubseite ausführlich beschrieben. Zuerst müssen ein paar Abhängigkeiten auf Systemebene installiert werden:

sudo apt-get install git python3 python3-pip bluetooth bluez

Anschließend wird in das Verzeichnis gewechselt, in welches das Programm abgelegt werden soll, bspw. das Home-Verzeichnis mit:

cd ~

Nun kann die eigentliche Installation gestartet werden:

 
git clone https://github.com/zewelor/bt-mqtt-gateway.git 
cd bt-mqtt-gateway 
sudo pip3 install -r requirements.txt 

Anschließend muss die mitgelieferte Beispielkonfigurationsdatei angepasst 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

Funktioniert alles zufriedenstellend, muss im letzten Schritt ein Systemd-Service erstellt werden, der das Gateway automatisch startet, sobald das Gerät neugestartet wird. Das Gateway liefert eine Beispielkonfiguration mit, die kopiert und angepasst werden muss. Zu beachten ist, dass in der Systemd-File unter dem Punkt WorkingDirectory und ExecStart die absoluten Pfade angegeben werden müssen, also der Pfad in das bt-mqtt-gateway abgelegt wurde:

 
sudo cp bt-mqtt-gateway.service /etc/systemd/system/
sudo nano /etc/systemd/system/bt-mqtt-gateway.service

Ist die Datei angepasst, muss der Service registriert und aktiviert werden:

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

Voilà! Das Gateway ist eingerichtet. Nun müssen die Daten des Gateways in Homeassistant überführt werden.

MQTT-Sensor in Homeassistant anlegen

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"

Jetzt kann Homeassistant das Gewicht mit korrekter Gewichtseinheit darstellen und man könnte zufrieden sein.

 

Weiterführende Spielereien

Ich habe darüber hinaus noch folgendes gemacht:

  • Homeassistant einen Sensor spendiert, der automatisch aus dem Gewicht den BMI errechnet
  • Ein „Custom Component“ namens HASS-Variables installiert. Dieses wird benötigt, um die Differenzen zum letzten Wiegevorgang zu Berechnen. Zusätzlich zu dem Component braucht Homeassistant noch zwei Variablen:
    1. Eine Variable die den State des Gewichts der letzten Messung speichert
    2. Eine Variable die den State des BMI der letzten Messung speichert
  • 3 Weitere Sensoren erstellt, die folgendes ausgeben:
    1. Gewichtsdifferenz zum Vortag
    2. BMI-Differenz zum Vortag
    3. Gewichtstrend mit adaptivem Icon
  • Eine Automation erstellt, die täglich zu einem definierten Zeitpunkt die Daten des letzten Wiegevorgangs an die 2 Variablen übergibt
  • Einen History Graph eingebunden, der den Gewichtsverlauf im zeitlichen Verlauf darstellt
  • Eine Gruppe erstellt, die alle Informationen bündelt und darstellt
  • Custom Icons für die Darstellung im Homeassistant Frontend vergeben

Der Reihe nach sind folgende Schritte nötig:

BMI Sensor

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

Da das Gewicht in Kilogramm bereits in Homeassistant vorhanden ist, muss lediglich der hintenangestellte Faktor 1/h² ausgrechnet 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) }}"

 

Custom Component HASS-Variables installieren und zwei Variablen anlegen

Die Installation ist schnell bewerkstelligt. Es muss lediglich, sofern noch nicht vorhanden, im Installationsverzeichnis von Homeassistant ein Ordner mit dem namen custom_components angelegt werden und die Datei variable.py dort abgelegt werden. Das kann zum Beispiel mittels FileZilla erledigt werden. Nach dem Kopiervorgang muss Homeassistant neugestartet werden.

Jetzt müssen die zwei Variablen angelegt werden, die den letzten Messungsstand vom Vortag enthalten und auf deren Basis die Gewichts- und BMI-Differenz berechnet wird:

 
variable:
  delta_gewicht:
    value: 'Unknown'
    restore: true
    attributes:
      icon: mdi:delta
      name: Gewichtsdifferenz
  delta_bmi:
    value: 'Unknown'
    restore: true
    attributes:
      icon: mdi:delta
      name: Gewichtsdifferenz

 

3 Sensoren für Gewichts- und BMI-Differenz + Trend

Die 3 Sensoren sehen wie folgend dargestellt aus:

 
sensor:
  - platform: template
    sensors:
      delta_weight:
        friendly_name: "Δ Gewicht"
        unit_of_measurement: 'kg'
        value_template: "{{ '%.1f' | format(float(states.sensor.gewicht.state) - float(states.variable.delta_gewicht.state)) }}"
      delta_bmi:
        friendly_name: "Δ BMI"
        value_template: "{{ '%.1f' | format(float(states.sensor.bmi.state) - float(states.variable.delta_bmi.state)) }}"
      weight_trend:
        friendly_name: "Trend"
        value_template: >
          {% if states('sensor.delta_gewicht') | float > 0 %}
            Zunahme
          {% elif states('sensor.delta_gewicht') | float > 0 %} 
            Abnahme 
          {% else %} 
            Gleich 
          {% endif %} 
        icon_template: >
          {% if states('sensor.delta_gewicht') | float > 0 %}
            mdi:arrow-up-bold
          {% elif states('sensor.delta_gewicht') | float < 0 %}
            mdi:arrow-down-bold
          {% else %}
            mdi:equal
          {% endif %}

 

Automation für Gewichtsübertrag an die Variablen erstellen

Der nächste Schritt ist die Erstellung der Automation, die einmal täglich zu einem definierten Zeitpunkt (2 Uhr nachts) die Werte der erstellten Sensoren (Gewicht und BMI) ausließt und an die beiden ebenfalls erstellten Variablen übergibt:

 
automation:
  - alias: Schreibe Gewicht und BMI Variablen
    trigger:
    - platform: time
      at: '02:00:00'
    action:
    - service: variable.set_variable
      data:
        variable: delta_gewicht
        value_template: '{{ states.sensor.gewicht.state }}'
    - service: variable.set_variable
      data:
        variable: delta_bmi
        value_template: '{{ states.sensor.bmi.state }}'

 

History Graph für die grafische Darstellung des Gewichtsverlaufs

Damit das Gewicht im zeitlichen Verlauf im Frontend erscheint muss ein History Graph hinzugefügt werden. Der dargestellte Zeitraum kann über den Eintrag hours_to_show festgelegt werden:

 
history_graph:
  gewicht:
    name: Gewichtsverlauf
    hours_to_show: 720
    refresh: 3600
    entities:
    - sensor.gewicht

 

Gruppe erstellen

 
group:
  miscale:
    name: Mi Scale
    entities:
    - sensor.gewicht
    - sensor.bmi
    - sensor.delta_gewicht
    - sensor.delta_bmi
    - sensor.gewicht_trend
    - history_graph.gewichtsverlauf

 

Custom Icons für die Sensoren zuweisen

In der Datei customize.yaml folgende Einträge hinzufügen:

 
customize:
  sensor.gewicht:
    icon: mdi:scale-bathroom
  sensor.bmi:
    icon: mdi:human-pregnant
  sensor.delta_gewicht:
    icon: mdi:finance
  sensor.delta_bmi:
    icon: mdi:finance

 

Ergebnis

Wenn alle Schritte erfolgreich durchlaufen wurden, sollte Homeassistant neugestartet und ein Blick in die Logs geworfen werden, ob alles korrekt funktioniert und keine Fehlermeldungen ausgegeben werden. Das Ergebnis sieht so aus: