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. Skripten / Logik
  4. Geofency Script

NEWS

  • Jahresrückblick 2025 – unser neuer Blogbeitrag ist online! ✨
    BluefoxB
    Bluefox
    15
    1
    621

  • Neuer Blogbeitrag: Monatsrückblick - Dezember 2025 🎄
    BluefoxB
    Bluefox
    13
    1
    627

  • Weihnachtsangebot 2025! 🎄
    BluefoxB
    Bluefox
    25
    1
    1.9k

Geofency Script

Geplant Angeheftet Gesperrt Verschoben Skripten / Logik
8 Beiträge 4 Kommentatoren 1.9k Aufrufe 2 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.
  • Mr. BurnsM Offline
    Mr. BurnsM Offline
    Mr. Burns
    schrieb am zuletzt editiert von
    #1

    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 Antwort Letzte Antwort
    0
    • ruhr70R Offline
      ruhr70R Offline
      ruhr70
      schrieb am zuletzt editiert von
      #2

      @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

      Adapter: Fritzbox, Unify Circuit
      Skripte: dynamic hue, Bluetooth Scan, Multi-Ereignisliste

      1 Antwort Letzte Antwort
      0
      • Mr. BurnsM Offline
        Mr. BurnsM Offline
        Mr. Burns
        schrieb am zuletzt editiert von
        #3

        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 Antwort Letzte Antwort
        0
        • ruhr70R Offline
          ruhr70R Offline
          ruhr70
          schrieb am zuletzt editiert von
          #4

          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.

          Adapter: Fritzbox, Unify Circuit
          Skripte: dynamic hue, Bluetooth Scan, Multi-Ereignisliste

          1 Antwort Letzte Antwort
          0
          • Mr. BurnsM Offline
            Mr. BurnsM Offline
            Mr. Burns
            schrieb am zuletzt editiert von
            #5

            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 Antwort Letzte Antwort
            0
            • Mr. BurnsM Offline
              Mr. BurnsM Offline
              Mr. Burns
              schrieb am zuletzt editiert von
              #6

              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 Antwort Letzte Antwort
              0
              • M Offline
                M Offline
                metzedo_0816
                schrieb am zuletzt editiert von
                #7

                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 Antwort Letzte Antwort
                0
                • M metzedo_0816

                  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 Offline
                  R Offline
                  Ramses123
                  schrieb am zuletzt editiert von
                  #8

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

                  732

                  Online

                  32.6k

                  Benutzer

                  81.9k

                  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