Dieser Post enthält Themen, die bereits in zwei vorherige Posts beschrieben wurden:


Viele IoT-Geräte funken ihre Daten über Bluetooth LE. Um diese ins Smarthome integrieren zu können benötigt man ein Gerät mit Bluetooth-Schnittstelle, das als Broker fungiert. Ich nutze dafür seit Jahren zuverlässig einen Raspberry Pi Zero, der in Anbetracht des schlichten Abfangens und Weiterleitens von Paketdaten, unterfordert und überdimensioniert ist. Ein solches Bluetooth Hub lässt sich mittels eines ESP32 und ESPhome mit deutlich geringerem Stromverbrauch und Konfigurationsaufwand realisieren.

Umgezogen werden bei mir die folgenden Bluetooth Sensoren, die nun vom ESP32 ausgelesen und an Homeassistant weitergereicht werden:

Vorraussetzungen

Benötigt werden:

  • ESP32 bspw. die Variante ESP32 D1 Mini, die ich für dieses Projekt verwendet habe
  • ESPhome Add-On für Hass.io
  • Chrome bzw. Edge Browser oder ESPhome Flasher zum einmaligen flashen der Firmware

Konfiguration

ESPhome Add-On

Im ersten Schritt muss das ESPhome Add-On installiert, aktiviert und gestartet werden. Anschließend kann über SMB oder das VS-Code-Add-On eine Datei namens secrets.yaml angelegt werden, in der alle sensitiven Daten, wie WiFi-Passwörter, API-Keys oder Atomraketenstartcodes hinterlegt werden können. Diese Einträge können mittels Variablen bei der Konfiguration verwendet werden.

Die Datei muss im Pfad ./config/esphome/secrets.yaml erstellt und kann anschließend diesem Schema und Beispieleinträgen gefüllt werden:

wifi_ssid: LanSolo
wifi_passwd: Wurstjunge12
api_passwd: Ras3nkant3
ota_passwd: S4mtpf0te
ap_passwd: GoBBerw4rz3

Nach der Anlage der Datei, kann diese auch direkt aus dem ESPhome Dashboard in Homeassistant editiert werden. Dafür steht das Schlosssymbol neben dem Button SECRETS zur verfügung:

ESPhome Dashboard Screenshot

Damit ist die Basis geschaffen, um die Konfiguration des Mikrokontrollers anzulegen. Im ESPhome Dashboard wird mit einem Klick auf das (+)-Icon eine neue Node erzeugt. So heißen die einzelnen eingebundenen Mikrokontroller, auf denen ESPhome läuft.

MiFlora Pflanzensensoren

Benötigt wird lediglich die MAC-Adresse des Sensors, um die Daten zu empfangen. In Firmwareversionen vor 2.3.1 sendeten die Pflanzensensoren noch ihren Batteriestand. Dies ist mit neueren Firmwares leider nicht mehr möglich.

Eine Beispielkonfiguration:

- platform: xiaomi_hhccjcy01
  mac_address: "C4:7C:23:69:63:08"
  temperature:
    name: "Vietnamchili Temperature"
  moisture:
    name: "Vietnamchili Moisture"
  illuminance:
    name: "Vietnamchili Illuminance"
  conductivity:
    name: "Vietnamchili Soil Conductivity"

Ein kleiner Tipp noch zum Troubleshooting:
Meine Sensoren liefen auf der Firmware 2.7.0. Damit konnten nicht zuverlässig Werte empfangen werden. Man kann die Firmware der Sensoren leicht mit der App Flower Care (Android / iOS) updaten. Die App setzt jedoch einen Account bei Xiaomi vorraus.

MiScale v1

Für die Waage von Xiaomi sollte der ESP32 das aktuelle Gewicht auslesen und zeitgleich noch einen weiteren Sensor für den BMI berechnen und an Homeassistant Senden. Die Berechnung des BMI hatte ich zuvor on Homeassitant mit einem Template Sensor gelöst. Diese Aufgabe kann nun der Mikrocontroller übernehmen. Auch für die Waage muss die MAC-Adresse bekannt sein:

- platform: xiaomi_miscale
  mac_address: 'C4:3F:13:E0:AC:82'
  weight:
    id: "miscale_weight"
    name: "Miscale Weight"
    icon: mdi:scale-bathroom
    accuracy_decimals: 1
    on_value:
      then:
        - lambda: |-
            const float bmi_factor = 0.29860551;
            return id(miscale_bmi).publish_state(x * bmi_factor);
    
- platform: template
  id: "miscale_bmi"
  name: "Miscale BMI"
  icon: mdi:human-pregnant
  unit_of_measurement: ""
  accuracy_decimals: 1

Diese Konfiguration enthält zwei Sensoren für Gewicht und BMI. Wird das Gewicht ausgelesen erfolgt automatisch die Berechnung des BMI. Der Faktor 0.29860551 muss gemäß der eigenen Körperwerte angepasst werden und setzt sich aus dem Kehrwert des Quadrats der Körperhöhe [m] zusammen:

BMI-Formel

