FHEM Forum

FHEM => Automatisierung => Thema gestartet von: Ma_Bo am 16 Februar 2017, 15:16:11

Titel: sleep in 99_myUtils.pm einbauen oder alternative ohne fhem zu blockieren
Beitrag 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
Titel: Antw:sleep in 99_myUtils.pm einbauen oder alternative ohne fhem zu blockieren
Beitrag von: marvin78 am 16 Februar 2017, 15:18:48
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.
Titel: Antw:sleep in 99_myUtils.pm einbauen oder alternative ohne fhem zu blockieren
Beitrag von: DeeSPe am 16 Februar 2017, 15:19:53
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.
Titel: Antw:sleep in 99_myUtils.pm einbauen oder alternative ohne fhem zu blockieren
Beitrag 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
Titel: Antw:sleep in 99_myUtils.pm einbauen oder alternative ohne fhem zu blockieren
Beitrag von: DeeSPe am 16 Februar 2017, 15:23:10
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
Titel: Antw:sleep in 99_myUtils.pm einbauen oder alternative ohne fhem zu blockieren
Beitrag von: marvin78 am 16 Februar 2017, 15:25:34
Das mit dem sleep ist zwar richtig, trifft aber die Anforderungen hier nicht ganz.
Titel: Antw:sleep in 99_myUtils.pm einbauen oder alternative ohne fhem zu blockieren
Beitrag von: Ma_Bo am 16 Februar 2017, 15:26:51
Mhhhh hast du da ein Beispiel...?

Versteh den Ablauf nicht ganz...


Gesendet von iPhone mit Tapatalk
Titel: Antw:sleep in 99_myUtils.pm einbauen oder alternative ohne fhem zu blockieren
Beitrag 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.
Titel: Antw:sleep in 99_myUtils.pm einbauen oder alternative ohne fhem zu blockieren
Beitrag von: CoolTux am 16 Februar 2017, 15:37:48
Man könnte alternativ auch mit InternalTimer arbeiten. Ist auch nicht blockierend.
Titel: Antw:sleep in 99_myUtils.pm einbauen oder alternative ohne fhem zu blockieren
Beitrag von: Ma_Bo am 16 Februar 2017, 15:39:16
Danke erst einmal an alle, ich werde jetzt mal lesen gehen...


Gesendet von iPhone mit Tapatalk
Titel: Antw:sleep in 99_myUtils.pm einbauen oder alternative ohne fhem zu blockieren
Beitrag von: Ma_Bo am 16 Februar 2017, 15:44:29
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.
Titel: Antw:sleep in 99_myUtils.pm einbauen oder alternative ohne fhem zu blockieren
Beitrag von: marvin78 am 16 Februar 2017, 16:09:02
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.
Titel: Antw:sleep in 99_myUtils.pm einbauen oder alternative ohne fhem zu blockieren
Beitrag von: Ma_Bo am 16 Februar 2017, 16:16:51
Ausgabe ist nur im Log : 2017.02.16 16:16:06.274 3: at.alexa_guten_morgen: Ausgabe für Fernseher
Titel: Antw:sleep in 99_myUtils.pm einbauen oder alternative ohne fhem zu blockieren
Beitrag von: marvin78 am 16 Februar 2017, 18:23:59
Schreib doch mal, wie die sub überhaupt aufgerufen wird.
Titel: Antw:sleep in 99_myUtils.pm einbauen oder alternative ohne fhem zu blockieren
Beitrag von: Ma_Bo am 16 Februar 2017, 19:09:20
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
Titel: Antw:sleep in 99_myUtils.pm einbauen oder alternative ohne fhem zu blockieren
Beitrag von: CoolTux am 16 Februar 2017, 19:28:43
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
Titel: Antw:sleep in 99_myUtils.pm einbauen oder alternative ohne fhem zu blockieren
Beitrag von: Ma_Bo am 16 Februar 2017, 19:43:24
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
Titel: Antw:sleep in 99_myUtils.pm einbauen oder alternative ohne fhem zu blockieren
Beitrag von: justme1968 am 16 Februar 2017, 19:57:17
hört mal auf hier am symptom rumzubasteln. im anderen thread gibt es eine version die direkt an der ursache ansetzt.
Titel: Antw:sleep in 99_myUtils.pm einbauen oder alternative ohne fhem zu blockieren
Beitrag von: CoolTux am 16 Februar 2017, 19:57:17
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.
Titel: Antw:sleep in 99_myUtils.pm einbauen oder alternative ohne fhem zu blockieren
Beitrag von: marvin78 am 16 Februar 2017, 20:15:06
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 ;)
Titel: Antw:sleep in 99_myUtils.pm einbauen oder alternative ohne fhem zu blockieren
Beitrag von: Ma_Bo am 16 Februar 2017, 20:28:11
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