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);
?>
<?
/*
*********************************************************************************************
Ü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 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?!
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.
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:
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
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…
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!