HowTo - Anwesenheitserkennung mit Bluetooth

Für welche Projekte verwendet Ihr OpenHAB? Was habt Ihr automatisiert? Stellt eure Projekte hier vor.

Moderatoren: Cyrelian, seppy

eiGelbGeek
Beiträge: 226
Registriert: 11. Aug 2019 06:39
Answers: 4

Re: HowTo - Anwesenheitserkennung mit Bluetooth

Beitrag von eiGelbGeek »

:mrgreen:

eric1905
Beiträge: 13
Registriert: 14. Apr 2020 12:40

Re: HowTo - Anwesenheitserkennung mit Bluetooth

Beitrag von eric1905 »

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?

eiGelbGeek
Beiträge: 226
Registriert: 11. Aug 2019 06:39
Answers: 4

Re: HowTo - Anwesenheitserkennung mit Bluetooth

Beitrag von eiGelbGeek »

Ich habe mal ein Geräte Update vorgenommen :mrgreen:

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 :mrgreen: 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 :mrgreen: :mrgreen: :mrgreen:

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 :mrgreen:

PS: In der ArduinoIDE NoOTA einstellen, sonst ist der Sketch zu groß... Wifi und BLE nehmen wohl doch mehr Platz ein als erwartet :mrgreen:

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.

eiGelbGeek
Beiträge: 226
Registriert: 11. Aug 2019 06:39
Answers: 4

Re: HowTo - Anwesenheitserkennung mit Bluetooth

Beitrag von eiGelbGeek »

eric1905 hat geschrieben: 19. Jun 2020 02:19
Set scan parameters failed: Connection timed out
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 :mrgreen:

Code: Alles auswählen

hcitool lescan > $filename & sleep 15
sleep einfach mal z.b. auf 20 stellen, dann scannt er 20 Sekunden statt 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.

Antworten