Ich habe verschiedene sleep von 0 bis 9 mit id angelegt, z. B. fhem "sleep 60 Temp_2; set Musik Vol 3";
Ich versuche jetzt, nur die noch existierenden sleeps zu cancel'n, aber der folgende Befehl funktioniert nicht, die sleep werden nicht gelöscht. Wie gehts richtig?
foreach my $num (0..$maxNum) {if (exists($defs{"Temp_$num"})){fhem ("cancel Temp_$num")}
Zitat$defs{"Temp_$num"}
Schau Dir mal die Hashes %intAt und %sleepers an. Hilfreich sind auch die Subs WakeUpFn und CommandCancel in fhem.pl.
Ich würde vermutlich einfach cancel bzw CommandCancel mit dem optionalen Argument quiet aufrufen und mich nicht selbst nicht weiter darum kümmern, ob die timer noch existieren.
Bitte darauf achten das intAtA von Hash auf Array umgestellt wurde.
einfach nur cancel ohne id listet die wartenden sleeps
und wenn es dir um die meldung beim canceln eines nicht vorhandenen sleeps geht: einfach quiet hinten anhängen. dann gibt es keine meldung.
selbst auf die internen datenstrukturen zuzugreifen ist keine gute idee.
Mein Dank an die Experten! Ja, mir ging es um die Meldungen beim canceln eines nicht vorhandenen sleeps, alles klar jetzt!
Hi, da das Thema aus dem Titel eigentlich nicht gelöst ist und ich genau daran hänge (sleep soll sich bei Vorhandensein nicht verlängern), würde mich interessieren, wie man am besten prüfen kann?
Ich teste gerade
my $compass = "NORD";
my $sleeps = fhem("cancel");
if (!grep(/sleep.$compass/, $sleeps)) { #nicht vorhanden}
Geht es irgendwie eleganter? Cancel liefert ja auch kein sauberes Array. Auch werden die Cancel-Abfragen unnötig geloggt.
Nicht wirklich getestet, aber sollte funktionieren.
foreach my $num (0..9) {fhem("cancel Temp_$num quiet") }
Durch das quiet erfolgt keine Meldung, wenn das sleep nicht existiert. Und alle, die existieren, werden gelöscht :).