Ampel für 10 Minuten einschalten

vielen Dank für die Rückmeldungen!
Also zur Errinerung : Lampe soll EINgeschaltet werden, 1 Minute NACHdem das Fenster aufgemacht wurde.
Mit Folgendem Skript (s.u.) kommt folgende Fehlermeldung genau 1 Minute :slight_smile: nach o.g. Ereignis:

<b>Warning</b>:  Skript #0 exisitert nicht in <b>/-</b> on line <b>14</b><br /> 

und hier mein Skript:

//Trigger: Variablen-Änderung: "STATE"
$id_aktor = 49439;
// wenn das Skript durch das Timer-Event gestartet wird:
if($_IPS['SENDER'] == "TimerEvent"){
    // SkriptTimer auf 1 Minute setzen, d.h. nach einer Minute wird das Skript wieder ausgeführt.
    IPS_SetScriptTimer($_IPS['SELF'], 1 * 60);    // 1 Minuten
    // Aktor einschalten
    TPLHS_PowerOn($id_aktor);                // TPLink-Stecker einschalten
// wenn das Skript NICHT durch das TimerEvent gestartet wurde, also durch ein Ereignis oder per Hand (zum Beispiel)
}else{
    // Aktor ausschalten
    TPLHS_PowerOff($id_aktor);                     // TPLink-Stecker ausschalten
    // SkriptTimer des Skriptes auf 0 setzen (deaktivieren)
    IPS_SetScriptTimer($_IPS['SELF'], 0);
    } 

Also ich glaube ich bis gaaanz nah dran. Nut die lampe bleibt aus.
Linie 14 ist die mit IPS_SetScriptTimer($_IPS[‚SELF‘], 0);

Gruß & Dank vorab, A.

Jetzt mach ich mich auch mal „wichtig“ :wink:

Ganz verstehen tue ich die Anforderung noch nicht, aber ich versuche mal zusammenzufassen:

  1. Du öffnest ein Fenster

  2. eine Minute vergeht

  3. Lampe geht an

  4. WER MACHT DIE LAMPE WANN WIEDER AUS???

Zu 1) 2) und 3) ist die Lösung sehr einfach, sofern du einen Kontakt bei deinem Fenster hast.

Deine Variable des Fensters setzt den Skripttimer auf 60 sek. deines Schaltskriptes, welches in verschiedensten Versionen schon durch den Thread geht. Dort schaltet du:

Kontakt des Fensters bei offen macht das:

 IPS_SetScriptTimer("ID Deines Schaltskriptes unten", 60);
 
$id_aktor = 49439;
// wenn das Skript durch das Timer-Event gestartet wird:
if($_IPS['SENDER'] == "TimerEvent" && "z.B. mein Licht ist aus, oder mein Fenster ist auf oder was ich sonst will"){
    // SkriptTimer auf 1 Minute setzen, d.h. nach einer Minute wird das Skript wieder ausgeführt
    IPS_SetScriptTimer($_IPS['SELF'], 1 * 60);    // 1 Minuten
    // Aktor einschalten
    TPLHS_PowerOn($id_aktor);                // TPLink-Stecker einschalten
// wenn das Skript NICHT durch das TimerEvent gestartet wurde, also durch ein Ereignis oder per Hand (zum Beispiel)
}else{
    // Aktor ausschalten
    TPLHS_PowerOff($id_aktor);                     // TPLink-Stecker ausschalten
    // SkriptTimer des Skriptes auf 0 setzen (deaktivieren)
    IPS_SetScriptTimer($_IPS['SELF'], 0);
    }  

Damit wird nach dem Einschalten nach einer Minute das Skript nach einer weiteren Minute (1*60) nochmal gestartet und wenndie If Bedingung nicht erfüllt wurde das Licht ausgeschalten und der Timer auf Null gesetzt!

Natürlich könntest du das ganze auch in ein Skript packen, aber evt. ist es so leichter nachzuvollziehen.

So das wäre mein Beitrag zu dem Thema, hoffe es ist verständlich!

lg
hagi

@Alamak hast Du den Code in ein Skript geschrieben?

Kann mir die Fehlermeldung gerade nicht erklären. Schaue mir das später noch mal an wenn ich am PC sitze.

Guten Tag,
Hier kurze Anworten zu euren Fragen:
Die Lampe wird ausgeschaltet, wenn das Fenster geschlossen wird. (das funktioniert)
Ich habe mein Skript als ausgelöstes Ereignis gespeichert (s.u.). Wäre das evtl. der Fehler ?:
symcon1.jpg
Gruß, A.

Ja, erstelle ein Skript und lege das Ereignis unter das Skript.

Und bei beschäftige Dich mit der Doku zu IPS_SetScriptTimer …

Hallo ich möchte eine Variabel für eine Rollosteuerung für 30 sec auf true setzen.
Dazu hab ich folgendes Skript geschriben. Durch zusammensuchen aus diversen Beiträgen.

