So, ich habe es nun so umgesetzt, falls jemand es brauchen kann (ein Profi könnte ggf. vieles kürzen und schöner machen):
Ziel:
Ich wollte einen Timer per Schalter (Boolean ID 11111) einschalten, um nach einer gewissen Zeit eine Lampe in Homematic (ID 55555) auszuschalten (meine kleine Tochter will immer bei Licht einschlafen und ich habe es schon öfters vergessen, auszuschalten). Im Webfront möchte ich über eine String (ID 22222) sehen, welche Rest-Laufzeit bleibt, aber nur, wenn der Timer aktiv ist.
Vorgehen:
Dazu habe ich zwei Skripte (IDs 33333 und 44444) wie folgt angelegt:
Skript 33333 (Ereignis: Änderung der ID 11111):
<?
$Zeit = 2700; // Ausschaltzeit in Sekunden
$Minuten = $Zeit/60;
$Arr = IPS_GetChildrenIDs(44444);
if (empty($Arr) == true)
{
$eid = IPS_CreateEvent(1);
IPS_SetEventCyclic($eid, 0 /* Keine Datumsüberprüfung */, 0, 0, 2, 1 /* Sekündlich */ , 5 /* Alle 5 Sekunden */);
IPS_SetParent($eid, 44444);
}
$TEN = IPS_GetChildrenIDs(44444)['0'];
if ($IPS_SENDER == "TimerEvent")
{
IPS_SetScriptTimer($IPS_SELF, 0);
IPS_SetEventActive($TEN, false);
SetValue(11111, false);
IPS_SetHidden(22222, true);
HM_WriteValueBoolean(55555, "STATE", false);
return;
}
else
{
if (GetValue (11111)
{
IPS_SetScriptTimer($IPS_SELF, $Zeit);
IPS_SetHidden(22222, false);
SetValue(22222, ("Ausschalten in ").$Minuten.(" Minuten"));
IPS_SetEventActive($TEN, true);
}
else
{
IPS_SetScriptTimer($IPS_SELF, 0);
IPS_SetEventActive($TEN, false);
IPS_SetHidden(22222, true);
return;
}
}
?>
Skript 44444 (Ereignis: alle 5 Sek. auslösen):
<?
$TEH = IPS_GetEventIDByName("ScriptTimer", 33333);
$RT = date ('i:s', ((IPS_GetEvent($TEH)['NextRun']) - time()));
SetValue(22222, ("Ausschalten in ").$RT.(" Minuten"));
?>
So zählt die String runter - ich habe als Ereignis alle 10 Sek. auslösen gewählt, da IPS sekündlich bei mir nicht hinterher kam. Wird kein Ergeignis festgelegt, wird eines kreiert (5 Sek.).
VG, Götz