Software oder Script ?

Hallo,

irgendwie fabge ich an ein wenig zu verzweifeln:

Ganz einfaches script, das auch tadellos funktionniert:

$move = GetValueBoolean("FS20PIRI_LEVEL2_move_detect");
$switch_duration = 30; // Switchtime in seconds
$FS20S4U_PB = GetValueBoolean("FS20S4U_LEVEL2_PB_Light");

if ($FS20S4U_PB == False)
    {
     if  ($move == True)
          {
          IPS_SetScriptTimer("FLOOR_LEVEL2_LIGHT_RESET", $switch_duration);
          FS20_SwitchDuration(57602, True, $switch_duration);
          }
    }

if ($FS20S4U_PB == True)
    {
     FS20_SwitchMode(57602, True);
     SetValueBoolean("FS20PIRI_LEVEL2_move_detect", False); // keep PIRI quiet
    }

Es schaltet mein Licht auf dem Flur. Daneben gibt es noch einen Schalter, der wenn ich ihn einschalte, das Licht auch eingeschaltet bleibt.
Dann funktionniert das ganze tadellos…einen halben Tag lang, dann funktionnieren die PIRI´s ganz gut, nur die Befehle werden nicht mehr angenommen und verarbeitet. Ich muss dann IPS runterfahren und wieder firsch starten, dann läuft es wieder…einen halben Tag lang. Das kann ja nicht der Sinn der Sache sein, oder?

Jemand eine Idee was hier falsch läuft?

PS: Ist NICHT die BETA !

durch was wird dieses Script getriggert?

der Status vom PIRI bleibt erhlaten - d.h. wenn er mal eine Bewegung erkannt hat bleibt er true - du müsstest den dann manuell zurücksetzen.

Nee, der PIRI status wird ja im RESET script zurückgesetzt, das klappt alles.
Das Problem liegt woanders. Wenn ich IPS frisch starte von einem frisch gestarteten Computer , laufen alle scripte (die FS20 betreffen) tadellos. Nur so nach 1 bis 2 stunden geht dann nichts mehr. Gerade bin ich am PIRI vorbei gelaufen, kein Licht ging an. IPS läuft seit 1 Stunde erst. Nun habe ich bemerkt, dass 3 Minuten später (nachdem ich schon am Computer sass) das Licht erst anging, und dann nach der eingestellten Zeit wieder aus.

So, wo kommt diese gewaltige Zeitverzögerung her? Meine FHT´s sind ja in ordnung !

Das Script wird durch den PB (Push Button) und move_detect getriggert

Hast du irgendwelche Scripte die Zeitverzögernd wirken?

z.B. Wenn du das WebInterface 0.56 hast und zu viele Graphen, dann kann es sein, dass dein Rechner alle 15min für 2-3Minuten blockiert ist, wo er keine Scripte ausführen kann. (In der 0.7 ist das Problem behoben)

Grüße, paresy

Nee, eigentlich nicht. Das Webgraph habe ich nur testweise 2 Grafiken laufen.
Soeben trat das Phenomen wieder auf. Wenn ich am PIRI vorbei lief, gings wieder nicht. Doch diesmal habe ich genauer hingeschaut: Im Windows-Task-Manager lief die CPU auf 100% ohne Unterbrechung. Erst, nachdem ich dem kleinen PIRI script die Trigger wegnahm, fiehl die CPU auf Null zurück. Ich kann mir jedoch nicht erklären, das das Script sich selbst andaurend triggert?

Irgendwie muss ich mir da was einfallen lassen. Der Fehler liegt wohl bei mir

Im Kernel->Debug sieht man immer recht schnell, was so an Scripten ausgeführt wird oder wenn sich „Warteschlangen“ bilden…

Du kannst ja sonst einen Log ranhängen… dann kann ich mal reingucken :slight_smile:

Grüße, paresy

Danke dir. Ich werde mir das mal anschauen, und wenn ich nicht finde werde ich mal die Logs sammeln und anhängen

Hallo,

ich fuerchte, Du hast Dir irgendwo eine boese Schleife programmiert, in der Dein Script sicht totlaeuft. Normalerweise wuerde dann in diesem Fall Dein Rechner bis in Ewigkeiten verloren sein, bei PHP wird aber jedes Script nach einer bestimmten Zeit (in der php.ini festlegbar) zwangsweise abgebrochen. Das ist das sogenannte Script Timeout. Das koennte dann bei Dir die Ursache sein, dass es nach einer bestimmten Zeit auf einmal geht…

Gruss Torro

Ja klar, ich habe ein schleife. Hier ein Auszug aus dem Kernel-Debug:

12/1/2005 6:57:57 PM | DEBUG | ScriptThread | Executing Script: FLOOR_LEVEL1_LIGHT ~ Variable: FS20PIRI_LEVEL1_move_detect #
12/1/2005 6:57:57 PM | DEBUG | VariableManager | Variable: FS20PIRI_LEVEL1_move_detect (Boolean), Value: False
12/1/2005 6:57:57 PM | DEBUG | EventScripter | [Queued,Size=15] | Script: FLOOR_LEVEL1_LIGHT | Variable: FS20PIRI_LEVEL1_move_detect
12/1/2005 6:57:57 PM | DEBUG | ScriptThread | Executed Script: FLOOR_LEVEL1_LIGHT ~ Variable: FS20PIRI_LEVEL1_move_detect #
12/1/2005 6:57:57 PM | DEBUG | ScriptThread | Executing Script: FLOOR_LEVEL1_LIGHT ~ Variable: FS20PIRI_LEVEL1_move_detect #
12/1/2005 6:57:57 PM | DEBUG | VariableManager | Variable: FS20PIRI_LEVEL1_move_detect (Boolean), Value: False
12/1/2005 6:57:57 PM | DEBUG | EventScripter | [Queued,Size=15] | Script: FLOOR_LEVEL1_LIGHT | Variable: FS20PIRI_LEVEL1_move_detect
12/1/2005 6:57:57 PM | DEBUG | ScriptThread | Executed Script: FLOOR_LEVEL1_LIGHT ~ Variable: FS20PIRI_LEVEL1_move_detect #
12/1/2005 6:57:57 PM | DEBUG | ScriptThread | Executing Script: FLOOR_LEVEL1_LIGHT ~ Variable: FS20PIRI_LEVEL1_move_detect #
12/1/2005 6:57:58 PM | DEBUG | VariableManager | Variable: FS20PIRI_LEVEL1_move_detect (Boolean), Value: False
12/1/2005 6:57:58 PM | DEBUG | EventScripter | [Queued,Size=15] | Script: FLOOR_LEVEL1_LIGHT | Variable: FS20PIRI_LEVEL1_move_detect
12/1/2005 6:57:58 PM | DEBUG | ScriptThread | Executed Script: FLOOR_LEVEL1_LIGHT ~ Variable: FS20PIRI_LEVEL1_move_detect #
12/1/2005 6:57:58 PM | DEBUG | ScriptThread | Executing Script: FLOOR_LEVEL1_LIGHT ~ Variable: FS20PIRI_LEVEL1_move_detect #
12/1/2005 6:57:58 PM | DEBUG | VariableManager | Variable: FS20PIRI_LEVEL1_move_detect (Boolean), Value: False
12/1/2005 6:57:58 PM | DEBUG | EventScripter | [Queued,Size=15] | Script: FLOOR_LEVEL1_LIGHT | Variable: FS20PIRI_LEVEL1_move_detect
12/1/2005 6:57:58 PM | DEBUG | ScriptThread | Executed Script: FLOOR_LEVEL1_LIGHT ~ Variable: FS20PIRI_LEVEL1_move_detect #
12/1/2005 6:57:58 PM | DEBUG | ScriptThread | Executing Script: FLOOR_LEVEL1_LIGHT ~ Variable: FS20PIRI_LEVEL1_move_detect #
12/1/2005 6:57:58 PM | DEBUG | VariableManager | Variable: FS20PIRI_LEVEL1_move_detect (Boolean), Value: False
12/1/2005 6:57:58 PM | DEBUG | EventScripter | [Queued,Size=15] | Script: FLOOR_LEVEL1_LIGHT | Variable: FS20PIRI_LEVEL1_move_detect
12/1/2005 6:57:58 PM | DEBUG | ScriptThread | Executed Script: FLOOR_LEVEL1_LIGHT ~ Variable: FS20PIRI_LEVEL1_move_detect #
12/1/2005 6:57:58 PM | DEBUG | ScriptThread | Executing Script: FLOOR_LEVEL1_LIGHT ~ Variable: FS20PIRI_LEVEL1_move_detect #
12/1/2005 6:57:59 PM | DEBUG | VariableManager | Variable: FS20PIRI_LEVEL1_move_detect (Boolean), Value: False
12/1/2005 6:57:59 PM | DEBUG | EventScripter | [Queued,Size=15] | Script: FLOOR_LEVEL1_LIGHT | Variable: FS20PIRI_LEVEL1_move_detect
12/1/2005 6:57:59 PM | DEBUG | ScriptThread | Executed Script: FLOOR_LEVEL1_LIGHT ~ Variable: FS20PIRI_LEVEL1_move_detect #
12/1/2005 6:57:59 PM | DEBUG | ScriptThread | Executing Script: FLOOR_LEVEL1_LIGHT ~ Variable: FS20PIRI_LEVEL1_move_detect #
12/1/2005 6:57:59 PM | DEBUG | VariableManager | Variable: FS20PIRI_LEVEL1_move_detect (Boolean), Value: False
12/1/2005 6:57:59 PM | DEBUG | EventScripter | [Queued,Size=15] | Script: FLOOR_LEVEL1_LIGHT | Variable: FS20PIRI_LEVEL1_move_detect
12/1/2005 6:57:59 PM | DEBUG | ScriptThread | Executed Script: FLOOR_LEVEL1_LIGHT ~ Variable: FS20PIRI_LEVEL1_move_detect #
12/1/2005 6:57:59 PM | DEBUG | ScriptThread | Executing Script: FLOOR_LEVEL1_LIGHT ~ Variable: FS20PIRI_LEVEL1_move_detect #
12/1/2005 6:57:59 PM | DEBUG | VariableManager | Variable: FS20PIRI_LEVEL1_move_detect (Boolean), Value: False
12/1/2005 6:57:59 PM | DEBUG | EventScripter | [Queued,Size=15] | Script: FLOOR_LEVEL1_LIGHT | Variable: FS20PIRI_LEVEL1_move_detect
12/1/2005 6:57:59 PM | DEBUG | ScriptThread | Executed Script: FLOOR_LEVEL1_LIGHT ~ Variable: FS20PIRI_LEVEL1_move_detect #
12/1/2005 6:57:59 PM | DEBUG | ScriptThread | Executing Script: FLOOR_LEVEL1_LIGHT ~ Variable: FS20PIRI_LEVEL1_move_detect #
12/1/2005 6:57:59 PM | DEBUG | VariableManager | Variable: FS20PIRI_LEVEL1_move_detect (Boolean), Value: False
12/1/2005 6:57:59 PM | DEBUG | EventScripter | [Queued,Size=15] | Script: FLOOR_LEVEL1_LIGHT | Variable: FS20PIRI_LEVEL1_move_detect
12/1/2005 6:57:59 PM | DEBUG | ScriptThread | Executed Script: FLOOR_LEVEL1_LIGHT ~ Variable: FS20PIRI_LEVEL1_move_detect #
12/1/2005 6:57:59 PM | DEBUG | ScriptThread | Executing Script: FLOOR_LEVEL1_LIGHT ~ Variable: FS20PIRI_LEVEL1_move_detect #
12/1/2005 6:58:00 PM | DEBUG | VariableManager | Variable: FS20PIRI_LEVEL1_move_detect (Boolean), Value: False
12/1/2005 6:58:00 PM | DEBUG | EventScripter | [Queued,Size=15] | Script: FLOOR_LEVEL1_LIGHT | Variable: FS20PIRI_LEVEL1_move_detect
12/1/2005 6:58:00 PM | DEBUG | ScriptThread | Executed Script: FLOOR_LEVEL1_LIGHT ~ Variable: FS20PIRI_LEVEL1_move_detect #
12/1/2005 6:58:00 PM | DEBUG | ScriptThread | Executing Script: FLOOR_LEVEL1_LIGHT ~ Variable: FS20PIRI_LEVEL1_move_detect #
12/1/2005 6:58:00 PM | DEBUG | VariableManager | Variable: FS20PIRI_LEVEL1_move_detect (Boolean), Value: False
12/1/2005 6:58:00 PM | DEBUG | EventScripter | [Queued,Size=15] | Script: FLOOR_LEVEL1_LIGHT | Variable: FS20PIRI_LEVEL1_move_detect
12/1/2005 6:58:00 PM | DEBUG | ScriptThread | Executed Script: FLOOR_LEVEL1_LIGHT ~ Variable: FS20PIRI_LEVEL1_move_detect #