<?php

$nachtschicht = GetValueBoolean(13855);
$time = date("H:i"); //aktuelle Uhrzeit
$nach9 = date("09:00");
$nach14 = date("14:00");

// wenn das Skript durch das Timer-Event gestartet wird:
if($_IPS['SENDER'] == "TimerEvent")
{
    //Aus Befehl
    SetValueBoolean(50290, false);

    //Timer ausschalten
    IPS_SetScriptTimer($_IPS['SELF'], 0);
} 
else
if      ((($nachtschicht == false) and ($time >= $nach9)) or (($nachtschicht == true) and ($time >= $nach14)))
{
    //An Befehl
    SetValueBoolean(50290, true);
    
    //Timer anschalten
    IPS_SetScriptTimer($_IPS['SELF'], 30);
}
?>

Das Skript soll wenn ich keine Nachtschicht habe um 9 Uhr die Variabel setzen zum Rollo Hochfrahren oder
wenn ich Nachtschicht habe um 14 Uhr für 30sec.

Ein SkriptTimer ist als Ereignis angehängt, um die Variabel nach 30sec wieder auszuschalten.
Durch manuelles ausführen des Skriptes klappt die Variabelumschaltung nach der eingestellten Zeit auch.
Um das Skript automatisch aufzuführen, hab ich mir gedacht das Skript über ein Ereignis immer um 9 Uhr und um 14 Uhr ausführen zu lassen.
Das Skript wird nun zwar ausgeführt aber die Variabel wird nicht nie auf true geschaltet sondern bleibt immer auf false. An der Aktualisierungszeit sieht man aber das das Skript zu den Zeiten aufgerufen wird.

Ich hab zum Testen auch nur das Standartskript welches auch hier beschrieben wurde, mit einem Ereignis versucht automatisch auszulösen z.B alle 2 Minuten von… bis… .
Die Variabel wird nur gesetzt wenn ich das Skript händisch auslöse.
Bei der automatischen Auslösung tut sich bei der Variabel gar nix.

Da ich noch ziemlicher Anfänger in php bin, hab ich da sicher einen Denkfehler und oder das Skript falsch geschrieben.
Wäre super wenn mir einer hiezu helfen könnte.

LG
Marius

Ich habe mir das Script nicht genau angesehen und kann dir nicht sagen ob die Logik grundsätzlich korrekt wäre. ABER: php kann nicht wie ein Mensch die Uhrzeit vergleichen. Es ist nicht definiert, ob 22:30 größer als 20:30 ist. Du musst stattdessen die Sekunden seit Mitternacht oder die absolute Verschiebung nach dem 1.1.1970 (simples php time() bzw. mktime) verwenden.

Danke dir tobiasr für deine Antwort.
Das mit dem Zeitvergleich hab ich aus diesem Beitrag Wie kann ich Uhrzeiten vergleichen von 2012.
Da Scheint es so zu funktionieren.

Mit time() müsste ein Vergleich in etwa so aussehen?

if ( time() >= $nach9);

Aber davon abgesehen hab ich das Problem
das ein Skript mit SkriptTimer nur richtig abgearbeitet wird wenn ich es von Hand oder über Ereignis Variabeländerung starte.
Möchte ich es über ein zyklisches Ereignis starten, laut Uhrenlogo ist der ScriptTimer ebenfalls ein zyklisches Ereignis, z,B, zum Testen alle X Minuten ab… von…
Wird das Skript zwar aufgerufen laut Uhrzeit aber nicht richtig abgearbeitet.
Die zu Schaltende Variabel wird einfach nicht eingeschaltet und der SkriptTimer wird nicht aufgerufen.
Anbei so ein Standardbeispiel wie es auch so änlich in der Doku steht und vielfach hier im Forum.

if($_IPS['SENDER'] == "TimerEvent")
{
    //Aus Befehl
    SetValueBoolean(50290, false);

    //Timer ausschalten
    IPS_SetScriptTimer($_IPS['SELF'], 0);
} 
else
{
    //An Befehl
    SetValueBoolean(50290, true);
    
    //Timer anschalten
    IPS_SetScriptTimer($_IPS['SELF'], 30);
}
?>

Kann demnach also ein Skript mit Zeitfunktion nicht über ein zyklisches Ereignis gestartet werden :dizzy_face: ??
Oder muss das Skript dann etwa nur angepasst werden?

Du kannst in der if Bedingung zusätzlich die auslösende id mit Abfragen.

Es ist immer hilfreich sich bei Problemen mit Ereignissen die $_IPS ins Meldungslog zu sichern. z.B. mit

IPS_LogMessage(„mein Script“, print_r($_IPS, true));

Zum Thema Time: hier wäre jetzt spannend WAS in $nacht9 steht. Dies musst du mit PHP: mktime - Manual vorbereiten.

PS: Ziemlich cool zum Arbeiten mit Zeit sind auch einige Funktionen von php wie PHP: DateTime - Manual

mktime und Datetime hab ich noch nicht ausprobiert.
Ich brauch auch nur die Uhrzeit.
Diesbezüglich hab mir aber mal ein kleines Testskript mit der if Bedingung und den Zeitenvergleich mit 2 Separaten Variablen geschrieben.
Ergebinss:
Die Uhrzeit wird korrekt ins Skript gelesen und der Vergleich mit Zeit X größer gleich usw. funktioniert und die Testvariable schaltet wie gewollt.
Demnach dürfte dieser Teil korrekt sein und richtig arbeiten.

Mein Problem ist aber weiterhin das in dem Teil

// wenn das Skript durch das Timer-Event gestartet wird:
if($_IPS['SENDER'] == "TimerEvent")
{
    //Aus Befehl
    SetValueBoolean(50290, false);

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

Soviel hab ich durchs lesen hier im Forum verstanden.
Wenn das Skript über den SkriptTimer nach x Sec aufgerufen wird, wird die Zeit auf 0 und die Variabel auf false gesetzt.
Wenn ich das Skript aber um 9 und 14 Uhr über ein Zyklisches Ereignis aufrufe passiert anscheinend meiner Erkenntnis genau das gleiche wie wenn das Skript über den SkriptTimer aufgerufen wird.
Es wird nur dieser Teil abgearbeitet.
Wie bekomme ich es also hin bei Ausführung eines Zyklischen Ereignisses um 9 und 14 Uhr das die Variabel auf true geschaltet wird und der SkriptTimer anfängt zulaufen und die Variabel nach der eingestellten Zeit wieder ausschaltet.
Um das zu lösen fehlt mir etwas an Verständnis.
Es muss doch möglich sein ein Skript mit einem SkriptTimer auch über ein zyklisches Ereignis aufzurufen und nicht nur über eine Variableänderung.

Ja das geht. Hast du, wie von mir vorgeschlagen dir $_IPS im MessageLog ausgeben lassen? Dann siehst du, dass dort unterschiedliche Infos (z.B. die EventID) drinstehen. Und auf die musst du mittels If auch noch prüfen.

Zum Thema Uhrzeit: Verlass die bloß nicht auf irgendwelche String vergleiche. Das ist Zufall, dass das bei bestimmten Uhrzeiten funktioniert.

Hab ich ans ende meines obengenannten skriptes eingefügt und die ID durch mein Skript geändert.
Bekomme beim ausführen erstmal eine Warnmeldung das die IDNummer einen Fehler in einer zukünftigen Version von PHP auslösen wird.

Im Meldungsfenster bekomme bei händischer Ausführung angezeigt

22.02.2021, 13:23:19 | „51930“          | Array
(
    [SELF] => 51930
    [THREAD] => 2
    [SENDER] => Execute
)

und das die gewünschte Variable auf true springt.
30sec später auf false und

22.02.2021, 13:23:49 | „51930“          | Array
(
    [SELF] => 51930
    [SENDER] => TimerEvent
    [EVENT] => 21838
    [THREAD] => 5
    [TARGET] => 51930
)

also durch den SkriptTimer aufgerufen wird.

Bei Auslösung über Ereignis jede Minute bekomme ich nur diese Meldung ohne das Vaiablen geschaltet werden.

22.02.2021, 13:25:00 | „51930“          | Array
(
    [SELF] => 51930
    [SENDER] => TimerEvent
    [EVENT] => 27313
    [THREAD] => 6
    [TARGET] => 51930
)

inkl. der Warnmeldung die mitkommt.

Hab ich das so richtig gemacht mit der LogMessage?

Du siehst, dass einmal $_IPS[‚EVENT‘] die 21838 und einmal die 27313 ist.
Du möchtest also wenn der Auslöser der Scripttimer ist, die Variable auf aus schalten, wenn es das „Minütlich“ Ereignis ist etwas anderes tun.

if($_IPS['SENDER']=="TimerEvent"){
  if($_IPS['EVENT']==21838 /*Scripttimer*/){
    // set Scripttimer off
  }elseif($_IPS['EVENT']==27313 /*Scripttimer*/){
    // Minütliche Ausführung
    // tue etwas anders
  }
}else{
  // kein TimerEvent, z.B: manuelle Ausführung
  // tue was ganz anderes
}

Vielen Dank tobiasr.
Das war das was ich benötigt habe.
Mit Testzeiten zum probieren hat es das gemacht was es sollte.
Werde morgen sehen ob morgens um 9 die Rollos so hochfahren wie gewünscht.
Den Part mit den Zeitvergleichen lass ich erstmal so, da es beim Testen bisher so funktioniert hat.
Lese mich aber mal in mktime ein.