Raspberry Pi als Beacon Scanner für Gigaset G-Tags - Reloaded

Hi,

Was spricht denn dagegen, einfach alle Macadressen auszugeben? Das filtern kann man auf symcon Ebene machen.

Bei dem projekt hier
MQTT Bluetooth Anwesenheitserkennung Raum präsenzmelder

Wird das auch gemacht. Es kommen dabei mac adressen und rssi raus. Hab das mal auf einem esp32 geflasht und funktioniert super.

Viele grüsse

Gesendet von meinem EML-L29 mit Tapatalk

meinst du den sed-Filter ? Ich fands sinnvoll, vor dem Senden zu fitern.

auch interessant, vor allem die Reichweite von BT bei aktiviertem WiFi, Ich bin aufgrund der Probleme des Zero mit BT bei aktiviertem WiFi ja davon runter…

Wir spielen derzeit mit FireBeetle Arduinos rum. Die können Entfernungen zu BT Devices ermitteln. Ansonsten das gleiche Prinzip.

Hallo Leute,

habe mal ein bißchen gegooglt und dieses Kommando gefunden:

btmon & hcitool lescan --duplicates

Ergebnis (Ausschnitt):

> HCI Event: LE Meta Event (0x3e) plen 27                                                                 #86570 [hci0] 719.346518
      LE Advertising Report (0x02)
        Num reports: 1
        Event type: Scan response - SCAN_RSP (0x04)
        Address type: Public (0x00)
        Address: xx:xx:xx:xx:xx:xx (Gigaset Communications GmbH)
        Data length: 15
        Name (complete): Gigaset G-tag
        RSSI: -95 dBm (0xa1)
> HCI Event: LE Meta Event (0x3e) plen 30                                                                 #86571 [hci0] 719.386300
      LE Advertising Report (0x02)
        Num reports: 1
        Event type: Connectable undirected - ADV_IND (0x00)
        Address type: Random (0x01)
        Address: xx:xx:xx:xx:xx:xx  (Resolvable)
        Data length: 18
        Flags: 0x1a
          LE General Discoverable Mode
          Simultaneous LE and BR/EDR (Controller)
          Simultaneous LE and BR/EDR (Host)
        TX power: 12 dBm
        Company: Apple, Inc. (76)
          Type: Unknown (16)
          Data: 111a9953d1ac
        RSSI: -85 dBm (0xab)

Spannend sind die Daten in der Tiefe und das offensichtlich auch eines meiner Apple Geräte gefunden wurde.

Bekam den Befehl aber nicht mehr gestoppt…:eek:
Warum ist der Befehl so nicht stoppbar?
Wäre es möglich diese Informationsvielfalt strukturiert in die auf dem Raspberry Pi laufenden Skripte zu integrieren?

Joachim

Hi,

btmon & hcitool lescan --duplicates

Warum ist der Befehl so nicht stoppbar?

weil der Befehl so wie oben nicht für deine Zwecke gedacht ist.

Das btmon & schickt das Programm btmon in den Hintergrund.

Du möchtest daher sowas haben

 hcitool lescan --duplicate | btmon

die Ausgabe von hcitool geht an btmon…

Ich stelle aber fest, das mit hcitool lescan die Batterie aller meiner Endgeräte schnell in die Knie gehen, also nicht durchlaufen lassen :wink:

Viele Grüße

Hallo Kris,

wäre das nicht klasse, wenn man das in den Dienst auf dem Raspberry Pi als Funktion integrieren könnte? Dann kann man selbst bestimmen in welchem Intervall man detaillierte Informationen möchte, in dem man diese dann gezielt aus dem IPS aufruft. Ebenso wäre der Abruf der Batteriedaten sicherlich dann und wann interessant.

Ich vermute in dem Ausbau des Dienstes steckt noch einiges an Potential zur Nutzung…:wink:

Joachim

…was könnte dieser Dienst auf dem Raspberry leisten:

  • Fernkonfiguration der Ziel IP/Port
  • Filterung der zulässigen Beacons (z.B. durch Namensfilterung)
  • Abfrage des Batteriezustands (auf Abruf)
  • Abfrage der Empfangsstärke (auf Abruf)
  • Häufigkeit der Abfrage (es kommen ja teilweise jetzt alle paar Sekunden Daten herein und habe aktuell nur zwei Raspberry Pi eingerichtet und zwei Gigaset G-Tag aktiv)
  • Start/Stop der Scanfunktion
  • einfache Installation und durch Fernkonfiguration im IPS für viele Anwender besser nutzbar
  • strukturiertes Datenformat zur Weitergabe an IPS

…vielleicht hat ja doch noch einer Lust, dieses Modul/Projekt „rund“ zu machen…:wink:

Joachim

Hallo Allerseits,

Die Lösungsansätze sind alle sehr interessant. Ich habe seit ca. 1 Jahr auch die Gigaset BT Tags als Anwesenheitserkennung.
Dazu ist ein Raspberry Zero auf dem Symcon läuft. Der nimmt die Geräte an und schickt die Daten über JSON an das Hauptsystem.
Das funktioniert soweit auch sehr zuverlässig. Ich möchte allerdings ein paar mehr von den Scannern einsetzten.
Problem hierbei, kommt ein BT Tag dazu oder wird ausgetauscht muss dies auf jeden Rasp nachgezogen und umprogrammiert werden.

Den Ansatz von Buzz2912 finde ich am spannensten. So dass alle Variablen an das Hauptsystem geschickt werden.
Über die MAC Adressen dann Filtern wer da ist.

Die Geschichte hier finde ich aber noch interessanter. Da hier scheinbar keine Verwaltung auf den Scannern nötig ist. Die Werte werden über MQTT an das Haupsystem geschickt und dort dann ausgewertet.
http://esp32-server.de/mqtt-ble/

Hat dies schon mal jemand getestet?

Hi,

Ja ich. Läuft auf einem esp32 sehr zuverlässig. 5 weitere warten noch auf ihren Einsatz

Das kompilieren ist tricky da man con arduinojson eine ältere library benötigt (die letzte 5er) aber sonst sehr gut.

Wenn ich mal zeit habe, versuche ich das auf die neusten libs umzustellen aber das ist fast neu programmiern…

Gesendet von meinem EML-L29 mit Tapatalk

Ich habe inzwischen auf lokales symcon auf den Sendern umgestellt, weil das sehr viel zuverlässiger läuft.
Allerdings verwalte ich diese zentral. Genauso wie Du Deine Nachrichten per Json ans Hauptsystem schickst, schicke ich vom Hauptsystem an die Scanner. Dazu benutzt jeder Scanner genau das gleiche Image. In einem Script steht dann ein Array mit Scanner IP und Hostname. Dieser wird dann gesetzt. Außerdem wird das Array mit den Tags übertragen. Zusätzlich noch die Zeit für Abwesenheit.
Ich könnte bei Interesse Scripte oder ein Image bereitstellen.

Läuft absolut störungsfrei.

Die ESP32 Variante fände ich auch super interessant. Allerdings bräuchte ich da schon ein fertiges Image zum flashen. Da kann ich nix.

Gruss Sebastian

Hi,

Ein fertiges image ist schwierig. Wifi und mqtt daten sind hartkodiert. Da muss man halt mal ran…

Gesendet von meinem EML-L29 mit Tapatalk

Ich hab es heute Abend auch mal auf einem ESP32 ausprobiert und den Code etwas angepasst.

Der Aufbau der MQTT Message ist nun wie folgt:

bt-scanner/00:11:22:33:44/OFFICE -> RSSI = -60

Also Topic Name ist konstant „bt-scanner“ gefolgt von der MAC, gefolgt vom Scanner Name. Dann kommt der Payload für RSSI.
So kann ich zu jeder Macadresse mir die RSSI von jedem Scanner abholen. Müsste nur schauen, wie ich das in Symcon abgebildet bekomme.

Übrigens muss man bei den MQTT Messages aufpassen, dass man nicht bei die 128 byte Größe kommt. Entweder das Limit in der Header Datei erhöhen oder die messages splitten. Der Code macht dies leider noch nicht. Wenn viele Geräte im Haus sind und das JSON groß wird, ist das Limit fix erreicht…

Würde mir jemand verraten, welches ESP Board dafür gut geeignet ist und wie die Reichweite mit WiFi und BT in der Praxis so ist ? Bei meinem Zero hatte ich immer erhebliche Einbußen der BT Reichweite bei aktiviertem WiFi.

Hi,

Tomw
Ich hab die „esp32 devkit v4“ von azdelivery. Aber es tut jeder esp32 mit bt und wifi

Someone
Gute idee mit dem aufbau der messages. Wenn du magst stelle ich meine symcon Schnipsel hier bereit, dann hat man einen anfang

Gesendet von meinem EML-L29 mit Tapatalk

wäre ne echt schöne Sache wenn sich hier was tut :slight_smile:
Leider kenn ich mich mit ESP32 Programmierung nicht wirklich aus.
Software drauf flashen ist da schon das höchste

@someone:
Dein ESP32-Code würde mich interessieren.
Könntest du den mal posten?

