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

Xiaomi bietet seit längerem ein kleines aber feines Thermometer an, das für unter 5€ bei AliExpress erstanden werden kann. Die genaue Modellbezeichnung lautet LYWSD03MMC. Neben der Temperatur kann dieses zusätzlich noch die Luftfeuchtigkeit messen und seinen Batteriestand mitteilen.

Die Daten des Geräts werden über Bluetooth LE (Low Energy) gesendet und mit der Standard-Firmware von Xiaomi leider nur verschlüsselt übertragen. Zur Dekodierung wird ein sogenannter bind_key benötigt, der sich aber mit kleinem Aufwand auslesen lässt. Alternativ lässt sich eine Custom-Firmware über eine Bluetooth-Verbindung auf die Thermometer flashen, die zusätzlich zur bind_key-Methode einen unverschlüsselten Empfang der Daten ermöglicht.

Methoden zur Einbindung in Homeassistant

Zur Einbindung in Homeassistant stehen prinzipiell 2 Wege zur Verfügung, die ich kurz erläutern möchte:

  1. Wer direkten Zugriff auf die Bluetooth-Schnittstelle der Hardware hat, die Homeassistant ausführt – etwa auf einem Raspberry Pi mit Hass.io -, kann direkt die gesendeten Daten mit der nativen Integration mitemp_bt abgreifen oder auf die Custom Component ble_monitor zurückgreifen.
  2. Wer keine direkten Zugriff auf die Bluetooth-Schnittstelle besitzt, muss einen Umweg gehen und ein weiteres Gerät nutzen, das diese Daten abgreifen kann, bspw. ein ESP32-Mikrocontroller oder ein Raspberry Pi Zero.

In diesem Post möchte ich auf den Fall 2 eingehen und zeigen, wie ein ESP32 mit ESPhome oder ein Raspberry Pi mit einem Bluetooth2MQTT-Gateway genutzt werden kann.

Was benötigt wird

  1. Ein Mobiltelefon mit aktivierten Bluetooth und installierten Chrome-Browser, zum flashen der Custom Firmware
  2. Die aktuellste Custom-Firmware für das Thermometer. Diese Datei muss auf das Smartphone heruntergeladen werden.
  3. Eine App, um die MAC-Adresse des Thermometers auszulesen, z.B. NRF Connect (Android)

Flashen der Custom-Firmware

Mit dem Smartphone muss die Webseite des Telink Flashers aufgerufen werden. Ist dies erfolgt, muss der Button Connect geklickt werden. Es erscheint eine Liste an Bluetooth-Geräten, die in Empfangsreichweite sind. An dieser Stelle wird das Thermometer ausgewählt. Unter dem Punkt Select Firmware wird nun die zuvor heruntergeladene Custom Firmware Datei ausgewählt und mit einem Klick auf Start Flashing auf das Thermometer übertragen.

Anschließend trennt sich die Bluetooth-Verbindung und das Thermometer erhält einen neuen Bluetooth-Gerätenamen. Erneut muss sich mittels Teelink Flasher mit dem Thermometer verbunden werden. Nun erscheint ein weitaus umfangreicheres Menü zum Einstellen des Thermometers.

Wer das kleine Gesicht unten links im Display vermisst, kann dieses unter dem Menüpunkt Smiley: durch aktivieren der Option Comfort wieder auf dem Display sichtbar machen. Wurde die Einstellung gesetzt, muss diese mit Send Config an das Gerät gesendet werden.

Bind-Key auslesen

Im Menü des Teelink Flashers gibt es den Button Show all mi keys. Klickt man auf diesen, erscheint dort unter dem Punkt Mi Bind Key die benötigte Zahlen- und Ziffernfolge. Diese wird für die Konfiguration von ESPhome benötigt und muss kopiert werden.

MAC-Adresse des Thermometer herausfinden

Die MAC-Adresse kann mit der NRF Connect App ausgelesen werden. Alternativ kann dies auch unter Linux mit dem Terminal erfolgen:

sudo hcitool lescan

LE Scan ...
A4:C1:38:B1:CD:7F ATC_838293

Mit der MAC-Adresse und dem Bind-Key sind alle Informationen vorhanden, um mit ESPhome fortzufahren.

Integration in Homeassistant

Methode 1: ESPhome

