ESP32 BLE Anwesenheitserkennung in Home Assistant

ESP32 BLE Anwesenheitserkennung in Home Assistant: ESPresense, ESPHome BLE Tracker und Companion App im Vergleich — Schritt für Schritt erklärt.

Stand
Erstellt
Lesezeit
13 Min.
Blatt
14 von 52
Thema
ESPHome
ESP32 BLE Anwesenheitserkennung in Home Assistant

Werbung / Affiliate-Links: Mit * markierte Links sind Affiliate-Links. Beim Kauf über diese Links erhalten wir eine kleine Provision — für dich ändert sich am Preis nichts. Als Amazon-Partner verdienen wir an qualifizierten Verkäufen.

Warum BLE-Anwesenheitserkennung?

Bewegungsmelder sind dumm. Klingt hart, ist aber so. Ein PIR-Sensor merkt, wenn du durch den Flur rennst — aber sobald du auf der Couch sitzt und Netflix schaust, denkt er nach fünf Minuten, der Raum sei leer. Licht aus, Heizung runter, du fluchst im Dunkeln.

Die Lösung heißt Bluetooth Low Energy (BLE) Anwesenheitserkennung mit einem ESP32. Statt auf Bewegung zu reagieren, erkennt das System, ob sich ein bestimmtes Gerät — dein Smartphone, deine Smartwatch, ein BLE-Beacon — tatsächlich im Raum befindet. Solange du da bist, weiß Home Assistant Bescheid. Egal ob du dich bewegst oder nicht.

In diesem Artikel zeige ich dir drei etablierte Methoden, wie du das umsetzt:

  1. ESPresense — eigenständige Firmware mit MQTT-Anbindung
  2. ESPHome BLE Tracker — direkt in ESPHome integriert
  3. Home Assistant Companion App — BLE Transmitter auf dem Android-Smartphone

Für jede Methode bekommst du eine konkrete Einrichtung, YAML-Configs und Automations-Beispiele, die du sofort verwenden kannst.

Was ist BLE-Anwesenheitserkennung und warum brauchst du sie?

Bluetooth Low Energy (BLE) ist ein stromsparendes Funkprotokoll, das in praktisch jedem modernen Smartphone, jeder Smartwatch und vielen IoT-Geräten steckt. Diese Geräte senden regelmäßig sogenannte Advertisement-Pakete — kurze Funksignale, die ihre Anwesenheit ankündigen.

Ein ESP32 hat einen eingebauten BLE-Empfänger. Wenn du in jedem Raum einen ESP32 platzierst, kann jeder davon diese Signale empfangen und die Signalstärke (RSSI) messen. Daraus lässt sich ableiten, welcher ESP32 dem Gerät am nächsten ist — und damit in welchem Raum sich die Person befindet.

Vorteile gegenüber Bewegungsmeldern

EigenschaftBewegungsmelder (PIR)BLE-Anwesenheit
Erkennt Stillsitzen
Raumgenaue Zuordnung
Personenunterscheidung
ReaktionszeitSofortEinige Sekunden (je nach Scan-Intervall und Glättung)
Kosten pro Raum10–25 €5–10 € (ESP32)

Der große Vorteil: Du kannst nicht nur erkennen, ob jemand da ist, sondern auch wer. Das eröffnet Automationen wie: „Wenn Alex ins Büro geht, starte seine Playlist. Wenn Sarah ins Wohnzimmer kommt, dimme das Licht auf 60 %.”

Methode 1: ESPresense — Der Spezialist

ESPresense ist eine eigenständige Firmware für den ESP32, die speziell für BLE-Anwesenheitserkennung entwickelt wurde. Sie ist das ausgereifteste Projekt in diesem Bereich und bietet Features, die über einfaches Tracking hinausgehen.

Was kann ESPresense?

  • Raumgenaue Zuordnung: Jeder Knoten schätzt die Entfernung, Home Assistant ordnet dich dem nächstgelegenen Raum zu (echte Trilateration auf einem Grundriss bietet der Zusatzdienst ESPresense-Companion)
  • Fingerprinting von Geräten (auch ohne feste MAC-Adresse)
  • iOS-Unterstützung über Identity Resolving Keys (IRK)
  • MQTT-Integration — perfekt für Home Assistant
  • Web-UI zur Konfiguration direkt auf dem ESP32

Hardware-Voraussetzungen

Du brauchst pro Raum:

Ein ESP32-DevKit bekommst du für unter 5 € — das ist günstiger als jeder vernünftige Bewegungsmelder.

Installation

  1. Firmware flashen: Geh auf espresense.com/firmware und flashe die Firmware direkt im Browser über Web Serial. Kein zusätzliches Tool nötig.

  2. WLAN konfigurieren: Nach dem Flashen öffnet der ESP32 einen eigenen Access Point. Verbinde dich damit und gib deine WLAN-Zugangsdaten ein.

  3. MQTT konfigurieren: In der Web-UI (erreichbar über die IP des ESP32) trägst du deinen MQTT-Broker ein:

    • MQTT Host: IP deines Brokers (z. B. 192.168.1.100)
    • MQTT Port: 1883
    • Room Name: Der Name des Raums (z. B. wohnzimmer)
  4. Gerät enrollen: Android-Smartphones wechseln ihre BLE-MAC-Adresse regelmäßig, die MAC-Adresse reicht deshalb nicht. Aktiviere stattdessen in der Companion App den BLE Transmitter (siehe Methode 3). Das Handy sendet dann ein iBeacon mit fester UUID, an dem ESPresense es wiedererkennt. Für iPhone und Apple Watch brauchst du den IRK (Identity Resolving Key): Öffne http://IP-DES-ESP/ui/#/devices, gib einen Namen wie philipp-handy in das Enroll-Feld ein und klicke auf Enroll. Koppele das iPhone danach innerhalb von zwei Minuten unter Einstellungen → Bluetooth mit dem Eintrag „ESPresense“. Die Firmware liest den IRK dabei aus und verteilt ihn per MQTT an alle Knoten.

MQTT-Topics

ESPresense trennt Knoten- und Gerätedaten. Die Entfernungen pro Gerät landen unter:

espresense/devices/DEVICE-ID/RAUM

Für dein Handy im Wohnzimmer also zum Beispiel espresense/devices/philipp-handy/wohnzimmer. Unter espresense/rooms/RAUM/... veröffentlicht jeder Knoten dagegen seinen Status, seine Telemetrie und seine Einstellungen.

Die Geräte-Payload enthält unter anderem:

  • distance — geschätzte Entfernung in Metern
  • rssi — Signalstärke (je negativer, desto weiter weg)
  • name — Gerätename

Home Assistant Integration

Per MQTT Discovery legt Home Assistant automatisch nur die ESPresense-Knoten an: Jeder ESP32 erscheint als Gerät mit Entitäten, etwa für die maximale Entfernung oder den aktiven Scan. Die Geräte, die du verfolgen willst, trägst du selbst in die configuration.yaml ein, und zwar über die Integration MQTT Room Presence (mqtt_room):

sensor:
  - platform: mqtt_room
    device_id: "philipp-handy"
    name: "ESPresense Alex Handy"
    state_topic: "espresense/devices/philipp-handy"
    timeout: 10
    away_timeout: 120

Die device_id muss exakt der ID entsprechen, die ESPresense für das Gerät meldet: bei einem enrollten iPhone der vergebene Name, beim Android-Transmitter die iBeacon-ID. Nach einem Neustart von Home Assistant hast du einen Sensor wie sensor.espresense_philipp_handy, dessen State der Raum des nächstgelegenen Knotens ist (z. B. wohnzimmer). Meldet sich das Gerät länger als away_timeout Sekunden nicht, wechselt der State auf not_home.

Brauchst du zusätzlich die Entfernung zu einem bestimmten Knoten, legst du einen MQTT-Sensor auf das Raum-Topic an:

mqtt:
  sensor:
    - name: "Alex Entfernung Wohnzimmer"
      state_topic: "espresense/devices/philipp-handy/wohnzimmer"
      value_template: "{{ value_json.distance }}"
      unit_of_measurement: "m"

Methode 2: ESPHome BLE Tracker

Wenn du bereits ESPHome nutzt, brauchst du keine separate Firmware. ESPHome hat eine eingebaute esp32_ble_tracker-Komponente, die BLE-Geräte erkennen kann.

