Da ja hier über Nacht nichts passiert ist hab ich das mal als Script umgesetzt
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
/* ---------- Hilfsfunktion: 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);
}
/* ---------- Hilfsfunktion: 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 
Viele Grüße
Stephan