Befehl zum Auflisten aller Räume

Begonnen von mwllgr, 03 Januar 2020, 16:54:45

Vorheriges Thema - Nächstes Thema

mwllgr

Hallo, gibt es einen Befehl zum Auflisten aller Räume? Evtl. auch mit jsonlist2 oder xmllist?

kumue

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..

CoolTux

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
Du musst nicht wissen wie es geht! Du musst nur wissen wo es steht, wie es geht.
Support me to buy new test hardware for development: https://www.paypal.com/paypalme/MOldenburg
My FHEM Git: https://git.cooltux.net/FHEM/
Das TuxNet Wiki:
https://www.cooltux.net

igami

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;
}
Pi3 mit fhem.cfg + DbLog/logProxy
Komm vorbei zum FHEM Treffen im Kreis Gütersloh! Das nächste Mal im April 2020.

MAINTAINER: archetype, LuftdatenInfo, monitoring, msgDialog, Nmap, powerMap
ToDo: AVScene, FluxLED

mwllgr


AnBad

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;
}

betateilchen

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.
-----------------------
Formuliere die Aufgabe möglichst einfach und
setze die Lösung richtig um - dann wird es auch funktionieren.
-----------------------
Lesen gefährdet die Unwissenheit!

AnBad

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;
}