Navigation

    Logo
    • Register
    • Login
    • Search
    • Recent
    • Tags
    • Unread
    • Categories
    • Unreplied
    • Popular
    • GitHub
    • Docu
    • Hilfe
    1. Home
    2. Deutsch
    3. Hardware
    4. MQTT Bluetooth BLE Anwesenheitserkennung mit ESP32

    NEWS

    • 15. 05. Wartungsarbeiten am ioBroker Forum

    • Monatsrückblick - April 2025

    • Minor js-controller 7.0.7 Update in latest repo

    MQTT Bluetooth BLE Anwesenheitserkennung mit ESP32

    This topic has been deleted. Only users with topic management privileges can see it.
    • M
      Muchul last edited by

      Hallo zusammen, da ich nicht programmieren kann wollte ich am Wochenende mal versuchen dies hier umzusetzen:
      https://docs.openmqttgateway.com/
      Kennt das villeicht jemand hier?

      1 Reply Last reply Reply Quote 0
      • M
        Muchul last edited by Muchul

        Habe jetzt mehrere ESP 32 mit OpenMQTTGateway bestückt und drei Mi Band 5 auf die withelist gesetzt.
        Funktioniert soweit erstmal gut.
        Habt ihr einen Tipp für mich, wie die Zuordnung zu den Zimmern gemacht wird.

        Außerdem muss ich an zwei der drei handys Bluetooth ausschalten, damit die Bänder überhaupt gesehen werden.
        Wie habt ihr das Problem gelöst?

        Habe testweise Nachdem die Bander von de ESP32 erkannt werden, Bluetooth wieder eingeschaltet und die Bänder werden weiterhin erkannt.

        Ach ja, falls es jemanden interessiert, es werden einzelne Datenpunkte angelegt:

        0dd2ceac-fdc5-441d-a6a6-1bf87fcd8617-image.png

        1 Reply Last reply Reply Quote 0
        • S
          Spezialtrick @GiuseppeS last edited by

          @giuseppes said in MQTT Bluetooth BLE Anwesenheitserkennung mit ESP32:

          @wildbill

          
          // erstelle States für Zielwerte
          createState("VIS.bleScan.Pino.RawWemos");
          createState("VIS.bleScan.Pino.AvgWemos");
          
          // nachfolgend kann auch manuData statt MAC eingetragen werden
          // dann müsste unten der Vergleich auf manuData statt mac erfolgen
          // z.B. val[dev].manuData.includes(pino) statt val[dev].mac.includes(pino)
          let pino = "ed:4b:90:40:e7:ba";
          
          // für Berechnung gleitender Mittelwert
          let arrPinoWemos = [0,0,0,0,0,0];
          
          
          on({id: "mqtt-client.0.bleScan.bett_192_168_192_49", change: "ne"}, function (obj) {
          
              // Array in val schreiben
              let val = JSON.parse(obj.state.val);
              
              // Array durchlaufen
              for ( let dev=0; dev < val.length; dev++){
                  //console.log(val[dev].mac + " | " + val[dev].rssi + " | " + val[dev].manuData);
                  
                  // Wenn MAC des betrachteten Array Elements oben definierte MAC enthält...
                  if( val[dev].mac.includes(pino) ) {
                      
                      // Schreibe RSSI Wert direkt in das RAW State (oben definiert)
                      setState("javascript." + instance + ".VIS.bleScan.Pino.RawWemos", val[dev].rssi);
          
                      // ab hier gleitender Mittelwert über letzte 6 Elemente (kann oben auch größer definiert werden)
                      arrPinoWemos.shift();
                      arrPinoWemos.push(val[dev].rssi);
                      let sum = arrPinoWemos.reduce((a, b) => a + b, 0);
                      let avg = (sum / arrPinoWemos.length) || 0;
                      setState("javascript." + instance + ".VIS.bleScan.Pino.AvgWemos", Math.round(avg));
                  }
              };
          });
          

          Habe ergänzende Kommentare hinzugefügt. Sollte hoffentlich selbsterklärend sein. Wenn nicht, einfach nachfragen 😉

          Ich versuche gerade die Anwesenheitserkennung nachzubauen. Leider bekomme ich das Script von GiuseppeS nicht ans Laufen... Die Datenpunkte, die das Script anlegt, bleiben leider leer. Wenn ich das Script debugge erhalten ich den Fehler "Cannot redeclare block-scoped variable".
          Habt ihr eine Idee, wo der Fehler liegt?!

          Bildschirmfoto 2021-11-23 um 21.02.25.png

          G 1 Reply Last reply Reply Quote 0
          • G
            GiuseppeS @Spezialtrick last edited by

            @spezialtrick

            Anscheinend wurde die Variable pino bereits vorher deklariert? Hast du das Skript aus Versehen doppelt eingefügt?

            1 Reply Last reply Reply Quote 0
            • S
              Spezialtrick last edited by

              @giuseppes Danke für deine schnelle Rückmeldung.

              Nein ich habe das Skript lediglich einmal eingefügt. Ich habe pino nun mal gegen Alf ausgetauscht und bekommen leider den gleichen Fehler. 😧

              G 1 Reply Last reply Reply Quote 0
              • G
                GiuseppeS @Spezialtrick last edited by

                @spezialtrick
                Dann poste hier bitte dein komplettes Skript. Kann mir noch vorstellen dass woanders Fehler sind und das hier ein Folgefehler.

                S 1 Reply Last reply Reply Quote 0
                • S
                  Spezialtrick @GiuseppeS last edited by

                  @giuseppes

                  So sieht mein Skript aus:

                  // erstelle States für Zielwerte
                   createState("Präsenzmelder.Miro.Raw");
                   createState("Präsenzmelder.Miro.Avg");
                    
                   // nachfolgend kann auch manuData statt MAC eingetragen werden
                   // dann müsste unten der Vergleich auf manuData statt mac erfolgen
                   // z.B. val[dev].manuData.includes(miro) statt val[dev].mac.includes(miro)
                   let miro = "7C:2F:80:C7:FB:1B";
                    
                   // für Berechnung gleitender Mittelwert
                   let arrMiroWemos = [0,0,0,0,0,0];
                    
                    
                   on({id: "mqtt.0.SmartHome.Küche.Präsenzmelder_192_168_188_75", change: "ne"}, function (obj) {
                    
                       // Array in val schreiben
                       let val = JSON.parse(obj.state.val);
                       
                       // Array durchlaufen
                       for ( let dev=0; dev < val.length; dev++){
                           //console.log(val[dev].mac + " | " + val[dev].rssi + " | " + val[dev].manuData);
                           
                           // Wenn MAC des betrachteten Array Elements oben definierte MAC enthält...
                           if( val[dev].mac.includes(miro) ) {
                               
                               // Schreibe RSSI Wert direkt in das RAW State (oben definiert)
                               setState("javascript." + instance + ".Präsenzmelder.Miro.Raw", val[dev].rssi);
                    
                               // ab hier gleitender Mittelwert über letzte 6 Elemente (kann oben auch größer definiert werden)
                               arrMiroWemos.shift();
                               arrMiroWemos.push(val[dev].rssi);
                               let sum = arrMiroWemos.reduce((a, b) => a + b, 0);
                               let avg = (sum / arrMiroWemos.length) || 0;
                               setState("javascript." + instance + ".Präsenzmelder.Miro.Avg", Math.round(avg));
                           }
                       };
                   });
                  
                  G 1 Reply Last reply Reply Quote 0
                  • G
                    GiuseppeS @Spezialtrick last edited by

                    @spezialtrick
                    Ich kann mir die Fehler nicht erklären. Allerdings würde ich immer davon abraten, deutsche Umlaute in Programm Codes zu verwenden. Zwar ist es hier ein "String". Aber ioBroker muss später damit klarkommen und entsprechende States anlegen. Habe gerade explizit auf fehlerhafte Semikolon o.ä. geachtet, konnte aber nichts feststellen.

                    Dieses WE wollte ich in ioBroker noch was machen. Werde dein Skript mal übernehmen und testen.

                    S 1 Reply Last reply Reply Quote 0
                    • S
                      Spezialtrick @GiuseppeS last edited by

                      @giuseppes

                      Ich teste es heute Abend nochmals ohne Umlaute und gebe dir eine Rückmeldung. Kann es sein, dass ich an irgendeiner Stelle im IOBroker eine fehlende Konfiguration habe? Ich bin erst kürzlich von FHEM umgestiegen, sodass mein IOBroker noch sehr jungfräulich ist.

                      G 1 Reply Last reply Reply Quote 0
                      • G
                        GiuseppeS @Spezialtrick last edited by GiuseppeS

                        @spezialtrick
                        Spezial-Konfig hatte ich mir auch überlegt. Zumindest in der Konfiguration der Javascript Instanz habe ich nichts besonderes gesehen, dass hier benötigt wird. Kannst du aber im Nachgang auch schauen.
                        In der Konfiguration kannst du Haken setzen, um bestimmte Funktionen zu erlauben.

                        S 1 Reply Last reply Reply Quote 0
                        • S
                          Spezialtrick @GiuseppeS last edited by

                          @giuseppes

                          Welche Haken hast du dort gesetzt?

                          G 2 Replies Last reply Reply Quote 0
                          • G
                            GiuseppeS @Spezialtrick last edited by

                            @spezialtrick

                            Screenshot_20211127-104841.jpg

                            1 Reply Last reply Reply Quote 0
                            • G
                              GiuseppeS @Spezialtrick last edited by

                              @spezialtrick
                              Habe eben dein Skript übernommen, es zeigt mir keine Fehler an und lässt sich einwandfrei starten.

                              Da du dein iobroker erst seit kurzem aufgesetzt hast, bestehen evtl andere gröbere Probleme im Hintergrund?
                              Funktionieren andere Skripts?

                              S 1 Reply Last reply Reply Quote 0
                              • S
                                Spezialtrick @GiuseppeS last edited by

                                @giuseppes

                                Das Skript lässt sich bei mir auch fehlerfrei starten, allerdings bleiben die Datenpunkt, die das Skript erzeugt immer leer.

                                Den Fehler sehe ich auch nur, wenn ich das Skript Debugger. Vllt gibt es den Fehler da auch bei dir?

                                Meines Erachtens läuft im IOBroker alles fehlerfrei. Andere JavaScripts laufen auch problemlos. Ich nutze z.B. dieses hier:

                                https://github.com/Baenker/Servicemeldungen-Homematic/blob/master/Servicemeldungen.js

                                G 1 Reply Last reply Reply Quote 0
                                • G
                                  GiuseppeS @Spezialtrick last edited by

                                  @spezialtrick
                                  Kommt überhaupt etwas über mqtt rein? Es wird auf "ne" getriggert. Wenn du über mqtt identische Werte bekommst, müsstest du "ne" zu "any" ändern.

                                  Das Skript sollte jedenfalls fehlerfrei funktionieren. Evtl stimmt die MAC nicht? Wenn über Smartphones ble simuliert werden (gibt Apps dafür), dann sind die MAC nicht konstant.

                                  S 1 Reply Last reply Reply Quote 0
                                  • S
                                    Spezialtrick @GiuseppeS last edited by

                                    @giuseppes

                                    Ich habe den Fehler gefunden und es mir wirklich unangenehm.... 😥

                                    Ich habe meine MAC-Adresse aus FHEM kopiert und ins Javascript eingefügt. In FHEM werden alle Buchstaben der MAC-Adresse als Großbuchstaben dargestellt. In Mosquitto kommen die MAC-Adressen über dein Arduino-Sketch aber als Kleinbuchstaben rein. Entsprechend konnte das Javascript im IOBroker auch nichts finden. 😥 Vielen herzlichen Dank für deine Hilfe!

                                    Wie arbeitest du mit den Zahlen aus den beiden Datenpunkten weiter?

                                    G 2 Replies Last reply Reply Quote 0
                                    • G
                                      GiuseppeS @Spezialtrick last edited by

                                      @spezialtrick
                                      Wichtig ist, dass der Fehler jetzt gefunden wurde.
                                      Habe gestern an einem größeren Skript im Kreis gewerkelt, weil ich wissen Fehler nicht finden konnte. Letztendlich war es ein flüchtiger Fehler, der mich eine Stunde gekostet hatte. Passiert 😉

                                      Aktuell habe ich unter meinem Bett einen Scanner, somit wird gut erkannt, ob ich im Schlafzimmer bin. Damit steuere ich meine "Guten Morgen" Routine. Rollläden fahren hoch, Lichter gehen nicht mehr gedimmt an.

                                      Eigentlich habe ich eine Funktion geschrieben, mit der Trianguliert werden kann. In 2D kann über drei Scanner die Position halbwegs genau ermittelt werden. Aber ich habe bisher keine weiteren Scanner daheim verbaut, weil ich meine Hoffnung ein wenig auf uwb setze.

                                      UWB Smartwatch mit passenden UWB Scanner könnte die Position sehr viel genauer ermitteln. Daher bin ich selbst gerade noch im "Schwebezustand".

                                      Ansonsten würde ich Lichtsteuerung mit diesen ble scanner erweitern:
                                      Licht geht über Bewegungsmelder an und geht erst aus wenn über ble der Bereich verlassen wird. Das wäre eine gute Ergänzung. Bewegungsmelder reagieren meist nicht schnell hintereinander. Außerdem werden kleinere Bewegungen nicht erkannt. Somit eine passende Ergänzung.
                                      Muss jetzt nur noch meine bessere Hälfte dazu bringen, auch eine Smartwatch mit ble zu verwenden 😊

                                      S 1 Reply Last reply Reply Quote 0
                                      • G
                                        GiuseppeS @Spezialtrick last edited by

                                        @spezialtrick
                                        Übrigens verwende ich nur den gemittelten Wert weiter, der andere kann schonmal Sprünge aufweisen.
                                        Anhand der Länge des Array für den gleitenden Mittelwert, kann zwischen Schnelligkeit und Genauigkeit variiert werden.

                                        1 Reply Last reply Reply Quote 0
                                        • S
                                          Spezialtrick @GiuseppeS last edited by

                                          @giuseppes said in MQTT Bluetooth BLE Anwesenheitserkennung mit ESP32:

                                          Wichtig ist, dass der Fehler jetzt gefunden wurde.

                                          Aber extrem ärgerlich... -.-

                                          Aktuell habe ich unter meinem Bett einen Scanner, somit wird gut erkannt, ob ich im Schlafzimmer bin. Damit steuere ich meine "Guten Morgen" Routine. Rollläden fahren hoch, Lichter gehen nicht mehr gedimmt an.

                                          Könntest du mir dieses Skript bereitstellen? Mir fehlt aktuell ein wenig die Idee, ab welchen RSSI Wert ein Gerät abwesend ist.

                                          Eigentlich habe ich eine Funktion geschrieben, mit der Trianguliert werden kann. In 2D kann über drei Scanner die Position halbwegs genau ermittelt werden. Aber ich habe bisher keine weiteren Scanner daheim verbaut, weil ich meine Hoffnung ein wenig auf uwb setze.

                                          Magst du mir die Funktion zum Testen geben? Ich hätte vier ESP32 hier, die ich nur dafür gekauft hatte. 😁

                                          G 1 Reply Last reply Reply Quote 0
                                          • G
                                            GiuseppeS @Spezialtrick last edited by

                                            @spezialtrick
                                            Ich sende es dir sobald ich wieder am privaten PC bin. Ich habe im Skript mit triangulation auch die Erstellung von HTML Objekten, um die Position darzustellen.
                                            Triangulation funktioniert zwar, aber natürlich musst du die Positionen der esp32 im 2D System darin eintragen.

                                            Übrigens warte ich aktuell auch darauf, dass Shelly seine Variante 2.5 mit esp32 rausbringt. Dann könnte mit alternativer Firmware der Rollladen normal gesteuert und der esp32 als Scanner verwendet werden. Dann wäre triangulation echt sehr gut möglich.

                                            S 1 Reply Last reply Reply Quote 0
                                            • First post
                                              Last post

                                            Support us

                                            ioBroker
                                            Community Adapters
                                            Donate

                                            532
                                            Online

                                            31.6k
                                            Users

                                            79.4k
                                            Topics

                                            1.3m
                                            Posts

                                            26
                                            242
                                            33788
                                            Loading More Posts
                                            • Oldest to Newest
                                            • Newest to Oldest
                                            • Most Votes
                                            Reply
                                            • Reply as topic
                                            Log in to reply
                                            Community
                                            Impressum | Datenschutz-Bestimmungen | Nutzungsbedingungen
                                            The ioBroker Community 2014-2023
                                            logo