Autor Thema: Fehlender Gerätename bei gruppierter Liste  (Gelesen 918 mal)

Offline xenos1984

  • Developer
  • Full Member
  • ****
  • Beiträge: 412
Fehlender Gerätename bei gruppierter Liste
« am: 24 Januar 2021, 14:38:09 »
Ich versuche gerade, eine readingsGroup mit der <device>:@<index>,<regex> Syntax anzulegen:

sysmon_.*:@2,<#1>,(.*)_rx_packets_rate,#1_rx_bytes_rate,#1_tx_packets_rate,#1_tx_bytes_rate

Im großen und ganzen klappt das auch und ich bekomme in den Spalten den mit der RegEx gefundenen Basis-Namen des Readings sowie die einzelnen Werte angezeigt. Allerdings ist die erste Spalte, in der normalerweise der Name des Geräts erscheint, leer. Nach ein wenig Suche im Quelltext vermute ich, dass es an dieser Zeile liegt:

822       $hash->{groupedList} = [];
823       foreach my $n (@l) {
824         my $cg1 = @{$n}[1]; my $cg2 = @{$n}[2]; my $cg3 = @{$n}[3]; my $cg4 = @{$n}[4];
825         my @l = @list[1..@list-1];
826         $l[$index-1] = @{$n}[0];
827         s/#1/$cg1/ for @l; s/#2/$cg2/ for @l; s/#3/$cg3/ for @l; s/#4/$cg4/ for @l;
828         push @{$hash->{groupedList}}, '<br2>' if( $hash->{groupedList} );
829         push @{$hash->{groupedList}}, @l;
830       }
831       @list = @{$hash->{groupedList}} if( $hash->{groupedList} );

Wenn ich das richtig verstehe, hat Zeile 828 den Sinn und Zweck, dass in dem Fall, dass es für ein Gerät mehrere Treffer beim Reading-RegEx gibt, zwischen zwei Treffern einen Zeilenumbruch einzubauen, indem geprüft werden soll, ob $hash->{groupedList} schon Einträge enthält. Das wird dann später ausgewertet, und bei einem Zeilenumbruch eine leere Tabellenzelle statt des Namen eingefügt:

