Script Timer

 if($_IPS['SENDER'] == "TimerEvent")
 {
  //Aus Befehl
  SetValue(28297, false);
  //Timer ausschalten
  IPS_SetScriptTimer($_IPS['SELF'], 0);
 } else {
  //An Befehl
  SetValue(28297, true);
  //Timer start
  IPS_SetScriptTimer($_IPS['SELF'], 300);
 }  

Danke dir, so hatte ich es anfangs. Dann blinkt das Licht alle 5 Sekunden, also versucht wohl auszugehen wird aber gleich wieder auf an getriggert.

Hier mein Script

<?

if($_IPS[‚SENDER‘] == „TimerEvent“)
{
//Aus Befehl

HUE_SetValue(19161 /[hue\Flur]/, ‚STATE‘, false);

//Timer ausschalten
IPS_SetScriptTimer($_IPS[‚SELF‘], 0);
} else {
//An Befehl

HUE_SetValue(19161 /[hue\Flur]/, ‚STATE‘, true);
//Timer start
IPS_SetScriptTimer($_IPS[‚SELF‘], 10);
}
?>

Ereignis wird getriggert durch Variablenwert der Variable auf true

Ok, vielen Dank, klappt

habe jetzt über Variablenänderung getriggert und if Abfrage eingebaut, ob State == true

edit: Verstehe nicht warum, aber jetzt blinkt es wieder

Du vergisst wohl den Timer wieder auf 0 zu setzen und damit zu deaktivieren?!

Hier im Thread gibt es einige Beispiele die dazu passen. Besonders in diesem Post das 3. Skript:
IP-Symcon - Wie kann ich… 2.0 - Seite 3

Grüße,
Chris

Du hast eine Endlosschleife gebaut :smiley:

Du schaltet das Gerät an -> Variable geht auf an -> Script wird gestartet -> Schaltet auch nochmal an (else-Zweig) und setzt den Timer auf 10 Sekunden.

Nach 10 Sekunden kommt der obere IF-Teil und schaltet das Gerät aus (und den Timer auf 0) -> Variable vom Gerät ändert sich, weil es ja ausgeschaltet wurde und somit landest du wieder im ELSE-Zweig vom Script… usw…

Also einfach den AN-Befehl raus aus dem ELSE-Zweig.
Und am besten nur den Timer setzen, wenn die Variable vom Geärt auch TRUE (an) ist.
Dazu gibt es:


if ($_IPS['VALUE']) // Nur wenn der 'Sender' eine Variablenänderung auf TRUE war.
{
IPS_SetScriptTimer($_IPS['SELF'], 10);
}

Michael

Klasse, klappt, danke!

Hallo,

ich würde gerne eine HM-Systemvariable B (Objekt-ID 28447) auf true setzen,wenn eine HM-Sytemvariable A (Objekt-ID 28448) mindestens 20 Sekunden auf true ist und in einem ersten Schritt (damit ich es verstehe) die HM-Systemvariable B wieder auf false setzen, wenn die HM-Sytemvariable A auf false ist.

Orientierend an dem Skript in Post #8 habe ich es wie folgt versucht, wobei das Skript durch eine Änderung der HM-Systemvarablen A getriggert wird (IPS 4.1 mit Homematic Ext.-Modul):

<?
 if(($IPS_SENDER == "TimerEvent")&&(GetValue(25448 /*[HomeMatic Systemvariablen\IPS Test]*/))) // nach 20 sec prüfen
{
    HM_WriteValueBoolean2(28447 /*[HomeMatic Systemvariablen\LichtsensorKamin]*/, "State", true);
    IPS_SetScriptTimer($IPS_SELF, 0); // Timer beenden
    return; // Script verlassen
}
if(GetValue(25448 /*[HomeMatic Systemvariablen\IPS Test]*/)) // wenn Variable auf true
{
   IPS_SetScriptTimer($IPS_SELF, 20); // Timer für 20 sec setzen
}
else // sonst
{
   IPS_SetScriptTimer($IPS_SELF, 0); // Timer löschen und
   HM_WriteValueBoolean2(28447 /*[HomeMatic Systemvariablen\LichtsensorKamin]*/, "State", false);
}  
?>

