Raeume ueber ihre feste Nummer: actors.room_id, Raum-Modal, Thermostat-Zweig

Geraete hingen ueber den Text "Etage/Raum" an ihrem Raum, das Raum-Modal
zerlegte "EG_Bad" am Unterstrich, und das Thermostat-Topic wurde aus Etage
und Name zusammengesetzt. Ein umbenannter Raum haette still alle Geraete,
seinen Temperaturregler und sein Heizsymbol verloren.

- actors.room (Text) -> actors.room_id, Fremdschluessel auf rooms, beim
  Loeschen eines Raums SET NULL. Alle 59 Zuordnungen uebernommen.
- automations.floor: ENUM(UG,EG,OG,AG) -> Verweis auf floors.
  Eine neue Etage kann damit auch Automatiken tragen.
- room.php nimmt ?room=<Nummer>; Solltemperatur geht an
  rooms.thermostat + /changeSetTemp.
- homeMQTT.js: Heizsymbol, Regler und Ist-Werte ueber mqttZweig(thermostat)
  statt mqttData.Raumtemp[Etage][Name].
- Raumvorschlaege in den Einstellungen: Messwerte unter dem Thermostat-
  Zweig eines Raums statt fest Raumtemp/<Etage>/<Name>.
- Schluessel in raumListe(), Katalog und Maske ist die Raumnummer als Text.

Geprueft gegen den Stand davor: Startseite gleich bis auf das Klickziel,
jede der 25 Kacheln oeffnet ihren eigenen Raum; Geraeteliste, Vorschlaege,
Editor-Katalog und die eigenen Geraete je Kachel gleich.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
2026-09-15 10:58:30 +02:00
co-authored by Claude Opus 5
parent 3636a134d6
commit 62a8af3fc6
10 changed files with 170 additions and 86 deletions
+10 -6
View File
@@ -156,6 +156,9 @@ function kachelListe()
"floor" => $room["floor"],
"floorLabel" => floorLabel($room["floor"]),
"room" => $room["id"],
// Die feste Raumnummer, als Text wie in raumListe(): die Maske
// stellt damit die Geraete des eigenen Raums nach oben.
"nr" => strval($room["nr"]),
"name" => $room["mqtt"],
"eigen" => isset($room["werte"]),
"werte" => $room["werte"] ?? kachelVorgabe($room),
@@ -219,18 +222,19 @@ function kachelKatalog()
continue;
}
/*
* Etage und Raum auch als Kuerzel, nicht nur ausgeschrieben: die
* Etage und Raum auch als Schluessel, nicht nur ausgeschrieben: die
* Maske stellt die Geraete des eigenen Raums nach oben und muss dafuer
* genau vergleichen koennen. actors.room steht als "EG/Technik" da -
* dieselben Kuerzel, die auch rooms.php benutzt.
* genau vergleichen koennen. Der Raum ist die feste Raumnummer
* (actors.room_id), dieselbe wie "nr" in kachelListe(); die Etage das
* Kuerzel, das deviceCatalog() schon als floorLabel fuehrt.
*/
$wo = explode("/", (string)($g["room"] ?? ""), 2);
$hatRaum = ($g["room"] ?? null) !== null && $g["room"] !== "";
$geraete[] = [
"label" => $g["label"],
"floor" => $g["floorLabel"],
"floorKey" => $wo[0] ?? "",
"floorKey" => $hatRaum ? $g["floorLabel"] : "",
"raum" => $g["roomName"],
"raumKey" => $wo[1] ?? "",
"raumKey" => $hatRaum ? strval($g["room"]) : "",
"werte" => $werte,
];
}