FHEM Forum

FHEM => Anfängerfragen => Thema gestartet von: mwllgr am 03 Januar 2020, 16:54:45

Titel: Befehl zum Auflisten aller Räume
Beitrag von: mwllgr am 03 Januar 2020, 16:54:45
Hallo, gibt es einen Befehl zum Auflisten aller Räume? Evtl. auch mit jsonlist2 oder xmllist?
Titel: Antw:Befehl zum Auflisten aller Räume
Beitrag von: kumue am 03 Januar 2020, 17:01:00
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..
Titel: Antw:Befehl zum Auflisten aller Räume
Beitrag von: CoolTux am 03 Januar 2020, 17:26:33
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
Titel: Antw:Befehl zum Auflisten aller Räume
Beitrag von: igami am 03 Januar 2020, 20:33:54
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;
}
Titel: Antw:Befehl zum Auflisten aller Räume
Beitrag von: mwllgr am 02 Januar 2022, 21:39:27
Die Lösung ist toll - danke!
Titel: Aw: Befehl zum Auflisten aller Räume
Beitrag von: AnBad am 03 Oktober 2023, 18:16:40
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;
}
Titel: Aw: Befehl zum Auflisten aller Räume
Beitrag von: betateilchen am 04 Oktober 2023, 12:10:28
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.
Titel: Aw: Befehl zum Auflisten aller Räume
Beitrag von: AnBad am 11 Mai 2024, 08:35:55
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;
}