IPS_SetEventTriggerValue($EventID, '<>1');

Hallo zusammen,

ich bastle mir gerade ein Script das mir eine Meldung ausgibt wenn ein Fenster nach dem Lüften zu schliessen vergessen wurde.
Ich nutze die EOn Hoppe Fenstergriffe mit dem org. VarProfil.

Funtioniert so weit auch schon. Ich lass automatisch Events anlegen, welche bei Variablenänderung das Script aufrufen.

Nun möchte ich aber, dass das Script nur dann aufgerufen wird, wenn der Zustand nicht „geschlossen“ = 1 ist. Also bei 0 = offen, 2 = offen, 3 = gekippt.

Mein Ansatz war IPS_SetEventTriggerValue($EventID, ‚<>1‘); Funktioniert aber leider nicht.

Geht das überhaupt? Oder muss ich für jeden zustand ein Event erstellen?

Danke im voraus für Eure Antworten,

Du kannst doch einfach das Script mit der Statusvar des Hoppegriffs triggern und dort einen Timer setzen welcher solange im Script den Status abfragt (und evtl. eine Meldung ausgibt) bis dieser auf 1 steht und den Scripttimer auf false setzt.

Hallo Thomas,

Genau das mach ich ja, nur versuche ich in einem Script alle Fenstergriffe abzufragen. Hab das wohl im ersten Post unterschlagen oder nicht richtig ausgedückt. Somit wird, wenn ein Fenster geschlossen wird, das Script ausgelöst und eine Meldung für alle noch anderen offenen Fenster ausgegeben. Genau das möchte ich verhindern.

Hier mal das komplette Script. Bin auch für andere Lösungen offen.

<?
// Wenn ein Fensterzu lange offen ist wird ein "Alarm" in Form einer Sprachausgabe ausgelöst.
// Dabei wird der Temperaturunterschied zur Aussentemperatur berücksichtigt. Je grösser der Temperaturunterschied umso kürzer werden die Lüftungszeiten.
// Querlüften wird vorausgesetzt.

$offsetgmt = (date("Z"));   // Offset zur GMT in Stunden (date("Z")/3600) = (date("O")/100) siehe http://php.net/manual/de/function.date.php
echo "gmtoffset ".$offsetgmt."
";
$timeH = date("H:i",time());
$time = time();
echo $time." - ".date("H:i",time())."
";

// Mangels flächendeckender Temperatursensoren erst mal jahreszeitenabhängig.
if (date("n",time())== 12 or date("n",time())== 1 or date("n",time())== 2) // dez - jan - feb  // n ist die Monatszahl ohne führende Null
    {$alarmschwelle = 5*60;} // 5 Minuten
elseif (date("n",time())== 11 or date("n",time())== 3) // nov - mar
    {$alarmschwelle = 10*60;} // 10 Minuten
elseif (date("n",time())== 10 or date("n",time())== 4) // okt - apr
    {$alarmschwelle = 15*60;} // 15 Minuten
elseif (date("n",time())== 9 or date("n",time())== 5) // sep - mai
    {$alarmschwelle = 20*60;} // 20 Minuten
elseif (date("n",time())== 8 or date("n",time())== 6 or date("n",time())== 7) // aug - jun - jul
    {$alarmschwelle = 25*60;} // 25 Minuten
    
//test alarmschwelle
$alarmschwelle = 10; // sekunden

echo "Alarmschwelle ".$alarmschwelle."
";

// zeitpunkt wann das fenster geöffent wurde
$Objects = IPS_GetChildrenIDs(46582 /*[WFs\wha\Übersicht\Offene Fenster und Türen]*/ );
$ScriptID = 30868 /*[Logisch\Alarme\FensterTueren\Fenster-DG-WC]*/;
$AnzOffen = 0;

