Schaltvorgänge durch zeit beienflussen!

@obicom

Weil nach 29 Sekunden (oder wieviel auch immer?) PHP behauptet der Thread sei nicht zurückgekehrt (abgestürzt). Wie Olli grade beschrieben hat kann man die Zeit zwar verlängern aber er hat auch sehr deutlich geschrieben warum man das nicht machen sollte. Und ich sehe das, grade bei Programmier-Anfängern, genauso.

Wenn man weiss was man tut und dann anfängt zu tricksen ist das etwas anderes. Dann muss man aber auch selber damit klarkommen und kann nicht ankommen und meinen das Produkt (IPS) würde nicht richtig laufen, sich seltsam benehmen oder gleich Bugs reklamieren wo im endeffekt keine sind. Und diese Gefahr besteht, denn diesen Thread liest bestimmt nicht nur der xanon.

Meine Meinung: Finger weg von solchen PHP internas - es sei denn man weiss was man tut. Es gibt einen anderen, besseren, sauberen, sicheren Weg. Den sollte man gehen.

Toni

Die „Stärke“ stellst du mit FS20_SetIntensity ein. Wie du die Funktion benutzt findest du in der Befehlsreferenz.

Toni

Danke Tonic1024
Wie man die Intensität einstellt weiss ich ja, aber wie kann ich nun die Zeit zwischen „Willkommen_Zuhause“ und „Alles_An_Aus“ beeinflussen?
wenn ich kein Sleep setzten will bzw. kann?

„Einschalten & Hochdimmen auf 16 -> 3min. warten, anders Script Triggern „Alles_an_aus“, welches die Flur beleuchtung auf intens 5 runter dimmt“.

Gruß
Xanon

Hast es mal so versucht? :confused:

Steht übrigens auch in diesem Thread im Beitrag 22, nur dass du statt dem Hilfsscript dein Alles_an_aus startest und dort den Timer zurücksetzt. Auch hier kannst du, wie beschrieben, die beiden Scripte in einen zusammenfassen.

Toni

@Tonic1024
Habe ich wohl irgenwie überlesen :rolleyes:
Werde es mal probieren mit Switchmode und FS20_SetIntensity inkl. Timer.
Werde mich wieder melden wenn ich es hinbekommen habe, oder auch nicht :wink:
Danke erstmal!
Muß nun auch erstmal zur Arbeit.
Damit ich nächsten Monat meine Hausautomatition aufrüsten kann :smiley:
Gruß
Xanon

@Xanon

Hi,

ja wir kennen uns auch aus dem MCE Forum. Ich denke das sich viele „Pleibling-Jünger“ hier rumtreiben :wink:

Wie du ja weißt, bin ich auch Anfänger auf dem Gebiet. Daher hätte ich erwartet, das eine Einschränkung des Sleep Befehls in der Dokumentation erwähnt worden wäre. Dort steht aber nichts davon. Wie soll der „Normalsterbliche“ denn auf sowas kommen? Mir wächst doch kein Gras aus den Taschen … :wink: Oder der Syntax sollte dann mehr als 30.000 als Wert nicht akzeptieren.

An der Doku wäre wirklich einmal z arbeiten… das Problem ist mir in der kurzen Zeit jetzt schon min. 3x begegnet…

Grüße, Obi

Mir fällt dazu aber gerade noch ein … wie wäre es dann mit einer einfachen Schleife (Var=Counter) der den Befehl IPS_SLEEP(1000) x-mal wiederholt?

also z.B. theoretisch (… denn ich kann ja kein „php“)

For counter= 1 to 30
IPS_SLEEP(1000)
Next counter

oder …

if counter <30
counter=counter+1
IPS_SLEEP(1000)
Else
counter=1

Somit solltest du eine längere Wartezeit ohne Fehlermeldung realisieren können.

Grüße, Obi

Du hast das Problem nicht erkannt…

Das Problem ist nicht IPS_Sleep sondern PHP. PHP erwartet, dass das Script nach X Sekunden abgearbeitet ist oder es geht davon aus, dass es abgestürzt ist - was genaugenommen auch gut ist so. Sollten dir im Laufe eines jahres alle Threads abgestürzt sein (waren es 10, die du zur verfügung hast?) käme das einem Rechner-Absturz gleich. PHP beugt dem vor. Auch im PHP Manual steht nichts von der Begrenzung, denn die ist ja, wie Olli schon sagte nicht Fix.

Wo der genaue Unterschied zwischen Sleep und IPS_Sleep liegt kann dir paresy sagen, aber dass der Thread blockiert steht in der WIki.

Die Wiki ist ein Offenes Handbuch. Es steht dir Frei dort Änderungen vorzunehmen.

Toni

Um die Zusammenhänge klar zu stellen:

Die Befehle Sleep() und auch IPS_Sleep() haben keine Zeitlimitation! Insofern gehört das auch nicht in die Dokumentation zu diesen Befehlen. Die Limitation kommt von PHP und beschränkt die maximale Ausführungszeit eines Skriptes - wenn du ein Skript schreibst, auch ohne Sleep zu benutzen, welches länger als 30 Sekunden läuft (Standardkonfiguration) dann wird das Skript nach 30 Sekunden terminiert.

