Navigation

    Logo
    • Register
    • Login
    • Search
    • Recent
    • Tags
    • Unread
    • Categories
    • Unreplied
    • Popular
    • GitHub
    • Docu
    • Hilfe
    1. Home
    2. Deutsch
    3. Skripten / Logik
    4. Geofency Script

    NEWS

    • Neuer Blog: Fotos und Eindrücke aus Solingen

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

    • ioBroker goes Matter ... Matter Adapter in Stable

    Geofency Script

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

      Hallo,

      ich fand es etwas schade, das im Adapter nicht die letzte Aktion, mit der letzten Uhrzeit, angezeigt wird.

      Deshalb habe ich mit Hilfe meines Kollegen ein kleines Script geschrieben.

      Es ist wahrscheinlich nicht perfekt und es fehlt noch die Übergabe der Zeit (Datum/Uhrzeit) aber es funktioniert.

      Für alle die es interessiert:

      // Script: Geofency Script Thomas + Statusanzeige in Vis
      
      // Datenpunkte für den Status in Vis anlegen
      createState('vis.Geofency.Th_status', 0, {name: 'Gefency Status des Thomas Logik'});
      createState('vis.Geofency.Freigabe', false, {name: 'Freigabe der Statusabfrage'});
      createState('vis.Geofency.StatusThomas', 0, {name: 'Geofency Status des Thomas im Klartext'});
      
      // Datenpunkt-IDs
      var idThHome = "geofency.0.Zuhause.Zuhause.entry";       // Thomas Zuhause
      var idThWork = "geofency.0.XXXXXX.entry";  // Thomas Arbeit
      var idStatus = "vis.Geofency.Th_status";                 //Status 1: Zuhause betreten, 2: Zuhause verlassen, 3: Arbeit betreten, 4: Arbeit verlassen, 5: Sport betreten, 6: Sport verlassen, etc...
      var idClearance = "vis.Geofency.Freigabe";
      var idThStatus = 'vis.Geofency.StatusThomas';
      
      // Variablendeklaration und Initialisierung bei Scriptstart
      var stateThHome = getState(idThHome).val;
      var stateThWork = getState(idThWork).val;
      var stateStatus = getState(idStatus).val;
      var stateClearance = getState(idClearance).val;
      var stateThStatus = getState(idThStatus).val;
      
      // Funktion zum Setzen des Status
      function setStatus() {
          var stateClearance = getState(idClearance).val;
          var stateThHome = getState(idThHome).val;
          var stateThWork = getState(idThWork).val;
          var stateStatus = getState(idStatus).val;
          var stateThStatus = getState(idThStatus).val;
           if (stateClearance === true) {
              if (stateThHome === "1" && stateThWork === "0") {
                   setState(idStatus, 1);      // Thomas hat zuhause betreten
                   setState(idThStatus, "Thomas ist Zuhause angekommen");
              }
         if (stateThHome === "0" && stateThWork === "1") {
               setState(idStatus, 3);      // Thomas hat Cremer betreten
               setState(idThStatus, "Thomas ist auf der Arbeit angekommen");
             }
         if (stateThHome === "0" && stateThWork === "0" && stateStatus === 1) {
               setState(idStatus, 2);      // Thomas hat Zuhause verlassen
               setState(idThStatus, "Thomas hat das Haus verlassen");
            }
          if (stateThHome === "0" && stateThWork === "0" && stateStatus === 3) {
               setState(idStatus, 4);      // Thomas hat die Arbeit verlassen
               setState(idThStatus, "Thomas hat die Arbeit verlassen");
            }
          }
      }
      
      // Aufruf der Funktionen bei Scriptstart
      setStatus();
      
      // Aufruf der Funktionen bei Änderung der Stati (Trigger)
      on(idThHome, function(obj) {
              stateThHome = obj.newState.val;
              setStatus();
      });
      
      on(idThWork, function(obj) {
              stateThCremer = obj.newState.val;
              setStatus();
      });
      
      on(idClearance, function(obj) {
                  stateClearance = obj.newState.val;
              setStatus();
      });
      

      Gruß

      1 Reply Last reply Reply Quote 0
      • ruhr70
        ruhr70 last edited by

        @Mr. Burns:

        ich fand es etwas schade, das im Adapter nicht die letzte Aktion, mit der letzten Uhrzeit, angezeigt wird. `
        Danke für das Skript.

        Ist es das, was Du eigentlich wolltest:

        on({id:/geofency.+.entry/,change:'ne'}, function (obj) {
            var datum       = formatDate(obj.state.ts, "JJJJ-MM-TT SS:mm:ss");
            var standort    = obj.native.id;
            var vorgang     = obj.state.val;
        
            log(datum + " " + standort + " " + vorgang);
        });
        

        Ergebnis: Je Änderung ein Eintrag (den man auch in einen Datenpunkt schreiben kann).

        javascript-2	31 22:52:58.247	info	script.js.Test.Test_temp: 2016-05-31 22:52:58 0.Wohnung_Arbeitszimmer_iBeacon 1
        geofency-0	31 22:52:58.243	info	adapter geofency received webhook from device 0 with values: name: Wohnung Arbeitszimmer iBeacon, entry: 1
        javascript-2	31 22:52:50.198	info	script.js.Test.Test_temp: 2016-05-31 22:52:50 0.Wohnung_Arbeitszimmer_iBeacon 0
        geofency-0	31 22:52:50.193	info	adapter geofency received webhook from device 0 with values: name: Wohnung Arbeitszimmer iBeacon, entry: 0
        javascript-2	31 22:52:42.460	info	script.js.Test.Test_temp: 2016-05-31 22:52:42 0.Wohnung_Arbeitszimmer_iBeacon 1
        geofency-0	31 22:52:42.456	info	adapter geofency received webhook from device 0 with values: name: Wohnung Arbeitszimmer iBeacon, entry: 1
        javascript-2	31 22:52:35.113	info	script.js.Test.Test_temp: registered 1 subscription and 0 schedules
        javascript-2	31 22:52:35.111	info	Start javascript script.js.Test.Test_temp
        

        Inhalt:

        Datum der Änderung:

        2016-05-31 22:52:42

        Wer:

        0.Wohnung_Arbeitszimmer_iBeacon

        (Benutzer 0)

        Wo:

        0.Wohnung_Arbeitszimmer_iBeacon

        Vorgang (1 betreten, 0 verlassen):

        1

        1 Reply Last reply Reply Quote 0
        • Mr. Burns
          Mr. Burns last edited by

          Das sieht viel besser aus, als das was ich da versucht habe…sowas hatte ich mir vorgestellt!

          Eine Variable pro Adapter mit letzter Aktion: Person X hat Ort y betreten/ verlassen.

          Sowie die letzte Änderungszeit pro Adapter.

          Also kann man damit einen Text basteln:

          Person X hat um Z Uhr den Ort Y betreten bzw. verlassen. So hätte man einen ungefähren Überblick wo gerade wer ist und könnte es noch Ausbauen...zum Beispiel als Erinnerung: Person X hat die Arbeit verlassen...noch 17min. Zeit um die Bude wieder auf Vordermann zu bringen.

          1 Reply Last reply Reply Quote 0
          • ruhr70
            ruhr70 last edited by

            Das kannst Du damit umsetzen. Alle Infos dazu sind vorhanden.

            Am einfachsten wird eine Ereignisliste für Geofency sein.

            Datum + Person + Ort + Vorgang (betreten/verlassen)

            Die kannst Du dann z.B. in VIS als Tabelle oder HTML-Liste einblenden. Dann hast Du ein gemeinsames, konsolidiertes Protokoll.

            1 Reply Last reply Reply Quote 0
            • Mr. Burns
              Mr. Burns last edited by

              Hallo,

              danke noch einmal für deine Hilfe @ruhr70…wäre ich niemals drauf gekommen das so zu machen.

              Da mich nur der IST Zustand interessiert (meine Frau fühlt sich sowieso schon total überwacht) hab ich das Script etwas angepasst.

              createState('vis.Geofency.Thomas', 0, {name: 'Geofency Status des Thomas im Klartext'});
              createState('vis.Geofency.Status', 0, {name: 'Geofency Status des Thomas im Klartext'});
              
              var Tag1 = 'vis.Geofency.Thomas';
              var Tag2 = 'vis.Geofency.Status';
              
              on({id:/geofency.0.+.entry/,change:'ne'}, function (obj) {     // Es wird der nur ein Adapter abgefragt nicht alle (.0)
                  var datum       = formatDate(obj.state.ts, "TT.MM.JJJJ");  // Datum auslesen
                  var uhr         = formatDate(obj.state.ts, "SS:mm:ss");    // Uhrzeit einlesen
                  var standort    = obj.native.id;                          
                  var vorgang     = obj.state.val;
                  var Thomas      = getState(Tag1).val;
                  var Status      = getState(Tag2).val;
              
                  if (vorgang==="0") {
                  setState(Tag2, "betreten");
                  }
                  if (vorgang==="1") {
                  setState(Tag2, "verlassen");
                  }
                  setState(Tag1, "Thomas hat " + standort + " am " + datum + " " + " um " + uhr + " " + Status);
              });
              

              Ich hab wirklich gekotzt. Weil ich echt, wirklich gar nicht scripten kann. Ich klau mir das nur so zusammen.

              Ein paar Sachen versteh ich nicht. Vielleicht kann mir da ein Samariter weiterhelfen:

              1. Warum brauche ich eine externe Variable zum zwischenspeichern (Status)?

              Wenn ich die nicht verwende, bekomme ich eine Fehlermeldung das .var nicht null sein darf

              2. Weshalb muss ich die Variablen außerhalb der Funktion schreiben (Tag2).

              Wenn ich diese direkt schreibe und verwenden will schreibt er die einfach nicht.

              3. Wieso sind meine Variablen negiert???

              Bei .entry = TRUE sollte eigentlich "betreten" ausgegeben werden. Ist aber anders herum.

              Das Script funktioniert schon, ist aber wahrscheinlich nicht sehr elegant…bitte bedient euch.

              Es muss der Adapter angepasst werden und der name in der Ausgabe. Dann sollte es Funktionieren.

              Bei mir dient es nur dazu, meiner Frau anzuzeigen, dass ich immer noch nicht mein Büro verlassen habe und es mit dem Essen später wird... 😉

              Gruß

              Thomas

              1 Reply Last reply Reply Quote 0
              • Mr. Burns
                Mr. Burns last edited by

                Mit etwas hilfe habe ich ein update des Scripts erstellt. Dies erklärt auch die vorherigen Fragen:

                createState('vis.Geofency.Thomas', 0, {name: 'Geofency Status des Thomas im Klartext'});
                
                var Tag1 = 'vis.Geofency.Thomas';
                
                on({id:/geofency.0.+.entry/,change:'ne'}, function (obj) {     // Es wird der nur ein Adapter abgefragt nicht alle (.0)
                    var datum       = formatDate(obj.state.ts, "TT.MM.JJJJ");  // Datum auslesen
                    var uhr         = formatDate(obj.state.ts, "SS:mm");    // Uhrzeit einlesen
                    var standort    = obj.native.id;                          
                    var vorgang     = obj.state.val;
                    var Thomas      = getState(Tag1).val;
                    var Status      = "";
                
                    if (vorgang==="1") {
                   Status = "betreten";
                    }
                    if (vorgang==="0") {
                    Status = "verlassen";
                    }
                    setState(Tag1, "Thomas hat " + standort + " am " + datum + " " + " um " + uhr + " " + Status);
                });
                
                1 Reply Last reply Reply Quote 0
                • M
                  metzedo_0816 last edited by

                  Hallo zusammen,

                  per Zufall, und dank der Suchfunktion habe ich dieses Script gefunden, leider funktioniert es nicht mehr richtig.
                  Ich habe es bei mir eingetragen (und natürlich die Namen geändert, da ich ja nicht Thomas heiße).
                  Wenn ich nun zuhause ankomme wird in meine Variable folgendes geschrieben:
                  Dominik hat Dominik.Home am 17.06.2021 um 00:25
                  Wie muss ich das Script nun anpassen, damit ich betreten oder verlassen noch hintenan bekomme und kann ich den Standortnamen anpassen? z.B. alles nach dem .?

                  Vielen Dank schonmal im Voraus.

                  R 1 Reply Last reply Reply Quote 0
                  • R
                    Ramses123 @metzedo_0816 last edited by

                    @metzedo_0816
                    Ohne jetzt genau zu wissen, was dieses Skript eigentlich macht (so gut sind meine Programmierkenntnisse nicht), mache ich das ein bisschen anders:
                    Die Handy App schickt per Webhook eine Mitteilung an die Services des IoT Adapters. Mit einem kleinen Skript lese ich dort die Daten aus und schicke sie an den Geofency Adapter. Der formt sie dann zu allen Daten um, die man gut brauchen kann.
                    Fahre ich seit Jahren gut und fehlerfrei mit.
                    Beschreibungen dazu gibt es hier auch im Forum.

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

                    Support us

                    ioBroker
                    Community Adapters
                    Donate

                    870
                    Online

                    31.8k
                    Users

                    80.0k
                    Topics

                    1.3m
                    Posts

                    4
                    8
                    1690
                    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