📖 Handbuch

Vollständige Dokumentation für BLE Presence v1.0

Voraussetzungen

Master (Raspberry Pi)

Scanner

Zu trackende Geräte

Jedes BLE-Gerät, das regelmäßig Advertisements sendet — z.B. BLE-Tags, Shelly-Geräte, iBeacons. Protokolle: BLE/Eddystone/BTHome.

Button-Events funktionieren aktuell nur mit BTHome Devices, z.B. Shelly BLU Button.

Aufgrund der wechselnden MAC-Adresse eignen sich keine AirTags und AirTag-kompatible Geräte.

Empfehlung: Shelly BLU Button, Feasycom Eddystone Devices.

Geräte-Katalog

Hier findest du eine Übersicht kompatibler BLE-Geräte, die mit BLE Presence getestet wurden. Die Tabelle wird laufend erweitert.

Hersteller Bezeichnung Formfaktor Protokolle UUID konfig. Button Batterie Lebensdauer Bewertung Bezugsquelle Preis ca.
Shelly BLU Button Button BTHome ✅ CR2032 ~1 Jahr ⭐⭐⭐⭐⭐ shelly.com ~10 €
Shelly BLU Door/Window Sensor BTHome ✅ CR2032 ~1 Jahr ⭐⭐⭐⭐ shelly.com ~15 €
Feasycom FSC-BP108 Tag Eddystone / iBeacon ✅ CR2477 ~2–3 Jahre ⭐⭐⭐⭐⭐ feasycom.com ~8 €
Feasycom FSC-BP104 Tag Eddystone / iBeacon ✅ CR2032 ~1 Jahr ⭐⭐⭐⭐ feasycom.com ~5 €
Android Handy Beacon Scope App Smartphone iBeacon / Eddystone / AltBeacon ⭐⭐⭐ Google Play Kostenlos
⚠️ Wichtig — Feasycom UUID ändern!
Feasycom-Tags werden ab Werk mit einer Standard-UUID ausgeliefert. Diese muss vor der Nutzung über die Feasycom-App geändert werden, da sonst alle Tags die gleiche Kennung senden und nicht unterscheidbar sind.
💡 Tipp
Geräte mit konfigurierbarer UUID sind ideal, da sie eine feste Kennung senden. Geräte mit wechselnder MAC-Adresse (z.B. AirTags) funktionieren nicht mit BLE Presence.

Android App

Für die Einrichtung und Konfiguration von BLE-Tags wird die jeweilige Hersteller-App benötigt.

Hersteller-Apps

Hersteller App Funktionen
Feasycom Feasycom Tool UUID/Namespace konfigurieren, Sende-Intervall, TX Power, Protokoll wählen
Shelly Shelly Smart Control Button-Aktionen konfigurieren, Firmware-Updates

UUID konfigurieren

Bei Geräten mit konfigurierbarer UUID (z.B. Feasycom-Tags) wird die UUID über die Hersteller-App geändert:

  1. Hersteller-App installieren und Bluetooth aktivieren
  2. Tag in der App suchen und verbinden
  3. UUID, Major/Minor (iBeacon) oder Namespace/Instance (Eddystone) setzen
  4. Änderungen speichern — das Gerät sendet ab sofort mit der neuen Kennung
⚠️ Wichtig
Feasycom-Tags müssen vor der Nutzung unbedingt per Feasycom-App mit einer eigenen UUID konfiguriert werden. Ab Werk senden alle Tags die gleiche Standard-UUID!

Android Handy als Beacon

Mit der App Beacon Scope kann jedes Android-Handy (ab Android 5.0) selbst als BLE-Beacon genutzt werden. Das Handy simuliert dann ein iBeacon-, Eddystone- oder AltBeacon-Signal und wird von BLE Presence wie ein normaler Tag erkannt.

  1. Beacon Scope aus dem Google Play Store installieren
  2. App öffnen und unter Transmit einen neuen Beacon erstellen
  3. Protokoll wählen (iBeacon, Eddystone oder AltBeacon)
  4. UUID/Namespace konfigurieren und Beacon starten
  5. Die App sendet auch im Hintergrund, bis man den Beacon manuell stoppt