Das ist auch kein Fehler oder eine Limitation von PHP - das ist bewusst so gewollt um die prinzipielle Lauffähigkeit von Servern (ursprünglich Webservern) zu gewährleisten auch wenn PHP-Skripte, aus welchem Grund auch immer, anfangen zu ‚spinnen‘.

Wer jedoch weiss was er macht und warum er es macht hat die Möglichkeit dieses Sicherheitsfeature (max_execution_time) von PHP zu konfigurieren - und diese Konfiguration hat wiederum nichts mit IPS zu tun denn das ist PHP. Die Dokumentation von PHP ist wiederum unter www.php.net nachzulesen.

Unabhängig davon gibt es noch zahlreiche weitere Einstellungen von PHP die ggf. eigene Projekte im Laufzeitverhalten beeinflussen können. Auch diese sind auf den PHP-Seiten dokumentiert und u.a. hier http://de.php.net/manual/de/ini.php gelistet.

Gruss,
Olli

Das hast du schön gesagt :smiley:

Hallo @ all
Aslo ich habe jetzt nochmal das Script umgeändert!

<?
/*


IP-SYMCON Event Scripting


File : Nachhause_kommen.ips.php
Trigger :
Interval :
*/

//Script einmalig für 2 min ausführen
if ($IPS_SENDER == „TimerEvent“)
{
SetValueBoolean(„Alles_AN_Aus“, true);
SetValueBoolean(„Nachhause_kommen“, false);
IPS_SetScriptTimer(„Nachhause_kommen“, 0); // nich vergessen…
}
else
{
DXMedia_Open(27787, „D:/Sprachbestätigung/Willkommen zuhause.wav“);
// Abspielen der Sounddatei beginnen
DXMedia_Play(27787);
// Lautstrke auf 100% setzten
DXMedia_SetVolume(27787, 100);
IPS_Sleep(3000);

FS20_SetIntensity(52675, 10, 15); // TV Wandbeleuchtung hoch fahren
FS20_SetIntensity(46339, 16, 15); // Tischbeleuchtung Hoch Fahren
FS20_SetIntensity(59840, 16, 15); // Lichtschlauch hoch fahren

$dauer=120; // sekunden
FS20_SetIntensity(35244, 16, 2, $dauer); // InstanzID der Stehlampe im Flur Beleuchtung
IPS_SetScriptTimer(„Nachhause_kommen“, $dauer);

}

?>

Ich bekomme aber nun folgende Fehlermeldung.

<br />
<b>Warning</b>: Wrong parameter count for fs20_setintensity() in <b>C:\Programme\IP-SYMCON\scripts.currentscript</b> on line <b>32</b><br />

In Zeile 32 steht dies:

FS20_SetIntensity(35244, 16, 2, $dauer); // InstanzID der Stehlampe im Flur Beleuchtung

Ich errinere mich nun auch wieder, das ich das so auch schon mal probiert hatte und genau den selben fehler hatte.
Scheinbar kann ich nicht

FS20_SetIntensity(35244, 16, 2, $dauer);
ausführen und ihm gleichzeitig sagen, wie lange und auf welche intens er schalten soll.
Oder habe ich nur irgendwo ein :,.,_ oder so etwas vergessen?
Gruß
Xanon
P.S.

hat die Möglichkeit dieses Sicherheitsfeature (max_execution_time) von PHP zu konfigurieren

Werde auf keinen fall etwas an der PHP konfiguration ändern, denn dann stellt sich mir jedes mal, wenn ein Skript nicht funktioniert die Frage: Liegt das vielleicht daran, das ich an dem php etwas geändert habe?

Wenn du diese beiden Zeilen aus deinem Script mal vergleichst und den Tip bekommst, dass die Anzahl der Parameter in der zweiten Zeile nicht stimmt, was fällt dir dann auf?


FS20_SetIntensity(59840, 16, 15);
FS20_SetIntensity(35244, 16, 2, $dauer);

Toni

OK, :confused: :slight_smile: :confused:
Kann es zur zeit leider nicht testen, da der Server gleichzeitig der MediaCenter ist, an dem mein frauchen Fern sieht :rolleyes:
Also mit anderen Worten "Access Denied "

Wenn du diese beiden Zeilen aus deinem Script mal vergleichst und den Tip bekommst, dass die Anzahl der Parameter in der zweiten Zeile nicht stimmt, was fällt dir dann auf?

PHP-Code:
FS20_SetIntensity(59840, 16, 15);
FS20_SetIntensity(35244, 16, 2, $dauer);

