Anfänger Frage - hier: Verständnisfrage zu hash

Begonnen von Amenophis86, 29 April 2018, 20:25:40

Vorheriges Thema - Nächstes Thema

Amenophis86

Ich bin gerade dabei mein erstes Modul zu schreiben und soweit klappt es eigentlich auch ganz gut. Allerdings habe ich das Problem, dass ich mit dem hash nicht ganz klar komme. Meine Define Funktion sieht wie folgt aus:

sub BatteryChange_Define($$)
{
my ( $hash, $def ) = @_;
my @a = split( "[ \t][ \t]*", $def );
#$a[0] Name des BatteryStatusDevice
#$a[2] Name des BatteryChangedDummy
#$a[3] Name der ReadingsGroup

my $BatteryChangedDummy;
my $hash->{NAME} = $a[0];
my $hash->{MODULVERSION} = $modulversion; # Modulversion schreiben
my $name = $a[0];


# Name für BatteryChange Dummy festlegen
if (int(@a) < 3)
  {
$BatteryChangedDummy = "BatteryChanged";
$BatteryChangedReadingsGroup = "rgBatteryStatus";
  }
elsif (int(@a) == 3)
  {
$BatteryChangedDummy = $a[2];
CommandAttr(undef, "$name BAT_NameChangedDummy $a[2]");
  }
elsif (int(@a) == 4)
  {
$BatteryChangedDummy = $a[2];
CommandAttr(undef, "$name BAT_NameChangedDummy $a[2]");
$BatteryChangedReadingsGroup = $a[3];
CommandAttr(undef, "$name BAT_NameChangedReadingsGroup $a[3]");
  }

# BatteryChange Dummy erstellen
CommandDefMod(undef, "$BatteryChangedDummy dummy");
CommandAttr(undef, "$BatteryChangedDummy room BatteryCheck");
Log3 $hash, 3, "BatteryChange: $BatteryChangedDummy created";

# BatteryStatus ReadingsGroup erstellen
CommandDefMod(undef, "$BatteryChangedReadingsGroup readingsGroup NAME=BatterieStatus:.*");
CommandAttr(undef, "$BatteryChangedReadingsGroup room BatteryCheck");
CommandAttr(undef, "$BatteryChangedReadingsGroup mapping \$READING");
CommandAttr(undef, "$BatteryChangedReadingsGroup valueIcon {SetBatterieIcon(\$READING, \$VALUE)}");
Log3 $hash, 3, "BatteryChange: $BatteryChangedReadingsGroup created";

}


Wenn ich nun $hash->{NAME} abfrage bleibt dies allerdings leer. $hash->{MODULVERSION} hingegen hat den Wert der globalen Variable übernommen und ist beschrieben. Ich habe testweise auch mal $hash->{Test} = "Hallo" geschrieben, aber auch da bleibt die Abfrage auf $hash->{Test} leer. Was habe ich übersehen, dass die Werte nicht in den hash geschrieben werden?
(Da $hash->{NAME} leer geblieben ist, habe ich als Brücke die Zeile $name = $a[0] eingefügt. $name ist damit belegt mit dem Wert, welcher eigentlich auch im hash stehen sollte)

Zweite Frage, müsste $hash->{MODULVERSION} nicht automatisch als Internal im Modul angezeigt werden? Aus mir unbekannten Gründen wird es das allerdings nicht.

Ich sollte vielleicht erwähnen, dass ich programmieren nie wirklich gelernt habe, sondern mir alles selbst beigebracht habe, daher könnte dürfte das Fachwissen begrenzt sein ;)
Aktuell dabei unser neues Haus mit KNX am einrichten. Im nächsten Schritt dann KNX mit FHEM verbinden. Allein zwei Dinge sind dabei selten: Zeit und Geld...

Amenophis86

Otto123 hat mir per PM geschrieben:
ZitatHi,

da ich nicht antworten darf im Dev Forum:

Du machst immer wieder my $hash, damit machst Du nach meiner Kennung doch alles immer wieder neu?!

Einmal die eigene Variable mit "my" Lokal zu haben reicht doch. Alles andere ist kontra.
Oder liege ich da falsch?

Gruß Otto

und das war der Fehler. Ich habe für $hash->{NAME} ein my gesetzt und damit quasi alles von vorher gelöscht.

Danke @Otto123.
Aktuell dabei unser neues Haus mit KNX am einrichten. Im nächsten Schritt dann KNX mit FHEM verbinden. Allein zwei Dinge sind dabei selten: Zeit und Geld...