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
Warum machst du das nicht direkt?
delete $hash->{READINGS}{meinAltesReading}
Das habe ich auch schon probiert mit dem gleichen Effekten. :-(
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?
Danke. Gibt es fürs bessere verstehen ein Modul, in dem NotifyFn fuer "global:INITIALIZED" eingebaut ist?
grep INITIALIZED fhem/FHEM/*.pm
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.
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.