Geofency Modul

Das macht die Instanz doch für dich automatisch.
Da es nur einen Webhook gibt, ist es klar das sich mehrere Instanzen mit unterschiedlichen Zugangsdaten in die Quere kommen.

Die Variablen werden anhand der Geräte ID und beim erstmaligen senden innerhalb des Geofency Moduls automatisch angelegt. Es können mehrere Geräte über einen Hook laufen. Jedes Gerät wird unter seiner eigenen „Kategorie“ eingerichtet.

Quelle:
Dokumentation Geofency

Michael

Ich spiele mich auch gerade wieder mit dem Modul.

Soweit alles eingerichtet.

Vom Device kommt auch im Webhook alles an - sehe ich zumindets im Debug von der Geofency Instanz. Aber angelegt wird nix. Kein neues Device oder neue Var’s weit und breit. Habe auch schon mal de- und wieder installiert.

Hat wer einen Tipp.

@paresy : Hast du evt. eine Idee dazu?

danke+lg
hagi

Noch nicht. Kannst du mal im Debug rauskopieren was denn kommt? Evtl. hat sich das Format geändert?

paresy

@paresy: Reicht dir das, Michael?

lg hagi

Magst du mir den ganzen Datensatz einmal per PN zusenden? Da kommt ja scheinbar auch eine „Malformed“ Meldung :slight_smile: Er erwartet ein id, device und name Feld. Hast du in der App evtl. was „leer“ gelassen?

paresy

Nein, in der Locative IOS App ist nichts leer gelassen.

Debug folgt, ich lasse mal ein paar Meldungen mitlaufen.

lg hagi

Ein „Unauthorized“ im Debug heißt eigentlich, dass die Zugangsdaten von Symcon nicht übereinstimmen mit denen von Geofency :slight_smile:

paresy

Hab jetzt mal spasseshalber die Anmeldung deaktiviert und das „Unauthorized“ ist auch im Debug weg. Doch leider werden keine Devices angelegt.

Hab auch mal die Instanz gelöscht und neu hinzugefügt. Selbes Ergbenis alles kommt ordentlich an - zeigt auch das Debug - aber nichts wird angelegt.

lg hagi

P.S. nur um ganz sicher zu gehen, bei IOS heisst die App „Locative“?

Also meine heißt Geofency, wie das Modul :smiley: :smiley: :smiley:

image

Ah. Stimmt. So sieht die bei mir aus

image

paresy

na dann habe ich das Problem, wobei ja die Daten offensichtlich richtig im Webhook ankommen. Locative ist halt kostenfrei und Geofency kostet und kann mehr als man eigentlich braucht. Schade.

danke für den Support.

lg hagi

Du kannst aber vermutlich mit überschaubarem Aufwand eine Skript + WebHook erstellen :slight_smile: Mach doch am besten ein neues Thema auf dafür.

paresy

Ich hätte einen kleinen Funktionswunsch:

Ich würde mir eine Variable wünschen die immer den aktuellen Standort-Namen enthält. Dies würde die Anzeige in der Visualisierung vereinfachen.

Also eine String Variable in die dann der Name vom aktuellen Standort geschrieben wird. Ist man an keinen Standort wird z.B. „unterwegs“ rein geschrieben…

Viele Grüße
Stephan

Da ja hier über Nacht nichts passiert ist hab ich das mal als Script umgesetzt :wink: kleiner Scherz…

Das Script sucht alle Bool Variablen die einen 32 Zeichen langen Ident haben und prüft auf true/false

Wenn true wird der Standortname in eine String Variable geschrieben.
Wenn alle Standortvariablen false sind wird „unterwegs“ geschrieben.
Wenn 2 oder mehr true sind wird „error“ geschrieben.

Das Script erstellt für jede gefundene Standortvariable automatisch einen Trigger der bei Wertänderung das Script ausführt.
Er wird zusätzlich ein zyklischer 10 Minuten Timer erstellt damit spätestens nach 10 Minuten auch für neue Standortvariablen ein Trigger generiert wird.

Anleitung:

  • Auf der Ebene der Standortvariablen eine neue String Variable erstellen
  • Auf der gleichen Ebene das Script erstellen
  • Im Script oben im Block „BENUTZER-KONFIGURATION“ die ID der String-Variable eingeben
  • falls gewünscht kann noch das Interval für den zyklischen Timer geändert werden.

Das ganze sollte dann so ausschauen:

<?php
/***********************************************************************
 *  Aktuellen Standort-Namen in String-Variable schreiben
 *  -------------------------------------------------------
 *  • prüft Bool-Variablen (gleicher Parent, Ident = 32-Hex)
 *  • legt OnChange-Trigger für neue Variablen automatisch an
 *  • legt/aktualisiert einen Zyklus-Timer (deaktiviert bei Intervall = 0) damit für neue Standortvariablen automatisch ein OnChange-Trigger erstellt wird.
 *  • schreibt den aktuellen Standortnamen in eine String-Variable. Alle Standorte false = "unterwegs", 1 Standort true = "Standortname", 2 oder mehr Standorte true = "error" (Herzlichen glückwunsch, du wurdest gecloned und befindest dich gleichzeitig an mehreren Standorten ;-))
 **********************************************************************/

