
MQTT Bluetooth BLE Anwesenheitserkennung
Personen Präsenz im Zimmer durch: iBeacon, Mi Band fitness tracker, smartwatch aufspüren.
MQTT Anwesenheitserkennung per Bluetooth BLE für Hausautomatisierung z.B FHEM, Node-RED, iobroker, openHAB, Domoticz.
Die Idee
In jedem Raum befindet sich bluetooth Präsenzmelder auf Basis von ESP32 – Modul. Jedes bluetooth Präsenzmelder ist über WLAN mit Hausnetz verbunden und sendet die bluetooth MAC Adressen per mqtt an den smart home. Ich trage ein Fitness Tracker Xiaomi Mi Band, der kann so eingestellt werden, dass auch in verbundenen Zustand, bluetooth advertising Daten sendet. Natürlich kann statt Fitness Tracker, ein beliebige iTag, iBeacon verwendet werden. Der muss natürlich immer dabei sein. So kriegt mein smart home in welchem Zimmer ich mich gerade befinde mit. So kann Hausautomatisierung Software z.b. Telefonanrufe in richtige Zimmer leiten. Meine Position anderen Personen im Haus mitteilen.
Funktionsweise
Esp32 Modul verbindet sich über WLAN Netz mit mqtt Broker. Das bluetooth Präsenzmelder scant 10 Sekunden lang ( Scan Zeit ist einstellbar) nach Bluetooth Geräten. Gesammelte Daten werden in JSON Format an das mqtt Broker gesendet. Daten beinhalten MAC-Adresse des Bluetooth Gerätes und Signalstärke RSSI . Danach wiederholt sich der Vorgang. Bei verlieren der wifi verbindung startet Esp32 Modul neu. Bei Unterbrechung der Verbindung zu mqtt Broker wird die Verbindung neu aufgebaut.
Arduino Sketch
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
|
/*
MQTT Bluetooth (BLE) Anwesenheitserkennung. Raum präsenzmelder für Hausautomatisierung. Personen präsenz im Zimmer durch:
iBeacon, Mi Band fitness tracker, smartwatch aufspüren. Publish ist MQTT_Name, Daten MAC und RSSI in JSON Format alle 10s
{
„28:A1:83:E1:58:8E“:-60,
„ea:5f:8d:69:be:56“:-80
}
FHEM, Node-RED, iobroker, openHAB, Domoticz */
#include <WiFi.h>
#include <WiFiClient.h>
#include <PubSubClient.h>
#include <BLEDevice.h>
#include <BLEScan.h>
#include <BLEAddress.h>
// MQTT Zugangsdaten
#define MQTT_server „m21.cloudmqtt.com“
#define MQTT_port 12247
#define MQTT_User „iasfjkqc“
#define MQTT_Pass „qsXY5N74m-VN“
#define MQTT_Name „Schlafzimmer“ // gleichzeitig publish Name
#define QoS 0
const char* ssid = „xxxxxxxxxxxxx“; // WLAN Zugangsdaten Eintragen
const char* password = „xxxxxxxxx“;
int scanTime = 10; //sek. iBeacon Suchzeit und MQTT Berichtinterval
BLEScan* pBLEScan ;
// ————— MQTT Variablen —————————————
WiFiClient wclient;
PubSubClient mqtt(wclient);
void setup()
{
int i;
Serial.begin(115200);
Serial.println(„“);
Serial.println(„Start“);
// ——————— WiFi ———————————————
Serial.println(„Warte auf Verbindung“);
WiFi.mode(WIFI_STA); ;
WiFi.begin(ssid, password);
Serial.println(„“);
int timout = 0;
while (WiFi.status() != WL_CONNECTED)
{
delay(500);
Serial.print(„O“);
timout++;
if (timout > 20) // Wenn Anmeldung nicht möglich
{
Serial.println(„“);
Serial.println(„Wlan verbindung fehlt“);
ESP.restart(); // ESP32 neu starten
}
}
Serial.println(„“);
Serial.print(„IP Addresse: „);
Serial.println(WiFi.localIP());
// ———————- MQTT —————————————————
mqtt.set_server(MQTT_server, MQTT_port); // MQTT Port einstellen
if (mqtt.connect(MQTT::Connect(MQTT_Name).set_auth(MQTT_User, MQTT_Pass)))
{
Serial.println(„Mit MQTT verbunden“);
mqtt.publish(MQTT::Publish(„hallo“, MQTT_Name).set_qos(QoS)); // im Topic hallo Präsenzmelder Name schreiben
}
Serial.println(„Starte BLE Scanner“);
BLEDevice::init(„“);
pBLEScan = BLEDevice::getScan();
pBLEScan->setActiveScan(true); // Aktives Bluetooth Scannen
pBLEScan->setInterval(100);
pBLEScan->setWindow(99);
}
void loop()
{
int j;
String NachrichtJSON;
BLEScanResults foundDevices = pBLEScan->start(scanTime); // BLE Scanen
NachrichtJSON = „{\r\n“; // JSON Format vorbereiten
for (j = 0; j < foundDevices.getCount(); j++) // Alle Gefundene Bluetooth Device durchgehen
{
NachrichtJSON = NachrichtJSON + „\““ + foundDevices.getDevice(j).getAddress().toString().c_str() + „\“:“;
if (j != foundDevices.getCount() – 1) NachrichtJSON = NachrichtJSON + String(foundDevices.getDevice(j).getRSSI()) + „,\r\n“;
else NachrichtJSON = NachrichtJSON + String(foundDevices.getDevice(j).getRSSI()) + „\r\n}“;
} // Alle gefundene MACs durchgehen
// diese „if“ spührt das letzte Eintragung und beendet den json Datensatz.
pBLEScan->clearResults(); // Speicher freigeben
mqtt.publish(MQTT::Publish(MQTT_Name, NachrichtJSON).set_qos(QoS)); // JSON per MQTT senden
Serial.println(NachrichtJSON);
delay(100);
if (WiFi.status() != WL_CONNECTED) ESP.restart(); // Wenn Wlan fehlt neustarten
if (mqtt.connected())
{
mqtt.loop();
}
else
{
Serial.println(„MQTT Verbindung fehlt“); // Wenn MQTT Verbindung fehlt dann neu verbinden
mqtt.connect(MQTT::Connect(MQTT_Name).set_auth(MQTT_User, MQTT_Pass));
} // ende MQTT Verbindung ja/nein
}
|
Das Programm ist ziemlich groß wegen Verwendung von WiFi und Bluetooth Bibliotheken. Deswegen vor dem compilieren soll beim Werkzeuge/ Partition Scheme das “No OTA” gewählt werden. Der Sketch hat 1490 KB vom 2097 KB (71%) des Speichers. Verwendete MQTT Bibliothek ist MQTT client library for Arduino(vom Imroy).
Hallo mischaka,
ich habe deinen Beitrag mit großem Interesse gelesen und den Scatch gleich ausprobiert. Funktioniert super!
Nur mit den Beacons habe ich noch so meine Probleme. Du hast geschrieben, dass du einen iTag beacon verwendet. Ich habe mir auch einen bei Amazon gekauft und getestet. An sich funktioniert er gut, allerdings schaltet er sich nach ca 5 Minuten wieder aus und man muss ihn via Knopf wieder einschalten (Ich habe ihn nicht mit der Handy-App gekoppelt).
Hast du eine Empfehlung/Link für mich zu einem Beacon, welcher sich nicht automatisch abschaltet sondern immer BLE’s sendet?
Gruß Martin
Hallo Martin,
ich habe mir diesen iBeacon NRF51822 für 4,21€ bei Aliexpress gekauft. https://de.aliexpress.com/item/2V-3-3V-NRF51822-Bluetooth-4-0-Wireless-Module-for-iBeacon-Base-Station-Intelligent-Control-System/32826502025.html?spm=a2g0s.9042311.0.0.27424c4dznSfxj
Ohne Gehäuse sind die noch günstiger. Batterie sollte für 3 Monaten auf jeden Fall reichen.
Das ist ja interessant für meine Amazefit Bip, die dem MiBand folgte.