Also wenn ich dich Toni richtig verstanden habe, kann ich hier nur 3 Parameter eintragen. (1.InstanceID, 2.Helligkeit des Lichtes und 3. durch „$dauer“ Zeit des eingestellten Sciptes.
Ist das soweit richtig?

Nun stellt sich mir aber noch die Frage:
Was sagt der Befehl?
Setzte Instance innerhalb von 16 sek. auf die vorher benutze Helligkeit. Wenn also vorher die intens bei 6 war geht sie auch nur auf 6?
Also sagen wir mal dieser hier:
FS20_SetIntensity(35244, 16, $dauer); //Springe sofort auf 100% Helligkeit und schaue nach, wie lange du so bleiben sollst?
oder
FS20_SetIntensity(35244, 2, $dauer); //Springe innerhalb von 2 Sek. auf deine letzte, bekannte, eingestellte Helligkeit und schaue nach, wie lange du so bleiben sollst.
Sorry, ich würde es zu gern ausprobieren.
Gruß
Xanon
P.s. Kennst du ein gutes Buch, welches ich mir zulegen sollte?
Hatte gestern eins in der Hand was glaube ich „PHP 6 für Dummies“ heißt.
Kosten 24,95 Eur.
Kann das jemand empfehlen?

So, habe es nun mal ausprobieren können.
Habe zwar nun keine Fehlermeldung mehr. Danke an Tonic1024, aber dafür gibt es jetzt ein anderes Problem, welches ich mir schon fast gedacht hatte.

Durch den Befehl:

$dauer=120; // sekunden
FS20_SetIntensity(35244, 16, $dauer); // InstanzID der Stehlampe im Flur Beleuchtung
IPS_SetScriptTimer(„Nachhause_kommen“, $dauer);

wird zwar die Beleuchtung im Flur hoch gefahren, aber in der vor eingestellten Zeit „$dauer=120;“ also in der Zeit von 2 Min. wird das Licht langsam von 0 auf 16 hoch gedimmt.
Und danach durch das „Normal_An_Aus“ Skript getriggert.

Ich will doch aber nicht, das das Licht im Flur 2 Min. braucht um auf volle Beleuchtung zu kommen, sondern
Ich will, das wenn der Sender gedrückt wird, das Licht sofort auf volle Beleuchtung springt und es so für 2 Min. hält. und erst dann das „Normal _An_Aus“ Skript getriggert wird. :frowning: :confused: :frowning:
Jemand eine Idee, ob und wie man das ändern kann?
Gruß
Xanon

Ich habe den Eindruck du hast weder die Befehlsreferenz noch die kleine PHP einleitung gelesen, hab ich recht?

IPS_SetScriptTimer
FS20_SetIntensity
Tonis kleines Programmierhandbuch

Toni

@Xanon

da muss ich Tonic beipflichten. Du „bastelst“ doch mindestens schon so lange an deinen Scripten wie ich. Langsam solltest du zumindest „die Grundlagen“ verinnerlicht haben. Manchmal hilft (mir) besonders „try&error“. Du kannst doch nicht erwarten, das alle anderen hier selbst „kleinste“ Probleme für dich lösen.

Also: Mit -> FS20_SetIntensity(35244, 16, $dauer);
setzt du doch genau das was du nicht willst, "In 120sek. auf Wert 16 hochfahren)

siehe ->
http://www.ipsymcon.de/wiki/index.php/FS20_SetIntensity

deshalb nutze ->
// Gerät mit der InstanceID 35244 einschalten.
FS20_SwitchMode(35244, True);

Grüße, Dirk

P.S.: Nur wer sich selber hilft, dem wird geholfen … hab ich mal gelesen !

@Tonic1024: Ich hab mir mal erlaubt dein kl. Programmierhandbuch in eine PDF zu konvertieren und hab diese angehangen.
Ich denke, so kann es sich jeder ausdrucken und unter sein Kopfkissen legen … :wink:

Hatte gestern eins in der Hand was glaube ich „PHP 6 für Dummies“ heißt.
Kosten 24,95 Eur.
Kann das jemand empfehlen?

Ich empfehle dir wirklich erst die IPS WIKI durchzulesen. Ausserdem gibt es genug Material zum Lesen online, und Toni hat dir schon genug vorgeschlagen. Im Buch für Dummies steht nicht mehr drin, als du auch im Wäb lesen kannst ! Wenn du es unbedingt ‚in der Hand‘ willst, dann kannst du es ja auch ausdrucken.

Im Gegenteil. Alles was „IPS_Sowiso“ und „FS20_Dingsbums“ heisst wirst du nur hier in der Dokumentation (Wiki), genauergesagt in der Befehlsreferenz, finden. Das sind spezielle IPS-Befehle und kein PHP. Im „kleinen Programmierhandbuch“ ist der Unterschied erklärt.

Ich habe mir alle Mühe gemacht, keinen trockenen Abriss davon zu machen. Versuchs ruhig mal damit.

Toni

Ich hatte dir ja geschrieben, dass du SetIntensity benutzen sollst. Das ist auch soweit richtig. ABER $dauer gibt nicht deine 2 Minuten an sondern in welcher Zeit der Dimmer hochdimmt. Also wie lange es dauert bis er auf 100% ist. Deine zwei Minuten, hatte ich geschrieben, sollst du mit einem Timer realisieren. Hargenau so wie du es mit deinem Schlafen_gehen Script gemacht hast.

Toni

… dann siehe Dir mal auch dies an: http://www.ipsymcon.de/forum/showthread.php?t=2619
Hier gibt es auch „(if then else)“ > unter „Temp_Vergleich“
Bein Fragen bitte unter dem o.g. Thema Fragen.

MST