Kann ich gerne machen. Ich denke am WE bin ich wieder am Rechner, wo ich den aktuellen Code habe. :cool:

So… anbei mal mein angepasster Code.
Basis ist wie gesagt der von MQTT Bluetooth Anwesenheitserkennung Raum präsenzmelder - ich bin kein C Experte! Außerdem verwende ich hier viel „String Schieberei“, was auf dem Arduino mit Teufelswerk gleichzusetzen ist (Stings fressen Speicher).

Der Code funktioniert jedoch bei mir und sendet pro Gerät in einer eigenen Queue die RSSI Werte.

–> bt-scanner/00:11:22:33:44/OFFICE -> RSSI = -60

Bitte die MQTT Server Werte und WIFI Werte setzen. Auch diese Werte könnt ihr nach Euren Vorstellungen setzen:

#define MQTT_Name „bt-scanner“
#define MQTT_SCANNER „OFFICE“

Ihr werdet im MQTT Configurator viele Einträge bekommen. Wundert Euch nicht, wieviele Geräte bei Euch bzw. Nachbarn so entdeckt werden. Mapped daher am beste nur die wirklich benötigten Devices.

Leider wechselt Apple (aus Datenschutzgründen?) ständig die MAC Adresse. D.h. ein Tracking von Apple Geräten ist nicht möglich, außerdem habt ihr dadurch nochmal eine Vielzahl von Geräten im MQTT Configurator.

#include <WiFi.h>
#include <WiFiClient.h>
#include <PubSubClient.h>
#include <BLEDevice.h>
#include <BLEScan.h>
#include <BLEAddress.h>

// MQTT Zugangsdaten
#define MQTT_server "mqtt.home"
#define MQTT_port 1883
#define MQTT_User "MQTT_USER"
#define MQTT_Pass "MQTT_PASSWORD"
#define MQTT_Name "bt-scanner"
#define MQTT_SCANNER "OFFICE"
#define QoS 0
#define BUFFER_MQTT_SIZE 

//const char* MQTT_SCANNER = "OFFICE";
const char* ssid = "SSID"; // WLAN Zugangsdaten Eintragen
const char* password = "WIFI_PASSWORD";

int scanTime = 10; //sek. iBeacon Suchzeit und MQTT Berichtinterval
BLEScan* pBLEScan ;

// --------------- MQTT Variablen ---------------------------------------
WiFiClient wclient;
PubSubClient mqtt(wclient);

void setup()
{
  Serial.begin(115200);

  // --------------------- WiFi ---------------------------------------------
  WiFi.mode(WIFI_STA);   ;
  WiFi.begin(ssid, password);
  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.setServer(MQTT_server, MQTT_port); // MQTT Port einstellen
  if (mqtt.connect(MQTT_Name, MQTT_User, MQTT_Pass))
  {
    Serial.println("Mit MQTT verbunden");
    //mqtt.publish("hallo", MQTT_Name); // 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;
  
  BLEScanResults foundDevices = pBLEScan->start(scanTime); // BLE Scanen

  for (j = 0; j < foundDevices.getCount(); j++) // Alle Gefundene Bluetooth Device durchgehen
  {
    char buf[128];
    strcpy(buf, MQTT_Name);
    strcat(buf, "/");
    strcat(buf, foundDevices.getDevice(j).getAddress().toString().c_str());
    strcat(buf, "/");
    strcat(buf, MQTT_SCANNER);
    strcat(buf, "/RSSI");
    if (!mqtt.publish(buf , String(foundDevices.getDevice(j).getRSSI()).c_str())) {
      Serial.println("Could not send MQTT");
    }
  } 
  pBLEScan->clearResults();

  delay(100);
  if (WiFi.status() != WL_CONNECTED)  ESP.restart(); 
  if (mqtt.connected())
  {
    mqtt.loop();
  }
  else
  {
    Serial.println("MQTT Verbindung fehlerhaft!");
    mqtt.connect(MQTT_Name, MQTT_User, MQTT_Pass);
  }
}

mal eine kleine Frage: ist das, was in diesem Thread und einigen weiteren mit dem Tag „BLE+Scanner“ versucht wird zu realisieren, nicht die Funktion von einem „BLE Gateway“? Z.B. dem G1 von Minew

Die Hardware zum Erfassen von BLE scheint sehr preiswert zu sein, aber im Internet findet man wenig fertige Lösungen, weil scheinbar jeder vorraussetzt, dass gerne gebastelt wird.

Das hört sich interessant an. Aber wie bekommt man das in Symcon?

Gesendet von meinem VOG-L29 mit Tapatalk