ℹ️ Gut zu wissen
Beacon Scope kann auch als BLE-Scanner genutzt werden, um alle Beacons in der Nähe anzuzeigen — praktisch zum Testen und Prüfen der Signalstärke (RSSI) vor der Einrichtung.
⚠️ Einschränkungen
Ein Handy als Beacon verbraucht deutlich mehr Akku als dedizierte Tags. Außerdem wird kein Batterie-Level an BLE Presence gemeldet. Für dauerhaften Einsatz sind echte BLE-Tags die bessere Wahl.

Eddystone / UUID

Eddystone ist ein von Google entwickeltes BLE-Beacon-Protokoll. BLE Presence unterstützt Eddystone-UID, das eine feste Kennung bestehend aus Namespace (10 Bytes) und Instance (6 Bytes) sendet.

Aufbau einer Eddystone-UID

Feld Länge Beschreibung
Namespace 10 Bytes Identifiziert die Gruppe/das System (z.B. alle Tags einer Wohnung)
Instance 6 Bytes Identifiziert das einzelne Gerät innerhalb des Namespace

Konfiguration am Tag

  1. Tag per Hersteller-App verbinden
  2. Eddystone-UID-Frame aktivieren
  3. Namespace einheitlich für alle Tags setzen (z.B. 0x00112233445566778899)
  4. Instance pro Tag eindeutig vergeben (z.B. 0x000000000001, 0x000000000002, …)
  5. Sende-Intervall einstellen (empfohlen: 500–1000 ms)
💡 Tipp
Ein kürzeres Sende-Intervall verbessert die Erkennung, reduziert aber die Batterielebensdauer. 1000 ms ist ein guter Kompromiss.

iBeacon UUID

iBeacon ist Apples BLE-Beacon-Protokoll. Es verwendet eine dreiteilige Kennung aus UUID, Major und Minor.

Aufbau einer iBeacon-Kennung

Feld Länge Beschreibung
UUID 16 Bytes Identifiziert die Anwendung/das System
Major 2 Bytes Gruppe, z.B. Etage oder Bereich (0–65535)
Minor 2 Bytes Einzelnes Gerät innerhalb der Gruppe (0–65535)

Konfiguration am Tag

  1. Tag per App verbinden
  2. iBeacon-Frame aktivieren
  3. UUID für alle Tags gleich setzen (z.B. 12345678-1234-1234-1234-123456789ABC)
  4. Major z.B. pro Etage vergeben (1 = EG, 2 = OG)
  5. Minor pro Gerät eindeutig vergeben (1, 2, 3, …)
  6. Sende-Intervall einstellen (empfohlen: 500–1000 ms)
⚠️ Wichtig
Die UUID/Namespace muss in BLE Presence nicht separat hinterlegt werden — das System erkennt die Geräte automatisch anhand ihrer Advertisement-Daten beim Discovery-Scan.

Installation

1. DietPi installieren

In den folgenden Links steht, wie man DietPi installiert:

Die nachfolgenden Dateien helfen dir, DietPi schnell und einfach für den ersten Start zu konfigurieren:

dietpi.txt — Hier ist soweit alles vorkonfiguriert für den normalen Gebrauch.

dietpi-wifi.txt — Hier müsst ihr, wenn ihr WLAN nutzen wollt, eure SSID (WLAN-Name) und WLAN-Passwort eintragen. Groß-/Kleinschreibung beachten!

WLAN

Beide Dateien liegen auf der SD-Karte im Boot-Verzeichnis, auf das ihr über z.B. den Windows Explorer zugreifen könnt.

Explorer

2. DietPi erster Start

