fhem.pl: ReadingsVal und verwandte - readingsSingleUpdate...

Begonnen von Elektrolurch, 27 Juni 2022, 11:54:42

Vorheriges Thema - Nächstes Thema

Elektrolurch

Hallo Rudi,

In meinem perl - Code kommen in der gleichen sub häufig "readingsBulkUpdate($hash..." und ReadingsVal($name..." (bzw. andere "Readings..($name...") Funktionsaufrufe vor.
Für jeder der Funktionen muss erneut der $name über die $defs$name] in den zugehörigen hash in der fhem.pl "nachgeschlagen" werden, was ja eigentlich auch etwas unnötig Rechenleistung kostet, da der hash ja sowieso bekannt ist.

Könnte man in den subs "Reading..($name..." in der fhem.pl nicht auch den hash zulassen?


if(ref($d ne 'HASH')
{
return$default) if(!defined($defs{$d}));
}
else
{
$d = $defs{$d};
}
  my $hash = $d;
...


Wenn man sich dann den orginalen Code ansieht, sieht man dass ziemlich häufig immer wieder $defs{$d} ausgewertet werden muss (Beispiel):

if(defined($defs{$d}) &&
     defined($defs{$d}{OLDREADINGS}) &&
     defined($defs{$d}{OLDREADINGS}{$n}) &&
     defined($defs{$d}{OLDREADINGS}{$n}{VAL})) {
     return $defs{$d}{OLDREADINGS}{$n}{VAL};
  }
  return $default;
}


Wäre mein Verbesserungsvorschlag.

Elektrolurch
configDB und Windows befreite Zone!

betateilchen

Bei $defs{$d} muss nichts extra ausgewertet werden, das ist schlichtweg eine Variable, genau wie $name auch.
-----------------------
Formuliere die Aufgabe möglichst einfach und
setze die Lösung richtig um - dann wird es auch funktionieren.
-----------------------
Lesen gefährdet die Unwissenheit!

Elektrolurch

Da muss ich leider widersprechen:
$defs{$d} ist ein perl - Hash, der von perl zuerst ausgerechnet werden muss, d.h. in einer Tabelle (hashes) nachgeschlagen werden muss.
Bei beispielsweise 300 Objekten in %defs werden zwar nicht 300 Namens-vergleiche ausgeführt, dass Suchen in "Hash-Werten" funktioniert da schon etwas effizienter.
Trotzdem muss ja nicht der gleiche Ausdruck (unnötiger Weise) -zig mal erneut berechnet werden, dass lernt(e) man ja früher schon im Grundstudium.

Die Frage war ja: Warum ReadingsVal mit $name und readingsBulkUpdate mit $hash aufgerufen werden.
Ich fände es für die Readings... - Funktionen einfach auch sinnvoll, dass die auch zusätzlich mit $hash aufgerufen werden können.
Die Vermeidung zusätzlicher Rechenoperationen ist ein Abfallprodukt davon (sihe auch die Diskussion über notifyDev im hash zur Optimierung der Event-Verarbeitung.

Elektrolurch
configDB und Windows befreite Zone!

betateilchen

Zitat von: Elektrolurch am 27 Juni 2022, 15:25:52
Die Frage war ja: Warum ReadingsVal mit $name und readingsBulkUpdate mit $hash aufgerufen werden.

ReadingsVal() ist für die Anwendung durch FHEM-Benutzer gedacht. Der Benutzer kennt normalerweise den Namen des betreffenden devices und muss sich deshalb nicht um den device-hash kümmern.
Die readings...Update Funktionen sind für die FHEM Entwicklung zur Benutzung in ihren Modulen vorgesehen. Dort wird in aller Regel ohnehin auf hash-Ebene gearbeitet.

-----------------------
Formuliere die Aufgabe möglichst einfach und
setze die Lösung richtig um - dann wird es auch funktionieren.
-----------------------
Lesen gefährdet die Unwissenheit!

Elektrolurch

[Zitat]
Die readings...Update Funktionen sind für die FHEM Entwicklung zur Benutzung in ihren Modulen vorgesehen. Dort wird in aller Regel ohnehin auf hash-Ebene gearbeitet.
[/Zitat]
Genau das ist es, was mich wundert: In den Modulen arbeite ich mit hash, aber es gibt keine ReadingsVal, die einen hash akzeptiert. Ein unnötiger Umweg, wie ich ja bereits oben beschrieben habe.

Elektrolurch
configDB und Windows befreite Zone!

Elektrolurch

Hallo Rudi,

als "Erfinder" der fhem.pl: Wie siehst Du meinen Erweiterungsvorschlag?
Die Diskussion mit Betateilchen war diesbezüglich nicht zielführend.

Elektrolurch
configDB und Windows befreite Zone!

Damian

Rudi wird hier nicht antworten - er liest nicht im Anfängerboard.
Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF