FHEM Forum

FHEM => Anfängerfragen => Thema gestartet von: ToM_ToM am 07 April 2016, 20:18:58

Titel: [gelöst] myUtils Funktion rekursiver Aufruf
Beitrag von: ToM_ToM am 07 April 2016, 20:18:58
Hallo Zusammen,

ich versuche mir gerade eine Art Sleep Timer zu basteln.

Aufruf in FHEM:

{ SonosSleepTimer(600) }

Demnach sollte sich die Lautstärke 10 Minuten lang alle 60 Sekunden um 1 verringern.

Code:

sub
SonosSleepTimer ($)
{
my $duration = shift;
my $startTime = shift;

my $currentTime  = time;

if (!$startTime) {
$startTime = $currentTime
}

if (($startTime + $duration)  > $currentTime) {
fhem("sleep 60; set Sonos_Wohnzimmer Volume -1; { SonosSleepTimer($duration, $startTime) }");
}
else {
fhem("set Sonos_Wohnzimmer stop");
}
}


Jedoch funktioniert das nur genau einmal. Irgendwie kann sich die Funktion nicht rekursiv wieder selbst aufrufen.
Hat jemand eine Idee wie man das lösen könnte oder übersehe ich nur einen kleinen Fehler?

Viele Grüße, Thomas
Titel: Antw:myUtils Funktion rekursiver Aufruf
Beitrag von: betateilchen am 07 April 2016, 20:21:12
eine solche Rekursion wird glücklicherweise von fhem generell unterbunden.

Was Du tun kannst und viel einfacher ist: Definiere ein at, das sich 10 Mal wiederholt. Dafür ist diese Wiederholungsfunktion schließlich eingebaut.
Titel: Antw:myUtils Funktion rekursiver Aufruf
Beitrag von: justme1968 am 07 April 2016, 20:31:19
nein. in dem code ist überhaupt keine rekursion. mit dem sleep übergibst du die kontrolle wieder zurück an fhem und startest einen timer der dann den code asynchron wider aufruft. eine rekursion gäbe es nur ohne das sleep und das würde fhem auch nicht bemerken sondern komplett blockieren.

der grund aus dem das nicht geht ist vermutlich das du im prototypen nur ein argument vorgesehen hast und deine routine später mit zwei parametern aufrufst. d.h der zweite und alle folgenden aufruf scheitern an einem syntax fehler. den solltest du auch im log sehen. eventuell musst du verbose hoch drehen.

wenn du eine routine so definierst sollte alles gehen: SonosSleepTimer ($;$)

gruss
  andre
Titel: Antw:myUtils Funktion rekursiver Aufruf
Beitrag von: ToM_ToM am 07 April 2016, 20:40:06
Hallo,
stimmt, es ist keine richtige Rekursion da FHEM sonst 10 Minuten lang blockieren würde.
Deshalb bin ich froh den Sleep-Befehl gefunden zu haben.

Danke justme1968, deine Lösung hat geholfen. Und jetzt funktioniert es. :)

Viele Grüße

Thomas