Nach dem Einstecken braucht der Pi ein paar Minuten, bis er per SSH erreichbar ist.

Um uns mit dem Pi zu verbinden, nutzen wir SSH. Ich empfehle PuTTY, das es HIER als Portable-Version gibt.

In PuTTY tragen wir den Hostname oder die IP ein und drücken „Open".

PuTTY

Für den ersten Login nutzt ihr:

login as: root
root@master's password: DietPi

DietPi fängt mit der Grundinstallation an.

Ihr werdet aufgefordert, die Passwörter für die User root und dietpi zu ändern. Nutzt sichere Passwörter, auch wenn alles nur im internen Netz läuft.

Password

Die serial/UART-Konsole könnt ihr abgeschaltet lassen. „NO" wählen.

Serial

Da wir über die dietpi.txt schon alles vorkonfiguriert haben, kannst du hier ohne Änderung auf „Install" und „Select" gehen.

Software

Kurz noch bestätigen und es wird alles eingerichtet. Das kann je nach Hardware ein paar Minuten dauern.

Software OK
💡 Tipp
Wenn ihr weder den Hostname noch die IP kennt, nutzt Angry IP Scanner Portable

3. Master installieren

Einfach die untere Zeile kopieren und einfügen, das war es schon:

cd / && rm -rf installer.* && wget http://ble-presence.de/download/installer.sh && bash installer.sh | tee /install.log

Nach dem Reboot ist die Web-Oberfläche mit admin/admin unter eurer IP erreichbar.

Nächste Schritte

  1. Web-Interface öffnen: http://[raspberry-ip]
  2. Master Konfiguration durchführen
  3. ESP32 einrichten (min. 1 Scanner)
  4. Unter „Geräte" → „Start Distributed Scan" einen ersten Scan starten
  5. Erkannte BLE-Geräte benennen und per Alias zuordnen
💡 Tipp
Wichtig ist als erstes der MQTT Broker, ohne den geht fast nichts.
Alles andere könnt ihr auch später noch einrichten.

Web-Konfiguration Master

Die gesamte Konfiguration erfolgt über Konfiguration > Master im Web-Interface. Änderungen werden in INI-Dateien gespeichert und die entsprechenden Services automatisch neu gestartet.

Konfigurationsgruppen

Gruppe Beschreibung
☁️ Main MQTT-Broker, Topics, Home Assistant
🎛️ Aggregator Timeouts, RSSI-Filter, Button-Events, Statistik, Tracking
📡 Scanner Scan-Daemon, Cron-Jobs, Logging
💡 Logging Debug Logging
📸 Screenshot: Konfigurationsseite

MQTT Einstellungen

Parameter Default Beschreibung
base_topic presence Basis-Topic für alle MQTT-Nachrichten
scanner_name master Name dieses Scanners
broker localhost MQTT Broker IP-Adresse
port 1883 MQTT Port
username MQTT Benutzername
password MQTT Passwort
websocket_port 9001 MQTT Websocket Port
ℹ️ Hinweis
Habt ihr schon einen Broker, dann könnt ihr diesen auch nutzen.
Einfach den Haken bei "Lokalen Mosquitto Broker aktivieren & konfigurieren?" entfernen.
Alle Daten gelten dann für den externen Broker.

Aggregator

Der Aggregator sammelt Daten aller Scanner, bestimmt den besten Scanner pro Gerät und publiziert das aggregierte Ergebnis.

Aggregator Einstellungen

Parameter Default Beschreibung
device_timeout 120 Sekunden bis ein Gerät als offline gilt
scanner_timeout 180 Sekunden bis ein Scanner als offline gilt
cleanup_interval 60 Wie oft auf Timeouts geprüft wird
prefer_stronger_rssi false Immer den stärksten Scanner verwenden
ℹ️ Hinweis Die effektive Offline-Erkennung kann bis zu device_timeout + cleanup_interval dauern. Beispiel: 120 + 60 = max. 180 Sekunden.

Aggregator Button Events

Parameter Default Beschreibung
event_mode immediate / collect Sendet Button-Event sofort, oder wartet collect_time (0.3 Sek.) und sendet vom stärksten Scanner
deduplication_timeout 1.0 Sekunden bis der nächste Button-Event des gleichen Geräts weitergegeben wird.

Aggregator UDP Export

Parameter Default Beschreibung
enabled Sollen UDP-Nachrichten genutzt werden, oder nur MQTT.
host IP des Netzwerkgeräts, das die UDP-Nachricht bekommen soll, z.B. MiniServer.
port Port der vom Empfänger für die Nachricht genutzt wird.

Statistik

Parameter Default Beschreibung
enabled Sollen die Statistiken aufgezeichnet werden?
directory /var/www/html/ble/statistics In diesem Verzeichnis werden die Daten gesammelt. Nur in begründeten Fällen ändern!
cleanup_hours 24 Alle X Stunden werden alte Daten gelöscht. (Anwesenheit älter 30 Tage / Batterie älter 2 Jahre)

Scanner

Hier kann eingestellt werden ob der Master auch ein Scanner sein soll, und Optionen für alle Scanner eingestellt werden.

Scan Daemon Steuerung

Parameter Default Beschreibung
Starten / Stoppen gestoppt Hier kann der Scanner des Masters aktiviert werden. Dann scannt der Master auch nach Devices. (Kein Batterie-Scan)

Allgemein

Parameter Default Beschreibung
report_offline_battery nein Wenn ein Gerät offline ist, würde bei Ja 0% Batterie zurück kommen. Bei Nein behält er den zuletzt gesehenen Wert.

Discovery / Scan

Parameter Default Beschreibung
timeout 15 So lange sucht er Geräte im Discovery-Modus und meldet sie danach zurück.

Zeitplan

Parameter Default Beschreibung
battery_scan_time 3:00 Um diese Uhrzeit startet der automatische Batterie-Scan. Es ist eine Chain: Es ermittelt immer nur ein Scanner die Daten. Wenn dieser fertig ist, startet der nächste.

UDP Einstellungen

Parameter Default Beschreibung
enabled Hier wird von jedem Scanner einzeln an UDP gesendet, nicht über den Aggregator. (Viele Daten!)
host IP des Netzwerkgeräts, das die UDP-Nachricht bekommen soll, z.B. MiniServer.
port Port der vom Empfänger für die Nachricht genutzt wird.

Logging

Das System kann Daten sammeln. Um nicht unnötig viele Logs zu schreiben kann man hier das Level einstellen.

Logging Einstellungen

Parameter Default Beschreibung
log_level WARNING Level des System-Log
console_level INFO Level der Konsolen Ausgabe
bleak_level WARNING Level des Bleak-Stack für Bluetooth (Wenn Master als Scanner arbeitet)

Geräte verwalten

Unter Geräte werden alle bekannten BLE-Devices aufgelistet. Hier kann man:

Distributed Scan

Ein koordinierter Scan über alle verbundenen Scanner (Master + ESP32 Clients). Findet neue BLE-Geräte im gesamten Haus gleichzeitig.

Geräte Verwaltung

Grundriss einrichten

Unter Position → Grundriss Editor wird der Grundriss konfiguriert:

  1. Grundriss hochladen — PNG oder JPG des Grundrisses
  2. Maßstab kalibrieren — Pixel pro Meter einstellen (z.B. 68 px/m). Wichtig für korrekte Distanzberechnung!
  3. Zonen zeichnen — Räume als farbige Polygone auf dem Grundriss markieren
  4. Etagen verwalten — Mehrere Stockwerke mit eigenem Grundriss
💡 Tipp Den Maßstab am besten anhand einer bekannten Strecke kalibrieren (z.B. eine Wand mit bekannter Länge in Metern).
Grundriss Editor

Scanner platzieren

Im Grundriss-Editor werden Scanner per Drag & Drop auf dem Plan positioniert. Die Position bestimmt die Trilateration:

Anti-Flapping

Das Anti-Flapping-System verhindert, dass Geräte ständig zwischen Räumen hin- und herspringen.

Parameter Default Beschreibung
enabled true Master-Schalter: Aktiviert Positionierung komplett
antiflapping true Anti-Flapping mit Hysterese
hysteresis 8 dB — neuer Scanner muss so viel besser sein
stability_time 30 Sekunden — Kandidat muss so lange besser bleiben
rssi_history 5 Anzahl RSSI-Werte für Rolling Average

Wie es funktioniert

  1. Für jedes Gerät wird der aktuelle „beste Scanner" (=Raum) gespeichert
  2. Ein neuer Scanner wird erst dann Kandidat, wenn er den aktuellen um hysteresis dB übertrifft
  3. Der Kandidat muss für stability_time Sekunden konstant besser bleiben
  4. Erst dann wird der Raum tatsächlich gewechselt
  5. Ein Kandidat bekommt 3 Fehlversuche, bevor er verworfen wird
⚠️ Empfehlung Hysterese nicht unter 6 dB setzen — BLE-Signale schwanken naturgemäß stark. Höhere Werte (8–10 dB) ergeben stabilere Raumzuordnung.

Live Map

Die Live Map unter Position zeigt alle Geräte in Echtzeit auf dem Grundriss:

Die Karte aktualisiert sich über MQTT WebSocket in Echtzeit. Geräte bewegen sich mit CSS-Transitions sanft über den Plan.

Live Map

ESP32 Hardware

Folgende ESP32-Varianten werden unterstützt:

Hardware Chip RAM Hinweis
ESP32 DevKit / WROOM ESP32-WROOM-32 ~60 KB frei Günstiger Standard
ESP32-D1 Mini ESP32-WROOM-32 ~60 KB frei Kompakter Formfaktor
ESP32-S3 DevKit ESP32-S3 ~90 KB frei Empfohlen — mehr RAM für BLE
Xiao ESP32-S3 ESP32-S3 ~90 KB frei Sehr kompakt
💡 Empfehlung ESP32-S3 ist die beste Wahl — mehr freier RAM bedeutet stabileres BLE-Scanning mit NimBLE.

Firmware flashen

Erstinstallation (Full-Version)

  1. Firmware unter System → ESP32 Firmware Downloads herunterladen (Full-Version)
  2. ESP32 per USB an den Computer anschließen
  3. Mit dem ESP Flash Tool im Web-Interface flashen
  4. Alternativ: esptool.py über Kommandozeile
# Via esptool.py (Alternative)
esptool.py --chip esp32s3 --port /dev/ttyUSB0 \
  write_flash 0x0 firmware_full_esp32s3.bin

Updates (OTA)

Nach der Erstinstallation können Updates kabellos über das Web-Interface oder remote vom Master aus installiert werden. Siehe OTA Updates.

ESP32 Einrichtung

  1. Nach dem Flashen öffnet der ESP32 einen WLAN-Hotspot
  2. Mit dem Hotspot verbinden und Setup-Seite öffnen
  3. WLAN-Zugangsdaten, Master-URL und Scanner-Name konfigurieren
  4. ESP32 startet neu und verbindet sich mit dem Master
  5. Am Master unter System → Scanner Firmware-Status prüfen

ESP32 Web-UI

Jeder ESP32 Scanner hat ein eigenes Web-Interface unter seiner IP-Adresse mit:

ESP32 Scanner Web-UI

OTA Updates

ESP32-Scanner können remote aktualisiert werden:

Vom Scanner selbst

  1. Scanner-WebUI öffnen → Update klicken
  2. Update-Firmware (.bin) hochladen
  3. Scanner startet automatisch neu

