RemoveInternalTimer

Begonnen von klausw, 12 Januar 2014, 18:58:05

Vorheriges Thema - Nächstes Thema

klausw

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?
RasPi B v2 mit FHEM 18B20 über 1Wire, LED PWM Treiber über I2C, Luchtdruck-, Feuchtesensor und ein paar Schalter/LED\'s zum testen
Module: RPI_GPIO, RPII2C, I2C_EEPROM, I2C_MCP23008, I2C_MCP23017, I2C_MCP342x, I2C_PCA9532, I2C_PCF8574, I2C_SHT21, I2C_BME280

fhainz

Versuch mal RemoveInternalTimer($hash);

Grüße

klausw

da lösche ich doch aber alle Timer der Modulinstanz, oder?
RasPi B v2 mit FHEM 18B20 über 1Wire, LED PWM Treiber über I2C, Luchtdruck-, Feuchtesensor und ein paar Schalter/LED\'s zum testen
Module: RPI_GPIO, RPII2C, I2C_EEPROM, I2C_MCP23008, I2C_MCP23017, I2C_MCP342x, I2C_PCA9532, I2C_PCF8574, I2C_SHT21, I2C_BME280

Dietmar63

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);

Gruß Dietmar
FB7390, CUL, 2 FHT, FS20
modules: 98_WOL.pm, 98_Heating_Control.pm,   98_WeekdayTimer.pm, 98_RandomTimer.pm, 59_Twilight.pm

klausw

Hallo Dietmar,

klappt super, danke
RasPi B v2 mit FHEM 18B20 über 1Wire, LED PWM Treiber über I2C, Luchtdruck-, Feuchtesensor und ein paar Schalter/LED\'s zum testen
Module: RPI_GPIO, RPII2C, I2C_EEPROM, I2C_MCP23008, I2C_MCP23017, I2C_MCP342x, I2C_PCA9532, I2C_PCF8574, I2C_SHT21, I2C_BME280

klausw

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.
RasPi B v2 mit FHEM 18B20 über 1Wire, LED PWM Treiber über I2C, Luchtdruck-, Feuchtesensor und ein paar Schalter/LED\'s zum testen
Module: RPI_GPIO, RPII2C, I2C_EEPROM, I2C_MCP23008, I2C_MCP23017, I2C_MCP342x, I2C_PCA9532, I2C_PCF8574, I2C_SHT21, I2C_BME280

Dietmar63

#6
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.
Gruß Dietmar
FB7390, CUL, 2 FHT, FS20
modules: 98_WOL.pm, 98_Heating_Control.pm,   98_WeekdayTimer.pm, 98_RandomTimer.pm, 59_Twilight.pm

klausw

er hat sicher seine Gründe und ich habe zu wenig Ahnung für eine Diskussion  ;D
Danke Nochmals!
RasPi B v2 mit FHEM 18B20 über 1Wire, LED PWM Treiber über I2C, Luchtdruck-, Feuchtesensor und ein paar Schalter/LED\'s zum testen
Module: RPI_GPIO, RPII2C, I2C_EEPROM, I2C_MCP23008, I2C_MCP23017, I2C_MCP342x, I2C_PCA9532, I2C_PCF8574, I2C_SHT21, I2C_BME280

Dietmar63

sicher!
Probier mal ob es klappt!
Gruß Dietmar
FB7390, CUL, 2 FHT, FS20
modules: 98_WOL.pm, 98_Heating_Control.pm,   98_WeekdayTimer.pm, 98_RandomTimer.pm, 59_Twilight.pm

rudolfkoenig

Ich empfehle fuer solche Faelle einen Aufruf-spezifischen Parameter (hash) anzulegen, und irgendwo zu merken.

Dietmar63

Genau so funktionieren die beiden Funktionen.
Gruß Dietmar
FB7390, CUL, 2 FHT, FS20
modules: 98_WOL.pm, 98_Heating_Control.pm,   98_WeekdayTimer.pm, 98_RandomTimer.pm, 59_Twilight.pm

klausw

Klappt super Dietmar
Danke Dir!
RasPi B v2 mit FHEM 18B20 über 1Wire, LED PWM Treiber über I2C, Luchtdruck-, Feuchtesensor und ein paar Schalter/LED\'s zum testen
Module: RPI_GPIO, RPII2C, I2C_EEPROM, I2C_MCP23008, I2C_MCP23017, I2C_MCP342x, I2C_PCA9532, I2C_PCF8574, I2C_SHT21, I2C_BME280

Dietmar63

wenn du es in deinem Modul freigibst müssen wir eventuell noch den Modulnamen davorpacken, damit wir keine Redefines bekommen.
Gruß Dietmar
FB7390, CUL, 2 FHT, FS20
modules: 98_WOL.pm, 98_Heating_Control.pm,   98_WeekdayTimer.pm, 98_RandomTimer.pm, 59_Twilight.pm