Wann ESPHome statt ESPresense?

  • Du nutzt den ESP32 bereits für andere Sensoren (Temperatur, Luftfeuchtigkeit, Stromverbrauch)
  • Du willst alles in einer Firmware verwalten
  • Du brauchst keine Raumzuordnung über mehrere Knoten oder übernimmst sie mit Bermuda direkt in Home Assistant (siehe unten)

Basis-Konfiguration

esp32_ble_tracker:
  scan_parameters:
    interval: 1100ms
    window: 1100ms
    active: true

binary_sensor:
  - platform: ble_presence
    mac_address: "AA:BB:CC:DD:EE:FF"
    name: "Alex Anwesend"
    device_class: presence

Diese einfache Config erkennt, ob ein Gerät mit der angegebenen MAC-Adresse in BLE-Reichweite ist. Die binary_sensor-Entity wird on, sobald das Gerät erkannt wird, und off, wenn es verschwindet. Das klappt nur mit Geräten, die eine feste MAC-Adresse senden, etwa BLE-Beacons. Smartphones wechseln ihre Adresse; für sie bietet ble_presence statt mac_address die Optionen irk (iPhone) und ibeacon_uuid (Android mit BLE Transmitter).

RSSI-basierte Entfernung

Für eine grobe Entfernungsschätzung kannst du den RSSI-Wert als Sensor exponieren:

sensor:
  - platform: ble_rssi
    mac_address: "AA:BB:CC:DD:EE:FF"
    name: "Alex RSSI Büro"
    filters:
      - exponential_moving_average:
          alpha: 0.3
          send_every: 1

Der Exponential Moving Average glättet die Werte — BLE-Signalstärke schwankt naturgemäß stark.

Bermuda BLE Trilateration (HACS-Integration)

Für eine komfortablere Lösung gibt es Bermuda BLE Trilateration als HACS-Integration. Bermuda nutzt die Bluetooth-Proxy-Funktion von ESPHome und ordnet Geräte direkt in Home Assistant einem Bereich (Raum) zu:

  1. Aktiviere auf jedem ESPHome-Knoten den Bluetooth-Proxy, indem du bluetooth_proxy: (mit active: true) in die Konfiguration aufnimmst, und flashe neu.
  2. HACS installieren (falls noch nicht vorhanden).
  3. In HACS nach „Bermuda“ suchen, installieren und Home Assistant neu starten.
  4. Unter Einstellungen → Geräte & Dienste → Integration hinzufügen die Integration Bermuda BLE Trilateration hinzufügen.
  5. In der Integration auf Konfigurieren klicken und die Bluetooth-Geräte auswählen, die du verfolgen willst.
  6. Ordne jeden Proxy in Home Assistant dem Bereich zu, in dem er steht.

Bermuda legt für jedes gewählte Gerät Sensoren für Bereich und Entfernung sowie eine device_tracker-Entität an, die du einer Person zuordnen kannst. iPhones bindest du über die Integration Private BLE Device mit ihrem IRK ein, Android-Handys über das iBeacon der Companion App. Der Vorteil: Du bekommst eine UI zur Geräteverwaltung und Raumzuordnung und musst nur den Proxy per YAML aktivieren. Laut Bermuda-Doku funktionieren auch Shelly-Geräte ab Generation 2 mit aktiviertem Bluetooth-Proxy als Empfänger.

Methode 3: Home Assistant Companion App

Die einfachste Methode — aber auch die eingeschränkteste. Die Home Assistant Companion App für Android kann als BLE Transmitter fungieren und sendet dann regelmäßig ein iBeacon mit fester UUID. Als Empfänger brauchst du weiterhin ESPresense-Knoten oder ESPHome-Proxys mit Bermuda.

Einrichtung (Android)

  1. Home Assistant Companion App öffnen
  2. Einstellungen → Companion App → Sensoren verwalten → BLE Transmitter
  3. BLE Transmitter aktivieren
  4. Sendeleistung (Transmit Power) und Advertise Mode konfigurieren
  5. Die App von der Akku-Optimierung ausnehmen, sonst beendet Android sie im Hintergrund

Einrichtung (iOS)

Die iOS-App bietet keinen BLE Transmitter; laut Companion-Dokumentation gibt es den Sensor nur unter Android. Für iPhones nutzt du deshalb ESPresense mit IRK-Enrollment oder Bermuda zusammen mit der Integration Private BLE Device.

Vor- und Nachteile

Vorteile:

  • Kein zusätzlicher Beacon nötig, das Handy sendet selbst (als Empfänger brauchst du trotzdem ESP32-Knoten)
  • Einfachste Einrichtung

Nachteile:

  • Akkuverbrauch auf dem Smartphone
  • Nur für Android, die iOS-App hat keinen BLE Transmitter
  • Allein liefert der Transmitter keine Raumzuordnung, erst ESPresense oder Bermuda werten das Signal aus

Vergleich: Welche Methode passt zu dir?

KriteriumESPresenseESPHome BLECompanion App
Raumgenauigkeit
iOS-Support (IRK) (IRK)
EinrichtungsaufwandMittelGeringSehr gering
Multi-Raum nächster Knoten mit Bermuda
Zusätzliche Sensoren Nur BLE Alles in ESPHome
MQTT erforderlich
Akkuverbrauch HandyKeiner (Android: Transmitter nötig)Keiner (Android: Transmitter nötig)Mittel

Meine Empfehlung:

  • ESPresense, wenn du raumgenaue Erkennung in mehreren Räumen willst. Das ist die Königsdisziplin.
  • ESPHome BLE Tracker, wenn du bereits ESP32s mit ESPHome im Einsatz hast und einfach Anwesenheit pro Raum ergänzen willst.
  • Companion App, wenn du nur wissen willst, ob jemand zuhause ist (nicht in welchem Raum).

Praxis: Automationen mit BLE-Anwesenheit

Jetzt wird’s spannend. Eine Anwesenheitserkennung ist nur so gut wie die Automationen, die darauf aufbauen. Hier ein paar Beispiele:

Licht an bei Betreten, aus bei Verlassen

automation:
  - alias: "Büro Licht an wenn Alex da"
    triggers:
      - trigger: state
        entity_id: sensor.espresense_philipp_handy
        to: "buero"
    actions:
      - action: light.turn_on
        target:
          entity_id: light.buero_decke
        data:
          brightness_pct: 80
          color_temp_kelvin: 4000

  - alias: "Büro Licht aus wenn Alex weg"
    triggers:
      - trigger: state
        entity_id: sensor.espresense_philipp_handy
        from: "buero"
    actions:
      - delay: "00:02:00"
      - condition: not
        conditions:
          - condition: state
            entity_id: sensor.espresense_philipp_handy
            state: "buero"
      - action: light.turn_off
        target:
          entity_id: light.buero_decke

Der 2-Minuten-Delay beim Ausschalten verhindert Flackern, falls das BLE-Signal kurz aussetzt.

Heizung nach Person steuern

Anwesenheitserkennung ist der perfekte Partner für eine smarte Heizungssteuerung — wer nicht da ist, muss auch nicht heizen.

automation:
  - alias: "Wohnzimmer Heizung nach Anwesenheit"
    triggers:
      - trigger: state
        entity_id: binary_sensor.philipp_anwesend_wohnzimmer
    actions:
      - action: climate.set_temperature
        target:
          entity_id: climate.wohnzimmer
        data:
          temperature: >
            {% if trigger.to_state.state == 'on' %}
              21
            {% else %}
              17
            {% endif %}

Musik folgt dir durchs Haus

automation:
  - alias: "Musik folgt Alex"
    triggers:
      - trigger: state
        entity_id: sensor.espresense_philipp_handy
    conditions:
      - condition: state
        entity_id: media_player.spotify
        state: "playing"
    actions:
      - action: media_player.select_source
        target:
          entity_id: media_player.spotify
        data:
          source: "{{ trigger.to_state.state | replace('_', ' ') | title }}"

Tipps für zuverlässige Erkennung

ESP32 Platzierung

  • Mittig im Raum montieren, nicht in einer Ecke
  • Höhe: etwa 1,5–2 Meter, über Möbeln
  • Abstand zu Metall und dicken Wänden halten
  • Direkte Sichtlinie zum typischen Aufenthaltsort ist ideal

Signalstabilität