logfile 20MB gross :eek:

Nur, wieso läuft diese Schleife sich tot. Das script ist doch sehr einfach. PIRI an, Licht an für Zeit, Licht aus. So, warum läuft der sich also tot !?
Ich muss mir ein neues Konzept ausdenken.
Der Grundgedanke ist einfach der: Ich habe einen Taster, wenn ich den betätige, der PIRI einfach ignoriert wird, wenn Taster aber auf False, dann schaltet PIRI.
Es geht einfach drum, dass jeder in de Familie einfach das Licht vergisst auszumachen im Flur. (Chronische Krankheit! ) Doch wenn meine Frau grad den Flur wischen möchte, sollte sie mit dem Schalter das Licht einschalten können und dann eingeschaltet bleiben, bis sie manuell wieder ausschaltet.

ok, ich habe es:

Diese Zeile ist Gift für das Script:

if ($FS20S4U_PB == True)
    {
     FS20_SwitchMode(57602, True);
     SetValueBoolean("FS20PIRI_LEVEL2_move_detect", False); // keep PIRI quiet

Wenn jetzt der PB auf TRUE steht, und dann jemand am PIRI vorbei läuft, dann setzt der PB ihn wieder auf False (was ja auch gewollt ist) doch leider triggert der wiederum das script da diese Move_detect- variable als Event Trigger eingesetzt ist und schon haben wir die Schleife. hmp ! :mad:

Das ist eine der ganz fiesesten Endlos-Schleifen, die man sich bauen kann… Weil man sie im Code nicht nachvollziehen kann.

Als Anfänger ganz allein gefunden? Respekt… Wie lange gesucht? :smiley:

Toni

jaja, blutiger PHP anfänger. :rolleyes:

In SPS Steuerungen kann man sich keine Schleife einfangen, da man immer nur vorwärts springen kann, nicht rückwärts.

Na, ein paar Tage habe ich schon gebraucht, bis ich richtig bemerkt hatte, dass da was nicht stimmt, vor allem die 20MB logfile hatte es in sich :smiley: und es stand immer dieselbe Zeile drin. Nun, Problem erkannt, Problem gebannt, obwohl die Aufgabe zwar einfach ist.

Funkwandsender: Adresse 2131
Funkschalter : Adresse 2131, also identisch !
Das habe ich so gewählt, das im Falle von Computerausfall elementare Steuerungen weiterhin funktionnieren.

Hinzu kommt jetzt ein PIRI: Adresse 2132

Aufgabe: Wenn Schalter auf False, dann soll PIRI übernehmen, und bei Detect 30 Sekunden Licht einschalten. Wenn Schalter auf ON, dann PIRI ignorieren und Licht dauerhaft brennen bis zum manuellen Ausschalter.
Klingt einfach, ist es aber nicht. Der entscheidende Punkt ist: Wie krieg ich den PIRI ruhig gestellt und auch seine Status-Variable auf False halten, wenn ich Licht über Schalter betätige??
Und hier habe ich den endscheidenen Fehler gemacht: Ich habe die Variable jedes mal wieder durch die Abfrage des Drückers (LIchtschalter) auf False zurückgesetzt. Da das Script aber genau durch diese Variable auch getriggert wird, kam eine endlos Schleife ingange.

Hallo,

ich geb auch mal meinen Senf als SPS Programmierer dazu :rolleyes:

Wie wäre es, wenn du das PIRI==FALSE einfach nach Ablauf der 30 Sekunden Licht und bei „Schalter AUS“ machst?
Dann musst du natürlich bei „Schalter EIN“ auch PIRI==TRUE setzen.
Im PIRI Auswertescript musst du die Schaltervariable noch „verunden“ damit du den Timer nicht auslöst.
Dann steht der PIRI in dieser Zeit halt bei TRUE. Darf er ja, ist ja schon geschaltet. :wink:
Nach Ablauf der Zeit bzw. Ausschalten wird der PIRI wieder mit PIRI==FALSE scharf geschaltet.

Da ich selber keinen PIRI habe, hab ich vielleicht aber auch ein Verständnisproblem :stuck_out_tongue:

Vielleicht hats ja geholfen.

P.S.: Auch mit SPS’en kann man solche Schleifen bauen. Man braucht nur einen Kommunikationspartner mit variabler Antwortzeit und etwas Pech :wink:

cu…

Ja, aber da hat man gott sei dank einen Watchdog !

Ich habe das Problem folgendermassen gelöst:

Mit 3 kleinen Scripts, und es funktionniert jetzt tadellos:

Script 1: FLOOR_LEVEL0_LIGHT_PB

$FS20S4U_PB = GetValueBoolean("FS20S4U_LEVEL0_PB_Light");

// Initialize PIRI when Push Button goes False
if ($FS20S4U_PB == False) SetValueBoolean("FS20PIRI_LEVEL0_move_detect", False);

Trigger event: FS20S4U_LEVEL0_PB_Light (ist der Drücker, wobei ein doppelter mit 2 Kanal True und False nicht SWAP ! FS20S4U

Script 2: FLOOR_LEVEL0_LIGHT_PIRI_RESET

$FS20S4U_PB = GetValueBoolean("FS20S4U_LEVEL0_PB_Light");

SetValueBoolean("FS20PIRI_LEVEL0_move_detect", False);

if ($FS20S4U_PB == False)  IPS_SetScriptTimer("FLOOR_LEVEL0_LIGHT_PIRI_RESET", 0);

Script 3: FLOOR_LEVEL0_LIGHT_PIRI

$move = GetValueBoolean("FS20PIRI_LEVEL0_move_detect");
$FS20S4U_PB = GetValueBoolean("FS20S4U_LEVEL0_PB_Light");
$switch_duration = 60; // switchtime for Light

// if Light openend by Push Button, exit the script and ignore the PIRI
if ($FS20S4U_PB == True) exit();

// else, detect a move on the floor
if ($move == True)
          {
          FS20_SwitchDuration(36926, True, $switch_duration);
          IPS_SetScriptTimer("FLOOR_LEVEL0_LIGHT_PIRI_RESET", $switch_duration);
          }

Triggerevent hier ist : FS20PIRI_LEVEL0_move_detect (der PIRI)

Und diese Variante habe ich jetzt auf 3 Stockwerken laufen und läuft seit ein paar tagen einwandfrei !

da muss ich als auch anfänger mal was fragen:

gibt es denn eine möglichkeit eine lichsteuerung zu erstellen, die vom pc gesteuert wird und auch von einem handsender direkt angesprochen werden kann wenn der server nicht läuft ?

danke, frank

Hallo Frank,

wir empfehlen für die Fernbedienung und Steckdose denselben Code zu verwenden.
Dadurch kann die Steckdose direkt, also ohne den PC geschaltet werden.
IP-Symcon kenn den Zustand der Steckdose, weil zusätzlich ein RX Modul für
die FB existiert und kann diese auch über das TX-Modul schalten. Alles klar?

Gruß MST

ips_tx_rx_direkt.jpg

verstanden !

das finde ich ja super klasse. ich war bisher der meinung ich kann nur das einei oder das andere. so kann ich die steuerung wie jetzt belassen und zusätzlich per pc steuern. das erleichtert die umstellung :-))

vielen dank, frank

@hmpf99

Das was ich da gepastet habe ist genau das. Lampe und Schalter selber Adresscode, doch PIRI hat einen Anderen (könnte ja auch ne FB sein). Das ist gut so, denn sonst, wenn der PC mal nicht geht, bleiben Basis Funktionen erhalten, sonst schmeisst mich der Hauschef raus ! :smiley:

eben drum. ausfallsicherung ist immer wichtig !
aber was ist PIRI ?

danke, frank

Bewegungsmelder