[gelöst] uiTable, cards und Übergabe von Variablen an z.B. cylinder_bars

Begonnen von gestein, 24 November 2022, 17:33:37

Vorheriges Thema - Nächstes Thema

gestein

Hallo,

ich bräuchte für mein Projekt bitte noch einmal Hilfe.

Ich baue mir über das Attribut uiTable eine Tabelle mit Infos zu allen LogFiles auf und möchte dazu gerne in der ersten Zeile eine Übersicht in Textform (das klappt) und ein Diagramm mit den 10 größten LogFiles nach Größe gelistet.
Dazu habe ich ein 2D Array definiert, das dann noch zu befüllen wäre.

Leider klappt aber die Übergabe der Array-Werte an das "cylinder_bars" nicht.
Es kommt die Fehlermeldung:
Global symbol "@vals" requires explicit package name (did you forget to declare "my @vals"?) at (eval 1000518) line 1. in expression: cylinder_bars("biggest files",0,15,"Bytes",undef,undef,undef,1,$vals[0][0],30,$vals[0][1],$vals[1][0],30,$vals[1][1],$vals[2][0],30,$vals[2][1])

Wie kann ich eine Variable an "cylinder_bars" übergeben?

Vielen Dank im Voraus
liebe Grüße
Gerhard

p.s.: Hier der Code (Versuch):
{## alle FileLogs mit Reading
  package ui_Table;;
##  $TC{0..4}="align='center'";;
  $SHOWNOSTATE=1;;
  $ATTRIBUTESFIRST=1;;
  my @vals = ([0, "Null"], [1, "Eins"], [2, "Zwei"], [3, "Drei"]);

sub FormatHumanReadable {
## https://forum.fhem.de/index.php/topic,97807.msg910736.html#msg910736
  my ($val)=@_;;
  1 while $val =~ s/^(-?\d+)(\d{3})/$1.$2/;;
  return $val;;
}

sub FormatOverview {
  my ($devs,$files,$filesize,$fhem_free,$fhem_freep)=@_;
  my $FormatString="<table>";
 
  $FormatString="<tr><td><b>Übersicht FileLogs</b><br><br></td></tr>";
  $FormatString.="<tr><td>#Log-Devices:</td><td>".FormatHumanReadable($devs)."</td></tr>";
  $FormatString.="<tr><td>#Log-Files insgesamt:</td><td>".FormatHumanReadable($files)."</td></tr>";
  $FormatString.="<tr><td>Gesamtgrößte der Log-Files:</td><td>".FormatHumanReadable($filesize)."</td></tr>";

  $FormatString.="<tr><td>noch frei:</td><td>".FormatHumanReadable($fhem_free)."MB, ".FormatHumanReadable($fhem_freep)."%</td></tr>";
  $FormatString.="</table>";
  return $FormatString;
}
}

FormatOverview([$SELF:LogDevs],[$SELF:LogFiles],[$SELF:LogFileSize],[TE.FolderSize:fhem_log_folder_size],[TE.FolderSize:fhem_used])|
cylinder_bars("biggest files",0,15,"Bytes",undef,undef,undef,1,$vals[0][0],30,$vals[0][1],$vals[1][0],30,$vals[1][1],$vals[2][0],30,$vals[2][1])


p.p.s.: Ich hoffe, ich habe beim Kürzen des Codes nichts vergessen.

Damian

Es handelt sich um eindimensionales Array. Welches du so belegen musst ($value1,$color1,$text1,$value2,$color2,$text2,....)
Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF

gestein

Aber das würde ich doch mit den Angaben:
$vals[0][0],30,$vals[0][1] ... Oder?

lg, Gerhard

Damian

Zitat von: gestein am 24 November 2022, 17:45:18
Aber das würde ich doch mit den Angaben:
$vals[0][0],30,$vals[0][1] ... Oder?

lg, Gerhard

ja, und den nächsten als Dreierpäckchen dahinter
Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF

gestein

