NEWS
MQTT Bluetooth BLE Anwesenheitserkennung mit ESP32
-
Habe nun ein Update des Skripts fertiggestellt. Das ist hier zu finden:
Hier ein Beispiel. Es schaut zumindest bei mir nicht immer so klar aus. Die Größe des Kreises gibt an, wie groß die (mathematische) Unschärfe in diesem Fall ist. Ausgewertet, werden für die Triangulation immer die drei Scanner mit dem stärksten Signal. Ich hatte nur noch drei ESP32 übrig, daher konnte ich diese Funktionalität nicht austesten. Theoretisch funktioniert es.
Mir ist aufgefallen, dass die Triangulation manchmal fehlerhaft ist; keine Auflösung der Formel. Dies fällt aber optisch nicht auf; muss ich weiter analysieren. Vor allem muss ich prüfen ob die Berechnung falsch ist oder tatsächlich keine Berechnung möglich ist (was ich bezweifle).
@Muchul: Für weitere Tests, ob dieses System bei dir überhaupt anwendbar ist, reicht es allemal. Kannst deine Variablen für Räume, Scanner und Beacons in das neue Skript übernehmen.
Übrigens: Der Beacon befindet sich im oben dargestellten Bild ziemlich genau auf der Berührungslinie zwischen wohnz1-Scanner und dem Mittelpunkt des berechneten Standortes. Schwankt aber sehr stark, obwohl keine Bewegung des Beacon stattfindet.
Die Anzeige, in welchem Raum man sich befindet, ist nun auch integriert. Ausgewertet wird immer der Mittelpunkt des Kreises.
-
Hallo @giuseppes
habe dein Script jetzt mal übernommen, bin begeistert.
An manchen stellen klappt es super, beispielsweise im Wohnzimmer.
Ich habe erst mal bei mir einige Anpassungen vorgenommen:
Die Sensoren habe ich ich von 10 Sekunden Aktualisierung auf 5 Sekunden reduziert, bei mir war es sogar gemischt, das ist für das Script sicher kontraproduktiv gewesen.Die Anzeige in welchen Raum man sich befindet finde ich sehr gut, wenn es nur darum geht, in welchen Raum an sich befindet, wäre das der Datenpunkt, den man zur Auswertung heranziehen könnte.
Hier wäre noch eventuell die Möglichkeit die Koordinaten mit auszugeben ganz gut.Ich denke eines der schwierigkeiten dürften die Wände / Abschirmung sein. Auf dem Balkon bin ich ca. 80 cm vom Sensor entfernt und es wird nichts gefunden, weil die Wand und das Fenster so stark abschirmen.
Auch scheint es mir so, wenn man sich an Randbereichen befindet, also beispielsweise bei mir im Eingangsbereich zwischen Küche und Wohnzimmer, (mittig ganz links am Rand) scheint das Band gar nicht gefunden zu werden.
Teilweise funktioniert es aber auch so gut, das man fast sekunden genau betrachten kann wie ich mich bewege.
Ich habe hier noch 2 ESP32 über, falls es dir hilft, könnte ich dir die zusenden. -
@muchul
Danke für das Angebot des Zusendens. Ich denke, dass die Auswahl der drei besten Scanner anscheinend funktioniert. Daher wäre der Bedarf gedecktTo Do's wären noch:
- Triangulation liefert manchmal keine Werte. Evtl liegt es daran, dass die Werte manchmal zu schnell eingingen.
- Ein zusätzlicher Datenpunkt, der den aktuellen Raum anzeigt.
- Ein zusätzlicher Datenpunkt mit den Beacon-Koordinaten
Was mir allgemein aufgefallen ist:
Der Standort vom Scanner ist immens wichtig. Der bei mir rechts zu finden ist, dieser empfängt seeehr gut, obwohl der ganz nah am Schrank und dadurch teils verdeckt war. Als ich den an einer Verlängerung etwas freiliegend hatte, waren die Werte realistischer.Ich verwende aktuell Shelly für meine Rollläden. Nun wird in den nächsten Tagen ein neues Produkt von Shelly vorgestellt. Könnte ein Shelly 2 mit esp32 sein. In diesem Fall, würde ich einen kaufen und damit testen. Tasmota sollte flashbar sein und ble scan unterstützten.
Dann hätte ich ruck zuck 7 Scanner in der Wohnung, absolut unauffällig und ohne zusätzliches gebastel. 1/2 Scanner mittig irgendwo sollte dann für gute Ergebnisse sorgen. -
@giuseppes
Wenn Werte die zu schnell kommen stören können, kann ich ja mal auf 10 Sekunden einstellen?
Kann ich irgendwie erkennen, wann eine Berechnung zu Ende ist? dann kann ich die Aktualisierungsrate anpassen, geht ja in espresense problemlos.Noch etwas, oder besser eine Verstädnissfrage:
In dem Folgenden Bild ist das Miband ungefähr auf dem i Punkt vom Wohnzimmer.
Ich habe folgendes verstanden, aber aber höchstwahrscheinlich falsch ist:
Das Script nimmt die drei Sensoren mit den besten Werten und zieht einen kreis auf die Berührungspunkte.
Der Mittelpunkt bestimmt dann die Position?
Wenn das Band, rechts von Wohnzimmer ist, unterhalb von Arbeitszimmer, und alle anderen Sensoren oberhalb, kann doch gar kein Kreis mit dem Mittelpunkt an der entsprechenden Stelle gezogen werden.
Bin etwas verwirrt.Habe im folgenden Beispiel mal Arbeitszimmer deaktiviert, ich denke da wird deutlicher wo meine gedanken hängen geblieben sind.
Der Grüne Punkt ist der selbe Standort, wie auch oben im Bild. -
@muchul
Aktuell ist es nicht sichtbar, wann eine Berechnung fertig ist. Im Script ist in Zeile 243 ein console.log auskommentiert. Wenn du den aktivierst, siehst du die Werte im Log nach jeder Berechnung.
Einstellungen am esp32 sind nur bedingt nützlich. Die Triangulation wird ja immer neu durchgeführt, wenn ein einzelner esp32 seine Werte aktualisiert. Wie aber erwähnt, evtl liegt es nicht am Timing sondern an bestimmte Werte bzw Kombinationen der Werte. Stört aber nicht allzu sehr für die ersten Tests.Bzgl der Triangulation hast du es grundsätzlich richtig verstanden. Unterhalb vom Arbeitszimmer ist die einzige genauere Möglichkeit der Ortung einzig über die Scanner "Wohnzimmer", "Umkleide" und "Arbeitszimmer" (alternativ "flurmitte") möglich.
Ich gehe davon aus, dass eine Ortung bestmöglich sein sollte, wenn die Scanner im Schachbrettmuster verteilt werden.Evtl macht es auch Sinn, bei einzelnen Scanner mit dem Kalibrierwert zu spielen. Dein Scanner "flurmitte" verschlechtert die Ortung, weil der zu gut empfängt. Würde da den Wert mal nach oben und unten variieren, dass der eine größere Distanz anzeigt wenn du weiterhin am I-Punkt stehst.
An meinen Tests konnte ich aber erkennen, dass die Streuung allgemein schon hoch ist.
Da du so viele esp32 einsetzt: du könntest mal auf Raw Werte der esp32 umstellen, statt auf die gefilterten Werte. Dazu musst du im Script die Zeile 222 und 223 tauschen (= auskommentieren / aktivieren). Zeilenangabe gemäß original Script. Wäre echt interessant zu sehen, wie sich das bei dir auswirkt.
Hatte schon den Gedanken, bei mir die esp32 irgendwie an den Deckenlampen unterzubringen. Die esp32 wären dann ziemlich ungestört und halbwegs mittig im Raum. Spannungsversorgung von 230V müsste ich nur austesten.
-
@mischaka
ich bekomme beim compilieren immer Fehlermeldungen:In file included from C:\Users\andre\Documents\Arduino\libraries\ESP32_BLE_Arduino\src/BLEAdvertising.h:15, from C:\Users\andre\Documents\Arduino\libraries\ESP32_BLE_Arduino\src/BLEServer.h:19, from C:\Users\andre\Documents\Arduino\libraries\ESP32_BLE_Arduino\src/BLEDevice.h:18, from C:\Users\andre\Documents\Arduino\blescanner\blescanner.ino:1: C:\Users\andre\Documents\Arduino\libraries\ESP32_BLE_Arduino\src/FreeRTOS.h:61:28: error: 'ringbuf_type_t' has not been declared Ringbuffer(size_t length, ringbuf_type_t type = RINGBUF_TYPE_NOSPLIT); ^~~~~~~~~~~~~~ Mehrere Bibliotheken wurden für "BLEDevice.h" gefunden Benutzt: C:\Users\andre\Documents\Arduino\libraries\ESP32_BLE_Arduino Nicht benutzt: C:\Users\andre\AppData\Local\Arduino15\packages\esp32\hardware\esp32\2.0.2\libraries\BLE Mehrere Bibliotheken wurden für "WiFi.h" gefunden Benutzt: C:\Users\andre\AppData\Local\Arduino15\packages\esp32\hardware\esp32\2.0.2\libraries\WiFi Nicht benutzt: C:\Program Files (x86)\Arduino\libraries\WiFi exit status 1 Fehler beim Kompilieren für das Board ESP32 Dev Module.
wahrscheinlich falsche Bibliothek? Kannst du mir sagen welche ich da einbinden muss (die mqtt Bibliothek von imroy habe ich eingebunden)
-
@amg_666
Der letzte Stand in diesem Thread ist, dass espresense genutzt wird.
Flashen funktioniert super über deren Webseite -
@giuseppes
Der tuts bei mir leider auch nicht. ESP32 geflasht, wlan und mqtt einstellungen eingegeben, soweit alles gut, aber dann bei Neustart des esp:[23:45:21]rst:0x1 (POWERON_RESET),boot:0x13 (SPI_FAST_FLASH_BOOT) [23:45:21]configsip: 0, SPIWP:0xee [23:45:21]clk_drv:0x00,q_drv:0x00,d_drv:0x00,cs0_drv:0x00,hd_drv:0x00,wp_drv:0x00 [23:45:21]mode:DIO, clock div:2 [23:45:22]load:0x3fff0018,len:4 [23:45:22]load:0x3fff001c,len:1044 [23:45:22]load:0x40078000,len:8896 [23:45:22]load:0x40080400,len:5828 [23:45:22]entry 0x400806ac [23:45:22]Connecting to WiFi (F0:08:D1:D8:0A:04)... [23:45:24]Connecting to WiFi SSID 'WLAN-772776'...............192.168.2.182 [23:45:24]Version: v2.0.26 [23:45:24]IP address: 192.168.2.182 [23:45:24]DNS address: 192.168.2.1 [23:45:24]Hostname: espresense-arbeitszimmer [23:45:24]Room: Arbeitszimmer [23:45:25]Max Distance: 16.00 [23:45:25]Telemetry: enabled [23:45:25]Rooms: enabled [23:45:25]Devices: enabled [23:45:25]Discovery: disabled [23:45:25]PIR Sensor: disabled [23:45:25]Radar Sensor: disabled [23:45:25]Query: [23:45:25]Include: [23:45:25]Exclude: [23:45:25]Connecting to MQTT 192.168.2.23 1883 [23:45:29]0 New | MAC: f54207d89c63, ID: mifit:f54207d89c63 [23:45:30]E (8070) task_wdt: Task watchdog got triggered. The following tasks did not reset the watchdog in time: [23:45:30]E (8070) task_wdt: - IDLE0 (CPU 0) [23:45:30]E (8070) task_wdt: Tasks currently running: [23:45:30]E (8070) task_wdt: CPU 0: BLE Scan [23:45:30]E (8070) task_wdt: CPU 1: IDLE1 [23:45:30]E (8070) task_wdt: Aborting. [23:45:30]abort() was called at PC 0x4018b210 on core 0 [23:45:30] [23:45:30]ELF file SHA256: 0000000000000000 [23:45:30] [23:45:32]Backtrace: 0x4008f658:0x3ffbfee0 0x4008f8d5:0x3ffbff00 0x4018b210:0x3ffbff20 0x4008dd01:0x3ffbff40 0x4000bfed:0x3ffde350 0x40091a59:0x3ffde360 0x40093c4f:0x3ffde380 0x400943fb:0x3ffde3a0 0x40081e6e:0x3ffde3c0 0x40086bd5:0x3ffde3e0 0x4000bec7:0x3ffde400 0x401a9e65:0x3ffde420 0x400d3029:0x3ffde440 0x400d7355:0x3ffde460 0x400908e6:0x3ffde4e0 [23:45:32] [23:45:32]Rebooting...
Zu der "Task watchdog got triggered." gibts zwar diverse Treffer bei google, ich hab aber nix gefunden was mir weiterhilft
-
@amg_666
Wenn der esp32 nicht defekt ist, kann es ehrlich gesagt nur an den Einstellungen liegen. Ich habe problemlos 3 Stück geflashed und eingerichtet.
Sicher, dass die mqtt Einstellungen korrekt sind? IP und Port?
Kann morgen deine logs zu meinen vergleichen. Wo/Wie sind diese zu finden? -
@amg_666
Nimm mal die v2.0.25. Die v2.0.26 hat wahrscheinlich einen Bug.
Und automatische Updates deaktivieren. -
@maik-0 ich befürchte, dass der esp eine Macke hat. Mit der v2.0.25 komme ich nicht ins WLAN
[11:12:48]rst:0x1 (POWERON_RESET),boot:0x13 (SPI_FAST_FLASH_BOOT) [11:12:48]configsip: 0, SPIWP:0xee [11:12:48]clk_drv:0x00,q_drv:0x00,d_drv:0x00,cs0_drv:0x00,hd_drv:0x00,wp_drv:0x00 [11:12:48]mode:DIO, clock div:2 [11:12:48]load:0x3fff0018,len:4 [11:12:48]load:0x3fff001c,len:1044 [11:12:49]load:0x40078000,len:8896 [11:12:49]load:0x40080400,len:5828 [11:12:49]entry 0x400806ac [11:12:49]Connecting to WiFi (F0:08:D1:D8:0A:04)... [11:13:43]Connecting to WiFi SSID 'WLAN-772776'.........................................................................................................................................................................................................................................................................................................................................................................ets Jun 8 2016 00:22:57 [11:13:43] [11:13:43]rst:0x1 (POWERON_RESET),boot:0x13 (SPI_FAST_FLASH_BOOT) [11:13:43]configsip: 0, SPIWP:0xee [11:13:44]clk_drv:0x00,q_drv:0x00,d_drv:0x00,cs0_drv:0x00,hd_drv:0x00,wp_drv:0x00 [11:13:44]mode:DIO, clock div:2 [11:13:44]load:0x3fff0018,len:4 [11:13:44]load:0x3fff001c,len:1044 [11:13:44]load:0x40078000,len:8896 [11:13:44]load:0x40080400,len:5828 [11:13:44]entry 0x400806ac [11:13:44]Connecting to WiFi (F0:08:D1:D8:0A:04)... [11:14:44]Connecting to WiFi SSID 'WLAN-772776'................................................................................................................................................................................................................................................................................................................................................................................................................ failed. [11:14:44]Starting access point for configuration portal. [11:14:44]SSID: 'espresense-arbeitszimmer' [11:14:44]IP: 192.168.4.1 [11:16:19][E][WiFiClient.cpp:395] write(): fail on fd 56, errno: 104, "Connection reset by peer"
Die Einstellungen habe ich mehrfach überprüft, PAsswort für WLAN und mqtt-Einstellungen sind korrekt.
-
Ich muss nochmal fragen: Neue ESP bestellt, geflasht, läuft.
.Ich hab jetzt einen ESP im Netz, der erkennt auch mein Mi Band:Das Mi Band sehe ich jetzt auch in den Objekten, soweit alles gut. Wenn ich jetzt weitere BT devices habe, wie kann ich dann bestimmte devices explizit als "excluded" eintragen?
-
@amg_666
Exclude müsste von der Firmware espresense umgesetzt werden. Das ist bis jetzt noch nicht geschehen. Hatte mal ein Issue dazu auf github gesehen. Das solltest du verfolgen. -
@giuseppes sagte in MQTT Bluetooth BLE Anwesenheitserkennung mit ESP32:
Hatte mal ein Issue dazu auf github gesehen. Das solltest du verfolgen.
Danke für die Info.
ich hab jetzt nmoch ein Problem bzw eine Frage: Zum Testen habe ich 3 ESP geflasht und die in 3 Etagen angeschlossen. Final soll das mal so fein werden, dass ich den Raum einer Person (respektive des Devices) mitbekomme und dann individuell Licht/Musik etc steuern kann.
Samsung Smartphone: Quasselt regelmäßig mit den ESPs, ich werte die Entfernungen aus und die niedrigste Entfernung ist dann die Etage wo das Handy grade ist. Funktioniert ohne Probleme (na ja fast, die Entfernungsermittlung ist schon ziemlich ungenau, aber im großen und ganzen ok).
Fitnessband (mi 3 Band): Das hatte ich gestern getestet und auch da wurden die Datenpunkte der ESP regelmäßig upgedatet. Heute morgen war da "Funkstille" (im wahrsten Sinne des Wortes). Ich hab dann mal die ESP resettet, den mqtt Adapter neu gestartet und irgendwann liefs wieder gut. Jetzt ist wieder Stillstand und es wird nichts upgedatet.
Sind diese einfachen Fitnessbänder so unzuverlässig oder woran kann das liegen? Das Samsung ist fröhlich am aktualisieren... -
@amg_666
Ich verwendete zu Testzwecken mein miband5 bzw 6 und da gab es nie Probleme, wie du sie beschreibst. Grundsätzlich wurde immer gesendet. Über mehrere Wochen hatte ich teilweise getestet. -
Hallo zusammen,
ich bekomme es leider nicht hin den Sketch zu kompilieren. Bei Kompilieren erhalte ich immer folgende Fehlermeldung:
Arduino: 1.8.19 (Windows 10), Board: "ESP32 Dev Module, Disabled, Default 4MB with spiffs (1.2MB APP/1.5MB SPIFFS), 240MHz (WiFi/BT), QIO, 80MHz, 4MB (32Mb), 921600, None" C:\Users\Andy\Downloads\1603999752128-mqtt_anwesenheit_ota.ino\mqtt_anwesenheit_ota\mqtt_anwesenheit_ota.ino: In function 'void setup()': mqtt_anwesenheit_ota:226:8: error: 'class PubSubClient' has no member named 'set_server' mqtt.set_server(MQTT_server, MQTT_port); // MQTT Port einstellen ^ mqtt_anwesenheit_ota:228:29: error: no matching function for call to 'PubSubClient::connect(String&)' if (mqtt.connect(MQTT_Name)) ^ In file included from C:\Users\Andy\Downloads\1603999752128-mqtt_anwesenheit_ota.ino\mqtt_anwesenheit_ota\mqtt_anwesenheit_ota.ino:34:0: C:\Users\Andy\Documents\Arduino\libraries\PubSubClient\src/PubSubClient.h:112:12: note: candidate: boolean PubSubClient::connect(const char*) boolean connect(const char* id); ^ C:\Users\Andy\Documents\Arduino\libraries\PubSubClient\src/PubSubClient.h:112:12: note: no known conversion for argument 1 from 'String' to 'const char*' C:\Users\Andy\Documents\Arduino\libraries\PubSubClient\src/PubSubClient.h:113:12: note: candidate: boolean PubSubClient::connect(const char*, const char*, const char*) boolean connect(const char* id, const char* user, const char* pass); ^ C:\Users\Andy\Documents\Arduino\libraries\PubSubClient\src/PubSubClient.h:113:12: note: candidate expects 3 arguments, 1 provided C:\Users\Andy\Documents\Arduino\libraries\PubSubClient\src/PubSubClient.h:114:12: note: candidate: boolean PubSubClient::connect(const char*, const char*, uint8_t, boolean, const char*) boolean connect(const char* id, const char* willTopic, uint8_t willQos, boolean willRetain, const char* willMessage); ^ C:\Users\Andy\Documents\Arduino\libraries\PubSubClient\src/PubSubClient.h:114:12: note: candidate expects 5 arguments, 1 provided C:\Users\Andy\Documents\Arduino\libraries\PubSubClient\src/PubSubClient.h:115:12: note: candidate: boolean PubSubClient::connect(const char*, const char*, const char*, const char*, uint8_t, boolean, const char*) boolean connect(const char* id, const char* user, const char* pass, const char* willTopic, uint8_t willQos, boolean willRetain, const char* willMessage); ^ C:\Users\Andy\Documents\Arduino\libraries\PubSubClient\src/PubSubClient.h:115:12: note: candidate expects 7 arguments, 1 provided mqtt_anwesenheit_ota:231:18: error: 'MQTT' has not been declared mqtt.publish(MQTT::Publish("hallo", MQTT_Name).set_qos(QoS)); // im Topic hallo Präsenzmelder Name schreiben ^ C:\Users\Andy\Downloads\1603999752128-mqtt_anwesenheit_ota.ino\mqtt_anwesenheit_ota\mqtt_anwesenheit_ota.ino: In function 'void loop()': mqtt_anwesenheit_ota:271:16: error: 'MQTT' has not been declared mqtt.publish(MQTT::Publish(MQTT_Name, NachrichtJSON).set_qos(QoS)); // JSON per MQTT senden ^ mqtt_anwesenheit_ota:283:27: error: no matching function for call to 'PubSubClient::connect(String&)' mqtt.connect(MQTT_Name); ^ In file included from C:\Users\Andy\Downloads\1603999752128-mqtt_anwesenheit_ota.ino\mqtt_anwesenheit_ota\mqtt_anwesenheit_ota.ino:34:0: C:\Users\Andy\Documents\Arduino\libraries\PubSubClient\src/PubSubClient.h:112:12: note: candidate: boolean PubSubClient::connect(const char*) boolean connect(const char* id); ^ C:\Users\Andy\Documents\Arduino\libraries\PubSubClient\src/PubSubClient.h:112:12: note: no known conversion for argument 1 from 'String' to 'const char*' C:\Users\Andy\Documents\Arduino\libraries\PubSubClient\src/PubSubClient.h:113:12: note: candidate: boolean PubSubClient::connect(const char*, const char*, const char*) boolean connect(const char* id, const char* user, const char* pass); ^ C:\Users\Andy\Documents\Arduino\libraries\PubSubClient\src/PubSubClient.h:113:12: note: candidate expects 3 arguments, 1 provided C:\Users\Andy\Documents\Arduino\libraries\PubSubClient\src/PubSubClient.h:114:12: note: candidate: boolean PubSubClient::connect(const char*, const char*, uint8_t, boolean, const char*) boolean connect(const char* id, const char* willTopic, uint8_t willQos, boolean willRetain, const char* willMessage); ^ C:\Users\Andy\Documents\Arduino\libraries\PubSubClient\src/PubSubClient.h:114:12: note: candidate expects 5 arguments, 1 provided C:\Users\Andy\Documents\Arduino\libraries\PubSubClient\src/PubSubClient.h:115:12: note: candidate: boolean PubSubClient::connect(const char*, const char*, const char*, const char*, uint8_t, boolean, const char*) boolean connect(const char* id, const char* user, const char* pass, const char* willTopic, uint8_t willQos, boolean willRetain, const char* willMessage); ^ C:\Users\Andy\Documents\Arduino\libraries\PubSubClient\src/PubSubClient.h:115:12: note: candidate expects 7 arguments, 1 provided Mehrere Bibliotheken wurden für "WiFi.h" gefunden Benutzt: C:\Users\Andy\AppData\Local\Arduino15\packages\esp32\hardware\esp32\1.0.5\libraries\WiFi Nicht benutzt: C:\Program Files (x86)\Arduino\libraries\WiFi exit status 1 'class PubSubClient' has no member named 'set_server'
Weiß jemand was ich hier machen kann?
-
@banis
Wozu überhaupt noch diesen Sketch verwenden? Espresense funktioniert ganz gut. -
@giuseppes Super vielen Dank das funktioniert mit Espresense ja mega einfach.
-
Welche Hardware nutzt ihr? Bzw welchen ESP32 sollte man denn kaufen? Bin von den verschiedenen Varianten auf Aliexpress etwas irritiert..
-
@grace13 Also bei mir läuft es mittlerweile ganz gut und ich benutze D1Mini von A-Z Delivery. Die sind da nicht sooo viel teurer als "beim Chinesen" und du hast kürzere Lieferzeiten und Garantie, bzw die sind eh sehr kulant.
Link auf die Homepage
Und wenn du dich da für den Newsletter einträgst kriegst du täglich irgendwelche Angebote, oft auch D1 Mini als Mehrfachpackung