Fensterstatus abfragen und in String schachteln

Hallo zusammen,

ich möchte gerne per Ereignis meine Fenster abfragen und deren Zustand in einen String ablegen.

  • Wenn ein Fenster geöffnet oder geschlossen wir startet das Script
  • Das Script startet eine Abfrage über alle Fenster (wegen mir auch einzeln zu definieren) und erzeugt eine Textzeile

So habe ich schon mal angefangen:

<?

$Status_leer="Alle Fenster sind geschlossen.";
$Status = "Fenster offen!";

//Fenster Arbeitszimmer
if (getValueBoolean(49817 /*[OG\Arbeitszimmer\Raumregler Arbeitszimmer\Fenster geöffnet]*/) == true)
{
setValueString (12743 /*[Sonstiges\Fenster/Türen\Fensterstatus]*/ , $Status);
}
// Fenster geschlossen
else
{
setValueString (12743 /*[Sonstiges\Fenster/Türen\Fensterstatus]*/ , $Status_leer);
};

//echo $Status_leer;

?>

Das funktioniert auch 1a, allerdings weiß ich nicht wie ich schachteln kann.

$Status = „Es sind noch in " $Status1 $Status2 … " ein Fenster geöffnet.“

Ich hoffe ich habe mich nicht zu ungeschickt ausgedrückt.
1000 Dank im Voraus.

Hi honk0504

sowas ähnliches habe ich für unsere Verschlussmeldung per Telefon gebaut. Und kann Dir am Montag mal das Script posten wie ich das gelöst habe.

Gruß Bastian

SUPER! Vielen Dank im Voraus, Bastian.
Jeder andere darf hier auch gerne Input liefern. :wink:

So… hier mal meine Variante. Inspiriert von paresy’s Skript mit den Links.

Struktur anlegen wie im Screenshot zu sehen. Ganz WICHTIG ist die Struktur und die Namen der Variablen.

Anschliessend noch die Ereignisse anlegen und benennen… es werden keine Links benötigt und es müssen auch keine ID’s eingetragen/angepasst werden. Das steht alles auch noch einmal im Skript.

Gruß,
Peter


<?
 # Fensterstatus abfragen
 # Ersteller: PeterChrisben
 # Version: 1.0
 #
 # Dummy-Instanz erstellen. Name ist egal. Darunter folgene Variablen anlegen.
 # -- String-Variable. Name: FENSTER LISTE
 # -- Integer-Variable. Name: FENSTER OFFEN
 # -- Boolean-Variable. Name: FENSTERSTATUS
 # 
 # Dem Skript nur noch Ereignisse der Fensterkontakte ( bei änderung ) hinzufügen .
 # Die Ereignisse benennen ( Schlafzimmer, Bad, etc. ), weil dieser
 # Name / diese Namen in die String-Variable geschrieben werden. Fertig.
 # Sollten die Namen der Variablen geändert werden, müssen diese auch
 # im Skript geändert werden. (ca. Zeile 20 => $int, $string, $status).
 
 
 
 $parentID = IPS_GetParent($_IPS['SELF']);
 $int = IPS_GetVariableIDByName('FENSTER OFFEN',$parentID);
 $string = IPS_GetVariableIDByName('FENSTER LISTE',$parentID);
 $status = IPS_GetVariableIDByName('FENSTERSTATUS',$parentID);

 $events = IPS_GetChildrenIDs( $_IPS['SELF']);
 $i = 0;

 foreach($events as $ID)
 {
 	$FKevent = IPS_GetEvent($ID);
 	$FKstatus = GetValue($FKevent['TriggerVariableID']);
 	$name = IPS_GetName($ID);
 	if($FKstatus == true)
        {
            $i++;
            $names[] = $name;
        }
 }

 @$count = count($names);
 if ($count >= 1){
 	SetValue($status,true);
 	$result = implode(",", $names);}
 else{
 	SetValue($status,false);
 	$result = "Alle Fenster geschlossen.";}
 
 SetValue($int, $i);
 SetValue($string, $result);



?>

@Peter: Eingerichtet, angepasst, getestet, vervollständigt. GENIAL!
Genau was ich gesucht habe! DANKE.

So… ich habe mal in meiner Config geschaut:


<?
/*
*********************************************************************************************
Überwachung Verschluss.
Bei den angelegten Objekte werden die Childknoten auf den Wert True bei Status überprüft
*********************************************************************************************
*/
$OBJECTS[0] = 12362 /*[Verschlusskontrolle\Gerätehalle\Wago]*/ ;
$OBJECTS[1] = 59665 /*[Verschlusskontrolle\Malerwerkstatt\Wago]*/ ;
$OBJECTS[2] = 57269 /*[Verschlusskontrolle\Strahlhalle\Wago]*/ ;
$OBJECTS[3] = 45383 /*[Verschlusskontrolle\Gerüsthalle\Wago]*/ ;

