Schaltvorgänge durch zeit beienflussen!

Hallo!
Ich habe mir ein sogenanntes "Schlafen gehen Script gebaut.
Das bedeutet das wenn ich schlfen gehe, sollen die Lampen nacheinander in einer von mir angegebenen zeit aus schalten/dimmen.
Funktioniert soweit auch ganz gut, nur habe ich Probleme beim letzten schalt vorgang.

<?
/*


IP-SYMCON Event Scripting


File : Schlafen_gehen.ips.php
Trigger :
Interval :
*/
TTS_Speak(48637,„Nacht Modus wurde Aktiviert!“);

IPS_Sleep(5000);
FS20_SetIntensity(52675, 0, 10); // TV Wandbeleuchtung runter fahren
FS20_SetIntensity(46339, 0, 10); // Tischbeleuchtung runter Fahren
IPS_Sleep(15000);
FS20_SwitchMode(33605, True); // Schlafzimmer Lampe einschalten
FS20_SetIntensity(35244, 0, 30); // Stehllampe runter fahren
IPS_Sleep(5000);
FS20_SetIntensity(59840, 0, 120); // Lichtschlauch auf der Treppe runter fahren
FS20_SwitchMode(33605, False); // Schlafzimmer Lampe ausschalten

?>

Und zwar schaltet die Schlafzimmer Lampe nicht erst aus, wenn der Lichtschlauch kommplett runter gefahren ist, sondern direkt nach der Übergabe das der lichtschlauch ausgeschaltet werden soll.
Also der vorgang „Lichtschlauch wird runter gefahren“ wird ausgelöst und sofort danach wird die Schlafzimmerbeleuchtung ausgeschaltet. soll aber erst nach dem Lichschlauch aus gehen. der vorgang dauert also eigentlich 120sek.
Wenn ich nun zwischen dem Lichtschlauch und der Schlafzimmerlampe ein „IPS_Sleep“ mit nochmals (5000) setzte, bekomme ich eine fehlermeldung, das IPS nicht wohl nicht mit 30 sek. Pausezeit klar kommt.
Kann mir einer sagen, ob es einen code gibt, in dem IPS die Geräte nacheinander schaltet?
Also erst das Wohnzimmer ausschaltet, dann erst dei Flur beleuchtung, und wenn die dann runter gefahren ist, den Lichtschlauch auf der Treppe und wenn dieser dann komplett runter gedimmt wurde, erst die Beleuchtung im schlafzimmer?
Gibt es solch einen befehl, den ich statt „IPS_Sleep“ einsetzten kann, oder muß ich das ganze umschreiben?

P.S.
Und noch etwas.
wie kann ich den Befehl nach dieser ganzen Prozedur geben, das er wieder auf False schaltet?
Wenn ich den Befehl sofort hinten ran hänge, schaltet es sofort alles aus, obwohl der ganze Prozess eigentlich noch am laufen ist.
Danke im vorraus.
Gruß
Xanon

Ich wurde es mal etwas anderes gestallten…
Schleife - sequenzen geben ab und zu mal komische resultaten wie beschrieben.
Deshalb wurd ich die schleife ersetzen durch timer basierte trigger.

Nur als vorschlag und nicht getestet:


<?
/*
*******************************
IP-SYMCON Event Scripting
*******************************
File : Schlafen_gehen.ips.php
Trigger : 
Interval : 
*/
if (IPS_SENDER=="Variable"){
    if (GetValueBoolean("Schlafen_gehen_trigger")) {  //"Schlafen_gehen_trigger" ist der var die triggert und nur bei true schalten
        TTS_Speak(48637,"Nacht Modus wurde Aktiviert!");
        SetValueInteger("schlafen_gehen_counter",1);
        IPS_SetScriptTimer("Schlafen_gehen",5*60);
    }
} else {
    if (IPS_SENDER=="TimerEvent"){
        if (GetValueInteger("schlafen_gehen_counter")==1){
            FS20_SetIntensity(52675, 0, 10); // TV Wandbeleuchtung runter fahren
            FS20_SetIntensity(46339, 0, 10); // Tischbeleuchtung runter Fahren
            SetValueInteger("schlafen_gehen_counter",2);
            IPS_SetScriptTimer("Schlafen_Gehen",15*60);
        }
        if (GetValueInteger("Schlafen_gehen_counter")==2){
            FS20_SwitchMode(33605, True); // Schlafzimmer Lampe einschalten
            FS20_SetIntensity(35244, 0, 30); // Stehllampe runter fahren
            SetValueInteger("schlafen_gehen_counter",3);
            IPS_SetScriptTimer("Schlafen_Gehen",5*60);
        }
        if (GetValueInteger("Schlafen_gehen_counter")==3){
            FS20_SetIntensity(59840, 0, 120); // Lichtschlauch auf der Treppe runter fahren
            FS20_SwitchMode(33605, False); // Schlafzimmer Lampe ausschalten
            SetValueInteger("schlafen_gehen_counter",0);
            IPS_SetScriptTimer("Schlafen_Gehen",0);
            SetValueInteger("gehen_schlafen_trigger",false);
         }
    } //timerevent
}  //variable
?> 

