Geraeteauswahl im Automatik-Editor gruppiert nach Etage

Bisher stand ueber jedem Raum eine eigene Ueberschrift - bei neunzehn
Raeumen aus rooms.php also neunzehn Stueck, jede mit der Etage davor:
"OG - Bad", "EG - Bad", "UG - Bad". In einer Liste, die fuenfzehn Zeilen
hoch ist, sah man dadurch mehr Ueberschrift als Geraet.

Jetzt gruppiert nur die Etage, und der Raum steht klein und rechtsbuendig
an jeder Zeile. Sortiert wird innerhalb der Etage nach Raum (Reihenfolge
wie in rooms.php), sodass die Geraete eines Raums trotzdem beisammen
stehen; aus zwanzig Ueberschriften werden fuenf. Ein Raum, den es in
rooms.php nicht mehr gibt, bekommt eine eigene Ueberschrift, statt
stillschweigend unter den Unzugeordneten zu verschwinden.

Die Suche laeuft zusaetzlich ueber den Raum: "bad" findet damit auch den
Handtuchtrockner, der im Bad haengt, ohne es im Namen zu tragen. In der
Trefferliste steht keine Ueberschrift darueber, deshalb traegt dort jede
Zeile die volle Angabe "OG - Bad".

Dafuer nennt raumListe() Etage und Raum jetzt auch einzeln, und der
Geraetekatalog reicht beides durch - der Schluessel "Etage/Raum" muss so
nicht im JavaScript wieder auseinandergenommen werden.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
2026-09-04 13:37:25 +02:00
co-authored by Claude Opus 5
parent 77651a860a
commit 37962224c1
2 changed files with 150 additions and 65 deletions
+40 -1
View File
@@ -225,6 +225,12 @@ function anzeigeName($name)
* Einzige Quelle bleibt restricted/rooms.php - ein neuer Raum ist dort eine
* Zeile und taucht hier automatisch auf. Der Schluessel ist "Etage/Raum",
* weil "Bad" allein auf drei Etagen vorkommt.
*
* Etage und Raum stehen zusaetzlich einzeln daneben: die Geraeteauswahl im
* Editor gruppiert nach der einen und sortiert nach dem anderen, und der
* Schluessel soll dafuer nicht erst im JavaScript wieder auseinandergenommen
* werden. Die Reihenfolge dieser Liste ist zugleich die Reihenfolge der
* Ueberschriften dort - erst OG, dann EG, dann UG, wie in rooms.php notiert.
*/
function raumListe()
{
@@ -233,9 +239,15 @@ function raumListe()
$liste[] = [
"key" => $raum["floor"] . "/" . $raum["mqtt"],
"label" => $raum["floor"] . " · " . $raum["mqtt"],
"floor" => $raum["floor"],
"room" => $raum["mqtt"],
];
}
$liste[] = ["key" => RAUM_AUSSEN, "label" => "Außen"];
// Aussen zaehlt als eigene Etage mit genau einem Raum: Carport, Garage und
// Regensensor liegen auf keinem Stockwerk, sollen aber ihre eigene
// Ueberschrift bekommen und nicht unter "Ohne Raum" fallen.
$liste[] = ["key" => RAUM_AUSSEN, "label" => "Außen",
"floor" => "Außen", "room" => ""];
return $liste;
}
@@ -255,6 +267,28 @@ function raumBeschriftung($key)
return $key . " (unbekannt)";
}
/**
* Etage und Raumname zu einem gespeicherten Raumschluessel.
*
* Die Geraeteauswahl im Editor braucht beides getrennt: die Etage wird zur
* Ueberschrift, der Raum zur Sortierung darunter. Geraete ohne Zuordnung
* bekommen ihre eigene Ueberschrift ganz am Ende; ein Raum, den es in
* rooms.php nicht mehr gibt, ebenso - er verschwindet nicht still zwischen
* den Unzugeordneten, sondern faellt auf.
*/
function raumEinordnung($key)
{
if (!$key) {
return ["floor" => "Ohne Raum", "room" => ""];
}
foreach (raumListe() as $raum) {
if ($raum["key"] === $key) {
return ["floor" => $raum["floor"], "room" => $raum["room"]];
}
}
return ["floor" => "Unbekannter Raum", "room" => $key];
}
/**
* Raumvorschlaege aus den MQTT-Topics.
*
@@ -377,6 +411,7 @@ function deviceCatalog()
return strcoll($labels[intval($a["id"])], $labels[intval($b["id"])]);
});
foreach ($zeilen as $row) {
$wo = raumEinordnung($row["room"]);
$devices[intval($row["id"])] = [
"id" => intval($row["id"]),
"name" => $row["name"],
@@ -385,6 +420,10 @@ function deviceCatalog()
"url" => $row["url"],
"room" => $row["room"],
"roomLabel" => raumBeschriftung($row["room"]),
// Etage und Raum getrennt: die Auswahlliste im Editor gruppiert
// nach der Etage und sortiert darin nach dem Raum.
"floorLabel" => $wo["floor"],
"roomName" => $wo["room"],
"states" => [],
"commands" => [],
];