Autor Thema: [gelöst] uiTable, cards und Übergabe von Variablen an z.B. cylinder_bars  (Gelesen 426 mal)

Offline gestein

  • Hero Member
  • *****
  • Beiträge: 1238
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.
« Letzte Änderung: 25 November 2022, 09:04:02 von gestein »

Offline Damian

  • Moderator
  • Hero Member
  • ***
  • Beiträge: 9970
Antw:uiTable, cards und Übergabe von Variablen an z.B. cylinder_bars
« Antwort #1 am: 24 November 2022, 17:42:08 »
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

Offline gestein

  • Hero Member
  • *****
  • Beiträge: 1238
Antw:uiTable, cards und Übergabe von Variablen an z.B. cylinder_bars
« Antwort #2 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

Offline Damian

  • Moderator
  • Hero Member
  • ***
  • Beiträge: 9970
Antw:uiTable, cards und Übergabe von Variablen an z.B. cylinder_bars
« Antwort #3 am: 24 November 2022, 17:47:16 »
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

Offline gestein

  • Hero Member
  • *****
  • Beiträge: 1238
Antw:uiTable, cards und Übergabe von Variablen an z.B. cylinder_bars
« Antwort #4 am: 24 November 2022, 18:08:51 »
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  :)

Offline Damian

  • Moderator
  • Hero Member
  • ***
  • Beiträge: 9970
Antw:uiTable, cards und Übergabe von Variablen an z.B. cylinder_bars
« Antwort #5 am: 24 November 2022, 18:51:25 »
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[...
« Letzte Änderung: 25 November 2022, 07:40:26 von Damian »
Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF

Offline gestein

  • Hero Member
  • *****
  • Beiträge: 1238
Antw:uiTable, cards und Übergabe von Variablen an z.B. cylinder_bars
« Antwort #6 am: 24 November 2022, 19:32:42 »
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

Offline Damian

  • Moderator
  • Hero Member
  • ***
  • Beiträge: 9970
Antw:uiTable, cards und Übergabe von Variablen an z.B. cylinder_bars
« Antwort #7 am: 25 November 2022, 07:40:06 »
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

Offline gestein

  • Hero Member
  • *****
  • Beiträge: 1238
Antw:uiTable, cards und Übergabe von Variablen an z.B. cylinder_bars
« Antwort #8 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

Offline Damian

  • Moderator
  • Hero Member
  • ***
  • Beiträge: 9970
Antw:uiTable, cards und Übergabe von Variablen an z.B. cylinder_bars
« Antwort #9 am: 25 November 2022, 11:00:27 »
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

Offline gestein

  • Hero Member
  • *****
  • Beiträge: 1238
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

Offline Damian

  • Moderator
  • Hero Member
  • ***
  • Beiträge: 9970
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