foreach ($Objects as $CurrentObjectID)
{
    $Object = IPS_GetObject($CurrentObjectID);
    if ($Object['ObjectType'] == 6)
     {
       //Zustand und Dauer erfassen und ggf Alarm ausgeben
            $Link = IPS_GetLink($CurrentObjectID);
//            print_r($Link);
            $LinkVar = IPS_GetVariable($Link['TargetID']);
//            print_r($LinkVar);
            $LinkValue = GetValue($Link['LinkChildID']);
            $LinkAktua = $LinkVar['VariableChanged'];
            $LinkName  = IPS_GetName($CurrentObjectID);
            echo $LinkName."
";
            $OffenSeit = $time - $LinkVar['VariableChanged'];
//            echo "Link Wert ".$LinkValue."
";

         if ($LinkValue <> 1)
             {$AnzOffen++;} // Variablen zählen

            $LinkAkt     = GetValue($Link['LinkChildID']);
            
            if ($LinkValue <> 1 and $LinkAktua < $time - $alarmschwelle)
            {  
               echo date("H:i",$time - $alarmschwelle)."
";
                echo "alarm
";
                echo "Aktualisiert ".$LinkAktua." offen seit ".date("H:i",$OffenSeit-$offsetgmt)."
";
                // Webfronts
                $WFC_W = 36122 /*[Wolf]*/ ;
                $WFC_S = 58027 /*[Sonja]*/ ;
                $WFC_SH = 37821 /*[HandyS]*/;
                
                // PushNotifications auf Androids
                WFC_PushNotification($WFC_W, 'Warnung', $LinkName.' ist seit '.date("H:i",$OffenSeit-$offsetgmt).' offen !', '', 0);
//                WFC_PushNotification($WFC_S, 'Warnung', 'Fenster '.'DG WC'.' ist seit '.date("H:i",$OffenSeit-$offsetgmt).' offen !', '', 0);
//                WFC_PushNotification($WFC_SH, 'Warnung', 'Fenster '.'DG WC'.' ist seit '.date("H:i",$OffenSeit-$offsetgmt).' offen !', '', 0);

                // WF Popup Ausgaben
//                WFC_SendPopup($WFC_W, "Warnung", "Fenster "."DG WC"." ist seit über ".date("H:i",$OffenSeit-$offsetgmt)." Stunden offen !");
/*                WFC_SendPopup($WFC_S, "Warnung", "Fenster "."DG WC"." ist seit über ".date("H:i",$OffenSeit-$offsetgmt)." Stunden offen !");
                WFC_SendPopup($WFC_SH, "Warnung", "Fenster "."DG WC"." ist seit über ".date("H:i",$OffenSeit-$offsetgmt)." Stunden offen !");
*/
                // --- audioNotification senden // funktioniert nicht
                //WFC_AudioNotification($WFC_W, 'Alarm!', 39707 /*[Logisch\Alarme\Ausgaben\Sirene\Alarm_01.mp3]*/ ); //55541 ist die ID des Media Objekts in IP-Symcon
                //WFC_AudioNotification($WFC_W, 'Alarm!', 50487 /*[Logisch\Alarme\Ausgaben\Sirene\Alarm_01.wav]*/ ); //55541 ist die ID des Media Objekts in IP-Symcon

            }
            else
            {
                echo "kein alarm
";
            }
            
            /*Event anlegen falls noch nicht vorhanden*/
            $EventName = "LinkID: ".$CurrentObjectID." ObjectID: ".$Link['LinkChildID'];
            $EventID = @IPS_GetEventIDByName($EventName, $ScriptID);
            if ($EventID === false)
            {
              $EventID = IPS_CreateEvent(0);
              IPS_SetName($EventID, $EventName);
              IPS_SetEventTrigger($EventID, 1, $Link['LinkChildID']);
//              IPS_SetEventTriggerValue($EventID, '<>1');
              IPS_SetParent($EventID, $ScriptID);
              IPS_SetEventActive($EventID, true);
            }

    }
}

         echo "Anzahl offen ".$AnzOffen."
";
         if ($AnzOffen > 0)
            {IPS_SetScriptTimer($_IPS['SELF'], 60);}
            else
               {IPS_SetScriptTimer($_IPS['SELF'], 0);}

IPS_RunScript (40204 /*[Logisch\FensterTüren\HC\HC Fenster u Türen]*/);

?>

Hmm, vielleicht geht ja noch was mit $_IPS[‚SENDER‘]. Ich weiss nur nicht, wie ich das einbauen kann. Bin kein PHP könner.

Hallo Wolfgang,

Du kannst Doch alle Stati im Script abfragen und brauchst doch trotzdem nur einen Timer der solange das Script ausführt bis alle Fenster zu sind. Das ist reine IF Logik, dazu benötigst Du keine Systemvariablen.

Hallo Thomas,

danke für Deine Unterstützung.

Irgend wie kann ich mich mal wieder nicht richtig ausdrücken oder ich kann Deinem Vorschlag nicht folgen.

Ich habe für jeden Fenstergriff ein Ereignis bei Variablenänderung das das Script auslöst.

Zusätzlich wird ein Timer (minütlich) aktiviert solange nicht alle Fenster geschlossen sind. Der hat aber keinen Einfluss auf das aktuelle Problem.

Das Script durchläuft alle Fenstergriffe und sendet eine Meldung wenn eins über der Lüftungszeit offen ist.

Wenn eins geschlossen wurde wird dessen Meldung natürlich nicht mehr angezigt, aber alle anderen die noch über die Zeit offen sind senden noch eine Nachricht.

