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…
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?
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…
…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…
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/
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.
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.
wäre ne echt schöne Sache wenn sich hier was tut
Leider kenn ich mich mit ESP32 Programmierung nicht wirklich aus.
Software drauf flashen ist da schon das höchste
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:
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.