885         $row++ if( $txt eq 'br2' );
886         if( $txt eq 'br' || $txt eq 'br2' ) {
887           $ret .= sprintf("<tr class=\"%s\">", ($row-1&1)?"odd":"even");
888           $ret .= "<td $value_columns><div $cell_style $name_style class=\"dname\"></div></td>" if( $show_names );
889           $first = 0;
890           ++$cell_row;
891           $cell_column = 1;
892           next;

Allerdings gibt if( $hash->{groupedList} ) immer true zurück, auch beim ersten Durchlauf, wenn das Array noch leer ist (das if tut also effektiv gar nichts) - mit dem Ergebnis, dass auch in der ersten Zeile kein Name erscheint. Vielleicht sollte es eher so aussehen?

828         push @{$hash->{groupedList}}, '<br2>' if( @{$hash->{groupedList}} );

Offline OdfFhem

  • Sr. Member
  • ****
  • Beiträge: 789
Antw:Fehlender Gerätename bei gruppierter Liste
« Antwort #1 am: 24 Januar 2021, 18:05:28 »
@xenos1984

Ich nutze die @-Logik an mehreren Stellen und habe eigentlich keine Probleme.

Ich habe einen leicht abgewandelten Test gemacht und das angehängte Ergebnis erhalten.

Stimmt die Definition im übertragenen Sinne mit Deiner Definition überein oder fehlt ein entscheidender Teil?

Offline xenos1984

  • Developer
  • Full Member
  • ****
  • Beiträge: 412
Antw:Fehlender Gerätename bei gruppierter Liste
« Antwort #2 am: 24 Januar 2021, 18:15:12 »
@OdfFhem

Dein Ergebnis zeigt das gleiche Verhalten wie bei mir. Mittels <#1> wird der extrahierte Teil des Reading-Namens ausgegeben - in dem Fall also die Schnittstelle. Das ist aber die zweite Spalte der Tabelle.

Wenn du dir den Quelltext der erstellten Tabelle ansiehst, findest du aber eine leere erste Spalte:

<td><div class="dname"></div></td>
Dort würde normalerweise der Name des Geräts stehen, also der des SYSMON Device. Bei anderen Readingsgroups ohne @-Logik ist das auch der Fall, aber mit der @-Logik bleibt diese erste Spalte leer. Zum Vergleich:

TYPE=SYSMON:ni_.*_rx

Offline OdfFhem

  • Sr. Member
  • ****
  • Beiträge: 789
Antw:Fehlender Gerätename bei gruppierter Liste
« Antwort #3 am: 24 Januar 2021, 18:55:57 »
@xenos1984

Hier ist ja (fast) eine Entschuldigung fällig, da ich wohl eine Hirnwindung zu früh geschaltet habe.

Mein Augenmerk lag - warum auch immer - auf <#1> und ich wunderte mich, dass diese Information fehlen soll.

In den @-Fällen nutze ich als Spalte - wenn gewünscht - meist ?alias oder !NAME und dann steht das gewünschte Ergebnis mit Hilfe der entsprechenden value-Attribute in einer selbst festlegbaren Spalte.

Angenommen, eine Programmänderung hätte die Auswirkung, dass die erste Spalte grundsätzlich wieder der Gerätename samt Link wäre. Wäre diese erste Spalte abschaltbar?

Offline xenos1984

  • Developer
  • Full Member
  • ****
  • Beiträge: 412
Antw:Fehlender Gerätename bei gruppierter Liste
« Antwort #4 am: 24 Januar 2021, 19:14:08 »
In den @-Fällen nutze ich als Spalte - wenn gewünscht - meist ?alias oder !NAME und dann steht das gewünschte Ergebnis mit Hilfe der entsprechenden value-Attribute in einer selbst festlegbaren Spalte.

Das ist natürlich auch eine Möglichkeit. Ich nutze bei meinen anderen ReadingsGroups das Attribute mapping, um in der (hier leeren) ersten Spalte den Gerätenamen zusammen mit seinem Icon darzustellen:

attr rg mapping {FW_makeImage(AttrVal($DEVICE, "icon", $DEVICE)) . ' $ALIAS'}
Das kann man sicher auch in eine andere Spalte bekommen, wobei es natürlich schön wäre, wenn man die eigentlich schon dafür vorhandene erste Spalte nutzen könnte, und das nicht mit z.B. valueFormat in den anderen Spalten vermischen würde. Außerdem dürfte bei deinem Ansatz der Gerätename in jeder Zeile auftauchen, also wenn mehrere Readings vom gleichen Gerät angezeigt werden:

PC1 eth0
PC1 eth1
PC2 eth0
PC2 eth1

In der von mir "reparierten" Variante dagegen nur in der jeweils ersten Zeile:

PC1 eth0
    eth1
PC2 eth0
    eth1

Zitat
Angenommen, eine Programmänderung hätte die Auswirkung, dass die erste Spalte grundsätzlich wieder der Gerätename samt Link wäre. Wäre diese erste Spalte abschaltbar?

Ja, indem man das Attribut nonames auf 1 setzt. Dann verschwindet diese Spalte komplett, es werden auch keine leeren Zellen mehr ausgegeben.

Offline OdfFhem

  • Sr. Member
  • ****
  • Beiträge: 789
Antw:Fehlender Gerätename bei gruppierter Liste
« Antwort #5 am: 26 Januar 2021, 07:37:28 »
@xenos1984

Hinweis: !NAME war meinerseits nicht ganz korrekt, da das Internal mit +NAME angesprochen werden muss.


Deine vorgeschlagene Änderung scheint absolut plausibel. Deshalb habe ich Deine Änderung auch mal ins Modul übernommen und ein wenig rumprobiert.

Zum Test verwende ich die folgende readingsGroup:
defmod rg_Test readingsGroup <>,<NAME>,<ip>,<rx>,<tx>,<interface> TYPE=SYSMON:@2,+NAME,ni_(.*)_ip,ni_#1_rx,ni_#1_tx,<#1>
attr rg_Test sortColumn 0

Die erste Spalte wird beim ersten Auftreten eines Devices erwartungsgemäß mit dem Device-Link gefüllt.
Da ein Device im Zweifel mehrere Interfaces hat, gibt es somit natürlich auch Zeilen ohne Device-Link.
Eigentlich kein Problem, solange die readingsGroup in ihrer Original-Sortierung vorliegt.
Sortiert man aber dann nach irgendeiner Spalte, wird's ohne zusätzliche Device-Link-Spalte schwierig ...
Das nonames-Attribut sorgt im Fall einer zusätzlichen Spalte immerhin für Abhilfe.

Aufgefallen ist mir noch, dass im vorliegenden Fall die erste Spalte - selbst bei maximiertem Browser - immer eine begrenzte Breite hat, die immer nur 6-8 Buchstaben darstellt. Tritt das bei Dir auch auf?

Offline xenos1984

  • Developer
  • Full Member
  • ****
  • Beiträge: 412
Antw:Fehlender Gerätename bei gruppierter Liste
« Antwort #6 am: 26 Januar 2021, 08:28:51 »
Eigentlich kein Problem, solange die readingsGroup in ihrer Original-Sortierung vorliegt.
Sortiert man aber dann nach irgendeiner Spalte, wird's ohne zusätzliche Device-Link-Spalte schwierig ...

Ja, da hast du Recht. In dem Fall ist eine manuell erzeugte Spalte dafür wohl flexibler.

Alternativ könnte man vielleicht das Attribut nonames mit einer weiteren Funktion belegen:

  • 0 = Device-Link-Spalte immer anzeigen.
  • 1 = Device-Link-Spalte immer ausblenden.
  • 2 = Device-Link-Spalte nur in der ersten Zeile eines Geräts mit dessen Name füllen.

Oder man macht es davon abhängig, ob sortieren erlaubt ist. Vielleicht kann @justme1968 als Modul-Autor etwas dazu sagen.

Übrigens ist mir dabei gerade aufgefallen, dass Zeile 831 genau das gleiche Problem hat wie 828 - der Test gibt immer true zurück, macht also effektiv nichts.

Zitat
Aufgefallen ist mir noch, dass im vorliegenden Fall die erste Spalte - selbst bei maximiertem Browser - immer eine begrenzte Breite hat, die immer nur 6-8 Buchstaben darstellt. Tritt das bei Dir auch auf?

Hm... Das kann ich (mit Firefox, F18 Stil in FHEMWEB eingestellt) nicht nachvollziehen. Tritt das bei dir auch mit einem anderen Browser auf oder mit anderem Stil? Könntest du mal schauen, welche CSS Attribute die erste Spalte bei dir bekommt?

Offline OdfFhem

  • Sr. Member
  • ****
  • Beiträge: 789
Antw:Fehlender Gerätename bei gruppierter Liste
« Antwort #7 am: 26 Januar 2021, 10:52:57 »
@xenos1984

Ich habe es nochmals unter Chrome, Firefox und Edge getestet und bekam immer diese fixierte Spaltenbreite.

Die automatisch zugewiesene css-Klasse heißt "dname" und sorgt für keine derartige Einschränkung.

Der css-Inspektor verriet mir dann aber überraschenderweise, dass die "width" der ersten Spalte auf 50px fixiert war. Ein zweiter Blick führte zur Aufklärung, da es sich um eine für @choetzu eingeführte Testkonstellation handelte. Das Deaktivieren der zusätzlich definierten Attribute im user.css sorgte wieder für normales Verhalten.

***

Die Idee mit der Funktionserweiterung von nonames gefällt mir sehr gut. Denn so behalten die bereits definierten readingsGroup ihr Aussehen, aber man hat bei Bedarf auf jeden Fall eine weitere Möglichkeit.