Hallo,
RemoveInternalTimer("timername") sollte doch den Timer mit dem "timername" löschen.
Ich habe den Timer angelegt:
InternalTimer( gettimeofday() +$to, "AAA_ReceiveTimeout", $hash, 0);
In der ReadFn wird er gelöscht:
RemoveInternalTimer("AAA_ReceiveTimeout");
Das die ReadFn ausgelöst wird habe ich über einen Logeintrag sichergestellt.
Allerdings läuft der Timer weiter und löst schließlich aus.
was habe ich übersehen?
Versuch mal RemoveInternalTimer($hash);
Grüße
da lösche ich doch aber alle Timer der Modulinstanz, oder?
ja, deshalb kannst du diese Fuktionen vielleicht verwenden:
################################################################################
sub myInternalTimer($$$$$) {
my ($modifier, $tim, $callback, $hash, $waitIfInitNotDone) = @_;
my $mHash;
if ($modifier eq "") {
$mHash = $hash;
} else {
my $timerName = "$hash->{NAME}_$modifier";
if (exists ($hash->{TIMER}{$timerName})) {
$mHash = $hash->{TIMER}{$timerName};
} else {
$mHash = { HASH=>$hash, NAME=>"$hash->{NAME}_$modifier", MODIFIER=>$modifier};
$hash->{TIMER}{$timerName} = $mHash;
}
}
InternalTimer($tim, $callback, $mHash, $waitIfInitNotDone);
}
################################################################################
sub myRemoveInternalTimer($$) {
my ($modifier, $hash) = @_;
my $timerName = "$hash->{NAME}_$modifier";
if ($modifier eq "") {
RemoveInternalTimer($hash);
} else {
my $myHash = $hash->{TIMER}{$timerName};
if (defined($myHash)) {
delete $hash->{TIMER}{$timerName};
RemoveInternalTimer($myHash);
}
}
}
werden so verwendet:
myRemoveInternalTimer ("perlTime", $hash);
myInternalTimer ("perlTime", $tim-60*60, "Twilight_WeatherTimerUpdate", $hash, 0);
Hallo Dietmar,
klappt super, danke
beim genaueren hinschauen doch nicht :(
Die Subroutine, welche beim Timeout aufgerufen wird bekommt ja den $mHash übergeben. Aber ich benötige den $hash der Modulinstanz.
der richtige hash wird in der Funktion gesichert, und man muss leider im timerCallback dereferenzieren.
sub xxx_calback($)
{
my ($myHash) = @_;
my $hash = $myHash->{HASH};
my $hashName = $hash->{NAME};
Log 3, "hashName------------>$hashName";
Das kann man leider nicht anders lösen. Besser wäre es Varianten dieser Funktionen nach fhem.pl zu übernehmen. Aber ich kann Rudi nicht überzeugen, und komme auch so klar.
er hat sicher seine Gründe und ich habe zu wenig Ahnung für eine Diskussion ;D
Danke Nochmals!
sicher!
Probier mal ob es klappt!
Ich empfehle fuer solche Faelle einen Aufruf-spezifischen Parameter (hash) anzulegen, und irgendwo zu merken.
Genau so funktionieren die beiden Funktionen.
Klappt super Dietmar
Danke Dir!
wenn du es in deinem Modul freigibst müssen wir eventuell noch den Modulnamen davorpacken, damit wir keine Redefines bekommen.