Zentral vom Master

  1. System → Scanner Firmware-Status öffnen
  2. Veraltete Scanner werden markiert (gelbe Legende)
  3. Per Klick auf „Update" wird die neue Firmware übertragen
ℹ️ Firmware-Varianten Es gibt getrennte Firmware-Dateien für ESP32-WROOM und ESP32-S3. Das System erkennt die Hardware automatisch.
Firmware Update

Loxone

Anbindung an Loxone über UDP-Export:

  1. In der Konfiguration Aggregator UDP Export aktivieren
  2. Ziel-IP und Port des Loxone Miniservers eintragen
  3. In Loxone einen UDP-Monitor-Eingang anlegen

Home Assistant

BLE Presence integriert sich über MQTT Auto-Discovery in Home Assistant:

# Beispiel-Automation (Home Assistant YAML)
automation:
  - trigger:
      platform: state
      entity_id: sensor.ble_dieter
      to: "Wohnzimmer"
    action:
      service: light.turn_on
      target:
        entity_id: light.wohnzimmer

API

Es können alle Daten auch über den API-Server im Json Format ausgelesen werden.

URL Beschreibung
http://raspberrypi:8099/ Alles
http://raspberrypi:8099/stats Statistik
http://raspberrypi:8099/devices Alle Geräte
http://raspberrypi:8099/online Nur Online
http://raspberrypi:8099/scanners Scanner
http://raspberrypi:8099/device/AA:BB:CC:DD:EE:FF Device einzeln

MQTT Topics

BLE Presence verwendet folgende Topic-Struktur (Beispiel mit base_topic = presence):

Topic Beschreibung
presence/master/discovery Scan-Ergebnisse des Masters
presence/[scanner]/discovery Scan-Ergebnisse eines Scanners
presence/aggregated/discovery Aggregierte Ergebnisse (bester Scanner pro Gerät)
presence/aggregated/positioning Berechnete Positionen (Trilateration)
presence/aggregated/scanner/+/status Scanner Online/Offline Status

Aggregated Discovery Payload

{
  "devices": [
    {
      "mac": "DC:0D:30:23:07:69",
      "alias": "Dieter",
      "rssi": -64,
      "scanner": "west",
      "battery": 100,
      "status": "online",
      "room": "Wohnzimmer",
      "last_seen": "2026-02-06T12:45:00"
    }
  ]
}

Statistiken

Unter Statistik werden Anwesenheits- und Batteriedaten aufgezeichnet:

Statistiken

Logs & Debugging

Logs können über die Web-UI oder direkt via Journal eingesehen werden:

# Aggregator Logs
sudo journalctl -u ble_aggregator -f

# Scan Daemon Logs
sudo journalctl -u ble_tool -f

# ESP32 WebSerial Monitor
# Im ESP32-WebUI: "Monitor" Button

Log-Level

In der Konfiguration unter Logging einstellbar:

Level Beschreibung
DEBUG Alle Details (sehr viel Output)
INFO Normaler Betrieb (empfohlen)
WARNING Nur Warnungen und Fehler
ERROR Nur Fehler

System Updates

Unter WebUI → System → Update wird die installierte Version mit der verfügbaren verglichen. Updates können direkt über das Web-UI eingespielt werden.

ESP32 Updates

Unter WebUI → System → Update wird die installierte Version der Scanner mit der verfügbaren verglichen. Updates können per Remote-Update über das Web-UI eingespielt werden.

Troubleshooting

Dashboard zeigt „Nicht verbunden"

Geräte werden nicht erkannt

ESP32 verbindet sich nicht

Geräte springen zwischen Räumen

Hoher RAM-Verbrauch am ESP32

💡 Allgemeiner Tipp
Die meisten Probleme lassen sich über die Logs diagnostizieren.
Im Zweifel log_level = DEBUG setzen und die Ausgabe prüfen.