Update controls_fhem.txt

Begonnen von Sidey, 21 Februar 2019, 22:01:13

Vorheriges Thema - Nächstes Thema

Ralf9

ZitatGibt es einen Grund, warum du in dieser Version auf package ("package signalduino_protocols;") bestehst?

Ich habe das package reingemacht, da es in der HMCCUConf.pm auch drin ist.

Ohne das "package signalduino_protocols;" und in der 00_SIGNALduino.pm
my %ProtocolListSIGNALduino = %signalduino_protocols::ProtocolListSIGNALduino;
bekomme ich z.B. bei
if (exists($ProtocolListSIGNALduino{$protocol}{format}) && $ProtocolListSIGNALduino{$protocol}{format} eq 'manchester')

diese Fehlermeldung

Global symbol "%ProtocolListSIGNALduino" requires explicit package name at ./FHEM/00_SIGNALduino.pm


Gruß Ralf
FHEM auf Cubietruck mit Igor-Image, SSD und  hmland + HM-CFG-USB-2,  HMUARTLGW Lan,   HM-LC-Bl1PBU-FM, HM-CC-RT-DN, HM-SEC-SC-2, HM-MOD-Re-8, HM-MOD-Em-8
HM-Wired:  HMW_IO_12_FM, HMW_Sen_SC_12_DR, Selbstbau IO-Module HBW_IO_SW
Maple-SIGNALduino, WH3080,  Hideki, Id 7

Sidey

#16
Das SIGNALduino Modul liegt aktuell im Package main.
Jededes Modul muss meines Wissens nach in einem Package liegen.

Egal wo was liegt sind die Variablen aber auch erst mal lokal. Da helfen dann so Bezeichnet wie our.

Das meinte ich übrigens mit Karten legen
Das ist aus meiner Sicht nicht ganz so einfach die Sachen in ein Packages zu verpacken, wenn es Referenzen in beide Richtungen gibt.
Signalduino, Homematic, Raspberry Pi, Mysensors, MQTT, Alexa, Docker, AlexaFhem

Maintainer von: SIGNALduino, fhem-docker, alexa-fhem-docker, fhempy-docker

betateilchen

von einem package hatte Rudi nie gesprochen. Er wollte einfach nur die Variable global verfügbar gemacht haben:

Zitat von: rudolfkoenig am 22 Februar 2019, 21:50:50
Es reicht, wenn du deine Datei "FHEM/lib/signalduino_protocols.pm" nennst, vor dem ersten Klammer

use vars qw(%signalduino_protocols);
%signalduino_protocols =

schreibst,

Ein bewährtes Verfahren, das auch an anderen Stellen in FHEM bereits seit langem verwendet wird.
-----------------------
Formuliere die Aufgabe möglichst einfach und
setze die Lösung richtig um - dann wird es auch funktionieren.
-----------------------
Lesen gefährdet die Unwissenheit!

Ralf9

Wäre es eine Möglichkeit in der ProtocolListSIGNALduino in method anstatt einer Referenz der Subroutine
method          => \&SIGNALduino_OSV1,
den Namen der Subroutine als String zu speichern?
method          =>  "SIGNALduino_OSV1",

Wie müsste dann dies aussehen?
my $method = $ProtocolListSIGNALduino{$id}{method};
my ($rcode,$res) = $method->($name,$bitData,$id,$mcbitnum);

FHEM auf Cubietruck mit Igor-Image, SSD und  hmland + HM-CFG-USB-2,  HMUARTLGW Lan,   HM-LC-Bl1PBU-FM, HM-CC-RT-DN, HM-SEC-SC-2, HM-MOD-Re-8, HM-MOD-Em-8
HM-Wired:  HMW_IO_12_FM, HMW_Sen_SC_12_DR, Selbstbau IO-Module HBW_IO_SW
Maple-SIGNALduino, WH3080,  Hideki, Id 7

Ralf9

FHEM auf Cubietruck mit Igor-Image, SSD und  hmland + HM-CFG-USB-2,  HMUARTLGW Lan,   HM-LC-Bl1PBU-FM, HM-CC-RT-DN, HM-SEC-SC-2, HM-MOD-Re-8, HM-MOD-Em-8
HM-Wired:  HMW_IO_12_FM, HMW_Sen_SC_12_DR, Selbstbau IO-Module HBW_IO_SW
Maple-SIGNALduino, WH3080,  Hideki, Id 7

Ralf9

Zitatvon einem package hatte Rudi nie gesprochen. Er wollte einfach nur die Variable global verfügbar gemacht haben:

Das Problem dabei ist, daß ich bis jetzt noch kein Beispiel gefunden habe wo das auch ohne package funktioniert.

Bei HMCCUConf.pm und UConv.pm werden auch package verwendet.

Gruß Ralf

FHEM auf Cubietruck mit Igor-Image, SSD und  hmland + HM-CFG-USB-2,  HMUARTLGW Lan,   HM-LC-Bl1PBU-FM, HM-CC-RT-DN, HM-SEC-SC-2, HM-MOD-Re-8, HM-MOD-Em-8
HM-Wired:  HMW_IO_12_FM, HMW_Sen_SC_12_DR, Selbstbau IO-Module HBW_IO_SW
Maple-SIGNALduino, WH3080,  Hideki, Id 7

