Automatische Installation von Ereignissen

Hallihallo!

Da ich ein wirklicher Anfänger in PHP und IPS bin, habe ich nochmals eine Frage:

Wie müsste der Quellcode aussehen bzw angepasst werden damit dieser AUTOMATISCH Zeitgesteuerte Ereignisse (Wenn Variable auf True steht) das Script ausgeführt wird? Die Ereignisse sollen dann logischerweise nur einmal angelegt werden und die Anzahl der beruht auf die Anzahl der „Kinder“ der angegebenen „Elternkategorie“.

Sprich: Gruppe Lichter hat 10 Instanzen. Jede Instanz den Status „Licht an“ oder „Licht aus“ (true oder false). Nun will ich das automatisch 10 Ereignisse auf mein Script verknüpft werden welche sich auf den Status der 10 Lampen beziehen. Hierbei sollte möglichst alles Dynamisch sein! Damit meine ich das man das Script dann zB auch bei Rauchmeldern (Anzahl X) einsetzen kann ohne große Änderungen durch zu führen.
Wenn sich der Status der Lichter dann ändert soll eine E-Mail versendet werden, aber nur, wenn die Alarmanlage schwarf ist!

Hier mal mein komplettes Script:

$parent = 20964; //IPS-Oberkategorie-ID (zB Bewegungsmelder)
$sendmail = 38541; //IPS- SMTP-Modul-ID
$betreff = "ALARM - EINBRUCH!"; //Betreff der E-Mail
$inhalt = "IP-Symcon meldet: ALARM - EINBRUCH! Folgende Bewegungsmelder haben Bewegung erkannt:"; //Inhaltstext der E-Mail OHNE Geräte (folgen nach dem :)
$alarmanlage = GetValueBoolean(12205); //ID der Alarmanlage bzw der Leuchte.


//!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
//AB HIER NICHTS MEHR ÄNDERN!!!!!!!!!!!!!!!!!!!!!!!!!!!
//!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!

if ($alarmanlage == true) //Ist Alarmanlage scharf?
{

	$var_1 = (IPS_GetChildrenIDs($parent)); //IDs der Instanzen der angegebenen Kategorie rausfinden.
	$Anzahl = count(IPS_GetChildrenIDs($parent)); //Instanzen zählen
	$i = 0; // Zählervariable

while ($i < $Anzahl) //Solange i kleiner als Anzahl ist führe folgenden Quellcode aus:
{

	$var2 = (IPS_GetChildrenIDs($var_1[$i]));
	$wert = IPS_GetObjectIDByName("Bewegung", $var_1[$i]); 	$vergleich = GetValueBoolean($wert);
	$i++;

	if ($vergleich == true) //Überprüfung Rauchmelder
	{
	$bewegung = IPS_GetName(IPS_GetParent($wert));
	$text[$i] = IPS_GetName(IPS_GetParent($wert));
	}

}//while ($i < $Anzahl)


	$ausgabe = implode(",
",$text); //Arrayinhalt in Variable $ausgabe schreiben
	SMTP_SendMail("$sendmail, $betreff , $inhalt 
$ausgabe"); //E-Mail Versand

}//if ($alarmanlage == 1)

Hallo Lega,
ich habe das so gelöst:

Es gibt ein Skript „Neue Melder hinzufügen“ das rekursiv ein seiner Kategorie nach Instanzen sucht und dann ein Ereigenis erzeugt „bei Variablenänderung ein Skript mit dem Namen alarm_state_update bzw. alarm_error_update (wird ebenfalls in der Aktuellen Kategorie gesucht) aufrufen“.

In diesen zuletzt genannten Skripten („alarm_*_update“) findet dann die Prüfung scharf/ unscharf und die Alarmierung statt. So kann ich dann nur protokollieren oder auch zwischen stillem und lautem Alarm unterscheiden. :slight_smile:

Neue Melder hinzufügen

<?
require ("functions.inc.php");

$obj=IPS_GetObject(IPS_GetParent($IPS_SELF));
echo "
 ===== Categorie: " . $obj['ObjectName'] . "
";
// Suche Skripte
	$id_alarm_error = @IPS_GetScriptIDByName("alarm_error_update",$obj['ObjectID']);
	if (!$id_alarm_error) die ("alarm_error_update not found");

	$id_alarm_state = @IPS_GetScriptIDByName("alarm_state_update",$obj['ObjectID']);
	if (!$id_alarm_state) die ("alarm_state_update not found");




// Suche Melder
$arr = br_searchinst(IPS_GetParent($IPS_SELF));

// Create Events
foreach ($arr as &$curinst){
 	$obj = IPS_GetObject($curinst);
 	$objParent =IPS_GetObject(IPS_GetParent($obj["ObjectID"]));
	echo "
 - Device: " . $obj['ObjectName'] . "
";

	$id=br_objGetVarID($curinst, "ERROR");
	$eid = @IPS_GetEventIDByName($objParent['ObjectName'] .": " . $obj['ObjectName'], $id_alarm_error);
	if($eid == false){	$eid = IPS_CreateEvent(0);
	IPS_SetName($eid, $objParent['ObjectName'] .": " . $obj['ObjectName']); }

	IPS_SetEventTrigger($eid, 1, $id); //Bei Änderung von Variable
	IPS_SetParent($eid, $id_alarm_error); //Ereignis zuordnen
	IPS_SetEventActive($eid, true); //Ereignis aktivieren
	

	echo "ERROR ID: " .$id."
";
	
	$id=br_objGetVarID($curinst, "STATE");
		echo "STATE ID: " .$id."
";
		
	$eid = @IPS_GetEventIDByName($objParent['ObjectName'] .": " . $obj['ObjectName'], $id_alarm_state);
	if($eid == false){	$eid = IPS_CreateEvent(0);
	IPS_SetName($eid, $objParent['ObjectName'] .": " . $obj['ObjectName']); }
	
	IPS_SetEventTrigger($eid, 1, $id); //Bei Änderung von Variable
	IPS_SetParent($eid, $id_alarm_state); //Ereignis zuordnen
	IPS_SetEventActive($eid, true); //Ereignis aktivieren

}



?>

alarm_state_update (Beispiel)

<?
require ("functions.inc.php");

$IDAtHome=21401 /*[Allgemein\Status\Anwesenheit]*/;
$IDAwake=36723 /*[Allgemein\Status\Wach]*/;
$IDAlarm=32925 /*[Allgemein\Status\Alarmanlage]*/;
$IDASilent=27672 /*[Allgemein\Status\Stiller Alarm]*/;
$AuthPeriod=120;

$Speak1="Achtung! Melder ";
$Speak2=" ausgelöst! Bitte authentifizieren Sie sich nun innerhalb der vorgeschriebenen " . $AuthPeriod . " Sekunden!";

if($IPS_SENDER=="Variable"){
	$eobj=IPS_GetObject($IPS_EVENT);

	IF(GetValueBoolean($IDAlarm)){
			IF(GetValueBoolean($IDAtHome)){

					IF(!GetValueBoolean($IDAwake)){
					   // da, aber schlafen: sofort Alarm 

		

                     	// Wenn nicht Alarm auf still
                                          if(!GetValueBoolean($IDASilent)){
                                            br_TTS_Speak($IDMediaPlayer,$Speak1 . $eobj['ObjectName']. $Speak2 ,6*1000);
                                            // alle 120 sec
                                            IPS_SetScriptTimer(48955 /*[Melder\alarm_timer]*/, $AuthPeriod);  
                                            IPS_RunScript(23898 /*[Allgemein\Status\Panik - ALLE LICHTER AN UND ALARM! ]*/ );
								}
                                            SMTP_SendMailEx(19991 /*[Program\E-Mail senden (SMTP)]*/, "my@email.de", "Alarm ???: ". $eobj['ObjectName'], "Melder ausgelöst!");
				
				
					


					} else {
					// und wach
                                          // Wenn nicht Alarm auf still
                                          if(!GetValueBoolean($IDASilent)){
                                          br_TTS_Speak($IDMediaPlayer,$Speak1 . $eobj['ObjectName']. $Speak2 ,6*1000);
					// alle 120 sec
					  IPS_SetScriptTimer(48955 /*[Melder\alarm_timer]*/, $AuthPeriod); 
                                        IPS_RunScript(23898 /*[Allgemein\Status\Panik - ALLE LICHTER AN UND ALARM! ]*/ );
								}
										SMTP_SendMailEx(19991 /*[Program\E-Mail senden (SMTP)]*/, "my@email.de", "Alarm ???: ". $eobj['ObjectName'], "Melder ausgelöst!");
					}
			} else {
                          // nicht da
                          // Wenn nicht Alarm auf still
                          if(!GetValueBoolean($IDASilent)){
                            // Timer für umschaltung aktivieren sonst Alarm
                            br_TTS_Speak($IDMediaPlayer,$Speak1 . $eobj['ObjectName']. $Speak2 ,6*1000);
                            IPS_SetScriptTimer(48955 /*[Melder\alarm_timer]*/, $AuthPeriod);  
                          }
                          SMTP_SendMailEx(19991 /*[Program\E-Mail senden (SMTP)]*/, "my@email.de", "Alarm???: ". $eobj['ObjectName'], "Melder ausgelöst, erwarte Auth");
                       }
	}
}
?>

Die Skripte sind noch recht individuell, aber ich hoffe Sie können DIr eine Anregung geben.
Die Funktionen mit „br_“ sind im Forum als „br_ips Library veröffentlicht“ oder auch den Zip Archiven von „br_sonos“ enthalten.

Grüße, Benjamin

Danke!!! Ich werde mir deinen Code mal in ruhe anschauen :wink: