InternalTimer: Einrichten von individuellen Timern

Begonnen von klaus.schauer, 08 Dezember 2014, 14:31:52

Vorheriges Thema - Nächstes Thema

klaus.schauer

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.

immi

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

rudolfkoenig

#2
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 :)

klaus.schauer

Danke für die Durchsicht und den Tipp. Ich werde in dieser Richtung forschen. Die Logs waren unverdächtig.