Die Timerauslösung funktioniert zwar, aber die HM-Systemvariable B ändert sich nie. Kann mir jemand sagen, wo der Fehler liegt?

Eigentlich habe ich in einem zweiten Schritt vor, dass die HM-Systemvariable B erst wieder auf false, wenn die HM-Systemvariable A ihrerseits mindestens 20 Sekunden auf false ist.

Und kann jemand eine Idee, wie das Skript aussehen müsste, um auch den 2. Schritt umzusetzen?

Danke und Grüße…

Das hier ist leider komplett falsch:

   HM_WriteValueBoolean2(28447 /*[HomeMatic Systemvariablen\LichtsensorKamin]*/, "State", false); 

28447 ist nicht die Instanz der Systemvariablen sondern eine Variabler, hier muss aber die ID der Instanz rein (55058 im Screenshot).
„State“ ist nicht der ‚Ident‘ der zu setzenden Systemvariable in der CCU.

Hier muss z.B. „4711“ rein. Also der Wert welcher hier in der Spalte Ident im Fenster Statusvariablen (oben rechts) zu sehen ist:

Michael

Super, vielen Dank!!!

Jetzt reagiert jedenfalls Variable B, auch wenn noch nicht so, wie ich mir das vorstelle (derzeit geht sie auf true, wenn A 20 Sek. auf true ist, und erst wieder auf false, wenn A auf false war und dann wieder auf true geschaltet wird…). Das muss ich mir nochmal anschauen…

Die Zeile

if(GetValue(25448 /*[HomeMatic Systemvariablen\IPS Test]*/)) // wenn Variable auf true 

prüft ja offenbar, ob die Variable auf true ist. Wie kann ich denn prüfen, ob die Variable auf false ist?

!GetValueBoolean
Michael

Vielen Dank für Deine Hilfe und sorry, dass ich so dumm fragen muss… Ich bin Laie auf dem Gebiet…

Ich kann es erste heute Abend oder morgen ausprobieren - letztlich müsste dann folgendes Skript die Variable B auf false setzen, wenn Variable A mind. 20 Sekunden auf false war?!?

 <?
 if(($IPS_SENDER == "TimerEvent")&&(GetValueBoolean(25448 /*[HomeMatic Systemvariablen\IPS Test]*/))) // nach 20 sec prüfen
{
    HM_WriteValueBoolean2(xxxxx /*[HomeMatic Systemvariablen\LichtsensorKamin]*/, 'xxx', false);
    IPS_SetScriptTimer($IPS_SELF, 0); // Timer beenden
    return; // Script verlassen
}
if(GetValueBoolean(25448 /*[HomeMatic Systemvariablen\IPS Test]*/)) // wenn Variable auf false
{
   IPS_SetScriptTimer($IPS_SELF, 20); // Timer für 20 sec setzen
}
?> 

Das funktioniert leider nicht.

Ich steige durch die einzelnen Befehle schlicht nicht durch - wie kann ich vorstehendes Szenario umsetzen?:confused:

Vielen Dank im Voraus!!!

Habs hinbekommen, vielen Dank noch einmal an Dich, Michael…

Schönes WE!

Ich brauche bitte auch eure Hilfe. Ich muss folgendes Szenario umsetzen:

Situation 1: Es ist zwischen 21:00 Uhr abends und 04:00 Uhr früh
Wenn ich im Wohnzimmer auf den „Schlafen gehen“-Taster drücke, soll sich im Wohnzimmer sowie in der Küche das Licht einschalten und nach 60 Sekunden im Wohnzimmer sowie nach 120 Sekunden in der Küche das Licht wieder ausschalten. Das Licht im Bad soll sich nach 20 Sekunden einschalten und nicht ausgehen. Der Schaltaktor des Fernsehers soll sich ausschalten.
Gleichzeitig soll geprüft werden, ob die Gartentüre, die Garagentüre und die Garage geschlossen ist (Eaton Binärkontakte). Wenn die Garage offen ist, soll sie automatisch geschlossen werden (Eaton Schaltaktor).
Wenn die Gartentüre oder Garagentüre nicht geschlossen ist, soll eine PushNachricht mit der Warnung erscheinen.
Situation 2: Es ist NICHT zwischen 21:00 Uhr abends und 04:00 Uhr in der früh
Es soll sich nur der Schaltaktor des Fernsehers ausschalten, sonst nichts.

