In letzter Zeit beschäftige ich mich viel mit Smart Home-Dingen auf der Grundlage von Home Assistant. Inzwischen ist mein Automatisierungsgrad schon gut angewachsen. Es ergben sich jedoch immer wieder Situationen, die eine besondere Behandlung erfordern und für die es nicht unbedingt fertige Lösungen von der Stange gibt. In meinem Schuppen ist inzwischen ein Bewegungsmelder installiert, da ich öfter über Verluste klagen musste. Damit das zukünftig besser überwacht werden kann, ob sich jemand im Schuppen aufhält, dafür sollte der Sensor dienen. Sobald eine Bewegung erkannt wird, erhalte ich eine sprachliche Ausgabe sowohl von meinem zentralen Steuerungstablet als auch auf mein Smartphone. Soweit so gut, das funktioniert auch sehr zuverlässig. Allerdings benutze ich den Schuppen auch hin und wieder als "Bastelecke". Die Konsequenz: Die Ansage, dass sich jemand im Schuppen aufhält, wird nun in ca. 15 Sekunden-Abstand ausgesendet. Das kann einem dann doch auf den Keks gehen. Die 15 Sekunden rühren von der Sensorzeit her, die er den erkannten Bewegungszustand innehält bevor er sich wieder der erneuten Bereitschaft zuwendet. Wie schön wäre es, wenn der Schuppen quasi erkennen könnte, dass ich dort drin bin und keine dritte Person...
Das Smartphone habe ich nahezu immer in der Hosentasche. Es sollte also eine Möglichkeit geschaffen werden, die das Smartphone als "Schlüssel" verwendet. Schnell wurde klar, dass Bluetooth, genauer BLE, der Schlüssel sein kann. Nach weiterer Recherche erfuhrt ich, dass die von meinem Smart Home System Home Assistant zur Vefügung gestellte App das Aussenden von BLE-Beacons unterstützt. Jetzt musste nur noch eine Möglichkeit geschaffen werden, diese BLE-Beacons zu empfangen und auszuwerten. Was liegt da näher, als den den Tausendsassa ESP32 zu verwenden? Der hat den Vorteil, dass er preiswert ist, WiFi an Board hat und eben auch BLE beherrscht. WiFi ist nützlich, da der Schuppen ja über keine Netzwerkanbindung verfügt, jedoch Repeater für den Rasenmäher das Grundstück gut mit WLAN versorgen.
Home Assistant unterstützt sehr gut ESPHome. Für diese Plattform existiert eine Beacon-Erkennung, die auf Basis von ESP32-Modulen realisiert ist. Alles, was ich in Erfahrung gebracht habe ist, dass die Erkennung auf MAC-Adressen der Beacons beruht. Da ich die MAC-Adresse meines Smartphones nicht kannte, bastelte ich mir erst einmal einen einfachen Beacon-Scanner auf ESP-Basis zusammen um zu horchen, welche MAC-Adresse mein Smartphone überhaupt hat.
Was soll ich sagen, die Ernüchterung folgte auf dem Fuße. Immer, wenn ich glaubte mein Smartphone gefunden zu haben, konnte ich es einige Zeit später nicht mehr finden. Es dauerte eine ganze Zeit bis mir dämmerte, dass eventuell dynamische MAC-Adressen verwendet werden. Das Internet befragt gab als Antwort, dass die MAC-Adresse vom Bluetooth-Adapter bei Android-Smartphones über die Einstellungen des WiFi-Adapters auf feste Adressen umgestellt werden kann. Also die Einstellungen gemäß Anleitung im Smartphone getätigt und erneut die Beacons gescannt. Was soll ich sagen? Es funktionierte noch immer nicht. Nach allem hin und her: Samsung-Smartphones der neueren Generationen lassen es nicht mehr zu, die MAC-Adresse des Bluetooth-Adapters fest einzustellen und benutzen immer dynamische MAC-Adressen.
Mein Traum schien geplatzt. Wie soll man auf etwas warten, dass ständig seine Identität wechselt? Da fiel mir auf, dass in der App für Home Assistant das ausgesendete Beacon eine UUID erhält, die für jedes Smartphone eindeutig ist. Gut, wenn die MAC-Adresse nicht als Identifikationsmerkmal herhalten kann, dann doch wohl diese UUID. Also versuchte ich aus den empfangenen Beacons meines ESP-Projektes diese UUID herauszulesen. Mit der Standard-Bibliothek des Arduino-Frameworks war mit das jedoch nicht möglich. Ich bin dann auf die Bibliothek NimBLE gestoßen. Mit ihr war es möglich, die UUID eines Beacons herauszufinden. Und somit war die Lösung gefunden!
Aktuell arbeitet mein Präsenz-Erkenner seit einigen Tagen im Schuppen. Bin sehr zufrieden damit. Die lästige Nachricht lässt sich damit nahezu komplett unterdrücken. Es hängt davon ab, wie schnell der ESP32 das Beacon meines Smartphones erkennt, was allerdings in 99% aller Fälle schnell genug passiert. Der ESP meldet während der Erkennungsphase alle UUIDs einzeln als auch nach Abschluss des Scanvorganges in einer Liste an einen MQTT-Server. Home Assistant tut sich etwas schwer die Liste auszuwerten, deshalb kann aktuell eine UUID im ESP32 hinterlegt werden, die bei Erkennung das Flag Found im MQTT mit True oder False versorgt. Ist jedoch leicht erweiterbar auf eine Liste von UUIDs, falls das gebraucht wird. Die Netzwerkverbindung wird über WiFi aufgebaut und im Fehlerfall rebootet sich der ESP automaitsch selbst um stabile Verhältnisse einzunehmen. Zusätzlich kann man die Zeitdauer des Scanvorgangs per MQTT einstellen. Und als letztes Schmankerl existiert eine Web-Schnittstelle, die die Daten des letzten Scan-Vorgangs per Json-Datei über http ausliefert (http://<ipadresse>/status).