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.
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.
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.
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.
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:
Orginal | Modified |
4,104s | 4,577s |
3,958s | 4,018s |
3,871s | 4,087s |
3,892s | 4,005s |
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.
Guten Morgen,
wäre einer der Beiden... ;)
Wäre auch an dem Feature als Raum bezogene Gruppen interessiert...
Gruß aus dem sonnigen Bayern!
Billy
Hallo,
dann wären wir ja schon zwei, die das nützlich fänden :D
lg, Stefan
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 ;)
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)) {
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.
Alt | Neu |
3,276 | 3,227 |
3,162 | 2,850 |
3,148 | 2,868 |
3,284 | 2,893 |
Anbei der neue Patch
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
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
Endlich geht das jemand an, super :-)
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 :)
Da hätte ich aber auch mal drauf kommen können :-[ ;)
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.
attr Lampe room Keller,Lampen
attr Lampe userattr alias_Keller alias_Lampen
attr Lampe alias_Keller Lampe im Keller
attr Lampe alias_Lampen Kellerlampe