Autor Thema: Update controls_fhem.txt  (Gelesen 1445 mal)

Offline Ralf9

  • Developer
  • Hero Member
  • ****
  • Beiträge: 2568
Antw:Update controls_fhem.txt
« Antwort #15 am: 23 Februar 2019, 14:05:12 »
Zitat
Gibt 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
SIGNALduino promini (LAN cc1101 + WLAN RXB6), WH3080,  Hideki, Id 7

Offline Sidey

  • Developer
  • Hero Member
  • ****
  • Beiträge: 2389
Antw:Update controls_fhem.txt
« Antwort #16 am: 23 Februar 2019, 14:22:51 »
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.
« Letzte Änderung: 28 Februar 2019, 22:55:24 von Sidey »
Signalduino, HMLan, Raspberry Pi, Mysensors, ESPEasy, HABridge für Echo

Offline betateilchen

  • Developer
  • Hero Member
  • ****
  • Beiträge: 16097
  • s/fhem\.cfg/configDB/g
Antw:Update controls_fhem.txt
« Antwort #17 am: 23 Februar 2019, 14:44:18 »
von einem package hatte Rudi nie gesprochen. Er wollte einfach nur die Variable global verfügbar gemacht haben:

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.
-----------------------
Unaufgeforderte Anfragen per email werden von mir nicht beantwortet. Dafür ist das Forum da.

Offline Ralf9

  • Developer
  • Hero Member
  • ****
  • Beiträge: 2568
Antw:Update controls_fhem.txt
« Antwort #18 am: 23 Februar 2019, 17:12:28 »
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
SIGNALduino promini (LAN cc1101 + WLAN RXB6), WH3080,  Hideki, Id 7

Offline Ralf9

  • Developer
  • Hero Member
  • ****
  • Beiträge: 2568
Antw:Update controls_fhem.txt
« Antwort #19 am: 23 Februar 2019, 18:12:14 »
habe was gefunden
https://stackoverflow.com/questions/30236740/generating-a-subroutine-reference-from-a-string
damit funktioniert es

my $method = \&{ $ProtocolListSIGNALduino{$id}{method} };
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
SIGNALduino promini (LAN cc1101 + WLAN RXB6), WH3080,  Hideki, Id 7

Offline Ralf9

  • Developer
  • Hero Member
  • ****
  • Beiträge: 2568
Antw:Update controls_fhem.txt
« Antwort #20 am: 24 Februar 2019, 08:35:53 »
Zitat
von 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
SIGNALduino promini (LAN cc1101 + WLAN RXB6), WH3080,  Hideki, Id 7

Offline Sidey

  • Developer
  • Hero Member
  • ****
  • Beiträge: 2389
Antw:Update controls_fhem.txt
« Antwort #21 am: 24 Februar 2019, 09:19:56 »
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, HMLan, Raspberry Pi, Mysensors, ESPEasy, HABridge für Echo

Offline Ralf9

  • Developer
  • Hero Member
  • ****
  • Beiträge: 2568
Antw:Update controls_fhem.txt
« Antwort #22 am: 03 März 2019, 19:00:35 »
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.pmversucht, bekomme dabei aber die folgende Fehlermeldung:
Can't read ./FHEM/libsignalduino_protocols.pm: No such file or directoryGibt 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
SIGNALduino promini (LAN cc1101 + WLAN RXB6), WH3080,  Hideki, Id 7

Offline Sidey

  • Developer
  • Hero Member
  • ****
  • Beiträge: 2389
Antw:Update controls_fhem.txt
« Antwort #23 am: 03 März 2019, 19:14:19 »
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, HMLan, Raspberry Pi, Mysensors, ESPEasy, HABridge für Echo

Offline Ralf9

  • Developer
  • Hero Member
  • ****
  • Beiträge: 2568
Antw:Update controls_fhem.txt
« Antwort #24 am: 03 März 2019, 19:44:23 »
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
SIGNALduino promini (LAN cc1101 + WLAN RXB6), WH3080,  Hideki, Id 7

Offline Sidey

  • Developer
  • Hero Member
  • ****
  • Beiträge: 2389
Antw:Update controls_fhem.txt
« Antwort #25 am: 03 März 2019, 21:32:02 »
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, HMLan, Raspberry Pi, Mysensors, ESPEasy, HABridge für Echo