Anwesenheitserkennung mit Bluetooth (BLE) und G-Tags mit ESP32-POE

Einführung

Ich hatte schon vor 3 Jahren eine Anwesenheitserkennung per Arduino Nano und HM10 Bluetooth Modul gebaut und hier beschreiben.
Da ich mit dieser Lösung nie ganz zufrieden war (HM10 scannt recht unzuverlässig), habe ich mich auf die Suche nach neuen Lösungen gemachten.

Dabei war der Weg von Piotek-Enocean-Tracker über einen ESP32 per WLAN bis zum jetzigen Endergebnis.

Warum nicht per WLAN?
Auch hier habe ich festgestellt das die Stabilität der bei eine so sensible Anwendung per WLAN nicht perfekt ist.
Somit habe ich mich (wie auch bei allen anderen Sensoren die ich gebaut habe) entschlossen wieder auf LAN zu gehen, und habe es nicht bereut.



Hardware

Recht überschaubar...
1x Olimex ESP32-POE oder POE-ISO Link ~25€



Software

Arduino IDE mit ESP32/ESP8266 Installation Link
Loxone Config Link



C-Code für Arduino




Da die BLE-Libs recht viel Platz brauchen muss das "Partition Scheme" auf "Minimal" geändert werden.

MiniServer Befehlskennung

Als erstes einen UDP-Eingang mit der Portnummer die ihr im ESP32 angegeben habt einrichten

Dann einen Eingangsbefehl anlegen und in die Erkennung aw_mac=aa:bb:cc:dd:ee:ff eintragen.
aa:bb:cc:dd:ee:ff natürlich gegen eure MAC des G-Tag ersetzen.  Das aw bevor _mac kann im Skript geändert werden, in dem Fall müsstet ihr das auch anpassen.

Weitere Befehle:
xxxxxxx=scan_start
xxxxxxx=scan_done
xxxxxxx_alive=1

Das xxxxxx hier steht für den module_ident im Skrtipt das ihr selber ändern könnt.




MiniServer Ausgang um BLE-Scan zu starten

Es muss ein Virtueller Ausgang angelegt werden.
/dev/udp/IP_des_ESP32/Port_des_ESP32

Als Befehl bei Ein wird ble\n verwendet.


Weitere Befehl:
reboot\n um den ESP32 neu zu starten



Nützliche Tools

Mit dem UDP-Test-Tool könnt ihr UDP-Nachrichten an den ESP32 senden um zu sehen ob alles richtig läuft.



Ihr müsst/könnt folgendes im Code anpassen...

//Anwesenheit
const char* host = "AW_TEST";//Hostname für Update Webside
String module_name = "aw"; //Kürzel vor Mac-Adresse
String module_ident = "AW_TEST"; //Kürzel für ALIVE, scan_start und scan_done

IPAddress local_IP(192, 168, 1, 2);
IPAddress gateway(192, 168, 1, 1);
IPAddress subnet(255, 255, 255, 0);
IPAddress primaryDNS(192, 168, 1, 1);

IPAddress udpAddress(192, 168, 1, 3); // IP Adresse-Loxone-MiniServer
unsigned int udpPort = 7001; // UDP Port Loxone-MiniServer
unsigned int localUdpPort = 7000; // Empfangsport der ESP32

#define SCAN_TIME 30 // Zeit wie lange gescannt werden soll in Sekunden (Std. 30 / min. 10 Sekunden)
#define ALIVE 60000 // Alle xxxxx Milliskunden wird ein Alive-Signal gesendet



Host für die Update-Seite, hier könnt ihr zB den Namen des Modul wie "anwesenheit_eingang" eintrag oder was ihr wollt. Keine Sonderzeichen und Umlaute wie bei URLs halt.
Module Name ist das Kürzel vor der Mac-Adresse zb "anwesenheit" würden dann im MiniServer als "anwesenheit_mac=xx:xx:xx......." ankommen.
Module Ident ist das Kürzel für die Befehle "alive/scan_start/scan_done" zb "anwesenheit_eingang" würde im MiniServer als "anwesenheit_eingang=scan_start" oder "anwesenheit_eingang_alive=1" ankommen.

IP usw. sollte jedem klar sein.
udpAddress ist die IP des MiniServer an den die Nachrichten gesendet werden
udpPort ist der Port den MiniServer
localUdpPort ist der Port des ESP32 an den die UDP Nachrichten vom MiniServer gesendet werden zb "ble\n"


SCAN_TIME ist die dauer wie lange nach Geräten gesucht wird in Sekunden
ALIVE ist die Zeit nach dem ein Alive-Signal gesendet wird in Millisekunden

Tipps

  • Es werden natürlich nicht nur G-Tags erkannt, es werden auch z.B.
    Mi Fit Band erkannt oder diverse andere BLE Tags / Geräte.

    Ein Smartphone selber wird nicht erkannt, es meldet sich auf solche Anfragen nicht. 


  • Die Scanzeit empfehle ich mit 20-30 Sekunden, bei kurzen Scanzeiten <10 Sekunden werden nicht alle Geräte zurück gemeldet, besonders wenn sie sehr weit weg liegen und eine weile brauchen um zu antworten.


  • Die Lebensdauer der Batterie ist bei mir 1-1,5 Jahre, das hängt aber davon ab wie oft ihr scannt, ich scanne dauernt wenn kein G-Tag anwesend ist, alle 20 Min. wenn einer anwesend ist.
    Diese Zeit kann man auch verkürzen, das geht aber direkt auf die Lebensdauer der Batterie.


  • Um das ganze Einfach zu verstaunen, habe ich das Modul in sogenannte Eletronic-Schalterdosen gesteckt. So kann man das Modul ohne weiteres hinter einem Blind-Deckel oder anderem betreiben.

ESP32 in Arduino IDE installieren

Link