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!!

Guten Morgen in die Runde,

ich hab das Script seit Jahren am laufen, aber seit der Version 7 gibt es einen Fehler, wenn alle Fenster geschlossen sind.
Ich kann leider nicht Skripten, kann sich das mal jemand ansehen?!

DANKE

Gruß
Der BEM

So wie es ausschaut kommt der Count Befehl nicht mehr mit leeren Paremetern klar. Er will eine Liste. Die wird gebaut, wenn Fenster offen sind aber eben nicht, wenn alle geschlossen sind, dann ist diese NULL.
Es muss also eine Liste mit 0 Elementen erzeugt werden die dann „gezählt“ werden können oder Du must prüfen ob die Variable $name leer ist und dann 0 in $count setzen und wenn sie nicht leer ist den jetztigen Befehl nutzen.

Okay, klingt logisch, aber da bin ich dann raus.
Vielleicht ist es auch noch ein Bug in der 7er Version.

Ich kann ja mal abwarten.

Danke für‘s erklären.

Sowas sollte gehen (ungetestet) ab @count =…:

if(is_array($names) && is_countable($names)&&count($names)>0){
 SetVale(&status, true);
 $result = implode(",", $names);
}
else{
 Setvalue($status, false);
 $result = "Alle Fenster geschlossen;
}

In Zeile 24 das einfügen und fertig.

$names = [];

Michael

2 „Gefällt mir“

Hey Michael,

das hat SUPER funktioniert.

DICKES DANKESCHÖN

Hallo zusammen,

ich bin noch relativ frisch in dem ganzen Thema was Programmierung in PHP anbelangt, nun hätte ich da auch mal eine Frage. Ich weis nur nicht, ob sie hier an der richtigen Stelle gestellt wird.

Und zwar möchte ich eigentlich nur abfragen, ob eines der Fenster geöffnet wird (ich verwende den optischen FK von Homatic) dieser liefert einen Integer Wert mit dem Text „Closed“ oder „Opened“.
Und wenn eins geöffnet wird, dann soll eine Bool Variable von False auf True gesetzt werden. Ich habe das Folgendermaßen gelöst:

irgend etwas mache ich falsch, da die Variable sich bei geöffnetem Fenster nicht ändert.

Es wäre toll wenn du Scripts nicht als Grafik sondern als Script einstellst, dann könnte man sie editieren.
Kleine Frage: Warum machst du das nicht mit einem Ablaufplan?

äähm, weil ich dachte das ich in einem Ablaufplan nur einen Auslöser eintragen kann aber nachdem du mir den Tip gegeben hast, habe ich gesehen das auch mehrere Auslöser gehen :roll_eyes:
Nur wie schalte ich im Ablaufplan dann die variable wieder zurück auf False, damit sie bei gegebenheit erneut auslösen kann?
Und damit ich wenigstens ein kleines Erfolgserlebnis habe, wie würde ich das beim Script anstellen??
Das ist jetzt vieleicht eine blöde Frage, aber wie kann ich das script hier einfügen?

Am einfachsten erstellst du zuerst eine Bool Variable mit einer Standardaktion.
Dann erstellst du einen Ablaufplan mit den drei Fenster und Trigger auf öffnen…
Mit der zugehörige Aktion setzt du dann die die Bool auf true .
Du erwähnst halt nicht, was du mit dem Wert der Bool anfangen möchtest.
Da gibt es die möglichkeit, dass du diese nach ein paar Sekunden wieder auf false setzt oder aber dies mit einem zweiten Ablaufplan tust. Musst halt ein wenig austesten, mit den Ablaufplänen kriegst du enorm viel hin ohne php…

Mit dieser Funktion…

image

OHNE Aktion. Wir wollen hier einen Sammelstatus anzeigen und nix ansteuern.
Michael

Dein Skript ist schon soweit in Ordnung, nur beim Vergleich nicht.

Du holst dir den Wert völlig korrekt mit GetValueInteger, da die Variable ja ein Integer ist.:+1:

Der Integer beinhaltet dann 0, 1 oder was auch immer für eine Zahl.

Aber dann vergleichst du mit „Opened“. Das ist immer falsch.

1 „Gefällt mir“

Hey,

Danke für den Hinweis. Ich dachte, weil der Anzeigewert in der Variable ein Text ist, muss ich auch den Text abfragen…
Okay dann muss ich mal prüfen welche Zahlen er da ausspuckt. Danke!