Esphome hat sich zu einem wahren schweizer Taschenmesser im Umgang mit Homeassistant entwickelt. Seit kurzem ist auch das zugehörige Add-On offiziell im Hass.io Repository vorhanden. Dieses Add-On übernimmt mit einem Wizard die initiale Konfiguration des ESP32 und muss dann lediglich um die folgenden Zeilen ergänzt werden:

sensor:
  - platform: xiaomi_lywsd03mmc
    mac_address: "A4:C1:38:B1:CD:7F"
    bindkey: "eef418daf699a0c188f3bfd17e4565d9"
    temperature:
      name: "LYWSD03MMC Temperature"
    humidity:
      name: "LYWSD03MMC Humidity"
    battery_level:
      name: "LYWSD03MMC Battery Level"

Diese Werte dürfen natürlich nicht 1:1 übernommen werden und die MAC-Adresse, sowie der Bind-Key müssen durch die zuvor ermittelten Angaben ausgetauscht werden.

ESPhome exportiert anschließend eine vorkompilierte Binärdatei, die nun auf den ESP32 geflasht werden muss, bspw. mit dem bewährten ESPhome Flasher.

Anschließend muss der geflashte Mikrokontroller im ESPhome Add-On als Node hinzugefügt werden und die Werte für Temperatur, Luftfeuchtigkeit und den Batteriestand stehen in Homeassistant zur Verfügung.

Methode 2: BT-MQTT-Gateway

Wer diesen Blog schon länger verfolgt, erinnert sich evtl. an meinen Post Xiaomi MiScale Waage in Homeassistant integrieren . Dort kam ein Bluetooth Gateway zum Einsatz, das die gelesen Werte mittels MQTT an Homeassistant sendet. Dieses Gateway läuft stabil und zuverlässig auf einem Raspberry Pi Zero und unterstützt auch das Auslesen des Thermometers. Bevor dieses jedoch eingebunden werden kann, muss noch eine Einstellung in der Custom Firmware des Thermometers vorgenommen werden:

Advertising Type ändern auf ATC1441

Das BT-MQTT-Gateway erwartet die zugesandten Daten ausschließlich im ATC1441-Format (Stand: 17.01.2021) . Dieses Format muss im Teelink Flasher unter dem Menüpunkt Advertising type: ausgewählt werden und anschließend mit Send Config an das Gerät gesendet werden.

Worker für das Gateway konfigurieren

In der config.yaml von BT-MQTT-Gateway muss ein sogenannter Worker angelegt werden. Dieser funktioniert im Kern exakt wie bei der Xiaomi Personenwaage, hat aber eine ausführlichere Konfiguration:

lywsd03mmc:
  args:
    devices:
      kueche: a4:c1:38:b1:cd:7f
    topic_prefix: mithermometer
    passive: true
    #command_timeout: 30 
    scan_timeout: 30
  update_interval: 120

ACHTUNG: Im Gegensatz zu ESPhome muss die MAC-Adresse zwingend in Kleinbuchstaben eingegeben werden. Ansonsten werden keine Werte ausgelesen und übermittelt.

MQTT-Sensoren in Homeassistant anlegen

Das Gateway funkt nun die Werte unter dem MQTT-Topic mithermometer/kueche über MQTT. Damit Homeassistant diese verwenden kann, müssen 3 Sensoren für Temperatur, Luftfeuchtigkeit und Batteriestand angelegt werden:

- platform: mqtt
  name: "Mithermometer Kueche Temperature"
  state_topic: "mithermometer/kueche"
  unit_of_measurement: '°C'
  value_template: "{{ value_json.temperature }}"
  icon: mdi:thermometer
- platform: mqtt
  name: "Mithermometer Kueche Humidity"
  state_topic: "mithermometer/kueche"
  unit_of_measurement: '%'
  value_template: "{{ value_json.humidity }}"
  icon: mdi:water-percent
- platform: mqtt
  name: "Mithermometer Kueche Battery Level"
  state_topic: "mithermometer/kueche"
  unit_of_measurement: '%'
  value_template: "{{ value_json.battery }}"
  icon: mdi:battery-80

Voilà! Nun muss nur noch einmal Homeassistant neu gestartet werden und die Werte können fortan in der Lovelace-UI dargestellt werden.