Um zu vermeiden dass das Script überhaupt weiterläuft (gestartet wirds ja durch die Variablenänderung) wenn ein Fenster geschlossen wurde, müsste ich ja wissen welche Variable das Script gestartet hat.

Oder hab ich da grade ein Baudiel vor dem Kopf?

So jetzt kann ich Dir nicht mehr folgen.

Um zu vermeiden dass das Script überhaupt weiterläuft (gestartet wirds ja durch die Variablenänderung) wenn ein Fenster geschlossen wurde, müsste ich ja wissen welche Variable das Script gestartet hat.

Es soll doch aber so lange weiterlaufen bis alle Fenster zu sind oder?

Warum so kompliziert?

Es wäre 100x einfacher, wenn du einfach alle Variablen von deinen Fenstern alle x Minuten überprüfen lässt und schaust, welche Fenster nicht zu sind.

Ist defintiv nett dieses „Problem“ über Ereignisse zu lösen, aber ich würde hier weniger auf Performance gehen und mehr auf Wartbarkeit und Übersichtlichkeit des Quellcodes gehen :slight_smile:

Du kannst übrigens nur den Wert bei IPS_SetEventTriggerValue angeben. Ein Vergleich wie von dir vorgeschlagen geht nicht.

paresy

Naja, so viele Fenster gibt es in Privathäuser ja auch nicht ;), aufgeteilt auf Etagen ist das problemlos abbildbar.

<?
$debug = true;
$Events = IPS_GetScriptEventList($_IPS['SELF']);
// if ($debug)
//   print_r($Events);

for ($number = 0;$number < count($Events);$number++) {
  foreach(IPS_GetEvent($Events[$number]) as $key => $element) {
    if ($key == 'TriggerVariableID') {
      $type = IPS_GetVariableType($element);
      switch ($type) {
        case "Integer": $result = GetValueInteger($element);        break;
      }
      if ($debug)
		  echo "Event: ".$key." -> ".$element ." : " . $result . "
";
      if ($result <> 1) {
        SetValueBoolean(35566 /*[Visualisierung\FensterGeschlossenEG\FensterGeschlossenEG]*/, False);
        return;
      }
    }
  }
}
SetValueBoolean(35566 /*[Visualisierung\FensterGeschlossenEG\FensterGeschlossenEG]*/, True);

?>

Und dann könnte man mit einem weiteren Script, das von der „FensterGeschlossenEG“ getriggert wird einen Scripttimer abhängig vom Monat setzen. Damit wäre eine zeitabhängige Meldung pro Etage machbar. Pro Fenster ist dann reine Fleißarbeit.

Mir reicht die reine Anzeige pro Etage, die ich dann zusammenfasse um mit einer LED im LCN Taster den Zustand anzuzeigen. Die Details, also welches Fenster, sind eh’ einzeln in der Visualisierung.

Es wäre 100x einfacher, wenn du einfach alle Variablen von deinen Fenstern alle x Minuten überprüfen lässt und schaust, welche Fenster nicht zu sind.

mein reden… :wink:

Du kannst Doch alle Stati im Script abfragen und brauchst doch trotzdem nur einen Timer der solange das Script ausführt bis alle Fenster zu sind. Das ist reine IF Logik, dazu benötigst Du keine Systemvariablen.

Hallo zusammen,

vielen Dank für Eure Lösungsvorschläge. Werd noch ne Weile testen und mich dann für eine Variante entscheiden.

@Thomas: Noch mal vielen Dank für Deine Hilfe. Ich weiss leider nicht wie ichs besser beschreiben soll. Und ja, das Script soll durch den Timer wiederholt werden bis alle Fenster zu sind.

Sooo,

ist jetzt zum eigentlichen Thema IPS_SetEventTriggerValue($EventID, ‚<>1‘); offtopic.

Hab das ursprüngliche Script in 2 aufgeteilt.

Das erste wird durch Zustandsänderung aller Fenster aufgerufen.
Es erstellt mir für alle Fenster (Links in einer Kategorie) automatisch die Events bei Statusänderung, zählt wie viele Fenster offen sind und setzt entsprechend einen Timer der dann alle Minute läuft.

Das zweite wird durch den Timer aufgerufen und gibt mir für alle offenen Fenster die über die Warnschwelle offen sind, die Meldungen aus.

Funktioniert für mich so perfekt.

Über die Darstellung in der Übersicht im WF bin ich mir noch nicht im klaren. Entweder als einzelne Variable die mir zeigt wie viele Fenster offen sind, und mit einem Klick auf die Variable dann zum FensterTab springt, in dem man dann alle, offene u geschlossene) Fenster sieht, oder jedes Fenster das offen ist als Variable in einer Liste.

Bei Interesse kann ich die Scripts ja posten.

Danke noch mal an alle,