Grundriss aus der Datenbank: Etagen und Raeume in homeMesh

Etagen, Raeume, Kachelpositionen und Kachelwerte standen als Tabelle in
restricted/rooms.php, die Werte zusaetzlich ueberschreibbar in
solarLog.kachelWerte. Fuer ein anderes Haus haette man den Quelltext
umschreiben muessen.

Jetzt liegen sie in homeMesh.floors und homeMesh.rooms
(homeMesh_grundriss.sql). rooms.php liest sie und gibt sie in der
bisherigen Form weiter; Startseite, Menue, Editor und Einstellungen sind
unveraendert - vorher und nachher als HTML verglichen, gleich bis auf
Livewerte und die zwei neuen Felder nr und thermostat in homeRooms.

- Vorgabe einer Kachel ist jetzt allein das Thermostat (rooms.thermostat):
  Soll, Ist, Feuchte - sonst nichts. Was bisher im Code als Vorgabe stand,
  gilt damit als selbst gesetzt.
- Grundrissbild je Etage (floors.bild) statt assets/img/<code>.png.
- Standard-Etage (floors.standard) statt "OG" an vier Stellen.
- meshDb() in eigener Datei, sonst Ring zwischen rooms.php und
  automations.php.
- solarLog_kacheln.sql entfaellt; die Tabelle kachelWerte liest niemand mehr.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
2026-09-15 10:29:58 +02:00
co-authored by Claude Opus 5
parent 483f08888e
commit 3636a134d6
12 changed files with 278 additions and 336 deletions
+21 -41
View File
@@ -2,13 +2,13 @@
/**
* Modell-Schicht für die Anzeigewerte der Home-Kacheln.
*
* Was auf einer Kachel steht, stand bisher fest in restricted/rooms.php. Das
* ist weiterhin die Vorgabe - hier kommt nur die Möglichkeit dazu, sie zu
* überschreiben, ohne die Datei anzufassen. Eine Kachel ohne Zeile in
* kachelWerte zeigt also genau das, was sie immer gezeigt hat.
* Gespeichert wird in homeMesh.rooms.werte. Steht dort NULL, gilt die Vorgabe
* (kachelVorgabe() in rooms.php: mit Thermostat Soll, Ist und Feuchte, sonst
* nichts). Bis September 2026 lagen die Werte getrennt in solarLog.kachelWerte
* und überschrieben eine Tabelle im Quelltext - beides gibt es nicht mehr.
*
* Die Form einer Wertdefinition ist dieselbe wie in rooms.php, damit zwischen
* Maske, Datenbank und Anzeige nichts übersetzt werden muss:
* Die Form einer Wertdefinition ist überall dieselbe, damit zwischen Maske,
* Datenbank und Anzeige nichts übersetzt werden muss:
*
* topic MQTT-Topic, aus dem der Wert kommt
* pfad optional: Schlüssel in einer JSON-Nachricht
@@ -26,21 +26,15 @@
* das "bi-" davor ("thermometer-half"). Erlaubt ist jedes,
* das im Stylesheet steht - siehe bootstrapIcons() in
* rooms.php; kachelSymbole() ist nur die Vorschlagsliste.
*
* Die Tabelle darf fehlen. Ist sie nicht angelegt (solarLog_kacheln.sql), so
* verhält sich alles wie vorher, statt dass die Startseite mit einem
* SQL-Fehler stehenbleibt - die Kacheln sind keine Einstellung, ohne die man
* das Haus nicht mehr sieht.
*/
/*
* Geladen wird nicht hier, sondern in rooms.php: kachelVorgabe() und
* kachelUeberschreibungen() stehen dort, weil die Startseite sie braucht und
* diese Datei nicht. So bleibt der Weg zur Anzeige kurz - und es gibt keine
* Geladen wird nicht hier, sondern in rooms.php: kachelVorgabe() und das
* Lesen der Werte stehen dort, weil die Startseite sie braucht und diese
* Datei nicht. So bleibt der Weg zur Anzeige kurz - und es gibt keine
* Ringabhängigkeit zwischen Raum-Modell und Maske.
*/
require_once(__DIR__ . "/rooms.php"); // Räume, Vorgaben, Überschreibungen
require_once(__DIR__ . "/costs.php"); // solarDb()
require_once(__DIR__ . "/rooms.php"); // Räume, Vorgaben, meshDb()
/** Höchstens drei Werte je Kachel - mehr passt nicht auf 24 x 19 Einheiten. */
const KACHEL_MAX = 3;
@@ -153,20 +147,18 @@ function kachelIconNamen()
*/
function kachelListe()
{
$ueber = kachelUeberschreibungen();
$liste = [];
foreach (allRooms() as $room) {
if (!isset($room["x"])) {
continue; // kein Platz im Grundriss, keine Kachel
}
$key = $room["floor"] . "|" . $room["id"];
$liste[] = [
"floor" => $room["floor"],
"floorLabel" => floorLabel($room["floor"]),
"room" => $room["id"],
"name" => $room["mqtt"],
"eigen" => isset($ueber[$key]),
"werte" => $ueber[$key] ?? kachelVorgabe($room),
"eigen" => isset($room["werte"]),
"werte" => $room["werte"] ?? kachelVorgabe($room),
"vorgabe" => kachelVorgabe($room),
];
}
@@ -275,14 +267,7 @@ function kachelTopicVorschlaege()
$topics = [];
foreach (allRooms() as $room) {
foreach (kachelVorgabe($room) as $wert) {
if (!empty($wert["topic"])) {
$topics[$wert["topic"]] = true;
}
}
}
foreach (kachelUeberschreibungen() as $werte) {
foreach ($werte as $wert) {
foreach (array_merge(kachelVorgabe($room), $room["werte"] ?? []) as $wert) {
if (!empty($wert["topic"])) {
$topics[$wert["topic"]] = true;
}
@@ -381,19 +366,15 @@ function kachelWertPruefen($wert, $nummer)
/**
* Die Werte einer Kachel speichern.
*
* $werte === null setzt auf die Vorgabe zurück - die Zeile verschwindet, statt
* die Vorgabe hineinzukopieren. Sonst stünde in der Datenbank eine Kopie, die
* nicht mitzöge, wenn sich rooms.php ändert.
* $werte === null setzt auf die Vorgabe zurück - in der Spalte steht dann
* NULL, statt die Vorgabe hineinzukopieren. Sonst stünde dort eine Kopie, die
* nicht mitzöge, wenn sich das Thermostat des Raums ändert.
*
* Eine leere Liste ist etwas anderes: die Kachel zeigt dann bewusst keinen
* Messwert, sondern nur ihren Namen.
*/
function kachelWerteSpeichern($floor, $room, $werte)
{
if (!kachelTabelleDa()) {
throw new RuntimeException(
"Die Tabelle kachelWerte fehlt. Sie steht in solarLog_kacheln.sql.");
}
$treffer = null;
foreach (allRooms() as $r) {
if ($r["floor"] === $floor && $r["id"] === $room && isset($r["x"])) {
@@ -404,10 +385,10 @@ function kachelWerteSpeichern($floor, $room, $werte)
throw new InvalidArgumentException("Diese Kachel gibt es nicht.");
}
$db = solarDb();
$db = meshDb();
if ($werte === null) {
$stmt = $db->prepare("DELETE FROM kachelWerte WHERE floor = ? AND room = ?");
$stmt->bind_param("ss", $floor, $room);
$stmt = $db->prepare("UPDATE rooms SET werte = NULL WHERE id = ?");
$stmt->bind_param("i", $treffer["nr"]);
$stmt->execute();
return null;
}
@@ -432,9 +413,8 @@ function kachelWerteSpeichern($floor, $room, $werte)
}
$json = json_encode($sauber, JSON_UNESCAPED_UNICODE);
$stmt = $db->prepare("INSERT INTO kachelWerte (floor, room, werte) VALUES (?, ?, ?)
ON DUPLICATE KEY UPDATE werte = VALUES(werte)");
$stmt->bind_param("sss", $floor, $room, $json);
$stmt = $db->prepare("UPDATE rooms SET werte = ? WHERE id = ?");
$stmt->bind_param("si", $json, $treffer["nr"]);
if (!$stmt->execute()) {
throw new RuntimeException($stmt->error);
}