Skip to content
  • Home
  • Aktuell
  • Tags
  • 0 Ungelesen 0
  • Kategorien
  • Unreplied
  • Beliebt
  • GitHub
  • Docu
  • Hilfe
Skins
  • Light
  • Brite
  • Cerulean
  • Cosmo
  • Flatly
  • Journal
  • Litera
  • Lumen
  • Lux
  • Materia
  • Minty
  • Morph
  • Pulse
  • Sandstone
  • Simplex
  • Sketchy
  • Spacelab
  • United
  • Yeti
  • Zephyr
  • Dark
  • Cyborg
  • Darkly
  • Quartz
  • Slate
  • Solar
  • Superhero
  • Vapor

  • Standard: (Kein Skin)
  • Kein Skin
Einklappen
ioBroker Logo

Community Forum

donate donate
  1. ioBroker Community Home
  2. Deutsch
  3. Hardware
  4. MQTT Bluetooth BLE Anwesenheitserkennung mit ESP32

NEWS

  • UPDATE 31.10.: Amazon Alexa - ioBroker Skill läuft aus ?
    apollon77A
    apollon77
    48
    3
    8.6k

  • Monatsrückblick – September 2025
    BluefoxB
    Bluefox
    13
    1
    2.1k

  • Neues Video "KI im Smart Home" - ioBroker plus n8n
    BluefoxB
    Bluefox
    16
    1
    2.8k

MQTT Bluetooth BLE Anwesenheitserkennung mit ESP32

Geplant Angeheftet Gesperrt Verschoben Hardware
242 Beiträge 26 Kommentatoren 45.9k Aufrufe 32 Watching
  • Älteste zuerst
  • Neuste zuerst
  • Meiste Stimmen
Antworten
  • In einem neuen Thema antworten
Anmelden zum Antworten
Dieses Thema wurde gelöscht. Nur Nutzer mit entsprechenden Rechten können es sehen.
  • G GiuseppeS

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

    S Offline
    S Offline
    Spezialtrick
    schrieb am zuletzt editiert von
    #54

    @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 Antwort Letzte Antwort
    0
    • S Spezialtrick

      @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 Offline
      G Offline
      GiuseppeS
      schrieb am zuletzt editiert von
      #55

      @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 Antwort Letzte Antwort
      0
      • G GiuseppeS

        @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 Offline
        S Offline
        Spezialtrick
        schrieb am zuletzt editiert von
        #56

        @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 Antwort Letzte Antwort
        0
        • S Spezialtrick

          @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 Offline
          G Offline
          GiuseppeS
          schrieb am zuletzt editiert von GiuseppeS
          #57

          @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 Antwort Letzte Antwort
          0
          • G 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 Offline
            S Offline
            Spezialtrick
            schrieb am zuletzt editiert von
            #58

            @giuseppes

            Welche Haken hast du dort gesetzt?

            G 2 Antworten Letzte Antwort
            0
            • S Spezialtrick

              @giuseppes

              Welche Haken hast du dort gesetzt?

              G Offline
              G Offline
              GiuseppeS
              schrieb am zuletzt editiert von
              #59

              @spezialtrick

              Screenshot_20211127-104841.jpg

              1 Antwort Letzte Antwort
              0
              • S Spezialtrick

                @giuseppes

                Welche Haken hast du dort gesetzt?

                G Offline
                G Offline
                GiuseppeS
                schrieb am zuletzt editiert von
                #60

                @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 Antwort Letzte Antwort
                0
                • G GiuseppeS

                  @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 Offline
                  S Offline
                  Spezialtrick
                  schrieb am zuletzt editiert von
                  #61

                  @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 Antwort Letzte Antwort
                  0
                  • S Spezialtrick

                    @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 Offline
                    G Offline
                    GiuseppeS
                    schrieb am zuletzt editiert von
                    #62

                    @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 Antwort Letzte Antwort
                    0
                    • G GiuseppeS

                      @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 Offline
                      S Offline
                      Spezialtrick
                      schrieb am zuletzt editiert von
                      #63

                      @giuseppes

                      Ich habe den Fehler gefunden und es mir wirklich unangenehm.... :disappointed_relieved:

                      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. :disappointed_relieved: Vielen herzlichen Dank für deine Hilfe!

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

                      G 2 Antworten Letzte Antwort
                      0
                      • S Spezialtrick

                        @giuseppes

                        Ich habe den Fehler gefunden und es mir wirklich unangenehm.... :disappointed_relieved:

                        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. :disappointed_relieved: Vielen herzlichen Dank für deine Hilfe!

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

                        G Offline
                        G Offline
                        GiuseppeS
                        schrieb am zuletzt editiert von
                        #64

                        @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 :blush:

                        S 1 Antwort Letzte Antwort
                        0
                        • S Spezialtrick

                          @giuseppes

                          Ich habe den Fehler gefunden und es mir wirklich unangenehm.... :disappointed_relieved:

                          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. :disappointed_relieved: Vielen herzlichen Dank für deine Hilfe!

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

                          G Offline
                          G Offline
                          GiuseppeS
                          schrieb am zuletzt editiert von
                          #65

                          @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 Antwort Letzte Antwort
                          0
                          • G GiuseppeS

                            @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 :blush:

                            S Offline
                            S Offline
                            Spezialtrick
                            schrieb am zuletzt editiert von
                            #66

                            @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. :grin:

                            G 1 Antwort Letzte Antwort
                            0
                            • S Spezialtrick

                              @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. :grin:

                              G Offline
                              G Offline
                              GiuseppeS
                              schrieb am zuletzt editiert von
                              #67

                              @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 Antwort Letzte Antwort
                              0
                              • G GiuseppeS

                                @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 Offline
                                S Offline
                                Spezialtrick
                                schrieb am zuletzt editiert von
                                #68

                                @giuseppes sagte in MQTT Bluetooth BLE Anwesenheitserkennung mit ESP32:

                                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.

                                Perfekt. :) Soll ich mit vier oder erstmal drei ESP32 testen?

                                Triangulation funktioniert zwar, aber natürlich musst du die Positionen der esp32 im 2D System darin eintragen.

                                Macht Sinn. Ansonsten dürfte es mit den Berechnungen schwierig werden.

                                Ü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.

                                Mit Shelly habe ich mich tatsächlich noch nie beschäftigt. Klingt aber spannend.

                                G 1 Antwort Letzte Antwort
                                0
                                • S Spezialtrick

                                  @giuseppes sagte in MQTT Bluetooth BLE Anwesenheitserkennung mit ESP32:

                                  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.

                                  Perfekt. :) Soll ich mit vier oder erstmal drei ESP32 testen?

                                  Triangulation funktioniert zwar, aber natürlich musst du die Positionen der esp32 im 2D System darin eintragen.

                                  Macht Sinn. Ansonsten dürfte es mit den Berechnungen schwierig werden.

                                  Ü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.

                                  Mit Shelly habe ich mich tatsächlich noch nie beschäftigt. Klingt aber spannend.

                                  G Offline
                                  G Offline
                                  GiuseppeS
                                  schrieb am zuletzt editiert von
                                  #69

                                  @spezialtrick
                                  Nach aktuellem Stand, funktioniert die Triangulation nur mit drei Werten.
                                  Am besten fütterst du das Skript mit den drei ESP32, die die kleinsten Werte aufweisen.
                                  Als Ergebnis bekommt man einen Kreis, der, je nach Abweichung, größer oder kleiner ausfällt.
                                  Hintergrund: mathematisch wird die Rechnung nie perfekt aufgehen, wenn grobe rssi Werte genommen werden. Man muss sich das so vorstellen, dass u.U. diese drei Entfernungen sich nie berühren. Aber es wird dann ein Kreis gebildet, der auf seinem Umfang, diese drei Entfernungspunkte berührt.

                                  S 1 Antwort Letzte Antwort
                                  0
                                  • G GiuseppeS

                                    @spezialtrick
                                    Nach aktuellem Stand, funktioniert die Triangulation nur mit drei Werten.
                                    Am besten fütterst du das Skript mit den drei ESP32, die die kleinsten Werte aufweisen.
                                    Als Ergebnis bekommt man einen Kreis, der, je nach Abweichung, größer oder kleiner ausfällt.
                                    Hintergrund: mathematisch wird die Rechnung nie perfekt aufgehen, wenn grobe rssi Werte genommen werden. Man muss sich das so vorstellen, dass u.U. diese drei Entfernungen sich nie berühren. Aber es wird dann ein Kreis gebildet, der auf seinem Umfang, diese drei Entfernungspunkte berührt.

                                    S Offline
                                    S Offline
                                    Spezialtrick
                                    schrieb am zuletzt editiert von
                                    #70

                                    @giuseppes

                                    Dann setze ich erstmal drei ESP auf und warte auf dein Skript. :)

                                    G 2 Antworten Letzte Antwort
                                    0
                                    • S Spezialtrick

                                      @giuseppes

                                      Dann setze ich erstmal drei ESP auf und warte auf dein Skript. :)

                                      G Offline
                                      G Offline
                                      GiuseppeS
                                      schrieb am zuletzt editiert von
                                      #71

                                      @spezialtrick

                                      Anbei das Skript für Triangulation:

                                      const mathjs = require("mathjs");
                                      
                                      
                                      /**
                                        * Berechnet triangulierten Punkt inkl. Unschärfe-Radius
                                        *
                                        * Basis-Gleichung lautet:
                                        * (x - x_i)² + (y - y_i)² = (r_i + ur)²,
                                        * mit i = 1,2,3 und ur = Unschärferadius
                                        * -> x² + x_i² - 2x_i*x + y² + y_i² - 2y_i*y = r_i² + u² + 2r_i*u
                                        *
                                        * Angelehnt an Lösungsweg: https://stackoverflow.com/a/56294794
                                        * Änderung: statt "= (r_i * k)² wird "= (r_i + ur)²" verwendet!
                                        *
                                        * @param {Object} p1 First point and radius: [ x, y, r ]
                                        * @param {Object} p2 Second point and radius: [ x, y, r ]
                                        * @param {Object} p3 Third point and radius: [ x, y, r ]
                                        * @return {Object} tril. Point and error-radius { x, y, ur }
                                        */
                                      function trilaterate (p1, p2, p3) {
                                      
                                          function sqr (a) {return a*a};
                                          function sqrt (a) {return mathjs.sqrt(a)};
                                      
                                          function solvePQ (p,q) {
                                              let d = sqr(p)/4 - q;
                                              if (d >= 0){
                                                  let x1 = -p/2 + sqrt(d);
                                                  let x2 = -p/2 - sqrt(d);
                                                  return [x1, x2]
                                              } else {
                                                  return []
                                              }
                                          }
                                      
                                          let x1 = p1[0], y1 = p1[1], r1 = p1[2],
                                              x2 = p2[0], y2 = p2[1], r2 = p2[2],
                                              x3 = p3[0], y3 = p3[1], r3 = p3[2];
                                      
                                          // Gl. a_i: x² + x_i² - 2x_i*x + y² + y_i² - 2y_i*y = r_i² + u² + 2r_i*u
                                          // Gl. a_1 - Gl. a_2 und Gl. a_1 - Gl.a_3 eliminiert x²/y² und ergibt ein LGS
                                          // A * X = C + B * u >>> X = A^-1 * C + A^-1 * B * u
                                      
                                          let A = [
                                              [ 2*(x2 - x1), 2*(y2 - y1) ],
                                              [ 2*(x3 - x1), 2*(y3 - y1) ]
                                          ];
                                      
                                          let C = [
                                              sqr(r1) - sqr(r2) - sqr(x1) + sqr(x2) - sqr(y1) + sqr(y2),
                                              sqr(r1) - sqr(r3) - sqr(x1) + sqr(x3) - sqr(y1) + sqr(y3)
                                          ];
                                      
                                          let B = [ 2*(r1 - r2), 2*(r1 - r3) ];
                                      
                                          let A_inv = mathjs.inv(A);
                                          let A_invC = mathjs.multiply(A_inv, C);
                                          let A_invB = mathjs.multiply(A_inv, B);
                                      
                                          // x = A_invC[0] + A_invB[0] * u, und y = A_invC[1] + A_invB[1] * u
                                          // x = c1 + c2 * u, und y = c3 + c4 * u in Gl. a_1
                                      
                                          let c1 = A_invC[0];
                                          let c2 = A_invB[0];
                                          let c3 = A_invC[1];
                                          let c4 = A_invB[1];
                                          
                                          let quot = sqr(c2) + sqr(c4) - 1;
                                          let p = (2*c1*c2 - 2*x1*c2 + 2*c3*c4 - 2*y1*c4 - 2*r1) / quot;
                                          let q = (sqr(c1) + sqr(x1) - 2*x1*c1 + sqr(c3) + sqr(y1) - 2*y1*c3 - sqr(r1)) / quot;
                                      
                                          let arrU = solvePQ(p,q);
                                      
                                          if (arrU == []) return "ur konnte nicht berechnet werden!";
                                      
                                          let u = arrU[0]; // Bisherige Tests: arrU[0] scheint immer zu passen?
                                          let x = c1 + c2 * u;
                                          let y = c3 + c4 * u;
                                      
                                          return { x: x.toFixed(2), y: y.toFixed(2), ur: u.toFixed(2) }
                                          
                                      }
                                      
                                      console.log(trilaterate( [0,0,7], [10,0,7], [5,8.66,7] ))
                                      
                                      

                                      Übergabe in die Funktion "trilaterate()" sind die drei Punkte mit X, Y und Radius. Radius ist der in cm oder m umgerechnete RSSI Wert. Die Umrechnung findest Du im unteren Skript mit "getDist()". Wichtig ist natürlich, dass immer dieselben Einheiten verwendet werden ;-)
                                      Übrigens musst Du innerhalb der Javascript Instanz das Modul mathjs eingeben. Das wird hier für vereinfachte Matrizen-Rechnungen verwendet.

                                      Womit ich zuletzt experimentiert hatte, war das Anzeigen der RSSI Werte (umgerechnet in cm) über html. Weil ich nur ein esp32 hatte (+ BLE vom PC), habe ich so nutzbare Filtermöglichkeiten getestet.
                                      Für das bessere Verständnis:
                                      "rssiComp" = RSSI Wert meines PCs = Sensor 1
                                      "rssiWemos" = RSSI Wert meines ESP32 = Sensor 2

                                      Im folgenden Skript werden die Positionen der beiden Sensoren + deren RSSI-in-cm Werten zu meiner BLE Uhr angezeigt

                                      
                                      createState("VIS.bleScan.Drawing");
                                      
                                      let idType = "Avg"; // Kf oder Raw
                                      
                                      // return in cm
                                      function getDist(rssi, txPower){
                                          let n = 2;
                                          let exponent = (txPower - rssi) / (10 * n);
                                          return Math.pow(10, exponent)*100;
                                      }
                                      
                                      let rssiComp, rssiWemos;
                                      
                                      on({id: new RegExp('javascript\.1\.VIS\.bleScan.\Pino\..*'), change: "any"}, function (obj) {
                                          let value = obj.state.val;
                                          let id = obj.id.split(".").pop();
                                      
                                          if (id == idType + "Wemos") rssiWemos = value;
                                          if (id == idType + "Comp") rssiComp = value;
                                          
                                          let html = '<svg width="410" height="900"> '
                                                   + '<rect x="10" y="10" width="225" height="500" style="fill:none;stroke:white;stroke-width:5" />'
                                                   + '<circle cx="220" cy="70" r="5" stroke="white" stroke-width="5" fill=white />' /*Comp*/
                                                   + '<text x="200" y="100" fill="red">' + rssiComp + '</text>' /*Comp*/
                                                   + '<circle cx="220" cy="70" r="' + getDist(rssiComp, -69)/2 + '" stroke="green" stroke-width="4" fill=none />' /*Comp*/
                                                   + '<circle cx="100" cy="410" r="5" stroke="white" stroke-width="5" fill=white />' /*Wemos*/
                                                   + '<text x="80" y="440" fill="red">' + rssiWemos + '</text>' /*Wemos*/
                                                   + '<circle cx="100" cy="410" r="' + getDist(rssiWemos, -69)/2 + '" stroke="green" stroke-width="4" fill=none />' /*Wemos*/
                                                   + '</svg>'
                                          
                                          setState("javascript." + instance + ".VIS.bleScan.Drawing", html);
                                      });
                                      

                                      So sahen meine Test-States aus:
                                      374aba7d-eb59-4090-9739-063b4b475a6e-image.png

                                      1 Antwort Letzte Antwort
                                      0
                                      • S Spezialtrick

                                        @giuseppes

                                        Dann setze ich erstmal drei ESP auf und warte auf dein Skript. :)

                                        G Offline
                                        G Offline
                                        GiuseppeS
                                        schrieb am zuletzt editiert von
                                        #72

                                        @spezialtrick
                                        Natürlich kannst Du beide Skripte in ein einziges Skript zusammnführen. Ich hatte zu dem Zeitpunkt die beiden Tests unabhängig voneinander durchgeführt, daher getrennt aufgeführt...

                                        1 Antwort Letzte Antwort
                                        0
                                        • E Offline
                                          E Offline
                                          exitus
                                          schrieb am zuletzt editiert von
                                          #73

                                          Hallo klappt es auch mit iphone kann ich das Bluetooth signal vom iphone auch dafür benutzen???

                                          G 1 Antwort Letzte Antwort
                                          0
                                          Antworten
                                          • In einem neuen Thema antworten
                                          Anmelden zum Antworten
                                          • Älteste zuerst
                                          • Neuste zuerst
                                          • Meiste Stimmen


                                          Support us

                                          ioBroker
                                          Community Adapters
                                          Donate

                                          627

                                          Online

                                          32.4k

                                          Benutzer

                                          81.5k

                                          Themen

                                          1.3m

                                          Beiträge
                                          Community
                                          Impressum | Datenschutz-Bestimmungen | Nutzungsbedingungen | Einwilligungseinstellungen
                                          ioBroker Community 2014-2025
                                          logo
                                          • Anmelden

                                          • Du hast noch kein Konto? Registrieren

                                          • Anmelden oder registrieren, um zu suchen
                                          • Erster Beitrag
                                            Letzter Beitrag
                                          0
                                          • Home
                                          • Aktuell
                                          • Tags
                                          • Ungelesen 0
                                          • Kategorien
                                          • Unreplied
                                          • Beliebt
                                          • GitHub
                                          • Docu
                                          • Hilfe