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