BLE-Signale schwanken — das ist normal. Diese Maßnahmen helfen:

  • Glättung: Exponential Moving Average in ESPHome; bei ESPresense sorgt der timeout im mqtt_room-Sensor dafür, dass ältere Messungen eines Knotens verworfen werden
  • Hysterese: Gerät erst als „weg” markieren, wenn es 30–60 Sekunden nicht mehr gesehen wurde
  • Max Distance: In ESPresense kannst du eine maximale Entfernung pro Raum setzen — alles darüber gilt als „nicht im Raum”

Mehrere Räume kalibrieren

Bei ESPresense lohnt sich die Kalibrierung von drei Werten: dem RSSI-Referenzwert bei 1 Meter (ref_rssi), der Empfängerkorrektur pro Knoten (rx_adj_rssi) und dem Dämpfungsfaktor absorption. Wichtig: absorption ist kein Glättungsfilter, sondern der Pfadverlust-Exponent. Je höher der Wert, desto mehr Dämpfung nimmt ESPresense an und desto größer fällt die berechnete Entfernung bei gleichem RSSI aus (Standard 2,7, typisch 2,5–3,5).

  1. Halte dein Gerät 1 Meter vor einen Referenzknoten, notiere den RSSI-Wert und trag ihn auf allen Knoten als RSSI-Referenz bei 1 m ein. iBeacons wie der BLE Transmitter der Companion App senden diesen Wert selbst mit; dort stellst du ihn in der App ein.
  2. Leg das Gerät bei jedem weiteren Knoten in denselben Abstand und gleiche die Abweichung mit rx_adj_rssi aus, bis alle Knoten ähnliche RSSI-Werte melden. Miss dabei ab 2 Metern, darunter verfälschen Nahfeldeffekte die Werte.
  3. Geh mehrere Meter durch deine Wände und passe absorption an, bis die angezeigte Entfernung zur Realität passt.
  4. Prüfe das Ergebnis an einer zweiten Stelle, damit du nicht auf einen einzigen Punkt kalibrierst.

Häufige Probleme und Lösungen

Android-Gerät wird nicht erkannt

  • Stelle sicher, dass Bluetooth und Standort aktiviert sind
  • Prüfe, ob die Home Assistant Companion App im Hintergrund laufen darf (Akku-Optimierung deaktivieren)
  • Manche Android-Hersteller (Xiaomi, Huawei) killen aggressiv Hintergrund-Apps

iOS-Gerät springt zwischen Räumen

  • Nutze IRK statt MAC-Adresse (Apple randomisiert BLE-MACs)
  • Setze die maximale Entfernung (max_distance) weiter entfernter Knoten niedriger, damit sie dich nicht mehr melden
  • Verringere das Scan-Intervall

ESP32 verliert WLAN

  • Nutze ein Board mit externer Antenne für besseren WLAN-Empfang
  • Setze einen statischen DHCP-Lease im Router
  • Bei ESPresense: Die Firmware startet bei längerem WLAN- oder MQTT-Ausfall selbst neu; hängt ein Knoten in einer Neustart-Schleife, prüfe das serielle Log

Fazit

BLE-Anwesenheitserkennung mit dem ESP32 ist eins der besten Upgrades, die du deinem Smart Home verpassen kannst. Für unter 10 € pro Raum bekommst du eine Erkennung, die Bewegungsmeldern in jeder Hinsicht überlegen ist — zumindest wenn es darum geht, ob jemand da ist, nicht nur ob sich gerade jemand bewegt hat. Noch präzisere Ergebnisse liefern mmWave-Präsenzmelder in Home Assistant, die auch ruhende Personen zuverlässig erkennen.

ESPresense ist die beste Wahl für Multi-Raum-Setups mit präziser Ortung. ESPHome BLE Tracker ist perfekt, wenn du deine bestehenden ESPHome-Nodes erweitern willst. Und die Companion App taugt als schneller Einstieg zum Ausprobieren.

Fang mit einem Raum an — Büro oder Wohnzimmer, wo du die meiste Zeit verbringst. Wenn das läuft, ist die Erweiterung auf weitere Räume ein Kinderspiel.

Weiterführende Artikel:

Autor
Philipp
Themen
Home Assistant, ESP32, Zigbee

Schreibt über Home Assistant, ESP32 und alles, was das Smart Home smarter macht.

Dieser Artikel wurde mit KI-Unterstützung erstellt; Angaben werden gegen offizielle Dokumentation und Herstellerangaben geprüft. Wie die Artikel entstehen