$CONTROL	 	= 24972 /*[Verschlusskontrolle\Überwachung\Steuerung\Verschlusseinstellungen\Informationen\Verschluss überprüfen\]*/ ;
$FAILURE 	= 16831 /*[Verschlusskontrolle\Überwachung\Steuerung\Verschlusseinstellungen\Informationen\Verschlussüberwachung]*/ ;
$CALLING 	= 16121 /*[Verschlusskontrolle\Überwachung\Steuerung\Telefon\Telefonrückmeldung]*/ ;
$LOOKUP 		= 32606 /*[Verschlusskontrolle\Überwachung\Verschlussmeldung]*/ ;   			//Statusvariable ob alles verschlossen ist oder nicht
$INFO 		= 27287 /*[Verschlusskontrolle\Überwachung\Verschlussmeldung\Meldungen]*/;    			// Stringvariable in der die Meldungen abgelegt werden
$COUNTER 	= 0;    //Countervariable die hochgezählt wird, wenn Objekte geöffnet sind
$ALARMINFO 	= 20504 /*[Verschlusskontrolle\Überwachung\Verschlussmeldung\Meldungen Telefon]*/ ;
SetValueString($INFO,"");  //StringVariable leeren
SetValueString($ALARMINFO,"");  //StringVariable leeren
$INFOTEXT 	= "";            //Variable Lerren
$ALRAMTEXT 	= "";            //Variable Lerren

$ALRAMTEXT.= "Achtung dies ist die automatische Verschlussmeldung. ";
//Schleife initalisieren wieviele Objekte überwacht werden.
for ($t=0;$t<count($OBJECTS);$t++) { 													//Alle Objekte abfragen die in dem Array $OBJECTS definiert wurden

	$WAGOOBJECT = IPS_GetObject($OBJECTS[$t]);
	$INFOTEXT.= "<b>".IPS_GetName(IPS_GetParent($OBJECTS[$t]))."</b><hr>";  //NAme des Gebäudes ermitteln
	$ALRAMTEXT.= IPS_GetName(IPS_GetParent($OBJECTS[$t])).". ";
	for ($i=0;$i<count($WAGOOBJECT['ChildrenIDs']);$i++) {                 //Einzelne Childobjekte abfragen
		$CHILDOBJECT = IPS_GetObject($WAGOOBJECT['ChildrenIDs'][$i]);           //Childobjekt auslesen
		$VARIABLE = IPS_GetVariable($CHILDOBJECT['ChildrenIDs'][0]);            //Variable auslesen
		$PROFIL = IPS_GetVariableProfile($VARIABLE['VariableCustomProfile']);   //Profil ermitteln der der Variable zugeteilt ist
		$status = getValue($CHILDOBJECT['ChildrenIDs'][0]);                     //Status der Variable ermitteln

		if ($CHILDOBJECT['ObjectName'] != "Dachkuppel") {                       // Bei der Dachkuppel ist die Meldung invertiert 0 = geschlossen

			if (!$status) {                                                      //nur ausführen, wenn 0 = geöffnet
				$status = 0;
				$COUNTER++;                                                       //Counter hochzählen
				$INFOTEXT.=  $CHILDOBJECT['ObjectName']." Status: ".$PROFIL['Associations'][$status]['Name']."<br>"; //Ereignis eintragen
				$ALRAMTEXT.= "Meldung ".$PROFIL['Associations'][$status]['Name']." an ".$CHILDOBJECT['ObjectName'].". ";
			}
		} ELSE {

			if ($status) {                                                       //nur ausführen, wenn 0 = geöffnet
				$COUNTER++;                                                       //Counter hochzählen
				$INFOTEXT.=  $CHILDOBJECT['ObjectName']." Status: ".$PROFIL['Associations'][$status]['Name']."<br>"; //Ereignis eintragen
            $ALRAMTEXT.= "Meldung ".$CHILDOBJECT['ObjectName']." ist ".$PROFIL['Associations'][$status]['Name'].". ";
			}
		}
	}

	$INFOTEXT.= "<hr>";
}
$ALRAMTEXT.=" Ende der Meldungen. Bitte sorgen Sie dafür das die entsprechenden Objekte verschlossen werden.";
if ($COUNTER == 0) {    //Wenn alles verschlossen ist, dann die Statusvariable auf True setzen und den Infotext ausblenden
	SetValue($LOOKUP,1);
	IPS_SetHidden($INFO,true);
	$ALRAMTEXT = "Alle Türen wurden Verschlossen.";
	SetValue($FAILURE,false);
} ELSE {                //Wenn irgendeine Meldung anliegt Statusvariable auf false setzen und Infotext einblenden
	SetValue($LOOKUP,0);
	IPS_SetHidden($INFO,false);
	SetValue($CALLING,true);
	SetValue($FAILURE,true);
	IPS_SetEventActive($CONTROL,false);
}
SetValueString ($INFO,$INFOTEXT);      //Text schreiben
SetValueString($ALARMINFO,$ALRAMTEXT);
?>

Das ganze wird in verschiedene Variablen gespeichert. Für Dich vielleicht die Variable $INFO. Dort wird der gesamte Text als String abgelegt. Kann dann so aussehen.

Ich mache mir die Objektnamen wie auch den Zustand zu nutze um zusammenhängende Sätze zu erstellen.

Geniales Script, danke fürs Teilen!!