Besser wäre noch die ganze if {} schleifen zu ersetzen durch switch {case… } aber das bringt uns etwas zu weit vom thema

Danke GGGss!
Werde es mal ausprobieren.
Wenn es klappt, kann ich aufgrund deiner vorlage auch meine andere Events endlich zeitlich beeinflussen.
Werde nachher mal posten, ob es geklappt hat.
Danke erstmal.
Gruß
Xanon

Bin absoluter anfänger wenn es um Programierung geht.
Biite um Hilfe
Erstes Problem, wenn ich das Script durch meines ersetzte bekomme ich folgende fehler meldung:

<br />
<b>Notice</b>: Use of undefined constant IPS_SENDER - assumed ‚IPS_SENDER‘ in <b>C:\Programme\IP-SYMCON\scripts.currentscript</b> on line <b>10</b><br />
<br />
<b>Notice</b>: Use of undefined constant IPS_SENDER - assumed ‚IPS_SENDER‘ in <b>C:\Programme\IP-SYMCON\scripts.currentscript</b> on line <b>17</b><br />

Was muß bei IPS_Sender rein? die Hausadresse?
Wenn ja, wie muß das aussehen? getrennt durch doppelpunkte oder wei
etwa so
Hausadresse:11223344 : 11 : 12???

Fehler meiner seits…
IPS-SENDER
durch


$IPS_SENDER

Ersetzen

Wie gesagt : nicht getestet

OK, er sagt mir nun zwar, das der Nacht modus aktiviert wurde, aber er macht nichts.
Sorry, das ich nochmal sooo blöd nachfragen muß, aber was muß ich noch machen, außer dein Script zu kopieren?
Hoffe du kannst mir noch helfen.

noch die variablen einrichten…

Ok du bist anfänger … kein problem. bitte auf gross und kleinschreib-weise achten (mein rat : immer klein-geschriebenes)

Du brauchst 2 variablen.

  • der die triggert zb ‚schlafen_gehen_trigger‘ typ boolean
    der startet das script : also per ‚events‘-reiter ‚on-change‘ event verknupfen an die variable.
  • ein zähler : ‚schlafen_gehen_counter‘ typ integer
    das ist die variable die die runden zählt.
    dieser hier soll nicht verknupft werden.

Das script hat sich jetzt hier und da was ge-andert: (gedebugged)


<?
/*
*******************************
IP-SYMCON Event Scripting
*******************************
File : Schlafen_gehen.ips.php
Trigger :
Interval :
*/
SetValueBoolean("schlafen_gehen_trigger",true); //-> simuliere knopf druck
$IPS_SELF="test"; //-> geht nur mit die laetzte offentliche version
//-> wenn fertig mit debuggen diese zeile kommentieren //

//Debug : beim 'Execute' drucken kommt ein log-file raus
$debug = true; //-> Auf false setzen wenn kein log-file gewunscht
$timer = 1; //in debugging zeit verkurzen x * $timer  normal : 60 (secunden)

//einrichten des log-files
$logfilepath="/schlafen.txt";  // dieser file steht auf 'c:\'
if ($debug) {
   $handle=fopen("$logfilepath", "a");
   if (!$handle){
      // error cannot open file
      echo("******* ERROR: Cannot open file '$tempfilepath'
");
   }
}

if ($IPS_SENDER=="Variable" || $IPS_SENDER=="Execute"){
    // ausfuhren durch die 'schlafen_gehen_trigger' variable oder execute
    if (GetValueBoolean("schlafen_gehen_trigger")) {  //"schlafen_gehen_trigger" ist der var die triggert und nur bei true schalten
        TTS_Speak(48637,"Nacht Modus wurde Aktiviert!");
        SetValueInteger("schlafen_gehen_counter",1);
        IPS_SetScriptTimer($IPS_SELF,5*$timer);
        if ($debug) fwrite($handle,"Proc started : counter = 1
");
    }
}
if ($IPS_SENDER=="TimerEvent"){
    if (GetValueInteger("schlafen_gehen_counter")==1){
        FS20_SetIntensity(52675, 0, 10); // TV Wandbeleuchtung runter fahren
        FS20_SetIntensity(46339, 0, 10); // Tischbeleuchtung runter Fahren
        SetValueInteger("schlafen_gehen_counter",2);
        IPS_SetScriptTimer($IPS_SELF,15*$timer);
        if ($debug) fwrite($handle,"    counter = 2
");
    } else {
      if (GetValueInteger("schlafen_gehen_counter")==2){
         FS20_SwitchMode(33605, True); // Schlafzimmer Lampe einschalten
         FS20_SetIntensity(35244, 0, 30); // Stehllampe runter fahren
         SetValueInteger("schlafen_gehen_counter",3);
         IPS_SetScriptTimer($IPS_SELF,5*$timer);
         if ($debug) fwrite($handle,"    counter = 3
");
      } else {
         if (GetValueInteger("schlafen_gehen_counter")==3){
            FS20_SetIntensity(59840, 0, 120); // Lichtschlauch auf der Treppe runter fahren
            FS20_SwitchMode(33605, False); // Schlafzimmer Lampe ausschalten
            SetValueInteger("schlafen_gehen_counter",0);
            IPS_SetScriptTimer($IPS_SELF,0);
            SetValueBoolean("gehen_schlafen_trigger",false);
            if ($debug) fwrite($handle,"    counter = 0
Und Ende
");
         } // counter 3
      } //counter 2
   } //counter 1
}// timerevent
if ($debug) fclose($handle); // close file
?>

ok : probiers jetzt mal und suche nach die c:\schlafen.txt file

Ich mag es wenn es ‚hintergrund‘-scripte gibt das ich die irgendwie verfolgen kann… deshalb diese ganze geschichte mit dieser


if ($debug) fwrite($handle,"text-ausgabe");

so erfasst man was los ist…

Also Viel gluck und bei probleme einfach melden

Hallo Ihr beiden.

Ich möchte mich mal beteiligen. Das angesprochene Problem, das die Schlafzimmerlampe erst nach dem verlöschen der Lichtschlauches ausgeht, kann man mit dieser Variante aber immer noch nicht lösen. Die müsste in sich in dieser Fassung genau wie beim anfänglich beschriebenen Problem verhalten.

Um besser zu verstehen warum, möchte ich nur mal kurz die Funktionsweise des Dimmers ansprechen.
Der von IPS-Befehl

FS20_SetIntensity(59840, 0, 120); // Lichtschlauch auf der Treppe runter fahren 

dimmt den Verbraucher in 120 Sekunden auf 0. Das bedeutet allerdings, das IPS nur den Befehl an den Dimmer absetzt. Ums Dimmen und den zeitlichen Ablauf kümmert der sich ganz allein.
Für IPS dauert also der Befehl nicht 120s sondern nur ein paar Millisekunden.

Daher denke ich, es wäre das beste, die von Fredje vorgeschlagene Methode weiter zu verfolgen und einen vierten Schritt einzubauen, mit einem Timerwert von 120s.

Aber aufpassen:
die Befehle

SetValueInteger("schlafen_gehen_counter",0); 
IPS_SetScriptTimer($IPS_SELF,0);

müssen dann natürlich in den letzten Schritt. :wink:

Gruß
Fabian

Möchte jetzt nicht diskutieren … das script ist so-wie-so schon uberkill fur das problem … habe es geschrieben um unseren newbie (gut gemeint - komme nicht mer auf deinem nahmen) etwas mehr wie FS20_SetIntensity bei zu bringen.

Ok ich gebe zu : vielleicht etwas zu schwer fur dem anfang … aber wenn das schafft … offnet sich eine ‚ich-denke-in-processe‘ welt und hilft um mehr und besser ihre fragen an die programmier-sprache an zu passen.

und ok Fabian,
du hasst recht … ein 4-er schrit braucht man um des ablaufs des script (ich hasse deutsch) besser ware : den ablauf des scriptes ?? grrrr :mad: exact an deuten zu können.

Aber es gibt noch ein macken die unserem freund entdecken wird:


FS20_SetIntensity(59840, 0, 120); // Lichtschlauch auf der Treppe runter fahren 
            FS20_SwitchMode(33605, False); // Schlafzimmer Lampe ausschalten

Der wird im dunkeln sitzen wenn sein treppe noch beleuchtet ist. Oder er pinkelt nach 6 minuten noch mal … oder der schläft in das treppe-haus :smiley:

Grusse,
Fredje

PS: es gibt keine ideale scripte … jedem macht es anders

Hallo!
Erstmal vielen dank @GGGss für deine (Echt) große hilfe.
Bin ohne Profis wie ihr es seid echt aufgeschmissen.
Werde das Script morgen mal probieren.

Auch danke an @prof für deine Erklärung, was das eine oder andere Befehl überhaupt tut.
Du hast recht, ich habe gedacht, das wenn ich dem "Lichtschlauch 120 sek. zeit gebe, das eigentlich dann erst das andere Script Startet. Das war wohl ein satz mit X.
Ich denke aber auch, wenn ich GGGss sein Scipt erstaml verstanden habe, das es dann warscheinlich leiter sein wird, das nächste mal selbst Hand an zu legen.
Wie schon gesagt, werde es morgen mal ausprobieren.
(Ach wieso Morgen, ist ja eigentlich schon Heute 03:13 Uhr)
OK, ich glaube bevor ich das Script tatsächlich mal näher unter die Lupe nehmen kann, benötige ich erstmal etwas schlaf.
Vielen dank, und ich melde mich.
Gruß
Xanon

jaja, man sagt ja auch lernen durch Schmerzen, äh Erfahrung… :stuck_out_tongue:

@GGGss
Hallo!
Hier das Ergebniss.
Also ich habe jetzt folgendes gemacht:
Mein Script komplett gelöscht.
Ein neues Script erstellt, mit dem Namen: „schlafen_gehen_script“
Habe nun dein geschriebenes Script von dieser Seite in mein gerade erstelltes leere Script kopiert.
Dann bin ich auf „Events“ gegangen und habe einen rechts klick auf „OnChange“ gemacht und dann auf Add Variable.
Nun wieder einen rechts klick und auf „Add Variable“
Hier nun den Namen „schlafen_gehen_trigger“ und den Type „Boolean“ angegeben.
Dann erstmal das Script gespeichert (Disketten Symbol".

<?
/*


IP-SYMCON Event Scripting


File : schlafen_gehen_script.ips.php
Trigger :
Interval :
*/
SetValueBoolean(„schlafen_gehen_trigger“,true); //-> simuliere knopf druck
$IPS_SELF=„test“; //-> geht nur mit die laetzte offentliche version
//-> wenn fertig mit debuggen diese zeile kommentieren //

//Debug : beim ‚Execute‘ drucken kommt ein log-file raus
$debug = true; //-> Auf false setzen wenn kein log-file gewunscht
$timer = 1; //in debugging zeit verkurzen x * $timer normal : 60 (secunden)

//einrichten des log-files
$logfilepath="/schlafen.txt"; // dieser file steht auf ‚c:‘
if ($debug) {
$handle=fopen("$logfilepath", „a“);
if (!$handle){
// error cannot open file
echo("******* ERROR: Cannot open file ‚$tempfilepath‘
");
}
}

if ($IPS_SENDER==„Variable“ || $IPS_SENDER==„Execute“){
// ausfuhren durch die ‚schlafen_gehen_trigger‘ variable oder execute
if (GetValueBoolean(„schlafen_gehen_trigger“)) { //„schlafen_gehen_trigger“ ist der var die triggert und nur bei true schalten
TTS_Speak(48637,„Nacht Modus wurde Aktiviert!“);
SetValueInteger(„schlafen_gehen_counter“,1);
IPS_SetScriptTimer($IPS_SELF,5*$timer);
if ($debug) fwrite($handle,"Proc started : counter = 1
„);
}
}
if ($IPS_SENDER==„TimerEvent“){
if (GetValueInteger(„schlafen_gehen_counter“)==1){
FS20_SetIntensity(52675, 0, 10); // TV Wandbeleuchtung runter fahren
FS20_SetIntensity(46339, 0, 10); // Tischbeleuchtung runter Fahren
SetValueInteger(„schlafen_gehen_counter“,2);
IPS_SetScriptTimer($IPS_SELF,15*$timer);
if ($debug) fwrite($handle,“ counter = 2
„);
} else {
if (GetValueInteger(„schlafen_gehen_counter“)==2){
FS20_SwitchMode(33605, True); // Schlafzimmer Lampe einschalten
FS20_SetIntensity(35244, 0, 30); // Stehllampe runter fahren
SetValueInteger(„schlafen_gehen_counter“,3);
IPS_SetScriptTimer($IPS_SELF,5*$timer);
if ($debug) fwrite($handle,“ counter = 3
„);
} else {
if (GetValueInteger(„schlafen_gehen_counter“)==3){
FS20_SetIntensity(59840, 0, 120); // Lichtschlauch auf der Treppe runter fahren
FS20_SwitchMode(33605, False); // Schlafzimmer Lampe ausschalten
SetValueInteger(„schlafen_gehen_counter“,0);
IPS_SetScriptTimer($IPS_SELF,0);
SetValueBoolean(„gehen_schlafen_trigger“,false);
if ($debug) fwrite($handle,“ counter = 0
Und Ende
");
} // counter 3
} //counter 2
} //counter 1
}// timerevent
if ($debug) fclose($handle); // close file
?>

Jetzt bin ich auf die Registerkarte „Variables“ in IPS gegangen.
Auch hier einen rechts klick und auf „Add Variable“
Nun den Namen :„schlafen_gehen_counter“ eingegeben und den Type:„Integer“ und OK.
Nun wieder zurück zur Registerkarte „Event Scripts“, klick auf „Execute“

Er sagt: „Nacht Modus wurde aktiviert!“… Aber danach passiert nichts mehr.
(Auch keine Fehlermeldung)
Bin dann auf C: gegangen um mir mal die Log datei (schlafen.txt) anzusehen.
Aber da steht nur drin: „Proc started : counter = 1“
und das wars.
Keine Lampe ausgegangen, einfach nichts passiert.
Was habe ich fasch gemacht?
Zur info: Meine IP-Symcon Version ist die : 1.21 , Build 30
Gruß
Xanon

Nachtrag:
Muß nicht vielleicht die „schlafen_gehen_counter“ Variable noch irgendwie integriert werden?

Hi

Wiso wird der Lampe nicht im ersten Schritt schon mitgeteilt wann sie sich wieder ausschalten soll?


<?
// Gerät mit der InstanceID 44007 für 120 sekunden einschalten
FS20_SwitchDuration(44007, True, 120);
?>

Gruss Patrik

@kirtapatrik
Vielen dank, diesen Befehl habe ich gesucht.
Nun geht es auch mit meinem 8zeiler.
SUPER. Vielen Dank!
Gruß
Xanon

Ich nochmal.
Klappt so weit echt gut.
Aber eine Frage habe ich noch.
Wie kann ich es jetzt noch hin bekommen, das er mir unter Variables auch anzeigt, das die Geräte aus sind?
Denn wenn ich mein jetziges Scipt benutze, läßt er alle auf True, die zu dem Zeitpunkt auf True waren.

<?
/*


IP-SYMCON Event Scripting


File : Schlafen_gehen.ips.php
Trigger :
Interval :
/
// ffnen der Sounddatei fr den Player
//
** Slash beachten! *** Kein Backslash verwenden
DXMedia_Open(27787, „D:/Sprachbesttigung/Nacht Modus wurde Aktiviert!.wav“);
// Abspielen der Sounddatei beginnen
DXMedia_Play(27787);
// Lautstrke auf 40% setzten
DXMedia_SetVolume(27787, 100);

IPS_Sleep(5000);
FS20_SetIntensity(52675, 0, 10); // TV Wandbeleuchtung runter fahren
FS20_SetIntensity(46339, 0, 10); // Tischbeleuchtung runter Fahren
IPS_Sleep(15000);
FS20_SwitchDuration(33605, True, 120);

FS20_SetIntensity(35244, 0, 30); // Stehllampe runter fahren
IPS_Sleep(5000);
FS20_SetIntensity(59840, 0, 90); // Lichtschlauch runter fahren

?>

Mit dem Befehl :

FS20_SwitchMode(49643, FALSE);

oder
Mit dem Begehl:

SetValueBoolean(„Alles_Aus“,false);

schaltet er die Beleuchtung vorzeitig aus.
Also er überspringt die Zeit dann.
Er soll aber erst die Variables auf false setzten, wenn das Script durch gelaufen ist.
Gibt es dafür auch einen Befehl?
Also Value auf False setzten ohne ein Script auszuführen?
Gruß
Xanon

Du kannst zu jeder Zeit die Variablen manuell auf false setzen:

SetValueBoolean("Switchvar", false);

Dies hat keine Auswirkungen auf den Zustand des FS20. Die Vars sind eher so eine Art „Zustandsinfo“.

Allerdings kann man das auch nach der abgelaufenen Zeit, jeweils vor dem nächsten Schritt tun, dann passt’s auch zur Laufzeit.

Vielen Dank!
Also einfach nur

SetValueBoolean(„Switchvar“, false);

hinten ran setzten, bzw. in die nächste Spalte unter der, die aus sein soll und das wars?
Oder muß ich ihm nun noch sagen wer aus gehen soll?
Gruß
Xanon

Nee, nee… Das ändert nur die Variable…sofern diese nichts triggert (ein Script anschubst) wird damit nichts geschaltet…

Toni

Habe es probiert einfach unter die Steckdose zu setzen, welche war ausgeschatet werden soll.

<?
/*


IP-SYMCON Event Scripting


File : Schlafen_gehen.ips.php
Trigger :
Interval :
/
// ffnen der Sounddatei fr den Player
//
** Slash beachten! *** Kein Backslash verwenden
DXMedia_Open(27787, „D:/Sprachbesttigung/Nacht Modus wurde Aktiviert!.wav“);
// Abspielen der Sounddatei beginnen
DXMedia_Play(27787);
// Lautstrke auf 40% setzten
DXMedia_SetVolume(27787, 100);

IPS_Sleep(5000);
FS20_SetIntensity(52675, 0, 10); // TV Wandbeleuchtung runter fahren
SetValueBoolean(„Switchvar“, false);
FS20_SetIntensity(46339, 0, 10); // Tischbeleuchtung runter Fahren
SetValueBoolean(„Switchvar“, false);
IPS_Sleep(15000);
FS20_SwitchDuration(33605, True, 120);

FS20_SetIntensity(35244, 0, 30); // Stehllampe runter fahren
SetValueBoolean(„Switchvar“, false);
IPS_Sleep(5000);
FS20_SetIntensity(59840, 0, 90); // Lichtschlauch runter fahren
SetValueBoolean(„Switchvar“, false);

?>

Bekommse stattdessen eine Fehlermeldung:

<br />
<b>Warning</b>: Unable to locate IPSVariable: Switchvar in <b>C:\Programme\IP-SYMCON\scripts.currentscript</b> on line <b>20</b><br />

Was mache ich denn schon wieder falsch? :mad:
Gruß
Xanon

Nachtrag:
Kann man nicht einfach sagen:

SetValueBoolean(„Switchvar Wohnzimmer_Bel“, false);
oder so ähnlich?

IPS-Variablen sind die, die du in IPS unter dem PUnkt „Variables“ anlegst und verwaltest. Er kennt Switchvar nicht. Hast du sie richtig geschrieben?

Ansonsten schaut das script schon garnicht so verkehrt aus…

Edit:

BegriffenHabUndMitDerHandAnDenKopfSchlag Prof hat sicherlich gemeint, dass du an dieser Stelle die „Switchvar“, also den namen der IPS-Variable, die du „switchen“ willst, einsetzen sollst… :rolleyes:

Toni