FHEM Forum

FHEM => Frontends => readingsGroup / readingsHistory => Thema gestartet von: uwirt am 28 Dezember 2020, 11:22:15

Titel: readingsGroup filtern
Beitrag von: uwirt am 28 Dezember 2020, 11:22:15
Hallo Ihr. Ich habe mir aus den Informationen hier eine RG erstellt, welche mir eine Liste der aktiven und inaktiven IP-Adressen im Netzwerk darstellt.

Nun möchte ich nur die aktiven haben - weiss aber leider nicht wo ich den Filter ansetzen muss. Ich konnte hier in der commandref und im Forum noch keinen schlüsssigen Hinweis finden:

defmod NetzwerkListe readingsGroup <>,<Nr>,<IP-Adresse>,<Status>,<Name> \Netzwerk:@4,#1_ip,<#1>,#1_state,(.*)_alias
attr NetzwerkListe cellStyle { "c:1" => 'style="text-align:right"',"c:3" => 'style="text-align:center"',"c:4" => 'style="text-align:left"' }
attr NetzwerkListe icon it_network
attr NetzwerkListe room Network
attr NetzwerkListe sortColumn 1
attr NetzwerkListe sortFn rgSortIP
attr NetzwerkListe valueFormat { my $ipAddr = substr($READING,0,index($READING,"_"));;;; return("<img src='/fhem/images/default/10px-kreis-rot.png' alt='absent'>") if($VALUE eq "absent");;;; return("<img src='/fhem/images/default/10px-kreis-gruen.png' alt='present'>") if($VALUE eq "present");;;; return(substr($VALUE,rindex($VALUE,".")+1)) if(substr($READING,rindex($READING,"_")) eq "_ip");;;; return("<a url='http://".$ipAddr."' onclick='window.open(\"http://".$ipAddr."\");;;; return false;;;;'>".$VALUE."</a>") if(substr(ReadingsVal($DEVICE,$READING,""),rindex(ReadingsVal($DEVICE,$READING,""),"-")+1) eq "80");;;; return("<a url='https://".$ipAddr."' onclick='window.open(\"https://".$ipAddr."\");;;; return false;;;;'>".$VALUE."</a>") if(substr(ReadingsVal($DEVICE,$READING,""),rindex(ReadingsVal($DEVICE,$READING,""),"-")+1) eq "443");;;; return("");;;; }
attr NetzwerkListe valueIcon { return 'it_network@red' if ($VALUE eq 'absent');;;; return 'it_network@green' if( $VALUE eq 'present' );;;; return $VALUE;;;; }


Vielleicht kann mir jemand mit einer kreativen Idee hier weiterhelfen.

Titel: Antw:readingsGroup filtern
Beitrag von: xenos1984 am 28 Dezember 2020, 12:19:56
Indem du in dem Perl-Ausdruck für valueFormat für die inaktiven Adressen undef zurückgibst:

http://wiki.fhem.de/wiki/ReadingsGroup#Inhalte_filtern

Auf 'absent' testest du ja schon, also muss die Abfrage dort so lauten:

return undef if ($VALUE eq 'absent')
Titel: Antw:readingsGroup filtern
Beitrag von: uwirt am 31 Dezember 2020, 13:53:29
Ich habe es so versucht - nur leider sieht es nicht aus wie ich es gerne hätte. Die abwesenden verbleiben weiterhin in der Liste.

{ my $ipAddr = substr($READING,0,index($READING,"_")); return undef if($VALUE eq "absent"); return("<img src='/fhem/images/default/10px-kreis-gruen.png' alt='present'>") if($VALUE eq "present"); return(substr($VALUE,rindex($VALUE,".")+1)) if(substr($READING,rindex($READING,"_")) eq "_ip"); return("<a url='http://".$ipAddr."' onclick='window.open(\"http://".$ipAddr."\"); return false;'>".$VALUE."</a>") if(substr(ReadingsVal($DEVICE,$READING,""),rindex(ReadingsVal($DEVICE,$READING,""),"-")+1) eq "80"); return("<a url='https://".$ipAddr."' onclick='window.open(\"https://".$ipAddr."\"); return false;'>".$VALUE."</a>") if(substr(ReadingsVal($DEVICE,$READING,""),rindex(ReadingsVal($DEVICE,$READING,""),"-")+1) eq "443"); return(""); }

Titel: Antw:readingsGroup filtern
Beitrag von: xenos1984 am 31 Dezember 2020, 15:37:28
Das scheint nur für einzelne Readings zu greifen. Eine andere Möglichkeit, wäre in der Definition der readingsGroup die Geräte auszufiltern, die angezeigt werden sollen:

http://fhem.de/commandref.html#readingsGroup

Zitat<device> can be a devspec (see devspec) with at least one FILTER expression.
Titel: Antw:readingsGroup filtern
Beitrag von: uwirt am 31 Dezember 2020, 17:44:26
Du hast wohl recht - nur kenne ich mich da nicht sehr gut aus. Was ich bisher versucht habe war ohne Erfolg.

Das zu Grunde liegende device ist Netzwerk und basiert auf nmap.

Mit:   
<>,<Nr>,<IP-Adresse>,<Status>,<Name> \Netzwerk:@4,#1_ip,<#1>,#1_state,(.*)_alias.:FILTER=#1_state=.*:present
bleibt die Liste leer.
Titel: Antw:readingsGroup filtern
Beitrag von: xenos1984 am 31 Dezember 2020, 22:55:00
Also ist es nur ein Device mit Namen Netzwerk, und die Liste enthält die Readings dieses eines Device? Dann funktioniert meine Idee mit devspec + FILTER in der Tat nicht, weil die nur verschiedene Devices filtern kann, d.h. wenn jede Zeile von einem eigenen Device käme.

Der Fall ist mir noch nicht begegnet - vielleicht hat einer der readingsGroup-Experten eine Idee.