/* ---------- BENUTZER-KONFIGURATION -------------------------------- */
$stringID         = 14804;   // ID der Ziel-String-Variablen
$triggerTyp       = 1;       // 1 = OnChange   (0 = OnUpdate)
$timerName        = 'Timer_Presence';
$timerIntervalMin = 10;       // Intervall in MINUTEN; 0 = Timer deaktiviert

/* ---------- Hilfs­funktion: Trigger-Event sicherstellen ----------- */
function ensureTrigger(int $scriptID, int $varID, int $triggerTyp)
{
    foreach (IPS_GetChildrenIDs($scriptID) as $eid) {
        if (IPS_GetObject($eid)['ObjectType'] !== 4) continue;         // 4 = Event
        $ev = IPS_GetEvent($eid);
        if ($ev['EventType'] !== 0)               continue;            // 0 = Trigger
        if ($ev['TriggerVariableID'] !== $varID)  continue;

        if (!$ev['EventActive']) IPS_SetEventActive($eid, true);
        return;                                                       // Trigger existiert
    }

    $eid = IPS_CreateEvent(0);                                        // Trigger anlegen
    IPS_SetParent($eid, $scriptID);
    IPS_SetName  ($eid, 'Trigger_' . IPS_GetName($varID));
    IPS_SetEventTrigger($eid, $triggerTyp, $varID);
    IPS_SetEventAction(
        $eid,
        '{346AA8C1-30E0-1663-78EF-93EFADFAC650}',                      // PHP-Code ausführen
        ['SCRIPT' => "IPS_RunScript($scriptID);"]
    );
    IPS_SetEventActive($eid, true);
}

/* ---------- Hilfs­funktion: Zyklus-Timer sicherstellen ------------ */
function ensureTimer(int $scriptID, string $timerName, int $intervalMin)
{
    $eid = @IPS_GetEventIDByName($timerName, $scriptID);

    /* --- Intervall = 0 ⇒ Timer (falls vorhanden) deaktivieren ------ */
    if ($intervalMin <= 0) {
        if ($eid !== false && IPS_GetEvent($eid)['EventActive'])
            IPS_SetEventActive($eid, false);
        return;                                                       // fertig
    }

    /* --- Intervall > 0 ⇒ Timer anlegen/aktualisieren -------------- */
    if ($eid === false) {                                             // Timer fehlt
        $eid = IPS_CreateEvent(1);                                    // 1 = Zyklisch
        IPS_SetParent($eid, $scriptID);
        IPS_SetName  ($eid, $timerName);
    }

    $ev = IPS_GetEvent($eid);
    // prüfen, ob Intervall oder Typ anders → anpassen
    if ($ev['CyclicTimeType'] !== 2 /*Minuten*/ ||
        $ev['CyclicTimeValue'] !== $intervalMin)
    {
        // DateType=0, DateValue=0, DateDay=0, DateDayValue=0,
        // TimeType=2 (Minuten), TimeValue=Intervall
        IPS_SetEventCyclic($eid, 0, 0, 0, 0, 2, $intervalMin);
    }

    IPS_SetEventAction(
        $eid,
        '{346AA8C1-30E0-1663-78EF-93EFADFAC650}',                      // PHP-Code ausführen
        ['SCRIPT' => "IPS_RunScript($scriptID);"]
    );
    if (!$ev['EventActive']) IPS_SetEventActive($eid, true);
}

/* ---------- passende Bool-Variablen suchen ------------------------ */
$selfID   = $_IPS['SELF'];
$parentID = IPS_GetParent($selfID);
$boolIDs  = [];

foreach (IPS_GetChildrenIDs($parentID) as $oid) {
    if ($oid === $stringID) continue;                                 // Ausgabe-Var. überspringen
    $obj = IPS_GetObject($oid);
    if ($obj['ObjectType'] !== 2)          continue;                  // 2 = Variable
    if (!preg_match('/^[0-9a-f]{32}$/i', $obj['ObjectIdent'])) continue;
    $var = IPS_GetVariable($oid);
    if ($var['VariableType'] === 0)                                   // 0 = Boolean
        $boolIDs[] = $oid;
}

/* ---------- Trigger-Events & Timer absichern ---------------------- */
ensureTimer($selfID, $timerName, $timerIntervalMin);
foreach ($boolIDs as $id)
    ensureTrigger($selfID, $id, $triggerTyp);

/* ---------- Anwesenheits-Logik ------------------------------------ */
$trueIDs = array_filter($boolIDs, fn($id) => GetValueBoolean($id));

switch (count($trueIDs)) {
    case 1:  $result = IPS_GetName(reset($trueIDs)); break;
    case 0:  $result = 'unterwegs';                  break;
    default: $result = 'error';
}

SetValueString($stringID, $result);

Und warum das ganze?
Darum :slight_smile:

Viele Grüße
Stephan

3 „Gefällt mir“

Du triggerst dann bei mehreren Standorten deinen Webhook?
Auf die Idee bin ich noch gar nicht gekommen :smiley:

Gruß,
Loerdy

genau so

Musst halt nur in der App der Frau genug Standorte festlegen. Dann siehst du genau wo die Dame gerade wieder Geld ausgibt :wink:

ok, zu ihrer Verteidigung: Sie verdient es auch selbst :rofl:

Gruß Stephan

1 „Gefällt mir“