Ich habe jetzt schon einige Versuche unternommen, scheitere aber bereits an den Timern. Für einen Profi wahrscheinlich ein Klacks. Ich bin ganz neu in dem Thema und würde das ohne eure Hilfe schwer oder gar nicht zusammen bringen!

Hier das begonnene Skript:

<?

$Timer_Wohnzimmerlicht = 60;
$Timer_Kuechenlicht = 120;
$PushNachrichtTitel_GarageLisi = „Garage Lisi“;
$PushNachrichtMessage_GarageLisi = „wird automatisiert geschlossen“;
$PushNachrichtTitel_Gartentuere = „Gartentüre“;
$PushNachrichtMessage_Gartentuere = „ist geöffnet“;
$PushNachrichtTitel_Garagentuere = „Garagentüre“;
$PushNachrichtMessage_Garagentuere = „ist nicht versperrt“;
$StatusGartentuere = GetValueBoolean(59364 /[Garten\Gartentüre\Status]/);
$StatusGaragentuere = GetValueBoolean(56860 /[Garagentüre/FREI (Kanal B)\Status]/);
$StatusGarageLisi = GetValueBoolean(44878 /[Keller\Garagen\Garage Lisi Aktor\Status]/);
$Uhrzeit = date(„H:i“);

if ((date(„H:i“) >= „20:15“) AND (date(„H:i“) < „23:59“)) {

MXC_SwitchMode(18905 /[Erdgeschoss\Wohnzimmer\Steckdose Fernseher ]/, false);
if($_IPS[‚SENDER‘] == „TimerEvent“)
{
MXC_SwitchMode(17252 /[Erdgeschoss\Küche\Deckenlicht Küche ]/, false);

//Timer ausschalten
IPS_SetScriptTimer($_IPS['SELF'], 0);

} else {
//An Befehl
MXC_SwitchMode(17252 /[Erdgeschoss\Küche\Deckenlicht Küche ]/, true);

//Timer anschalten
IPS_SetScriptTimer($_IPS['SELF'], 120);

}
if($_IPS[‚SENDER‘] == „TimerEvent“)
{
MXC_SwitchMode(10860 /[Erdgeschoss\Wohnzimmer\Wohnzimmer Deckenlicht]/, false);

//Timer ausschalten
IPS_SetScriptTimer($_IPS['SELF'], 0);

} else {
//An Befehl
MXC_SwitchMode(10860 /[Erdgeschoss\Wohnzimmer\Wohnzimmer Deckenlicht]/, true);

//Timer anschalten
IPS_SetScriptTimer($_IPS['SELF'], 60);

}

}

?>

Mach Dir ein Skript, welches eine Variable „Nacht“ um 21 Uhr auf True setzt. Mach Dir ein zweites Skript für 4 Uhr, welches die Variable auf False setzt.

In deinem eigentlichen Skript fragst Du dann diese Variable mit einem switch oder einer if Anweisung ab und reagierst entsprechend.

Nicht schön, aber wirkungsvoll.

Danke für den Tipp!
Wie kann ich den Rest umsetzen? Bin noch nicht recht fit auf PHP :frowning:

Für den Rest brauchst Du nichts, was Du nicht in Deinem Skript in #1 nicht auch schon verwenden würdest.

Zeig, wie weit Du bist, dann sage ich Dir, wie der Rest umzusetzen ist.

Ich komme hier einfach nicht wirklich weiter.
Ich stehe immer noch bei den Timern. Ich möchte z.B., dass sich das Wohnzimmerlicht nach 6 Sekunden und das Küchenlicht nach 10 Sekunden ausschaltet. An welcher Stelle und vor allem mit welchem Befehl gebe ich den Timer für das Küchenlicht ein? :confused::confused:


<?

$Timer_Wohnzimmerlicht = 6;
$Timer_Kuechenlicht = 10;
$PushNachrichtTitel_GarageLisi = "Garage Lisi";
$PushNachrichtMessage_GarageLisi = "wird automatisiert geschlossen";
$PushNachrichtTitel_Gartentuere = "Gartentüre";
$PushNachrichtMessage_Gartentuere = "ist geöffnet";
$PushNachrichtTitel_Garagentuere = "Garagentüre";
$PushNachrichtMessage_Garagentuere = "ist nicht versperrt";
$StatusGartentuere = GetValueBoolean(59364 /*[Garten\Gartentüre\Status]*/);
$StatusGaragentuere = GetValueBoolean(56860 /*[Garagentüre/FREI  (Kanal B)\Status]*/);
$StatusGarageLisi = GetValueBoolean(44878 /*[Keller\Garagen\Garage Lisi Aktor\Status]*/);
$Uhrzeit = date("H:i");

if ((date("H:i") >= "20:00") AND (date("H:i") < "23:59")) {

if($_IPS['SENDER'] == "TimerEvent")
{
     //Aus Befehl
MXC_SwitchMode(10860 /*[Erdgeschoss\Wohnzimmer\Wohnzimmer Deckenlicht]*/, false);
MXC_SwitchMode(17252 /*[Erdgeschoss\Küche\Deckenlicht Küche ]*/, false);
 
    //Timer ausschalten
    IPS_SetScriptTimer($_IPS['SELF'], 0);
	
} else {
    //An Befehl
MXC_SwitchMode(10860 /*[Erdgeschoss\Wohnzimmer\Wohnzimmer Deckenlicht]*/, true);
MXC_SwitchMode(17252 /*[Erdgeschoss\Küche\Deckenlicht Küche ]*/, true);
 
    //Timer anschalten
    IPS_SetScriptTimer($_IPS['SELF'], $Timer_Wohnzimmerlicht);
}
}

?>

Für den Anfang würde ich das gar nicht alles in ein Skript stecken.

Mach Dir z.B. ein Skript für „Wohnzimmerlicht Aus“

<?
MXC_SwitchMode(10860 /*[Erdgeschoss\Wohnzimmer\Wohnzimmer Deckenlicht]*/, false);

if($_IPS['SENDER'] == "TimerEvent"){
  IPS_SetScriptTimer($_IPS['SELF'], 0);
}
?>

Nach dem gleichen Schema erstellst Du eins für das Licht in der Küche.

Aus Deinem Skript heraus machst Du dann:


IPS_SetScriptTimer(SKRIPT-WOHNZIMMER-ID, $Timer_Wohnzimmerlicht);

also:

<?
$Timer_Wohnzimmerlicht = 6;
$Timer_Kuechenlicht = 10;
$PushNachrichtTitel_GarageLisi = "Garage Lisi";
$PushNachrichtMessage_GarageLisi = "wird automatisiert geschlossen";
$PushNachrichtTitel_Gartentuere = "Gartentüre";
$PushNachrichtMessage_Gartentuere = "ist geöffnet";
$PushNachrichtTitel_Garagentuere = "Garagentüre";
$PushNachrichtMessage_Garagentuere = "ist nicht versperrt";
$StatusGartentuere = GetValueBoolean(59364 /*[Garten\Gartentüre\Status]*/);
$StatusGaragentuere = GetValueBoolean(56860 /*[Garagentüre/FREI  (Kanal B)\Status]*/);
$StatusGarageLisi = GetValueBoolean(44878 /*[Keller\Garagen\Garage Lisi Aktor\Status]*/);
$Uhrzeit = date("H:i");

if ((date("H:i") >= "20:00") AND (date("H:i") < "23:59")) {
  MXC_SwitchMode(10860 /*[Erdgeschoss\Wohnzimmer\Wohnzimmer Deckenlicht]*/, true);
  MXC_SwitchMode(17252 /*[Erdgeschoss\Küche\Deckenlicht Küche ]*/, true);
  
  IPS_SetScriptTimer(SKRIPT-WOHNZIMMER-ID, $Timer_Wohnzimmerlicht);
  IPS_SetScriptTimer(SKRIPT-KUECHE-ID, $Timer_Kuechenlicht);
}
?>

Für „Badezimmerlicht an“ gehst Du genau so vor.

Klar soweit?