FHEM Forum

FHEM - Entwicklung => Wunschliste => Thema gestartet von: igami am 30 Oktober 2016, 07:37:51

Titel: sortby Perl Code
Beitrag von: igami am 30 Oktober 2016, 07:37:51
Hallo Allerseits,

Ich wünsche mir, dass das sortby Attribut auch Perl Code auswerten kann.

Grüße
igami
Titel: Antw:sortby Perl Code
Beitrag von: Lazgar am 06 Februar 2017, 11:42:03
*push*
Titel: Antw:sortby Perl Code
Beitrag von: betateilchen am 06 Februar 2017, 15:50:48
Baut doch einfach mal einen patch für 01_FHEMWEB.pm und schlagt das im richtigen Unterforum vor.
Die wenigen zu ändernden Stellen sind doch leicht zu finden.

Titel: Antw:sortby Perl Code
Beitrag von: Lazgar am 07 Februar 2017, 07:06:31
Ich kann es leider nicht.
Bin, was Fhem und Programmieren angeht, noch ein blutiger Anfänger :(
Titel: Antw:sortby Perl Code
Beitrag von: marvin78 am 07 Februar 2017, 16:30:00
Na dann bist du ja auch noch lange nicht beim Sortieren mit Perl angelangt.
Titel: Antw:sortby Perl Code
Beitrag von: betateilchen am 07 Februar 2017, 16:35:13
@marvin78: ich hatte mich nicht getraut, das zu schreiben  :P
Titel: Antw:sortby Perl Code
Beitrag von: Lazgar am 07 Februar 2017, 18:57:15
ich sag da mal nix dazu außer: danke für eure Unterstützung *daumenhoch*
Titel: Antw:sortby Perl Code
Beitrag von: igami am 07 Februar 2017, 19:20:13
wie wäre es damit?

Index: FHEM/01_FHEMWEB.pm
===================================================================
--- FHEM/01_FHEMWEB.pm (Revision 13354)
+++ FHEM/01_FHEMWEB.pm (Arbeitskopie)
@@ -1717,7 +1717,9 @@
     if($modules{$defs{$dev}{TYPE}}{FW_atPageEnd}) {
       $usuallyAtEnd{$dev} = 1;
       if(!AttrVal($dev, "group", undef)) {
-        $sortIndex{$dev} = lc(AttrVal($dev,"sortby",FW_alias($dev)));
+ my $i = lc(AttrVal($dev,"sortby",FW_alias($dev)));
+ $i = eval $i if($i =~ m/^{.*}$/s); # Forum #59883
+ $sortIndex{$dev} = $i;
         push @atEnds, $dev;
         next;
       }
@@ -1725,7 +1727,9 @@
     next if(!$FW_types{$dev});   # FHEMWEB connection, missed due to caching
     foreach my $grp (split(",", AttrVal($dev, "group", $FW_types{$dev}))) {
       next if($FW_hiddengroup{$grp});
-      $sortIndex{$dev} = lc(AttrVal($dev,"sortby",FW_alias($dev)));
+      my $i = lc(AttrVal($dev,"sortby",FW_alias($dev)));
+      $i = eval $i if($i =~ m/^{.*}$/s); # Forum #59883
+      $sortIndex{$dev} = $i;
       $group{$grp}{$dev} = 1;
     }
   }
Titel: Antw:sortby Perl Code
Beitrag von: betateilchen am 07 Februar 2017, 21:36:26

- $i = eval $i if($i =~ m/^{.*}$/s); # Forum #59883
+ $i = AnalyzePerlCommand($i); # Forum #59883
Titel: Antw:sortby Perl Code
Beitrag von: igami am 08 Februar 2017, 06:00:29
Zitat von: betateilchen am 07 Februar 2017, 21:36:26

- $i = eval $i if($i =~ m/^{.*}$/s); # Forum #59883
+ $i = AnalyzePerlCommand($i); # Forum #59883

Warum kann die Überprüfung auf die Spitzen Klammern entfallen? Zudem fordert AnalyzePerlCommand doch zwei Argumente, den client hash und den Befehl.
Titel: Antw:sortby Perl Code
Beitrag von: betateilchen am 08 Februar 2017, 10:31:54
Zitat von: igami am 08 Februar 2017, 06:00:29
Warum kann die Überprüfung auf die Spitzen Klammern entfallen?

Damit man es in der Anwendung einfacher hat. Es geht außerdem nicht um spitze Klammern, sondern um geschweifte ;)

Zitat von: igami am 08 Februar 2017, 06:00:29
Zudem fordert AnalyzePerlCommand doch zwei Argumente, den client hash und den Befehl.

Stimmt, mein Fehler. Also so:


+ $i = AnalyzePerlCommand(undef,$i); # Forum #59883


Anwendungsbeispiele findest Du z.B. in 02_RSS.pm und 55_InfoPanel.pm, wenn es um die Auswertung von bestimmten Layoutkomponenten geht.
Titel: Antw:sortby Perl Code
Beitrag von: igami am 08 Februar 2017, 17:32:11
dann also der ganze Patch:

Index: FHEM/01_FHEMWEB.pm
===================================================================
--- FHEM/01_FHEMWEB.pm (Revision 13354)
+++ FHEM/01_FHEMWEB.pm (Arbeitskopie)
@@ -1717,7 +1717,9 @@
     if($modules{$defs{$dev}{TYPE}}{FW_atPageEnd}) {
       $usuallyAtEnd{$dev} = 1;
       if(!AttrVal($dev, "group", undef)) {
-        $sortIndex{$dev} = lc(AttrVal($dev,"sortby",FW_alias($dev)));
+ my $i = lc(AttrVal($dev,"sortby",FW_alias($dev)));
+ $i = AnalyzePerlCommand(undef,  $i); # Forum #59883
+ $sortIndex{$dev} = $i;
         push @atEnds, $dev;
         next;
       }
@@ -1725,7 +1727,9 @@
     next if(!$FW_types{$dev});   # FHEMWEB connection, missed due to caching
     foreach my $grp (split(",", AttrVal($dev, "group", $FW_types{$dev}))) {
       next if($FW_hiddengroup{$grp});
-      $sortIndex{$dev} = lc(AttrVal($dev,"sortby",FW_alias($dev)));
+      my $i = lc(AttrVal($dev,"sortby",FW_alias($dev)));
+      $i = AnalyzePerlCommand(undef,  $i); # Forum #59883
+      $sortIndex{$dev} = $i;
       $group{$grp}{$dev} = 1;
     }
   }

Muss ich ja nur noch Rudi darauf aufmerksam machen, oder liest er hier mit?
Titel: Antw:sortby Perl Code
Beitrag von: betateilchen am 08 Februar 2017, 18:56:52
Die Wunschliste liest er ganz bewusst nicht  8)
Titel: Antw:sortby Perl Code
Beitrag von: betateilchen am 08 Februar 2017, 19:15:55
Mich würde mal ein konkretes Beispiel interessieren, wofür man die hier gewünschte Erweiterung tatsächlich nutzen kann.
Titel: Antw:sortby Perl Code
Beitrag von: igami am 08 Februar 2017, 20:10:11
Für Automatiken nutze ich oft ein Tripel aus Dummy für die Parameter, Weekdaytimer um das UZSU Widget auszuwerten und DOIF für die Automatik ansich.
Da ich die devices gerne in der Reihenfolge angezeigt bekommen möchte verwende ich als sortby 100, 110, 120, was in der Übersicht everything jedoch nicht hilfreich ist.

Hmm, aber eigentlich weiß ich gar nicht mehr warum ich das damals für so sinnvoll gehalten habe. Ich hatte den Thread auch total verdrängt :D
Wenn es mir wieder einfällt werde ich es mitteilen. Es hatte irgendwas mit meinem archetype Modul zu tun.
Titel: Antw:sortby Perl Code
Beitrag von: rudolfkoenig am 09 Februar 2017, 10:20:53
ZitatWenn es mir wieder einfällt werde ich es mitteilen.
Ok, danach werde ich den Patch anschauen.
Nicht verwendeten Code will ich eher entfernen, und nicht einbauen.
Titel: Antw:sortby Perl Code
Beitrag von: Lazgar am 09 Februar 2017, 11:55:38
Ich habe eine UDF in der 99_myUtils.pm, die meinen Googlekalender nach Terminen durchsucht.
Es werden 4 Dummies befüllt mit der Anzahl der Tage, wann der Termin wieder eintritt.
Beim Attribut sortby hätte ich gerne per ReadingsVal den Wert ausgelesen, damit danach sortiert wird.
Titel: Antw:sortby Perl Code
Beitrag von: rudolfkoenig am 10 Februar 2017, 21:00:23
Hab den Patch angeschaut:
- AnalyzePerlCommand wird immer aufgerufen, d.h. der Patch fuehrt in 99.9% aller FHEM-Installationen zu Perl-Fehler. Ausnahme: wenn jemand fuer jedes Geraet ein numerisches sortby oder alias vergeben hat.
- falls das Perl Expression in sortby Grossbuchstaben enthaelt (wie ReadingsVal), dann wird es mit lc() kaputtgemacht
- als erster Parameter wird AnalyzePerlCommand undef uebergegeben, damit wird die Rechtepruefung ausgehebelt.
- falls jemand ein alias mit {} definiert hat, dann wird das alias fuer sortieren ausgefuehrt, bei der Anzeige aber nicht.
- keine Doku

Ich habe jetzt meine Variante eingecheckt: Evaluirt wird nur sortby, und auch nur, wenn es in {} eingeschlossen ist. $NAME wird dabei gesetzt.


Achtung: da es beim Aufbau _jeder_ Raum-Uebersichtsseite das Attribut fuer _alle_ Geraete berechnet wird, kann das Setzen des Attributes bei sehr vielen Geraeten zu merkbaren Performance-Einbussen fuehren.

Titel: Antw:sortby Perl Code
Beitrag von: JoeALLb am 11 Februar 2017, 09:42:40
Zitat von: igami am 08 Februar 2017, 20:10:11
Für Automatiken nutze ich oft ein Tripel aus Dummy für die Parameter, Weekdaytimer um das UZSU Widget auszuwerten und DOIF für die Automatik ansich.
Du weißt dass Du Dummy, UZSU Widget und DOIF (meist) zu einem DOIF zusammenfassen kannst?
Titel: Antw:sortby Perl Code
Beitrag von: igami am 11 Februar 2017, 09:51:47
Ja, weiß ich, aber ich lasse das UZSU ja durch WeekdayTimer auswerten und das macht dann eben "set <device> einabled" was bei einem DOIF irgendwie blöd wäre. Außerdem hab ihc keine lust alles umzubauen. Es funktioniert ja :)