Hallo, gibt es einen Befehl zum Auflisten aller Räume? Evtl. auch mit jsonlist2 oder xmllist?
hm... displayattr .* room
ist sicherlich zu einfach :)
und wenn du in der Webansicht einem Device einen Raum zuordnen willst, bekommst Du ja auch alle verfügbaren Räume angezeigt...
Vermute aber, das ist nicht das, was Du speziell suchst..
Wenn Du jsonlist2 machst bekommst Du doch eine große Liste wo auch die Räume zu jedem Device stehen. Somit hast Du auch alle Räume
Habe mir vor Jahren mal eine sub gebaut. Keine Ahnung ob es mittlerweile etwas besseres gibt:
sub rooms {
my @rooms;
foreach my $device (devspec2array(".*")){
foreach (split(",", AttrVal($device, "room", "Unsorted"))){
if (!($_ ~~ @rooms)){
push(@rooms, $_);
}
}
}
@rooms = sort(@rooms);
return @rooms;
}
Die Lösung ist toll - danke!
Hi,
habe eine Möglichkeit gesucht um WEB/sortRooms zu leicht zu beschlagworten. Habe den Code von oben genutzt; vielen Dank dazu. In Befehlszeile einfach eingeben: {rooms()} ergibt eine Raumliste, {rooms("attr")} trägt die Liste als String dann gleich in WEB/sortRooms ein. In der Sub rooms(;$) kann man im Array hinterlegen, wie für bestimmte Räume die Sortierung aussehen soll. Nicht genannte Räume werden sortiert zum Schluss aufgeführt.
Vielleicht gibt es auch eine bessere Lösung. Habe aber nix gefunden.
Vg.
sub rooms(;$) {
my ($kindofdata) = @_;
my $room_string = "";
my %custom_sort_order = (
"Start" => 1,
"Aus" => 2,
"KG" => 3,
"EG" => 4,
"OG" => 5,
"DG" => 6,
"TH" => 7,
);
my @rooms;
foreach my $device (devspec2array(".*")) {
foreach (split(",", AttrVal($device, "room", "Unsorted"))) {
if (!($_ ~~ @rooms)) {
push(@rooms, $_);
}
}
}
# Custom sort using a sorting subroutine
@rooms = sort {
my $a_sort = custom_sort_value($a, \%custom_sort_order) || 9999; # Default to a high value
my $b_sort = custom_sort_value($b, \%custom_sort_order) || 9999; # Default to a high value
$a_sort <=> $b_sort || $a cmp $b; # Custom sort first, alphanumeric second
} @rooms;
if (defined $kindofdata && $kindofdata eq "attr") {
$room_string = join(" ", @rooms);
fhem("attr WEB sortRooms $room_string");
}
my $room_list = join("\n", @rooms);
return $room_list;
}
sub custom_sort_value {
my ($room, $sort_order) = @_;
for my $pattern (keys %$sort_order) {
if ($room =~ /^$pattern/) {
return $sort_order->{$pattern};
}
}
return;
}
Zitat von: mwllgr am 03 Januar 2020, 16:54:45gibt es einen Befehl zum Auflisten aller Räume? Evtl. auch mit jsonlist2
klar...
jsonlist2 .* room
dann einfach per loop über das array und die Räume aus dem json lesen. Fertig.
Hier eine aktuelle Version meiner kleinen Sub zum Sortieren von Räumen:
sub rooms {
# call by {rooms("attr")}
my ($attrErstellen) = @_;
my $room_string = "";
my %custom_sort_order = (
"Start" => 1,
"Config" => 2,
"Aus" => 3,
"KG" => 4,
"EG" => 5,
"OG" => 6,
"DG" => 7,
"TH" => 8,
"Numeric" => 9, # Add this for numeric room names
);
my @rooms;
foreach my $device ( devspec2array(".*") ) {
my $room_val = AttrVal( $device, "room", "Unsorted" );
if ( index( $room_val, ',' ) != -1 ) { # Check if room_val contains a comma
foreach my $room ( split( ",", $room_val ) ) {
unless ( grep { $_ eq $room } @rooms ) {
push( @rooms, $room );
}
}
}
else { # If room_val doesn't contain a comma, treat it as a single room
unless ( grep { $_ eq $room_val } @rooms ) {
push( @rooms, $room_val );
}
}
}
# Print room names
print "1) Room names after populating: @rooms\n";
# Sorting logic: Include handling for numeric room names
@rooms = sort {
my $a_sort = custom_sort_value( $a, \%custom_sort_order ) || 9999;
my $b_sort = custom_sort_value( $b, \%custom_sort_order ) || 9999;
$a_sort <=> $b_sort || $a cmp $b;
} @rooms;
if ( defined $attrErstellen && $attrErstellen eq "attr" ) {
$room_string = join( " ", @rooms );
fhem("attr WEB sortRooms $room_string");
print "3.1) Sorted room list: $room_string\n";
}
else {
print "3.2) Sorted room list: $room_string\n";
}
my $room_list = join( "\n", @rooms );
return $room_list;
}
sub custom_sort_value {
my ( $room, $sort_order ) = @_;
# Debug printing
print "2) Room before sorting: $room\n";
for my $pattern ( keys %$sort_order ) {
if ( $room =~ /\Q$pattern\E/ ) {
print "Matched pattern: $pattern\n";
return $sort_order->{$pattern};
}
}
# Handle numeric room names
if ( $room =~ /^\d+/ ) {
return $sort_order->{Numeric};
}
return;
}