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

    • ioBroker@Smart Living Forum Solingen, 14.06. - Agenda added

    • ioBroker goes Matter ... Matter Adapter in Stable

    • Monatsrückblick - April 2025

    MQTT Bluetooth BLE Anwesenheitserkennung mit ESP32

    This topic has been deleted. Only users with topic management privileges can see it.
    • G
      GiuseppeS @Wildbill last edited by GiuseppeS

      @wildbill
      Ich mache das wie folgt:
      In meinem Skript ist die MAC oder die Manu Data notiert und in dem JSON suche ich danach. Das Ergebnis, wenn vorhanden, schreibe ich in ein separates State extra für dieses Gerät. Ist in Javascript geschrieben. Könnte ich auch zur Verfügung stellen.

      Bzgl JSON musste ich zu Beginn auch viel Try&Error durchmachen, inkl Google. Aber ich sag mal so: hier ist es eine klare kleine Aufgabe. Mit einer entsprechenden Vorlage sollte man klar kommen.

      W 1 Reply Last reply Reply Quote 0
      • W
        Wildbill @GiuseppeS last edited by

        @giuseppes Ja gerne. Ich tippsel mir gerade die Finger wund und versuche aus verschiedenen Scripten, die ich hier im Forum zum Thema JSON parsen finde, was zusammenzustupfen, aber irgendwie will es nicht so ganz. Wenn Du mir da einen Denkanstoß geben könntest, würde ich das sicher angepasst bekommen.

        Mir fehlen halt die Grundlagen der Javascript-Befehle und dann wird es da schon schwer. Mit Blockly fühle ich mich sehr wohl, aber das ist hier fehl am Platz.
        Worin ich aber recht gut bin, ist Scripte anderer dann zu verstehen und für meine Zwecke anzupassen. 😊

        Gruss, Jürgen

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

          @wildbill
          Geht klar, dann setze ich mich gleich mal an den PC. Nur vorab als Tip: Es ist eigentlich ein Array mit mehreren JSON Objekten.

          W 1 Reply Last reply Reply Quote 0
          • W
            Wildbill @GiuseppeS last edited by

            @giuseppes Das habe ich ziemlich am Anfang schon festgestellt. Erster Schritt war, den Inhalt des Datenpunktes mal in einen Online JSON Parser zu schieben und zu schauen, wie die Struktur genau ist. Array machte es dann für mich nicht leichter. Das meiste, was ich gefunden habe, waren JSON ohne Array und meist noch mit fester Struktur. Hier im Array ändern sich ja auch immer mal die Nummern der einzelnen Geräte, je nachdem, was ankommt und gerade nicht gehört wird...

            Gruss, Jürgen

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

              @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 😉

              W S 2 Replies Last reply Reply Quote 1
              • W
                Wildbill @GiuseppeS last edited by

                @giuseppes Perfekt, läuft.
                Vielen vielen Dank. Da hätte ich noch eine Weile rumgemacht. Ich glaube auch, ich habe im Array eine Ebene übersehen gehabt. Aber nun kommen die Daten einwandfrei. 👍

                Gruss, Jürgen

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

                  @wildbill
                  Gern geschehen ✌

                  W 1 Reply Last reply Reply Quote 0
                  • W
                    Wildbill @GiuseppeS last edited by

                    @giuseppes Habe heute ein kleines Problem festgestellt. Wenn ich den MQTT-Adapter im iobroker neu starte, dann verbindet sich der ESP nicht mehr automatisch. Es kommt dann im Log

                    Client [bleScan/oben_192_168_100_94] has invalid password(undefined) or username(undefined)
                    

                    Scheint, als würde er keine neue Verbindung aushandeln. Ich muss ihn dann einmal neu starten (aus- und wieder einstecken) und schon läuft er wieder. Bevor ich ihn jetzt umflashe und den Umweg über meinen Mosquitto nehmen lasse, bringt mir das überhaupt was? Der ist auch mit user/password versehen. Handelt der das anders?

                    Gruss, Jürgen

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

                      @wildbill
                      Ich verwende im Heimnetz kein User/Pass über mqtt. Außerdem nutze ich auf meinem PC direkt Mosquitto, im ioBroker nur den mqtt-Client. Dass sich der esp32 nicht neu verbindet, ist mir bisher nicht aufgefallen. Es ist in den letzten Monaten 1 mal passiert, dass er nicht verbunden war. Grund war unklar. Jedenfalls hängt es nicht mit den PC Neustarts zusammen, die finden allein wegen Backup min. 1/Woche statt.

                      W 1 Reply Last reply Reply Quote 0
                      • W
                        Wildbill @GiuseppeS last edited by Wildbill

                        @giuseppes Ja, es wird mit user/password zusammenhängen. Komischerweise hat nur der ESP mit dem blescan das Problem. Ein paar andere, unter Anderem mit ESPEasy verbinden sofort wieder.
                        Aber, ich frage mich gerade auch, warum ich im MQTT vom iobroker user/pass drin habe. Der ist nicht im Internet, da hängt nur der Mosquitto. Dann nehme ich es im iobroker einfach raus und sollte passen. Danke.

                        Gruss, Jürgen

                        EDIT: Das wars auch. User password raus und sofort haben sich alle Geräte inclusive dem ESP mit blescan wieder verbunden. Wenn nur alles so einfach wäre...

                        1 Reply Last reply Reply Quote 1
                        • 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
                                            • First post
                                              Last post

                                            Support us

                                            ioBroker
                                            Community Adapters
                                            Donate

                                            479
                                            Online

                                            31.7k
                                            Users

                                            79.8k
                                            Topics

                                            1.3m
                                            Posts

                                            26
                                            242
                                            36490
                                            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