Hallo zusammen,
ich habe mir ein kleines Programm geschrieben und in einer 99_myUtils abgelegt. Das Programm läuft auch einwandfrei.
In dem Programm kommt ein sleep Befehl von 20 sec vor.
sleep(20);
Das Problem ist das solange das Programm läuft ich keine weiteren Eingaben mehr in Fhem machen kann d.h. Fhem ist für 21 Sekunden blockiert. Scheinbar ist der Raspberry mit der Abarbeitung des Programms so beschäftigt das er keine zweite Aufgabe ausführen kann.
Gibt es da irgendwie eine Lösung um das ganze zu umgehen?
Danke und Gruß
Markus
Du solltest nicht den Perl Befehl sleep nutzen sondern den fhem-Befehl. Dieser blockiert nicht. Ob das allerdings an dieser Stelle sinnvoll ist, kann ich nicht sagen, da ich deinen Code nicht kenne.
fhem("sleep 20");
Hallo marvin,
Danke für die Blitzantwort :D.
Ich versuch kurz zu erklären was ich vor habe.
Das Badezimmer soll bei einer Bestimmten Luftfeuchte automatisch gelüftet werden und wenn die Luftfeuchte wieder Ok ist das Fenster wieder geschlossen werden. (relativ simpel)
Wenn allerdings das Dachfenster über das Verlux Contoll Pad geöffnet wird soll das Dachfenster dauerhaft auf bleiben und nicht automatisch geschlossen werden.
Dazu habe ich mir einen Dummy für den Status definiert welcher auf "auto" gesetzt wird wenn das Automatische lüften Aktiviert wurde. (auch noch relativ simpel)
Jetzt hatte ich die Idee das wenn der Fensterkontaktsensor am Dachfenster meldet das es auf gegangen ist, soll ein Programm überprüfen ob das Fenster durch das Autolüften Programm geöffnet wurde (Status "auto" steht im Dummy) oder nicht was bedeuten würde er setzt den Status des dummy auf manuell.
Dazu brauche ich einen kleinen Wartebefehl damit sichergestellt ist das das Autolüftenprogramm abgeschlossen ist und der Status evtl. auf "auto" gesetzt ist.
Ich habe mal versucht das ganze Vereinfacht da zu stellen. (Der gesamte Code ist relativ lang ::) ) deshalb denke ich das müsste reichen.
sub BadLueften() {
my ($state_fenster) = ReadingsVal("Dachfenster_Bad_Status", "switch_detect","");
sleep(20);
my ($state_auto_manu) = $value{"Bad_Dachfenster_auto_manuell"};
if ($state_fenster eq "on") {
if ($state_auto_manu eq "auto") {
return
}
else {
fhem("set Bad_Dachfenster_auto_manuell manuell");
}
}
}
Leider bringt mir der "fhem sleep" nichts. Das Programm arbeitet gnadenlos weiter ohne Wartezeit da der Rest in Perl geschrieben ist.
Und den sleep Befehl in dem entsprechenden notify einzutragen ist auch keine Alternative.
Derzeit habe ich es über einen kleinen Umweg gelöst aber die Neugierde treibt mich ob mann so einen sleep einbauen kann.
Gruß
Markus
FHEM sleep funktioniert nur wenn der Befehl direkt danach kommt.
Also zB
fhem("sleep 20;;set device on");
Siehe command ref:
ZitatBemerkung: sleep gefolgt von weiteren Befehlen und aufgerufen in at/notify/etc blockiert die Abarbeitung von FHEM nicht.
Hallo fhainz,
ja ich habe in einem andrem notify so einen sleep eingebaut daher weiß ich das Fhem nicht blockiert wird.
Aber Perl scheint da nichts herzugeben. ???
Du könntest zB in der funktion ein at definieren das nach 20 sek eine weitere Funktion triggert.
Ja genau so habe ich meinen derzeitigen Umweg gebaut.
Die Lösung funktioniert zwar aber ich finde sie nicht sonderlich elegant. Aber wenn es nicht anderes geht lasse ich es so.
Trotzdem danke für eure Hilfe ;D
Gruß
Markus
Zitat von: mago0211 am 08 August 2014, 18:52:11
Aber Perl scheint da nichts herzugeben. ???
sag doch nicht sowas... Probier mal das hier:
select(undef, undef, undef, 20);
Hallo betateilchen,
Entschuldigung ich habe hier eine Zeitlang nicht mehr reingeschaut ::)
Ich habe es versucht mit
select(undef, undef, undef, 20);
Leider der gleiche Effekt Fhem ist für die 20 Sec. ohne Funktion.
Was macht die Zeile genau? Sieht für mich auch nach einem Trick aus ;)
Gruß
Markus
Zitat von: mago0211 am 27 August 2014, 19:19:22
Was macht die Zeile genau? Sieht für mich auch nach einem Trick aus ;)
Kein Trick. Doku lesen.
http://perldoc.perl.org/functions/select.html
so lange fhem nur singlethreaded ist kannst du kein sleep auf perl ebene verwenden. egal ob es sleep oder select oder sonst wie heisst.
du kannst das fhem sleep verwenden oder besser deine logik event gesteuert machen.
wenn es aus irgend einem grund tatsächlich nicht ohne blockieren geht (was in 99% aller fälle nicht stimmt) bleibt noch BlockingCall.
gruss
andre