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:
+21
-41
@@ -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);
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user