Ich habe das ganze bei mir auch mal ausprobiert und habe das Problem, dass mein G-Tag ab und zu abwesend angezeigt wird. Dabei liegt er aktuell ständig etwa 1 Meter von meinem Raspberry entfernt. Habe das gefühl, dass das hcitool manchmal Probleme macht. Hatte hier dann manchmal auch manuell folgende Ausgabe:
Set scan parameters failed: Connection timed out
Weiß jemand woran das liegen könnte?
HowTo - Anwesenheitserkennung mit Bluetooth
-
- Beiträge: 226
- Registriert: 11. Aug 2019 06:39
-
- Beiträge: 13
- Registriert: 14. Apr 2020 12:40
-
- Beiträge: 226
- Registriert: 11. Aug 2019 06:39
Re: HowTo - Anwesenheitserkennung mit Bluetooth
Ich habe mal ein Geräte Update vorgenommen
Raspberry's durch Wemos D1 Mini ESP32 ersetzt.
Im Arduino Code wird auch der RSSI Wert abgefragt, aber noch nicht weiter verarbeitet. Man kann mit dem Code durch wenigen Anpassungen auch Raumgenau die Anwesenheit erkennen und z.b. Musik oder Licht oder oder oder einschalten, wenn jemand den Raum betritt. Aktuell Scanne ich 30 Sekunden Werte aus und Scanne wieder 30 Sekunden. Für Musik z.b. würde das reichen, für Licht eher nicht Da müsste man dann noch mit den Werten spielen.
Naja aber hauptsächlich wollte ich erstmal sicher erkennen ob Jemand zu Hause ist, den Rest werde ich vielleicht mal in Angriff nehmen.
PS: Der Arduino Code ist sicherlich Optimierungsfähig
MQTT wäre für dieses Projekt ganz sicher die beste Wahl, doch leider scheint es im MQTT Client bezüglich des ESP32 ein Bug zu geben. Er verliert häufig die Verbindung und nach Reproduzierbar 230 Minuten reconnectet er garnicht mehr. Natürlich hätte ich auch eine Routine einbauen können, das der ESP alle 120 Minuten neu bootet, aber die REST-API funktioniert ja auch ohne Probleme
PS: In der ArduinoIDE NoOTA einstellen, sonst ist der Sketch zu groß... Wifi und BLE nehmen wohl doch mehr Platz ein als erwartet
Raspberry's durch Wemos D1 Mini ESP32 ersetzt.
Im Arduino Code wird auch der RSSI Wert abgefragt, aber noch nicht weiter verarbeitet. Man kann mit dem Code durch wenigen Anpassungen auch Raumgenau die Anwesenheit erkennen und z.b. Musik oder Licht oder oder oder einschalten, wenn jemand den Raum betritt. Aktuell Scanne ich 30 Sekunden Werte aus und Scanne wieder 30 Sekunden. Für Musik z.b. würde das reichen, für Licht eher nicht Da müsste man dann noch mit den Werten spielen.
Naja aber hauptsächlich wollte ich erstmal sicher erkennen ob Jemand zu Hause ist, den Rest werde ich vielleicht mal in Angriff nehmen.
PS: Der Arduino Code ist sicherlich Optimierungsfähig
MQTT wäre für dieses Projekt ganz sicher die beste Wahl, doch leider scheint es im MQTT Client bezüglich des ESP32 ein Bug zu geben. Er verliert häufig die Verbindung und nach Reproduzierbar 230 Minuten reconnectet er garnicht mehr. Natürlich hätte ich auch eine Routine einbauen können, das der ESP alle 120 Minuten neu bootet, aber die REST-API funktioniert ja auch ohne Probleme
PS: In der ArduinoIDE NoOTA einstellen, sonst ist der Sketch zu groß... Wifi und BLE nehmen wohl doch mehr Platz ein als erwartet
Code: Alles auswählen
#include <WiFi.h>
#include <WiFiClient.h>
#include <BLEDevice.h>
#include <BLEScan.h>
#include <BLEAddress.h>
const char* ssid = "SSID";
const char* password = "PASSWORT";
const char* openhabIP = "10.10.80.3";
unsigned int openhabPORT = 8484;
char* BTag_01_ID = "7f:5f:88:33:d9:6e";
char* BTag_01_OH_ITEM = "BTag_01_Buero";
char* BTag_02_ID = "7f:5f:84:95:cr:19";
char* BTag_02_OH_ITEM = "BTag_02_Buero";
char* BTag_03_ID = "7f:7f:85:44:cd:3e";
char* BTag_03_OH_ITEM = "BTag_03_Buero";
int scanTime = 30;
BLEScan* pBLEScan ;
WiFiClient client;
void setup() {
Serial.begin(115200);
delay(10);
Serial.println();
Serial.println();
Serial.println("Start BLE Scanner");
BLEDevice::init("");
pBLEScan = BLEDevice::getScan();
pBLEScan->setActiveScan(true);
pBLEScan->setInterval(100);
pBLEScan->setWindow(99);
}
void setup_wifi() {
delay(10);
Serial.println();
Serial.print("Connecting to ");
Serial.println(ssid);
WiFi.begin(ssid, password);
while (WiFi.status() != WL_CONNECTED) {
delay(500);
Serial.print(".");
}
randomSeed(micros());
Serial.println("");
Serial.println("WiFi connected");
Serial.println("IP address: ");
Serial.println(WiFi.localIP());
}
void openhabRestApiPost(char* OH_VALUE, char* OH_ITEM){
if (client.connect(openhabIP, openhabPORT)) {
char buf[100];
String value = OH_VALUE;
String item = OH_ITEM;
Serial.println("Connected to REST-API");
client.println("POST /rest/items/" + item + " HTTP/1.1");
sprintf(buf, "Host: http://%s:%d", openhabIP, openhabPORT);
client.println(buf);
client.println("Accept: application/json");
client.println("Content-Length: " + String(value.length()));
client.println("Content-Type: text/plain");
client.println();
client.println(value);
Serial.print("POST -> Value: ");
Serial.print(value);
Serial.print(" to ");
Serial.print(item);
Serial.println();
}
}
void loop()
{
if (WiFi.status() != WL_CONNECTED) {
setup_wifi();
}
int j;
String resultJSON;
BLEScanResults foundDevices = pBLEScan->start(scanTime);
resultJSON = "{";
for (j = 0; j < foundDevices.getCount(); j++)
{
resultJSON = resultJSON + "\"" + foundDevices.getDevice(j).getAddress().toString().c_str() + "\":";
if (j != foundDevices.getCount() - 1) resultJSON = resultJSON + String(foundDevices.getDevice(j).getRSSI()) + ",\r\n";
else resultJSON = resultJSON + String(foundDevices.getDevice(j).getRSSI()) + "\r\n}";
}
pBLEScan->clearResults();
Serial.println(resultJSON);
if(resultJSON.indexOf(BTag_01_ID) > 0){
openhabRestApiPost("ON", BTag_01_OH_ITEM);
} else {
openhabRestApiPost("OFF", BTag_01_OH_ITEM);
}
if(resultJSON.indexOf(BTag_02_ID) > 0){
openhabRestApiPost("ON", BTag_02_OH_ITEM);
} else {
openhabRestApiPost("OFF", BTag_02_OH_ITEM);
}
if(resultJSON.indexOf(BTag_03_ID) > 0){
openhabRestApiPost("ON", BTag_03_OH_ITEM);
} else {
openhabRestApiPost("OFF", BTag_03_OH_ITEM);
}
}
Zuletzt geändert von eiGelbGeek am 27. Feb 2021 12:06, insgesamt 1-mal geändert.
-
- Beiträge: 226
- Registriert: 11. Aug 2019 06:39
Re: HowTo - Anwesenheitserkennung mit Bluetooth
Dann läuft das Script gerade und scannt.....
Ja es kann durchaus passieren, das manchmal der Tag nicht erkannt wird, entweder Scan Dauer höher stellen oder weniger BLE Devices im Haushalt haben
Code: Alles auswählen
hcitool lescan > $filename & sleep 15
Ich habe bei mir im openhab noch eine Sicherheit eingebaut, es wird erst auf Abwesend geschaltet, wenn der Tag 5 mal nicht erkannt wurde bzw scanne ich alle 2 Minuten und beim ersten nicht erkennen starte in einen 10 Minuten Timer und es wird auf Abwesend geschaltet, wenn dieser abgelaufen ist. Abgebrochen wird der Timer durch erkennnen des Tags.