FHEM Forum

FHEM => Anfängerfragen => Thema gestartet von: Elektrolurch am 27 Juni 2022, 11:54:42

Titel: fhem.pl: ReadingsVal und verwandte - readingsSingleUpdate...
Beitrag von: Elektrolurch am 27 Juni 2022, 11:54:42
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
Titel: Antw:fhem.pl: ReadingsVal und verwandte - readingsSingleUpdate...
Beitrag von: betateilchen am 27 Juni 2022, 12:08:58
Bei $defs{$d} muss nichts extra ausgewertet werden, das ist schlichtweg eine Variable, genau wie $name auch.
Titel: Antw:fhem.pl: ReadingsVal und verwandte - readingsSingleUpdate...
Beitrag von: Elektrolurch am 27 Juni 2022, 15:25:52
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
Titel: Antw:fhem.pl: ReadingsVal und verwandte - readingsSingleUpdate...
Beitrag von: betateilchen am 27 Juni 2022, 16:12:20
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.

Titel: Antw:fhem.pl: ReadingsVal und verwandte - readingsSingleUpdate...
Beitrag von: Elektrolurch am 28 Juni 2022, 11:51:19
[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
Titel: Antw:fhem.pl: ReadingsVal und verwandte - readingsSingleUpdate...
Beitrag von: Elektrolurch am 01 Juli 2022, 11:30:43
Hallo Rudi,

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

Elektrolurch
Titel: Antw:fhem.pl: ReadingsVal und verwandte - readingsSingleUpdate...
Beitrag von: Damian am 01 Juli 2022, 13:00:10
Rudi wird hier nicht antworten - er liest nicht im Anfängerboard.