Ich stehe vor folgenden Problem und bekomme es leider nicht gelöst. Wenn ich mit:
my @daten4 = {system("cat /proc/meminfo")}
folgende Daten in das array @daten4 schreiben möchte:
MemTotal: 8064160 kB
MemFree: 5065108 kB
MemAvailable: 7799528 kB
Buffers: 175748 kB
Cached: 2514244 kB
SwapCached: 0 kB
Active: 678760 kB
Inactive: 2149852 kB
Active(anon): 139516 kB
Inactive(anon): 8496 kB
Active(file): 539244 kB
Inactive(file): 2141356 kB
Unevictable: 0 kB
Mlocked: 0 kB
SwapTotal: 8278012 kB
SwapFree: 8278012 kB
Dirty: 88 kB
Writeback: 0 kB
AnonPages: 138624 kB
Mapped: 45708 kB
Shmem: 9388 kB
Slab: 115560 kB
SReclaimable: 96096 kB
SUnreclaim: 19464 kB
KernelStack: 2560 kB
PageTables: 4772 kB
NFS_Unstable: 0 kB
Bounce: 0 kB
WritebackTmp: 0 kB
CommitLimit: 12310092 kB
Committed_AS: 426140 kB
VmallocTotal: 34359738367 kB
VmallocUsed: 0 kB
VmallocChunk: 0 kB
HardwareCorrupted: 0 kB
AnonHugePages: 104448 kB
CmaTotal: 0 kB
CmaFree: 0 kB
HugePages_Total: 0
HugePages_Free: 0
HugePages_Rsvd: 0
HugePages_Surp: 0
Hugepagesize: 2048 kB
DirectMap4k: 93704 kB
DirectMap2M: 8183808 kB
aus dem array möchte ich dann mittels:
my $mem1 = $daten4[1]; # MemTotal
my $mem2 = $daten4[4]; # MemFree
my $mem3 = $daten4[7]; # MemAvailable
my $mem4 = $daten4[14]; #Cached
my $mem5 = $daten4[47]; #SwapFree
den Variablen $mem1 bis $mem5 die einzelnen Werte aus dem Array zuweisen, leider funktioniert das so nicht, da es ja eine Art Tabelle mit Zeilenumbrüchen ist. Mit folgendem Schnipsel probiert:
my ($daten4) = @_;
my $memg = {system("cat /proc/meminfo")};
my @daten4 = split(/ /,$memg); # und der Zeilenumbruch ???
my $mem1 = $daten4[1]; # MemTotal
my $mem2 = $daten4[4]; # MemFree
my $mem3 = $daten4[7]; # MemAvailable
my $mem4 = $daten4[14]; #Cached
my $mem5 = $daten4[47]; #SwapFree
fhem "setreading Memory MemTotal $mem1";
fhem "setreading Memory MemFree $mem2";
fhem "setreading Memory MemAvailable $mem3";
fhem "setreading Memory Cached $mem4";
fhem "setreading Memory SwapFree $mem5";
Kann mir jemand einen Tipp geben?
VG
Frank
sub test {
my @daten4 = split(/\n/,qx(cat /proc/meminfo));
return Dumper @daten4;
}
kannst Du in Deine 99_myUtils.pm packen und dann mit {test} im fhem Frontend testen.
Ich würde das Ergebnis danach in einen hash %meminfo speichern und dabei die Parameternamen als key verwenden, dann kannst Du mit $meminfo->{MemTotal}
direkt auf den Wert zugreifen.
Klasse, die regex in split war es was mir dringend gefehlt hat.
VG
Frank
Korrigierte Fassung:
sub test {
my %meminfo;
my @daten4 = split(/\n/,qx(cat /proc/meminfo));
foreach (@daten4) {
my ($key,$rest) = split(/:/,$_);
$rest =~ s/ //g;
$rest =~ s/kb$//i;
$meminfo{$key} = $rest;
}
return Dumper \%meminfo;
}
Melde mich noch einmal, was ich nicht verstehe ist, wie ich die Daten aus
$meminfo->{MemTotal}
einer neuen Variable zuweisen oder zurück in ein device schreiben kann.
mit $mem1 = $meminfo->{MemTotal}; geht das nicht, was übersehe ich dabei?
Lass mal das -> weg.
Aber irgendwie denkst Du viel zu kompliziert, denn
$meminfo{MemTotal}
$meminfo{MemFree}
usw.
sind doch bereits Deine Variablen, auf die Du direkt zugreifen kannst, ohne sie vorher noch einmal irgendwohin zuweisen zu müssen. Diese Namen sind doch viel einfacher zu verstehen, als wenn man sie einfach nur durchnummeriert.
Ok, so komme ich weiter, vielen Dank betateilchen.
VG
Frank
Noch einen Schritt weiter? Gerne 8)
Du kannst direkt in der foreach Schleife die readings in Deinem device befüllen.
Problematisch dabei sind allerdings die Werte mit den Klammern, diese Klammern muss man vorher noch wegregexen.
sub test {
# my %meminfo;
my @daten4 = split(/\n/,qx(cat /proc/meminfo));
foreach (@daten4) {
my ($key,$rest) = split(/:/,$_);
$key =~ s/[\(\)]//g;
$rest =~ s/ //g;
$rest =~ s/kb$//i;
# $meminfo{$key} = $rest;
CommandSetReading(undef,"Memory $key $rest");
}
}