Sleep Befehl in 99_myUtils

Begonnen von mago0211, 08 August 2014, 17:37:43

Vorheriges Thema - Nächstes Thema

mago0211

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

marvin78

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");

mago0211

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

fhainz

#3
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.

mago0211

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.   ???

fhainz

Du könntest zB in der funktion ein at definieren das nach 20 sek eine weitere Funktion triggert.

mago0211

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

betateilchen

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);
-----------------------
Formuliere die Aufgabe möglichst einfach und
setze die Lösung richtig um - dann wird es auch funktionieren.
-----------------------
Lesen gefährdet die Unwissenheit!

mago0211

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

betateilchen

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
-----------------------
Formuliere die Aufgabe möglichst einfach und
setze die Lösung richtig um - dann wird es auch funktionieren.
-----------------------
Lesen gefährdet die Unwissenheit!

justme1968

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
hue, tradfri, alexa-fhem, homebridge-fhem, LightScene, readingsGroup, ...

https://github.com/sponsors/justme-1968