Demnach sollte der Funktionsaufruf eh stimmen:
cylinder_bars("biggest files",0,15,"Bytes",undef,undef,undef,1,$vals[0][0],30,$vals[0][1],$vals[1][0],30,$vals[1][1],$vals[2][0],30,$vals[2][1])

Liefert aber den oben genannten Fehler.
Irgendwie stehe ich auf dem Schlauch  :)

Damian

#5
ja, deine Definition des Arrays ist nicht global, sondern innerhalb des Block lokal und deshalb außerhalb des Blocks nicht bekannt. Für diesen Zweck habe ich Instanzvariablen vorgesehen, die beginnen mit $_ , für Arrays dann @{$_...}


my @{$_vals} = ([0, "Null"], [1, "Eins"], [2, "Zwei"], [3, "Drei"]);

Zugriff geht dann über $_vals[...
Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF

gestein

Das wäre ja toll.

Aber wenn ich die Deklaration nehme, dann kommt eine Fehlermeldung:
{## alle FileLogs mit Reading
  package ui_Table;;
##  $TC{0..4}="align='center'";;
  $SHOWNOSTATE=1;;
  $ATTRIBUTESFIRST=1;;

## https://forum.fhem.de/index.php/topic,130508.msg1247589.html#msg1247589
  my @{$_vals} = ([0, ""], [0, ""], [0, ""], [0, ""], [0, ""], [0, ""], [0, ""], [0, ""], [0, ""], [0, ""]);


Fehler:
di_LogFiles: error: Can't declare array dereference in "my" at (eval 4971416) line 7, near "} ="
in uiTable: no warnings 'redefine';
  package ui_Table;;

  $hash->{uiTable}{shownostate}=1;;
  $hash->{uiTable}{attributesfirst}=1;;

  my @{$hash->{var}{vals}} = ([0, ""], [0, ""], [0, ""], [0, ""], [0, ""], [0, ""], [0, ""], [0, ""], [0, ""], [0, ""]);


Bitte entschuldige, dass Du mich da so an der Hand nehmen musst.
Danke, lg, Gerhard

Damian

Das Wörtchen my ist wohl zu viel. Diese Variablen muss man nicht deklarieren.
Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF

gestein

Vielen herzlichen Dank für Deine Hilfe.
Das hätte ich alleine nicht geschafft (abgesehen davon, dass ich es gar nicht verstehe).

Funktioniert nun perfekt.
lg, Gerhard

Damian

Zitat von: gestein am 25 November 2022, 09:03:37
Vielen herzlichen Dank für Deine Hilfe.
Das hätte ich alleine nicht geschafft (abgesehen davon, dass ich es gar nicht verstehe).

Funktioniert nun perfekt.
lg, Gerhard

Es ist eigentlich ganz einfach, wenn man weiß was dahinter steckt.

$_ ersetze ich durch $hash->{var}, damit sind diese Variablen (beginnend mit $_) Teil des Hashes und brauchen deshalb nicht deklariert zu werden, alles andere ist Perl.
Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF

gestein

Danke für die Erklärung. Damit ist es ein bisschen verständlicher.

Eine letzte Frage dazu bitte noch:
Ich muss das Array auch noch sortieren. Das würde ich so machen:
@{$_vals} = sort { $a->[0] <=> $b->[0] } @{$_vals};

Stimmt das so?
Oder reiße ich mir damit eventuell ein Speicherproblem auf?
Es funktioniert zumindest.

Danke, lg, Gerhard

Damian

Zitat von: gestein am 26 November 2022, 08:26:04
Danke für die Erklärung. Damit ist es ein bisschen verständlicher.

Eine letzte Frage dazu bitte noch:
Ich muss das Array auch noch sortieren. Das würde ich so machen:
@{$_vals} = sort { $a->[0] <=> $b->[0] } @{$_vals};

Stimmt das so?
Oder reiße ich mir damit eventuell ein Speicherproblem auf?
Es funktioniert zumindest.

Danke, lg, Gerhard

Wenn es mit einem lokalen Array funktioniert, dann muss es genauso mit einem Array innerhalb eines Hashes funktionieren - sonst ist Perl kaputt ;)
Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF