<?php
/******************************************************
* Bewegung -> Zwei Lichter (nur bei Nacht/Tag=false)
* - Einschalten via RequestAction
* - 5-Minuten-Auto-Off (Timer retriggered bei jeder Bewegung)
* - Sofort AUS, wenn Tag=true wird
* - Zusätzlicher Nachlauf: x Sekunden nach Bewegungsende
* (falls keine neue Bewegung kommt)
* IP-Symcon
******************************************************/
// === KONFIGURATION: IDs anpassen ===
$MOTION_VAR_ID = 12345; // ID Bewegungsmelder (Bool)
$TAG_VAR_ID = 23456; // ID Bool "Tag" (true=Tag, false=Nacht)
$LIGHT1_ID = 34567; // ID Licht 1 (RequestAction-fähig)
$LIGHT2_ID = 45678; // ID Licht 2 (RequestAction-fähig)
$OFF_DELAY_MIN = 5; // Minuten bis Auto-AUS (Langtimer)
$END_GRACE_SECONDS = 30; // Sekunden Nachlauf nach Bewegungsende
// === INTERN ===
$OFF_DELAY_SEC = max(1, $OFF_DELAY_MIN * 60);
$SELF_ID = $_IPS['SELF']; // Skript-ID
$END_TIMER_NAME = "AutoLightOff_EndGrace"; // Event-Name für Nachlauf
// --- Hilfsfunktionen ---
function lights_on($id1, $id2) {
RequestAction($id1, true);
RequestAction($id2, true);
}
function lights_off($id1, $id2) {
RequestAction($id1, false);
RequestAction($id2, false);
}
function schedule_end_grace_timer($scriptId, $eventName, $seconds, $light1, $light2) {
$eid = @IPS_GetObjectIDByName($eventName, $scriptId);
if ($eid === false) {
$eid = IPS_CreateEvent(1); // zyklisches Event
IPS_SetParent($eid, $scriptId); // unter diesem Skript ablegen
IPS_SetName($eid, $eventName);
// Beim Auslösen: Lichter aus, ScriptTimer stoppen, Event deaktivieren
$eventScript =
'RequestAction('.$light1.', false); ' .
'RequestAction('.$light2.', false); ' .
'IPS_SetScriptTimer('.$scriptId.', 0); ' .
'$eid=@IPS_GetObjectIDByName("'.$eventName.'", '.$scriptId.'); ' .
'if($eid!==false){IPS_SetEventActive($eid,false);}';
IPS_SetEventScript($eid, $eventScript);
}
// Einmalig auf "jetzt + seconds" stellen
$t = time() + max(1, (int)$seconds);
IPS_SetEventCyclic($eid, 0, 0, 0, 0, 1, 0); // kein echter Zyklus
IPS_SetEventCyclicDateFrom($eid, 0, 0, 0);
IPS_SetEventCyclicTimeFrom($eid, (int)date("H", $t), (int)date("i", $t), (int)date("s", $t));
IPS_SetEventActive($eid, true);
return $eid;
}
function deactivate_end_grace_timer($scriptId, $eventName) {
$eid = @IPS_GetObjectIDByName($eventName, $scriptId);
if ($eid !== false) {
IPS_SetEventActive($eid, false);
}
}
// === HAUPTLOGIK ===
switch ($_IPS['SENDER'] ?? '') {
case 'Variable':
$varId = $_IPS['VARIABLE'];
$val = $_IPS['VALUE'];
if ($varId === $MOTION_VAR_ID) {
// --- Bewegungsmelder hat getriggert ---
$motion = (bool)$val; // true = Bewegung
$isDay = GetValueBoolean($TAG_VAR_ID); // true = Tag, false = Nacht
if ($motion && !$isDay) {
// Nacht + neue Bewegung -> Lichter AN, 5-Minuten-Timer neu
lights_on($LIGHT1_ID, $LIGHT2_ID);
IPS_SetScriptTimer($SELF_ID, $OFF_DELAY_SEC);
// Nachlauf-Timer abbrechen, falls der noch lief
deactivate_end_grace_timer($SELF_ID, $END_TIMER_NAME);
} elseif ($motion && $isDay) {
// Tag + Bewegung -> nichts einschalten; Timer stoppen
IPS_SetScriptTimer($SELF_ID, 0);
deactivate_end_grace_timer($SELF_ID, $END_TIMER_NAME);
} elseif (!$motion) {
// Bewegungsende -> kurzen Nachlauf starten
schedule_end_grace_timer($SELF_ID, $END_TIMER_NAME, $END_GRACE_SECONDS, $LIGHT1_ID, $LIGHT2_ID);
// Langtimer (5 min) lassen wir weiterlaufen; wird
// bei neuer Bewegung ohnehin neu gesetzt oder durch
// EndGrace vorzeitig ausgeschaltet.
}
} elseif ($varId === $TAG_VAR_ID) {
// --- Tag-Variable hat getriggert ---
$isDayNow = (bool)$val;
if ($isDayNow) {
// Sofort AUS bei Tag
lights_off($LIGHT1_ID, $LIGHT2_ID);
IPS_SetScriptTimer($SELF_ID, 0);
deactivate_end_grace_timer($SELF_ID, $END_TIMER_NAME);
}
// Bei Wechsel auf Nacht: nichts; Bewegung kümmert sich.
}
break;
case 'TimerEvent':
// Unterscheidung: ScriptTimer (kein $_IPS['EVENT']) vs. EndGrace-Event (mit EVENT)
if (isset($_IPS['EVENT'])) {
// EndGrace ist ausgelöst (Event-Skript schaltet ohnehin aus und deaktiviert sich).
// Hier ist nichts weiter nötig, aber zur Sicherheit:
lights_off($LIGHT1_ID, $LIGHT2_ID);
IPS_SetScriptTimer($SELF_ID, 0);
deactivate_end_grace_timer($SELF_ID, $END_TIMER_NAME);
} else {
// ScriptTimer (5 Minuten) ist ausgelöst -> AUS und EndGrace ebenfalls stoppen
lights_off($LIGHT1_ID, $LIGHT2_ID);
IPS_SetScriptTimer($SELF_ID, 0);
deactivate_end_grace_timer($SELF_ID, $END_TIMER_NAME);
}
break;
default:
echo "Dieses Skript wird durch Bewegungsmelder, Tag-Variable, ScriptTimer (5 Min) oder EndGrace-Event ausgelöst.";
break;
}
Einrichtung (kurz)
1\. IDs einsetzen.
2\. **Zwei Ereignisse** auf dieses Skript legen:
• Bewegungsmelder → „Bei Aktualisierung/Änderung“ (idealerweise nur bei true),
• Tag-Variable → „Bei Aktualisierung/Änderung“.
3\. Optional: $END_GRACE_SECONDS anpassen (Standard 30 s).
Verhalten
• **Nacht & Bewegung (true):** Lichter AN, **5-Minuten-Timer** startet/verlängert sich; kurzer Nachlauf wird abgebrochen.
• **Bewegungsende (false):** startet **Kurz-Nachlauf** (z. B. 30 s).
• **Neue Bewegung vor Ablauf des Kurz-Nachlaufs:** Lichter bleiben an, **5-Minuten-Timer** wird neu gesetzt, Kurz-Nachlauf wird abgebrochen.
• **Tag wird true:** Lichter **sofort AUS**, alle Timer gestoppt.