Wie schon hier beschrieben: https://forum.fhem.de/index.php/topic,60244.msg585709.html#msg585709 und ein erneuter Versuch mich mit der sub zu beschäftigen : https://forum.fhem.de/index.php/topic,60244.msg586227.html#msg586227
habe ich ein Problem mit meiner sub, ich möchte diese um ca. 1 Sekunde verzögern, damit alles ohne Probleme funktioniert.
Leider blockiert ein fhem durch ein "sleep" an dieser Stelle, für die angegebene Zeit und mein perfmon meckert dann.
Hat jemand eine Idee, wie ich eine Verzögerung hinbekomme ?
Gggfs. möchte ich auch ein Reading einlesen, was sich ca 1-2 Sekunden nach dem Aufruf der sub ändert und dies dann auch abfangen.
Hier nochmal die sub:
##### Start Alexa guten morgen
sub alexa_guten_morgen()
{
sleep 0.8;
my $Skillname = ReadingsVal("Alexa","fhemIntent",0);
#Alexa
if ($Skillname =~ "amzn1.ask.skill.111")
{fhem "setreading Alexa fhemIntent loeschen";return "Guten Morgen von Alexa";}
#Fernseher
elsif ($Skillname =~ "amzn1.ask.skill.222")
{fhem "setreading Alexa fhemIntent loeschen";return "Guten Morgen von Fernseher";}
#Badezimmer
elsif ($Skillname =~ "amzn1.ask.skill.333")
{fhem "setreading Alexa fhemIntent loeschen";return "Guten Morgen von Badezimmer";}
#Wohnzimmer
elsif ($Skillname =~ "amzn1.ask.skill.444")
{fhem "setreading Alexa fhemIntent loeschen";return "Guten Morgen von Wohnzimmer";}
#Küche
elsif ($Skillname =~ "amzn1.ask.skill.555")
{fhem "setreading Alexa fhemIntent loeschen";return "Guten Morgen von Küche";}
#Schlafzimmer
elsif ($Skillname =~ "amzn1.ask.skill.666")
{fhem "setreading Alexa fhemIntent loeschen";return "Guten Morgen von Schlafzimmer";}
#Balkon
elsif ($Skillname =~ "amzn1.ask.skill.777")
{fhem "setreading Alexa fhemIntent loeschen";return "Guten Morgen von Balkon";}
#Fehlerfall
elsif ($Skillname =~ "loeschen")
{fhem "setreading Alexa fhemIntent loeschen";return "Fehlerfall";}
}
#####Ende Alexa guten morgen
Grüße Marcel
Den verzögerten Aufruf (ggf. auch rekursiv) würde ich über ein at realisieren. Das blockiert nicht.
Alternativ kannst du dich im Developerbereich in InternalTimer einlesen.
Oder einfach im Perl:
fhem "set xyz on; sleep 1; set zyx sbla";
Gruß
Dan
P.S. Das sleep im fhem "" Aufruf ist non-blocking.
Das Problem ist, die sub wird von Alexa automatisch aufgerufen...
Gesendet von iPhone mit Tapatalk
Zitat von: Ma_Bo am 16 Februar 2017, 15:20:50
Das Problem ist, die sub wird von Alexa automatisch aufgerufen...
Gesendet von iPhone mit Tapatalk
Das macht doch keinen Unterschied wer die sub aufruft.
Es muss am Ende möglichst alles in einem fhem Aufruf stehen damit das wirklich hintereinander ausgeführt wird.
Gruß
Dan
Das mit dem sleep ist zwar richtig, trifft aber die Anforderungen hier nicht ganz.
Mhhhh hast du da ein Beispiel...?
Versteh den Ablauf nicht ganz...
Gesendet von iPhone mit Tapatalk
Einfaches Beispiel:
die aufgerufene sub:
sub alexa_guten_morgen() {
fhem("define at.alexa_guten_morgen at +00:00:01 {alexa_guten_morgen_sub()}");
}
und alexa_guten_morgen_sub
sub alexa_guten_morgen_sub()
{
my $Skillname = ReadingsVal("Alexa","fhemIntent",0);
#Alexa
if ($Skillname =~ "amzn1.ask.skill.111")
{fhem "setreading Alexa fhemIntent loeschen";return "Guten Morgen von Alexa";}
#Fernseher
elsif ($Skillname =~ "amzn1.ask.skill.222")
{fhem "setreading Alexa fhemIntent loeschen";return "Guten Morgen von Fernseher";}
#Badezimmer
elsif ($Skillname =~ "amzn1.ask.skill.333")
{fhem "setreading Alexa fhemIntent loeschen";return "Guten Morgen von Badezimmer";}
#Wohnzimmer
elsif ($Skillname =~ "amzn1.ask.skill.444")
{fhem "setreading Alexa fhemIntent loeschen";return "Guten Morgen von Wohnzimmer";}
#Küche
elsif ($Skillname =~ "amzn1.ask.skill.555")
{fhem "setreading Alexa fhemIntent loeschen";return "Guten Morgen von Küche";}
#Schlafzimmer
elsif ($Skillname =~ "amzn1.ask.skill.666")
{fhem "setreading Alexa fhemIntent loeschen";return "Guten Morgen von Schlafzimmer";}
#Balkon
elsif ($Skillname =~ "amzn1.ask.skill.777")
{fhem "setreading Alexa fhemIntent loeschen";return "Guten Morgen von Balkon";}
#Fehlerfall
elsif ($Skillname =~ "loeschen")
{fhem "setreading Alexa fhemIntent loeschen";return "Fehlerfall";}
}
#####Ende Alexa guten morgen
Das alles geht, wie immer, auch anders.
Man könnte alternativ auch mit InternalTimer arbeiten. Ist auch nicht blockierend.
Danke erst einmal an alle, ich werde jetzt mal lesen gehen...
Gesendet von iPhone mit Tapatalk
Zitat von: marvin78 am 16 Februar 2017, 15:33:52
Einfaches Beispiel:
die aufgerufene sub:
sub alexa_guten_morgen() {
fhem("define at.alexa_guten_morgen at +00:00:01 {alexa_guten_morgen_sub()}");
}
und alexa_guten_morgen_sub
sub alexa_guten_morgen_sub()
{
my $Skillname = ReadingsVal("Alexa","fhemIntent",0);
#Alexa
if ($Skillname =~ "amzn1.ask.skill.111")
{fhem "setreading Alexa fhemIntent loeschen";return "Guten Morgen von Alexa";}
#Fernseher
elsif ($Skillname =~ "amzn1.ask.skill.222")
{fhem "setreading Alexa fhemIntent loeschen";return "Guten Morgen von Fernseher";}
#Badezimmer
elsif ($Skillname =~ "amzn1.ask.skill.333")
{fhem "setreading Alexa fhemIntent loeschen";return "Guten Morgen von Badezimmer";}
#Wohnzimmer
elsif ($Skillname =~ "amzn1.ask.skill.444")
{fhem "setreading Alexa fhemIntent loeschen";return "Guten Morgen von Wohnzimmer";}
#Küche
elsif ($Skillname =~ "amzn1.ask.skill.555")
{fhem "setreading Alexa fhemIntent loeschen";return "Guten Morgen von Küche";}
#Schlafzimmer
elsif ($Skillname =~ "amzn1.ask.skill.666")
{fhem "setreading Alexa fhemIntent loeschen";return "Guten Morgen von Schlafzimmer";}
#Balkon
elsif ($Skillname =~ "amzn1.ask.skill.777")
{fhem "setreading Alexa fhemIntent loeschen";return "Guten Morgen von Balkon";}
#Fehlerfall
elsif ($Skillname =~ "loeschen")
{fhem "setreading Alexa fhemIntent loeschen";return "Fehlerfall";}
}
#####Ende Alexa guten morgen
Das alles geht, wie immer, auch anders.
Ok, das funktioniert, ABER ich muss jetzt das "return" von sub alexa_guten_morgen_sub() für diese sub alexa_guten_morgen() haben, sonst gibt Alexa nichts aus.
Was macht?
sub alexa_guten_morgen() {
fhem("define at.alexa_guten_morgen at +00:00:01 {return alexa_guten_morgen_sub()}");
}
@CoolTux: Habe ich oben schon erwähnt.
Ausgabe ist nur im Log : 2017.02.16 16:16:06.274 3: at.alexa_guten_morgen: Ausgabe für Fernseher
Schreib doch mal, wie die sub überhaupt aufgerufen wird.
Automatisch durch Alexa, über das Alexa Modul und das was die sub als Return zurückgibt wird als Sprache ausgegeben...
Gesendet von iPhone mit Tapatalk
Viel interessanter wäre wieso die Routine ohne sleep nicht klappen sollte. Ansonsten einfach wie gesagt vor jedem FHEM Befehl, also nur am Anfang fhem "sleep 1;....
machen
Zitat von: Ma_Bo am 16 Februar 2017, 15:16:11
Wie schon hier beschrieben: https://forum.fhem.de/index.php/topic,60244.msg585709.html#msg585709 und ein erneuter Versuch mich mit der sub zu beschäftigen : https://forum.fhem.de/index.php/topic,60244.msg586227.html#msg586227
habe ich ein Problem mit meiner sub, ich möchte diese um ca. 1 Sekunde verzögern, damit alles ohne Probleme funktioniert.
Leider blockiert ein fhem durch ein "sleep" an dieser Stelle, für die angegebene Zeit und mein perfmon meckert dann.
Hat jemand eine Idee, wie ich eine Verzögerung hinbekomme ?
Gggfs. möchte ich auch ein Reading einlesen, was sich ca 1-2 Sekunden nach dem Aufruf der sub ändert und dies dann auch abfangen.
Hier nochmal die sub:
##### Start Alexa guten morgen
sub alexa_guten_morgen()
{
sleep 0.8;
my $Skillname = ReadingsVal("Alexa","fhemIntent",0);
#Alexa
if ($Skillname =~ "amzn1.ask.skill.111")
{fhem "setreading Alexa fhemIntent loeschen";return "Guten Morgen von Alexa";}
#Fernseher
elsif ($Skillname =~ "amzn1.ask.skill.222")
{fhem "setreading Alexa fhemIntent loeschen";return "Guten Morgen von Fernseher";}
#Badezimmer
elsif ($Skillname =~ "amzn1.ask.skill.333")
{fhem "setreading Alexa fhemIntent loeschen";return "Guten Morgen von Badezimmer";}
#Wohnzimmer
elsif ($Skillname =~ "amzn1.ask.skill.444")
{fhem "setreading Alexa fhemIntent loeschen";return "Guten Morgen von Wohnzimmer";}
#Küche
elsif ($Skillname =~ "amzn1.ask.skill.555")
{fhem "setreading Alexa fhemIntent loeschen";return "Guten Morgen von Küche";}
#Schlafzimmer
elsif ($Skillname =~ "amzn1.ask.skill.666")
{fhem "setreading Alexa fhemIntent loeschen";return "Guten Morgen von Schlafzimmer";}
#Balkon
elsif ($Skillname =~ "amzn1.ask.skill.777")
{fhem "setreading Alexa fhemIntent loeschen";return "Guten Morgen von Balkon";}
#Fehlerfall
elsif ($Skillname =~ "loeschen")
{fhem "setreading Alexa fhemIntent loeschen";return "Fehlerfall";}
}
#####Ende Alexa guten morgen
Grüße Marcel
Weil sich der Wert des Readings kurz nach Aufruf der sub noch verändern kann:
my $Skillname = ReadingsVal("Alexa","fhemIntent",0);
Gesendet von iPhone mit Tapatalk
hört mal auf hier am symptom rumzubasteln. im anderen thread gibt es eine version die direkt an der ursache ansetzt.
Da du den Aufruf selbst wohl nicht steuern kannst, würde ich mit InternalTimer versuchen zu arbeiten. Wobei ich mir gerade selbst unsicher bin ob das überhaupt möglich ist. Pauschal wüsste ich das auf die schnelle nicht.
InternalTimer ist meines Wissens Instanzspezifisch und nicht Modulspezifisch.
Das Auslesen des Readings muss ja offenbar verzögert werden. Da hilft es nicht, vor jedem fhem-Befehl ein sleep zu bauen. ::)
Was mich nicht interessiert und wozu ich deshalb nichts sagen kann, ist Alexa. Meine Beiträge beziehen sich nur auf das verzögerte Auslesen und Ausführen.
Wenn justme1968 sagt, dass die Ursach behoben wird/wurde, ist das hier aber ohnehin nicht mehr wichtig ;)
Obwohl justme1968 wahrscheinlich die Lösung im Alexa Modul hat, teste ich diese Nacht oder morgen,
interessiert mich trotzdem ob es irgendwie möglich ist, das einlesen zu verzögern, so lernt man...
Gesendet von iPhone mit Tapatalk