Tipp zum Abschluss:
Für die Xiaomi Waage gibt es eine Custom Component, die es erlaubt mehrere Benutzer zu tracken und einen erweiterten Fundus an generierten Fitnessdaten liefert.

Mithermometer

Auch die Mithermometer lassen sich einfach über die MAC-Adresse einbinden. Am einfachsten lassen sie sich auslesen, wenn man den Advertising Type auf den Wert Custom setzt. Wie das geht, habe ich in dem ursprünglichen Post zu dem Thermometer bereits beschrieben. Dort wurde jedoch der Funkstandard (Advertising Type) ATC1441 genutzt. Im gleichen Menü kann der Standard gewechselt werden.

Ein Konfiguration für ESPhome sieht dann wie folgt aus:

- platform: pvvx_mithermometer
  mac_address: "A6:C3:23:E0:A8:42"
  temperature:
    name: "Mithermometer Kueche Temperature"
  humidity:
    name: "Mithermometer Kueche Humidity"
  battery_level:
    name: "Mithermometer Kueche Battery Level"
  battery_voltage:
    name: "Mithermometer Kueche Battery Voltage"

Vollständige Kofiguration des ESP32

Nun müssen nur noch alle drei Teilkonfigurationen zusammengeführt, kompiliert und auf den Mikrocontroller geflasht werden. In dieser Konfiguration können die Variablen aus der secrets.yaml verwendet werden. Eine vollständige Konfiguration könnte so aussehen. Wichtig ist, dass ggf. der Eintrag im Feld board: angepasst wird, wenn eine abweichende Variante vom ESP32 verwendet wird:

esphome:
  name: esp32-btle-hub
  comment: ESP32 Bluetooth LE Hub
  platform: ESP32
  board: esp32dev

# Enable logging
logger:

# Enable Home Assistant API
api:
  password: !secret api_passwd

ota:
  password: !secret ota_passwd

wifi:
  ssid: !secret wifi_ssid
  password: !secret wifi_passwd
  fast_connect: true

  # Enable fallback hotspot (captive portal) in case wifi connection fails
  ap:
    ssid: "Btle-Hub Fallback Hotspot"
    password: !secret ap_passwd

captive_portal:

esp32_ble_tracker:

sensor:
  # XIAOMI MISCALE
  - platform: xiaomi_miscale
    mac_address: 'C4:3F:13:E0:AC:82'
    weight:
      id: "miscale_weight"
      name: "Miscale Weight"
      icon: mdi:scale-bathroom
      accuracy_decimals: 1
      on_value:
        then:
          - lambda: |-
              const float bmi_factor = 0.29860551;
              return id(miscale_bmi).publish_state(x * bmi_factor);
      
  - platform: template
    id: "miscale_bmi"
    name: "Miscale BMI"
    icon: mdi:human-pregnant
    unit_of_measurement: ""
    accuracy_decimals: 1
    
  # XIAOMI THERMOMETER
  - platform: pvvx_mithermometer
    mac_address: "A6:C3:23:E0:A8:42"
    temperature:
      name: "Mithermometer Kueche Temperature"
    humidity:
      name: "Mithermometer Kueche Humidity"
    battery_level:
      name: "Mithermometer Kueche Battery Level"
    battery_voltage:
      name: "Mithermometer Kueche Battery Voltage"
  
  # XIAOMI MIFLORA PLANT SENSOR    
  - platform: xiaomi_hhccjcy01
    mac_address: "C4:7C:23:69:63:08"
    temperature:
      name: "Vietnamchili Temperature"
    moisture:
      name: "Vietnamchili Moisture"
    illuminance:
      name: "Vietnamchili Illuminance"
    conductivity:
      name: "Vietnamchili Soil Conductivity"

Dieser Code muss im ESPhome Add-On im Editor zur Node eingegeben, gespeichert und kompilliert werden.

Firmware flashen

Im ESPhome Add-On gibt es mehrere Möglichkeiten eine Firmware auf den ESP32 zu installieren:

ESPhome auf Mikrocontroller flashen

Der einfachste Weg ist die erste Option den Mikrocontroller direkt aus dem Browser heraus zu flashen. Vorraussetzung dafür ist der Browser Chrome oder Edge. Mit Firefox klappt es nicht.

Ich nutze immer die letzte Option des manuellen Downloads und lade die Firmware herunter und flashe sie anschließend mit dem ESPhome Flasher. Dieser Vorgang muss nur einmal erfolgen, da Nodes später Over-The-Air geupdated werden können.

Ist der Flashvorgang erfolgreich durchlaufen wird der ESP32 automatisch neu starten.

ESP32 Node in Hass einbinden

Homeassistant erkennt nach dem erfolgreichen Flashvorgang den ESP32 automatisch und bietet an diesen zu integrieren. Beim initialen Verbinden mit dem Controller muss dann das definierte Passwort, welches in der Variable !secret api_passwd hinterlegt ist, eingegeben werden. Anschließend stehen alle Sensoren in Homeassistant zur Verfügung.

Sollte die automatischer Erkennung der Node nicht klappen, kann diese auch manuell eingebunden werden indem man im Menü Configuration > Devices & Services den Button Add Integration klickt und dort den Eintrag ESPHome auswählt.