Bereinigen von readings in beta-Version

Begonnen von tupol, 30 Januar 2014, 22:24:32

Vorheriges Thema - Nächstes Thema

tupol

Hallo,

es gibt ja jetzt den schönen Befehl "deletereading" http://forum.fhem.de/index.php?topic=10418.0. Den hätte ich auch gerne unter Perl, da ich bei der Benennung meiner Readings täglich dazulernen.  ;)

Ich habe das Großreinmachen nun wie folgt versucht:

if (exists($defs{$name}{READINGS}{$oldReading})) {
delete($defs{$name}{READINGS}{$oldReading});
Log3 $name,2,"$name: !!! Bugfix in LUXTRONIK2.pm: '$oldReadingis' now '$newReading'";
}


Das funktioniert in der Define-Sub gar nicht.

In der Update-Sub funktioniert es auch nicht. Ich krieg zwar den Log-Eintrag aber das Readings ist nicht gelöscht und beim nächsten Update startet der Löschversuch erneut.

Nach vielen Probieren habe ich festgestellt, dass es nur nach readingsBeginUpdate($hash); eingebaut werden kann.

Ich vermute, dass hängt mit dem neuen Reading-Mechanismus und der fhem.save zusammen.

Kann mir eventuell jemand helfen und erklären, wie ich es in die Define-Sub reinbekommen. Dort hätte ich es gerne, da das Reinemachen eigentlich nur beim Neustart oder Rereadcfg benötigt wird.

Gruß

Tupol

Loredo

Warum machst du das nicht direkt?


delete $hash->{READINGS}{meinAltesReading}
Hat meine Arbeit dir geholfen? ⟹ https://paypal.me/pools/c/8gDLrIWrG9

Maintainer:
FHEM-Docker Image, https://github.com/fhem, Astro(Co-Maintainer), ENIGMA2, GEOFANCY, GUEST, HP1000, Installer, LaMetric2, MSG, msgConfig, npmjs, PET, PHTV, Pushover, RESIDENTS, ROOMMATE, search, THINKINGCLEANER

tupol

Das habe ich auch schon probiert mit dem gleichen Effekten. :-(

rudolfkoenig

Im DefFn wird das nicht funktionieren, weil beim Einlesen der Konfigration erst DefFn aufgerufen wird, und danach (beim Lesen von fhem.state) setstate, um die Readings zu restaurieren. Du loeschst also in DefFn ein noch nicht existierendes Reading, was spaeter erst angelegt wird.
Loesung: NotifyFn fuer "global:INITIALIZED" aufsetzen.

Sonst:
- das ist laut CHANGED Datei seit 2005-12-26 (Version 1.5) so
- bitte die Behauptung mit readingsBeginUpdate ignorieren.
- was ist ein Update-Sub?


tupol

Danke. Gibt es fürs bessere verstehen ein Modul, in dem NotifyFn fuer "global:INITIALIZED"  eingebaut ist?

rudolfkoenig


tupol

#6
OK. Eingebaut.

Vielleicht hilft es anderen weiter oder vielleicht lerne ich auch was dazu - deshalb hier der Code.

sub
LUXTRONIK2_Notify(@) {
  my ($hash,$dev) = @_;
  my $name = $hash->{NAME};
 
  if ($dev->{NAME} eq "global" && grep (m/^INITIALIZED|REREADCFG$/,@{$dev->{CHANGED}})){
    # housekeeping
my %cleanUp = (
currentOperatingStatus1 => "currentOperatingState1",
currentOperatingStatus2 => "currentOperatingState3",
...
);
my $oldReading;
my $newReading;
while (($oldReading, $newReading) = each(%cleanUp)) {
if ( exists( $hash->{READINGS}{$oldReading} ) ) {
delete($hash->{READINGS}{$oldReading});
Log3 $name,2,"$name: !!! Bugfix in LUXTRONIK2-Modul: '$oldReading' is now '$newReading'";
}
}
  }
  return;
}



PS: "Behauptung mit readingsBeginUpdate" ist ein Tatsachen/Erlebnisbericht.
      "Update-Sub" ist die Sub, die die Readings aktualisiert.

rudolfkoenig

Falls Du noch $module->{NOTIFYDEV} = "global" setzt, dann wird deine Funktion nur fuer global Events aufgerufen, und belastet das System bei den restlichen Events nicht.

Zitat"Behauptung mit readingsBeginUpdate" ist ein Tatsachen/Erlebnisbericht.
Das ist mir schon klar, es lag aber nicht an readingsBeginUpdate, sondern dass du diese Funktion nicht in DefFn aufgerufen hast.