Index: 02_RSS.pm
===================================================================
--- 02_RSS.pm (Revision 5621)
+++ 02_RSS.pm (Arbeitskopie)
@@ -14,7 +14,11 @@
use feature qw/switch/;
use vars qw(%data);
use HttpUtils;
-require "98_SVG.pm"; # enable use of plotAsPng()
+#require "98_SVG.pm"; # enable use of plotAsPng()
+sub plotAsPng(@); # forward declaration will be enough
+ # to ensure correct function
+ # and will avoid reloading 98_SVG.pm
+ # during fhem startup/rereadcfg
my @cmd_halign= qw(halign thalign ihalign);
my @cmd_valign= qw(valign tvalign ivalign);
Hallo,
mich stört auch, daß 98_SVG.pm zweimal geladen wird.
Wie wird aber ohne das require sichergestellt, daß das Modul überhaupt geladen wird? Es ist nämlich nicht in allen Fällen so, daß das Modul geladen ist, bevor es von plotAsPng() benötigt wird. Ich glaube, daß ich es sogar aufgrund einer Anwenderfehlermeldung erst eingebaut habe.
require lädt eine Library ja nur, wenn Sie nicht bereits geladen ist. Kann es sein, daß die Meldungen über das erneute Laden aus FileLog_loadSVG() kommen?
Grüße
Boris
Hallo Boris,
nein, das require hattest Du seinerzeit eingebaut, weil Du es für gut und notwendig angesehen hast (Mein Vorschlag damals war ja, diese Funktion in das RSS Modul einzubauen).
Du kannst mit plotAsPng aber nur einen plot einbinden, der bereits definiert ist. Und um einen plot per define in fhem verfügbar zu haben, muss das 98_SVG mindestens einmal geladen sein.
Zitatrequire lädt eine Library ja nur, wenn Sie nicht bereits geladen ist.
Stimmt - aber nur für die perl ebene.
require macht das sehr wohl. Aber wenn RSS vor dem ersten SVG geladen wird, weiss fhem beim ersten define <> SVG nicht, dass 98_SVG.pm bereits geladen ist, weil es zwar von perl geladen wurde, aber nicht von fhem und deshalb nicht in %modules enthalten ist. Deshalb lädt fhem das Modul beim ersten define eines SVG auf jeden Fall nochmal.
Im Prinzip geht es hier um ein Reihenfolgenproblem. Mit der Vorwärtsdeklaration der einzigen benötigten Funktion sollte das aber gelöst sein. Bei mir funktioniert das Ganze jedenfalls fehlerfrei. Ich werde heute abend auf einem Testsystem noch ausprobieren, wie sich das verhält, wenn ich die Reihenfolge bewußt verändere und ein RSS vor dem ersten SVG in der fhem.cfg definiert wird. Bin aber der Ansicht, dass ich das heute sogar schonmal so hatte.
Wie wäre es mit
sub
RSS_loadSVG()
{
if(!$modules{SVG}{LOADED} && -f "$attr{global}{modpath}/FHEM/98_SVG.pm") {
my $ret = CommandReload(undef, "98_SVG");
Log3 undef, 1, $ret if($ret);
}
}
und einem RSS_loadSVG() in RSS_Initialize()?
Grüße
Boris
Warum magst Du eigentlich einfache Lösungen nicht?
Testergebnis:
Meine eingangs vorgeschlagene Lösung funktioniert einwandfrei - egal in welcher Reihenfolge die Module geladen werden.
Na dann, ist eingecheckt.
bn