Urlaubs Script - zum deaktivieren von Ereignissen während des Urlaubs

Möchte Euch kurz mien kleines Script vorstellen, das gestern Abend enstanden ist.
Habe in IPS eine Variable (BOOLEAN), ob wir aktuell im Urlaub sind. Urlaub = TRUE, kein Urlaub = FALSE.

Anhand des Status möchte ich natürlich, dass bestimmte Dinge nicht mehr geschehen, zb. Kaffeemaschine an, Router an etc.

Dieses Script deaktiviert Ereignisse von angegebenen Instanzen abhängig vom Urlaub.
(Bereits nicht aktive Ereignisse vor Urlaub werden danach nat. auch nicht aktiviert)


<?
/* Urlaubs script -------------------------------------------------------
 Dieses Script deaktiviert Ereignisse wenn man im Urlaub ist.
 Bei beendetem Urlaub werden die Ereignisse wieder in den Urspr.
 Zustand gesetzt.
-------------------------------------------------------------------------*/

/* ---- BEGIN CONFIG ----------------------------*/
  // Wenn Urlaubsmodus, dann die Ereignisse für folgende Objekte deaktivieren.
 $c_geraete[] = 48388 /*[Objekte\Funksteckdosen\Steckdose 1 (Kaffeemaschine)]*/;
 $c_geraete[] = 58082 /*[Objekte\Sonstige Objekte\Dimmer (Schlafzimmer)]*/;
 $c_geraete[] = 19522 /*[Scripts\Leuchten Scripts\Schlafzimmer Sonnenaufgang]*/;
 $c_geraete[] = 49862 /*[Scripts\Leuchten Scripts\Schlafzimmer Ausschalten täglich]*/;
 $c_geraete[] = 31390 /*[Objekte\FS20\FS20 Steckdose (Media Center)\Mediacenter Power]*/;
 
 // Urlaubsvariable (TRUE/FALSE)
 $c_urlaub = 53059 /*[Objekte\Sonstige Objekte\Urlaubsmodus]*/; 
 
 //Nur Zyklische Ereignisse
 $c_cyclic_only = true;
 
/* ---- END CONFIG ----------------------------*/


 $l_urlaub = getvalue($c_urlaub);
 $l_nactive = "";
 if(!$l_urlaub)$l_nactive =  getvalue(CreateVariableByName($_IPS['SELF'],"Urlaub Aktiv Status",3));
 
 echo "Urlaubsmodus ".GetValueFormatted($c_urlaub)."
";
 foreach($c_geraete as $l_objid){
   $l_childs = IPS_GetChildrenIDs($l_objid); // Kinder Objekte einer INstanz etc. lesen
   foreach($l_childs as $l_cobjid){
      $l_detail = IPS_GetObject($l_cobjid);

      if($l_detail["ObjectType"] == 4){  // Wenn Ereignis (4)
         $l_eventinfo = IPS_GetEvent($l_cobjid);
			if(($c_cyclic_only && $l_eventinfo["EventType"] == 1) || (!$c_cyclic_only)){
				// Neuer Status definiieren
				if($l_urlaub){
					//Wegspeichern, welche Ereignisse nicht aktiv sind
	     			if(!$l_eventinfo["EventActive"])$l_nactive .= $l_cobjid.",";
					$l_status = false;
				} else {
				   // Wenn Event vorher nicht aktiv war, jetzt auch nicht aktivieren, sonst ja.
				   $l_status = (in_array($l_cobjid, explode(",", $l_nactive)))? false : true;
				}
				// Event Aktivieren oder Deaktivieren
				IPS_SetEventActive($l_cobjid, $l_status);
				$txt_status = ($l_status)?"Aktiviert":"Deaktiviert";
				echo IPS_GetName($l_objid)."->".IPS_GetName($l_cobjid).": ".$txt_status."
";
			} // Zyklische
      }
   }
 }
 
 // speichern
 if($l_urlaub){
	 setvalue(CreateVariableByName($_IPS['SELF'],"Urlaub Aktiv Status",3), $l_nactive);
 }
 
 //.............................................................................
 function CreateVariableByName($id, $name, $type, $profile = "")
{
	# type: 0=boolean, 1 = integer, 2 = float, 3 = string;
    global $IPS_SELF;
    $vid = @IPS_GetVariableIDByName($name, $id);
    if($vid === false)
    {
        $vid = IPS_CreateVariable($type);
        IPS_SetParent($vid, $id);
        IPS_SetName($vid, $name);
        IPS_SetInfo($vid, "this variable was created by script #$IPS_SELF");
        if($profile !== "") { IPS_SetVariableCustomProfile($vid, $profile); }
    }
    return $vid;
}

?>

Neue Version mit mehreren Modi hier: