[PATCH] Raumbezogener Alias

Begonnen von Bootscreen, 31 Oktober 2016, 07:24:07

Vorheriges Thema - Nächstes Thema

Bootscreen

Moin moin

da es mich schon lange gestört hat das ein Device nur einen Alias haben kann und nicht verschiedene je nach Raum (mir wichtig bei Sammelräumen wie Heizung), habe ich einen Patch geschrieben der das ändert.

Index: 01_FHEMWEB.pm
===================================================================
--- 01_FHEMWEB.pm (revision 12475)
+++ 01_FHEMWEB.pm (working copy)
@@ -1519,7 +1519,7 @@
   my $rf = ($FW_room ? "&room=$FW_room" : ""); # stay in the room

   FW_pF "\n<tr class=\"%s\">", ($row&1)?"odd":"even";
-  my $devName = AttrVal($d, "alias", $d);
+  my $devName = AttrVal($d, "alias_" . $FW_room, AttrVal($d, "alias", $d));
   if(defined($nameDisplay)) {
     my ($DEVICE, $ALIAS) = ($d, $devName);
     $devName = eval $nameDisplay;
@@ -1636,8 +1636,8 @@
       FW_pO "<tr><td>";
       FW_pO "<table class=\"block wide\" id=\"TYPE_$g\">";

-      foreach my $d (sort { lc(AttrVal($a,"sortby",AttrVal($a,"alias",$a))) cmp
-                            lc(AttrVal($b,"sortby",AttrVal($b,"alias",$b))) }
+      foreach my $d (sort { lc(AttrVal($a,"sortby",AttrVal($a, "alias_" . $FW_room, AttrVal($a, "alias", $a)))) cmp
+                            lc(AttrVal($b,"sortby",AttrVal($b, "alias_" . $FW_room, AttrVal($b, "alias", $b)))) }
                      keys %{$group{$g}}) {
         my $type = $defs{$d}{TYPE};
         $extPage{group} = $g;
@@ -1655,8 +1655,8 @@
   FW_pO "</table><br>";

   # Now the "atEnds"
-  foreach my $d (sort { lc(AttrVal($a, "sortby", AttrVal($a,"alias",$a))) cmp
-                        lc(AttrVal($b, "sortby", AttrVal($b,"alias",$b))) }
+  foreach my $d (sort { lc(AttrVal($a,"sortby",AttrVal($a, "alias_" . $FW_room, AttrVal($a, "alias", $a)))) cmp
+                        lc(AttrVal($b,"sortby",AttrVal($b, "alias_" . $FW_room, AttrVal($b, "alias", $b)))) }
                    @atEnds) {
     no strict "refs";
     $extPage{group} = "atEnd";


Um es zu nutzen muss man unter GLOBAL userattr eigene Attribute bestehend aus "alias_<raumname>" definieren, z.B.: alias_Arbeitszimmer alias_Heizung.
Hinterher kann man dann über die Attribute unterschiedliche Namen definieren:

attr alias_Arbeitszimmer Thermostat     # Device Name: "Thermostat" im Raum Arbeitszimmer
attr alias_Heizung Arbeitszimmer        # Device Name: "Arbeitszimmer" im Raum Heizung
attr alias Arbeitszimmer Thermostat     # Device Name: "Arbeitszimmer Thermostat" in allen andere Räumen


Würde mich freuen wenn der Patch übernommen wird.
Gruß
Oliver

FHEM 5.7 Hardware:
Raspberry PI B+ | HomeMatic USB 2 | 433Mhz Sender (pilight) | nanoCUL (433Mhz)

rudolfkoenig

1. Wenn Patch, dann bitte mit Doku, kostet mir genausoviel Zeit, wie Code zu schreiben.
2. Interessiert dieser Feature auch sonst jemanden?
3. Als Nachteil gibt es eine langsamere Seitengenerierung, was insb. bei kleinen Kisten (RPI/etc) stoeren koennte. Nett waere hier genaue Zahlen zu haben.

Bootscreen

Hy,

bei mir läuft es ohne Unterschied auf dem RPi 2, aber da ich auch nicht wusste wie ich die Doku formulieren soll ( Ich hoffe du meinst die commandref Doku). Habe ich noch ein Attribut, useRoomAlias, eingebaut mit dem man die raumbezogenen Alias an oder ausschalten kann. Ist das Attribut auf 1 gesetzt wird nach alias_<Raumname> geschaut und dies gegebenenfalls genutzt, andernfalls wird wie bisher der Name gebildet. Ich hoffe Die Doku ist auch soweit in Ordnung.
Gruß
Oliver

FHEM 5.7 Hardware:
Raspberry PI B+ | HomeMatic USB 2 | 433Mhz Sender (pilight) | nanoCUL (433Mhz)

rudolfkoenig

Zitatbei mir läuft es ohne Unterschied auf dem RPi 2
Da habe ich sowas, wie "bei 100 Geraeten in einem Raum benoetigt die neue Implementierung auf einem RPi2 < 1ms" erwartet. Also was mit Zahlen.
Und es fehlt noch die Begeisterung der Massen fuer das Feature.

Bootscreen

Ich habs grad mal versucht zu testen.

Getestet hab ich mit "curl -s -w %{time_total}\\n -o /dev/null http://localhost:8083/fhem?room=all".
Definiert waren ca 300 Devices einige mit raumbezogenem Alias, einige mit Alias und der Rest halt ohne.

Hier die Zeiten:






OrginalModified
4,104s4,577s
3,958s4,018s
3,871s4,087s
3,892s4,005s
Gruß
Oliver

FHEM 5.7 Hardware:
Raspberry PI B+ | HomeMatic USB 2 | 433Mhz Sender (pilight) | nanoCUL (433Mhz)

rudolfkoenig

Danke. Ist also ein Slowdown zw 1.5% und 11.5% zu messen, bzw. wenn man die Extreme weglaesst,  3%-5%
Wenn 2-3 Leute das als sinnvoll erachten, baue ich es ein.

BillyPbg

Guten Morgen,

wäre einer der Beiden...  ;)
Wäre auch an dem Feature als Raum bezogene Gruppen interessiert...

Gruß aus dem sonnigen Bayern!
Billy

Icinger

Hallo,

dann wären wir ja schon zwei, die das nützlich fänden :D

lg, Stefan
Verwende deine Zeit nicht mit Erklärungen. Die Menschen hören (lesen) nur, was sie hören (lesen) wollen. (c) Paulo Coelho

Benni

Na, dann machen wir die 3 doch mal voll.  8)

Nützlich finde ich es grundsätzlich schon, ob und wann es dann bei mir zum Einsatz kommt, weiß ich allerdings derzeit noch nicht ;)

Happy Fhem User

#9
Ich hätte an raumbezogenen Aliasen ebenfalls Interesse.
Der Performance-Impact ist aber schon recht ordentlich.
Ich habe hier leider gerade kein passendes Test-System um den Performance-Unterschied zu messen.
@Bootscreen hättest Du vielleicht Lust zum Sortieren mal folgende Variante bei Dir einzubauen und nochmal zu messen?

Zusätzlich einfügen in der Funktion irgendwo vor den Sortier-Aufrufen:

my %sortIdx=();
sub sortArrayByAlias {
map {
unless( $sortIdx{$_}) {
my $v=AttrVal($_,"sortby",undef);
$v=defined($v)?$v:AttrVal($_, "alias_" . $FW_room,undef);
$v=defined($v)?$v:AttrVal($_, "alias", $_);
$sortIdx{$_} = lc($v);
}
} @_;
return sort { $sortIdx{$a} cmp $sortIdx{$b} } @_;
}


und dann an den Sortierstellen entsprechend den alten Monster-Sortier-Code durch den Aufruf der Funktion ersetzen:

-      foreach my $d (sort { lc(AttrVal($a,"sortby",AttrVal($a, "alias_" . $FW_room, AttrVal($a, "alias", $a)))) cmp
-                            lc(AttrVal($b,"sortby",AttrVal($b, "alias_" . $FW_room, AttrVal($b, "alias", $b)))) }
-                     keys %{$group{$g}}) {
+      foreach my $d (sortArrayByAlias(keys %{$group{$g}}) {


und analog

-  foreach my $d (sort { lc(AttrVal($a,"sortby",AttrVal($a, "alias_" . $FW_room, AttrVal($a, "alias", $a)))) cmp
-                        lc(AttrVal($b,"sortby",AttrVal($b, "alias_" . $FW_room, AttrVal($b, "alias", $b)))) }
-                   @atEnds) {
+  foreach my $d (sortArrayByAlias(@atEnds)) {


Bootscreen

#10
Dank dir Happy Fhem User. Durch deine Funktion gibts nen doch recht gravierenden Unterschied. Ich hab deine Funktion einfach hinter die init Funktion gesetzt, keine Ahnung ob sie vllt an anderer Stelle besser aufgehoben ist. Das müsste dann vllt rudolf nochmal schauen. So gut kenn ich mit Perl noch nicht aus.







AltNeu
3,2763,227
3,1622,850
3,1482,868
3,2842,893

Anbei der neue Patch
Gruß
Oliver

FHEM 5.7 Hardware:
Raspberry PI B+ | HomeMatic USB 2 | 433Mhz Sender (pilight) | nanoCUL (433Mhz)

Happy Fhem User

Danke Dir für's ausprobieren. Die Funktion und vor allem das Hash zum Zwischenspeichern %sortIdx müssen allerdings lokal definiert sein. Ansonsten würden sich Änderungen an den Attributen nicht in der Sortierung auswirken.

Kannst Du bitte nochmal ausprobieren, die Sortierfunktion + Variable in die "sub FW_showRoom()" zu verschieben, z.B. hinter die Zeilen

   # row counter
   my $row=1;
   my %extPage = ();
   my $nameDisplay = AttrVal($FW_wname,"nameDisplay",undef);
+  my %sortIdx=();
+  sub sortArrayByAlias {
+  ..


Und dann nochmal messen. Ich befürchte die Performance-Verbesserung wird sich dann wie bei Deinem ersten Messwert verhalten 3,276 vs 3,227


Bootscreen

ich hab es jetzt verschoben und egal wo ich es hinpacke die sortorder ändert sich leider gar nicht wenn ich das alias umbenenne

//Nachtrag: hab erstmal den etwas fehlerhaften patch wieder rausgenommen
Gruß
Oliver

FHEM 5.7 Hardware:
Raspberry PI B+ | HomeMatic USB 2 | 433Mhz Sender (pilight) | nanoCUL (433Mhz)

Loredo

Endlich geht das jemand an, super :-)
Hat meine Arbeit dir geholfen? ⟹ https://paypal.me/pools/c/8gDLrIWrG9

Maintainer:
FHEM-Docker Image, https://github.com/fhem, Astro(Co-Maintainer), ENIGMA2, GEOFANCY, GUEST, HP1000, Installer, LaMetric2, MSG, msgConfig, npmjs, PET, PHTV, Pushover, RESIDENTS, ROOMMATE, search, THINKINGCLEANER

rudolfkoenig

Ich habe jetzt eine modifizierte Variante gebaut, getestet und eingecheckt:
- useRoomAlias wird nicht verwendet, es wird immer zuerst nach einem alias_<roomname> gesucht
- wie bei Happy Fhem User, werden die Werte fuer die Sortierung auch nur einmal berechnet, bei mir ist die Anzeige fuer ein Raum mit 300 dummys, mit jeweils gesetzten alias damit von 50ms auf ca 40ms gesunken.

Was mir nach dem Einbau eingefallen ist: die Aufgabe konnte man auch bisher mit
attr WEB nameDisplay { AttrVal($DEVICE, "alias_$FW_room", $ALIAS) }
loesen. War aber zu faul, alles wieder auszubauen :)

Benni

Da hätte ich aber auch mal drauf kommen können  :-[ ;)

AmunRe

Zitat von: rudolfkoenig am 04 November 2016, 13:53:10
Ich habe jetzt eine modifizierte Variante gebaut, getestet und eingecheckt:
- useRoomAlias wird nicht verwendet, es wird immer zuerst nach einem alias_<roomname> gesucht
- wie bei Happy Fhem User, werden die Werte fuer die Sortierung auch nur einmal berechnet, bei mir ist die Anzeige fuer ein Raum mit 300 dummys, mit jeweils gesetzten alias damit von 50ms auf ca 40ms gesunken.

Was mir nach dem Einbau eingefallen ist: die Aufgabe konnte man auch bisher mit
attr WEB nameDisplay { AttrVal($DEVICE, "alias_$FW_room", $ALIAS) }
loesen. War aber zu faul, alles wieder auszubauen :)

Darf ich Fragen wie ich das einbinde? Ich habe mehrere Device die gleich heißen, da wäre das super wenn ich "useRoomAlias" nutzen könnte. Update habe ich grad gemacht, aber ich finde kein attr useRoomAlias.
4 x Echo Dot, HMLAN Gateway, und diverse HM Komponenten, Philips Hue + OSRAM Plugs

rudolfkoenig

attr Lampe room Keller,Lampen
attr Lampe userattr alias_Keller alias_Lampen
attr Lampe alias_Keller Lampe im Keller
attr Lampe alias_Lampen Kellerlampe