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
+31
View File
@@ -14,6 +14,10 @@
-- Die Tabellen duerfen leer sein. Dann zeigt die Startseite einen Hinweis auf
-- die Einstellungen statt eines Hauses - das ist der Anfang jeder neuen
-- Installation.
--
-- Einspielen NACH homeMesh_DB-layout.sql und homeMesh_automations.sql: am
-- Ende haengt diese Datei die Fremdschluessel von actors.room_id und
-- automations.floor an die neuen Tabellen. Ein zweiter Lauf schadet nicht.
-- ---------------------------------------------------------------------------
SET NAMES utf8mb4;
@@ -63,3 +67,30 @@ CREATE TABLE IF NOT EXISTS `rooms` (
CONSTRAINT `fk_rooms_floor` FOREIGN KEY (`floor`) REFERENCES `floors` (`code`)
ON UPDATE CASCADE ON DELETE RESTRICT
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin;
-- ---------------------------------------------------------------------------
-- Verweise auf Etagen und Raeume.
--
-- actors.room_id: ein geloeschter Raum laesst seine Geraete unzugeordnet
-- zurueck (SET NULL) - sie tauchen dann unter "ohne Raum" wieder auf.
-- automations.floor: eine Etage mit Automatiken laesst sich nicht loeschen
-- (RESTRICT); die Einstellungsseite nennt vorher die Namen.
--
-- Idempotent ueber information_schema, weil MariaDB kein
-- ADD CONSTRAINT IF NOT EXISTS fuer Fremdschluessel kennt.
-- ---------------------------------------------------------------------------
SET @da := (SELECT COUNT(*) FROM information_schema.TABLE_CONSTRAINTS
WHERE CONSTRAINT_SCHEMA = DATABASE() AND CONSTRAINT_NAME = 'fk_actors_room');
SET @sql := IF(@da = 0,
'ALTER TABLE actors ADD KEY idx_actors_room (room_id),
ADD CONSTRAINT fk_actors_room FOREIGN KEY (room_id) REFERENCES rooms (id) ON DELETE SET NULL',
'DO 0');
PREPARE stmt FROM @sql; EXECUTE stmt; DEALLOCATE PREPARE stmt;
SET @da := (SELECT COUNT(*) FROM information_schema.TABLE_CONSTRAINTS
WHERE CONSTRAINT_SCHEMA = DATABASE() AND CONSTRAINT_NAME = 'fk_automations_floor');
SET @sql := IF(@da = 0,
'ALTER TABLE automations ADD CONSTRAINT fk_automations_floor FOREIGN KEY (floor)
REFERENCES floors (code) ON UPDATE CASCADE ON DELETE RESTRICT',
'DO 0');
PREPARE stmt FROM @sql; EXECUTE stmt; DEALLOCATE PREPARE stmt;