FHEM Forum

FHEM => Anfängerfragen => Thema gestartet von: Hackstall am 22 Januar 2019, 20:12:22

Titel: Überladen von Util-Funktionen
Beitrag von: Hackstall am 22 Januar 2019, 20:12:22
Hallo,

eine Frage, kann ich Routinen (Subs) die aus StandardModuln per default genommen werden mit eigenen Routinen (Subs)
in myUtils überlagern. Geht das technisch überhaupt.

Also so dass eine Routine zBsp. Convert($$)  aus dem 04_ExtModul mit meiner Routine Convert($$) aus meinem Modul 99_myUtils
von FHEM genommen wird?

Danke Andreas
Titel: Antw:Überladen von Util-Funktionen
Beitrag von: amenomade am 24 Januar 2019, 14:59:41
Wenn ich richtig verstanden habe, willst Du eine Funktion eines Moduls überschreiben/überladen? Das halte ich für keine gute Idee, da Du nicht weisst welche Abhängigkeit diese Funktion hat (und in der Zukunft haben wird!).

Wenn das sein soll: die 99.* Modulen werden am Ende geladen. Ich habe es nie probiert, aber theoretisch könntest Du dann sowas in myUtils in der Initialize Funktion schreiben:
  if(!$modules{ExtModul}{LOADED} && -f "$attr{global}{modpath}/FHEM/04_ExtModul.pm") {
            my $ret = CommandReload(undef, "04_ExtModul");
    Log3 undef, 1, $ret if($ret);
}

um das Modul ExtModul zu laden, falls er nicht geladen ist (ausser 99.* werden erst die Modulen geladen, wenn ein Device vom Typ definiert wird, sprich define xxxx ExtModul blabla in der Config.)

Und dann weiter in der Datei:
sub ExtModul_Convert($$) {... code...}
Somit sollte die Funktion überschrieben werden... Du wirst ein Warning in der Log haben, da die sub "redefined" wird, aber vielleicht kannst Du noch es verhindern mit:
no warnings 'redefine';. Ich würde das Warning lassen, damit ein Spur von dieser Konstrukt irgendwo bleibt...


Wie gesagt: nicht getestet, und vor allem ohne Gewähr! Bin kein FHEM Developer
Titel: Antw:Überladen von Util-Funktionen
Beitrag von: CoolTux am 24 Januar 2019, 15:04:29
Kleine Ausbesserung. Die 99er werden als aller erstes geladen. Dem zu Folge sollte ein überschreiben eigentlich nicht möglich sein.
Davon ab ist davon dringend ab zu raten. Siehe amenomade Beitrag.
Titel: Antw:Überladen von Util-Funktionen
Beitrag von: Beta-User am 24 Januar 2019, 15:09:36
...sowas paßt richtig gut in Anfängerfragen :o ...
Im Ernst: Was willst du erreichen?
Wenn du bessere Varianten hast für vorhandene Routinen: https://wiki.fhem.de/wiki/How_to_write_a_patch

Solange du austestest: https://wiki.fhem.de/wiki/Update#exclude_from_update

Ansonsten kannst du auch mit packages arbeiten usw.. Aber das ist erst mal alles Spekulation, solange du nicht verrätst, was die Motivation dahinter ist...
Titel: Antw:Überladen von Util-Funktionen
Beitrag von: amenomade am 24 Januar 2019, 16:09:56
Zitat von: CoolTux am 24 Januar 2019, 15:04:29
Die 99er werden als aller erstes geladen.

Ich wurde davon verwirrt aus fhem.pl:

    foreach my $m (sort readdir(DH)) {
      next if($m !~ m/^([0-9][0-9])_(.*)\.pm$/);
      $modules{$2}{ORDER} = $1;
      CommandReload(undef, $m)                  # Always load utility modules
         if($1 eq "99" && !$modules{$2}{LOADED});
      $counter++;
    }


Aber Du hast natürlich Recht (Du bist FHEM Developer ;) ). Dann ist es nicht so einfach... Wobei... es fehlt nicht so viel in meinem Code oben.

Egal: das wäre sowieso eine schlechte Idee gewesen
Titel: Antw:Überladen von Util-Funktionen
Beitrag von: CoolTux am 24 Januar 2019, 16:28:52
Wenn der Thread Ersteller "besseren" Code für eine bereits vorhandene Funktion hat dann bitte her damit.
Am besten ins passende Forum als Patch.