Sidey

Was spricht denn gegen ein Package?

Das Package selbst verursacht doch ohnehin keine Probleme.

Das woran ich hänge ist, zur Laufzeit ein anderes Modul mit gleichem Namen zu laden und die vorhandenen Daten sauber zu ersetzen.
Signalduino, Homematic, Raspberry Pi, Mysensors, MQTT, Alexa, Docker, AlexaFhem

Maintainer von: SIGNALduino, fhem-docker, alexa-fhem-docker, fhempy-docker

Ralf9

Es funktioniert inzwischen alles soweit, es ist aber noch ein kleine Frage aufgetaucht.

Ich habe die Protokollhashliste damit in die 00_SIGNALduino.pm eingebunden:
require "lib/signalduino_protocols.pm";
my %ProtocolListSIGNALduino = %signalduino_protocols::ProtocolListSIGNALduino;


Nun wollte ich nach dem editieren der signalduino_protocols.pm diese mit reload neuladen:
Ich habe es mit
reload lib/signalduino_protocols.pm
versucht, bekomme dabei aber die folgende Fehlermeldung:
Can't read ./FHEM/libsignalduino_protocols.pm: No such file or directory
Gibt es eine Möglichkeit ein "/" in die commandline einzugeben?

Gruß Ralf

FHEM auf Cubietruck mit Igor-Image, SSD und  hmland + HM-CFG-USB-2,  HMUARTLGW Lan,   HM-LC-Bl1PBU-FM, HM-CC-RT-DN, HM-SEC-SC-2, HM-MOD-Re-8, HM-MOD-Em-8
HM-Wired:  HMW_IO_12_FM, HMW_Sen_SC_12_DR, Selbstbau IO-Module HBW_IO_SW
Maple-SIGNALduino, WH3080,  Hideki, Id 7

Sidey

Hi Ralf,

Das neuladen des Perl Modules, wenn es denn wie bei einem Fhem Modul funktioniert, würde dann aber noch immer nicht die Kopie der Variable erneuern.

Was für ein Problem gibt es denn mit der bereits implementierten Variante über

{SIGNALduino_LoadProtocolHash("$attr{global}{modpath}/FHEM/lib/signalduino_protocols.pm");}


Signalduino, Homematic, Raspberry Pi, Mysensors, MQTT, Alexa, Docker, AlexaFhem

Maintainer von: SIGNALduino, fhem-docker, alexa-fhem-docker, fhempy-docker

Ralf9

Wie ich schon im github geschrieben habe, erscheint mir das mit dem Laden des Hashes über die Sub SIGNALduino_LoadProtocolHash recht aufwändig und umständlich. Wenn jemand mehrere signalduino Devices hat, wird bei jedem signalduino Device die signalduino_protocols.pm neu geladen und falls zukünftig weitere hashes in der signalduino_protocols.pm dazukommen, wird beim Laden jedes hashes auch signalduino_protocols.pm neu geladen.

sub SIGNALduino_LoadProtocolHash($)
{
if (! -e $_[0]) {
return %{ {"error" => "File does not exsits"}};
}
use Symbol 'delete_package';
delete_package 'SD_Protocols';
delete($INC{$_[0]});
if(  ! eval { require "$_[0]"; 1 }  ) {
return %{ {"error" => $@}};
}
return  %{SD_Protocols->getProtocolList};
}
FHEM auf Cubietruck mit Igor-Image, SSD und  hmland + HM-CFG-USB-2,  HMUARTLGW Lan,   HM-LC-Bl1PBU-FM, HM-CC-RT-DN, HM-SEC-SC-2, HM-MOD-Re-8, HM-MOD-Em-8
HM-Wired:  HMW_IO_12_FM, HMW_Sen_SC_12_DR, Selbstbau IO-Module HBW_IO_SW
Maple-SIGNALduino, WH3080,  Hideki, Id 7

Sidey

Zitat von: Ralf9 am 03 März 2019, 19:44:23
Wenn jemand mehrere signalduino Devices hat, wird bei jedem signalduino Device die signalduino_protocols.pm neu geladen und falls zukünftig weitere hashes in der signalduino_protocols.pm dazukommen, wird beim Laden jedes hashes auch signalduino_protocols.pm neu geladen.

Wieso meinst Du dass jede Definition das Laden auslöst? Das Laden wir genau 1x für das gesamte Modul ausgelöst.

Diese sub existiert, damit zur Laufzeit und nicht zur compile Zeit eine Perlmodul Datei geladen werden die das Package SD_Protocols und darin eine Funktion getProtocolList bereitstellt.

Was das Laden anderer Variablen angeht, kann ich dir nicht folgen. Die sind nach dem Laden des angegebenen Perlmodules über ihren vollqualifizierten Namen erreichbar und könnten auch über getter subs bereitgestellt werden.

Grüße Sidey
Signalduino, Homematic, Raspberry Pi, Mysensors, MQTT, Alexa, Docker, AlexaFhem

Maintainer von: SIGNALduino, fhem-docker, alexa-fhem-docker, fhempy-docker