Ich benötige im EnOcean Modul für jedes Device unabhängige InternalTimer. Ich habe den Vorschlag von http://forum.fhem.de/index.php/topic,15706.msg102769.html#msg102769 leicht modifiziert eingebaut:
sub EnOcean_InternalTimer($$$$$)
{
my ($modifier, $tim, $callback, $hash, $waitIfInitNotDone) = @_;
my $mHash = {};
my $timerName = "$hash->{NAME}_$modifier";
if ($modifier eq "") {
$mHash = $hash;
} else {
if (exists ($hash->{helper}{TIMER}{$timerName})) {
$mHash = $hash->{helper}{TIMER}{$timerName};
Log3 $hash->{NAME}, 3, "EnOcean_InternalTimer setting mHash with stored $timerName";
} else {
$mHash = {HASH => $hash, NAME => $timerName, MODIFIER => $modifier};
$hash->{helper}{TIMER}{$timerName} = $mHash;
Log3 $hash->{NAME}, 3, "EnOcean_InternalTimer setting mHash with $timerName";
}
}
InternalTimer($tim, $callback, $mHash, $waitIfInitNotDone);
Log3 $hash->{NAME}, 3, "EnOcean setting timer $timerName at " . strftime("%Y-%m-%d %H:%M:%S", localtime($tim));
}
#
sub EnOcean_RemoveInternalTimer($$)
{
my ($modifier, $hash) = @_;
my $mHash = {};
my $timerName = "$hash->{NAME}_$modifier";
if ($modifier eq "") {
RemoveInternalTimer($hash);
} else {
$mHash = $hash->{helper}{TIMER}{$timerName};
if (defined($mHash)) {
delete $hash->{helper}{TIMER}{$timerName};
RemoveInternalTimer($mHash);
}
}
Log3 $hash->{NAME}, 3, "EnOcean removing timer $timerName";
}
Leider funktionieren die Funktionen nicht, wenn man einen sep. Timer erzeugen will, z. B.
#RemoveInternalTimer($hash);
EnOcean_RemoveInternalTimer("observe", $hash);
#InternalTimer(gettimeofday() + 1, "EnOcean_observeRepeat", $hash, 0);
EnOcean_InternalTimer("observe", gettimeofday() + 1, "EnOcean_observeRepeat", $hash, 0);
Die Variante, die den Standardaufruf des InternalTimers erzeugt, geht:
#RemoveInternalTimer($hash);
EnOcean_RemoveInternalTimer("", $hash);
#InternalTimer(gettimeofday() + 1, "EnOcean_observeRepeat", $hash, 0);
EnOcean_InternalTimer("", gettimeofday() + 1, "EnOcean_observeRepeat", $hash, 0);
Weder der ursprüngliche Vorschlag noch meine etwas angepasste Version ist bei mir lauffähig. Deshalb wäre ich für jeden hilfreichen Tipp dankbar.
HI Klaus
you can have a look at my solution for >50 internal timer
It is not very elegang but works quite well ....
https://github.com/mhop/fhem-mirror/blob/master/fhem/FHEM/00_THZ.pm
for you relevant
THZ_Refresh_all_gets line 382
THZ_GetRefresh line 404
THZ_RemoveInternalTimer line 1204
immi
Nach einer kurzen Pruefung gehe ich davon aus, dass die aufgerufene Funktion (EnOcean_observeRepeat) nicht auf dem neuen Parameter ($mHash) angepasst wurde. Noch einfacher waere es zu debuggen, wenn du die reichlich vorhandenen Logausgaben uns mitteilen wuerdest :)
Danke für die Durchsicht und den Tipp. Ich werde in dieser Richtung forschen. Die Logs waren unverdächtig.