NEWS
Geofency Script
-
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ß
-
@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
-
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.
-
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.
-
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
-
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); });
-
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.
-
@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.