Einstellungsseite: Reiter, Kachelwerte und Geraeteliste
Die Einstellungen bestanden aus einer einzigen langen Spalte mit den Preistabellen. Sie bekommt Reiter, und darin zwei neue Flaechen: was die Kacheln der Startseite anzeigen, und welche Geraete es ueberhaupt gibt. Reiter gab es vorher dreimal in drei Ausfuehrungen - die Etagen ueber den Automatismen mit eigenem switchTab(), die Geraetegruppen im Raum-Modal mit eigener CSS-Klasse, und die Einstellungsseite noch einmal anders. Jetzt baut restricted/reiter.php alle drei; umgeschaltet wird von Bootstrap, den offenen Reiter merkt reiterMerken() in der Adresse. Kachelwerte: was auf einer Kachel steht, stand fest in rooms.php. Die neue Tabelle kachelWerte (solarLog_kacheln.sql) ueberschreibt das je Raum, die Maske waehlt die Messwerte aus demselben Katalog wie der Automatik-Editor - nach Etage sortiert, die Geraete des eigenen Raums oben. Fehlt die Tabelle, zeigt jede Kachel weiter ihre Vorgabe. Geraete: die Zuordnung Geraet -> Raum war ein Modal, erreichbar ueber ein Zahnrad neben den Automatismen. Sie ist eine Einstellung und steht jetzt dort, zusammen mit dem, was fehlte: seit wann ein Geraet nichts mehr meldet, in welchen Automatiken es steckt, und ein Loeschknopf. Letzterer ist noetig, weil der Suchlauf nichts loescht - er legt an und frischt auf, damit die Automatiken ihre Zustands-Ids behalten; ein abgebautes Geraet bliebe sonst fuer immer stehen. Geloescht wird nur, was in keiner Automatik vorkommt. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
+91
-10
@@ -2,6 +2,11 @@
|
||||
/*
|
||||
* Einzige Quelle für die Räume der Home-Ansicht.
|
||||
*
|
||||
* Die Werte auf den Kacheln sind hier die Vorgabe; überschrieben werden sie
|
||||
* auf der Einstellungsseite (Reiter "Home-Kacheln"). Was dort gesetzt wurde,
|
||||
* steht in der Tabelle kachelWerte und hat Vorrang - alles Übrige zeigt
|
||||
* weiterhin, was hier steht.
|
||||
*
|
||||
* Aus dieser Tabelle entstehen sowohl die SVG-Kacheln in home.php als auch
|
||||
* die Aktualisierungsschleife in js/solar/homeMQTT.js (die Tabelle wird dafür
|
||||
* als JSON in die Seite geschrieben). Ein neuer oder umbenannter Raum ist
|
||||
@@ -12,7 +17,9 @@
|
||||
* id Kürzel in den SVG-Element-IDs: <floor>_w0_<id>, <floor>_<id>_heater
|
||||
* x, y Position der Kachel im SVG (viewBox 400x300) - fehlt bei Räumen
|
||||
* ohne Kachel
|
||||
* werte Was auf der Kachel steht: bis zu drei Messwerte, jeder mit
|
||||
* werte Was auf der Kachel steht, sofern auf der Einstellungsseite nichts
|
||||
* anderes gewählt wurde (Tabelle kachelWerte, siehe
|
||||
* restricted/kacheln.php): bis zu drei Messwerte, jeder mit
|
||||
* topic (oder wechselrichter, siehe Carport), optional pfad
|
||||
* (Schlüssel in einer JSON-Nachricht) und entweder format
|
||||
* ("leistung" skaliert selbst zwischen W und kW) oder dem Paar
|
||||
@@ -33,6 +40,10 @@
|
||||
* ist die linke obere Ecke der 24 x 19 grossen Kachel, nicht ihre Mitte.
|
||||
*/
|
||||
|
||||
// solarDb() für die Kachelwerte. costs.php definiert nur Funktionen und
|
||||
// verbindet sich erst, wenn eine davon gerufen wird.
|
||||
require_once(__DIR__ . "/costs.php");
|
||||
|
||||
// Reihenfolge im Menü und in der Anzeige; OG ist die Standardetage.
|
||||
//
|
||||
// AG ist das Außengelände - eine Etage ohne Grundriss. Was draußen hängt,
|
||||
@@ -239,27 +250,97 @@ function roomsWithTile()
|
||||
}
|
||||
|
||||
/**
|
||||
* Die Messwerte einer Kachel, fertig ausgeschrieben.
|
||||
* Was eine Kachel ohne Zutun zeigt.
|
||||
*
|
||||
* Ohne eigene Angabe sind es die drei Thermostatwerte, die dort schon immer
|
||||
* standen: Solltemperatur klein darüber, Isttemperatur gross, Feuchte klein
|
||||
* darunter. Nur diese Räume bekommen auch die Symbole für "heizt" und
|
||||
* "Pufferbetrieb" - anderswo gibt es nichts zu heizen.
|
||||
* darunter.
|
||||
*/
|
||||
function mitWerten($room)
|
||||
function kachelVorgabe($room)
|
||||
{
|
||||
if (isset($room["werte"])) {
|
||||
$room["heizung"] = false;
|
||||
$room["werte"] = array_slice($room["werte"], 0, 3);
|
||||
return $room;
|
||||
return array_slice($room["werte"], 0, 3);
|
||||
}
|
||||
$zweig = "Raumtemp/" . $room["floor"] . "/" . $room["mqtt"] . "/";
|
||||
$room["heizung"] = true;
|
||||
$room["werte"] = [
|
||||
return [
|
||||
["topic" => $zweig . "Set Temp[degC]", "einheit" => "°C", "stellen" => 0],
|
||||
["topic" => $zweig . "Temp[degC]", "einheit" => "°C", "gross" => true],
|
||||
["topic" => $zweig . "rHum[%]", "einheit" => "%rF"],
|
||||
];
|
||||
}
|
||||
|
||||
/**
|
||||
* Gibt es die Tabelle mit den selbst gewählten Kachelwerten?
|
||||
*
|
||||
* Sie darf fehlen (solarLog_kacheln.sql legt sie an). Dann gilt überall die
|
||||
* Vorgabe - die Startseite bleibt nicht mit einem SQL-Fehler stehen, nur weil
|
||||
* eine Einstellung noch nie benutzt wurde.
|
||||
*/
|
||||
function kachelTabelleDa()
|
||||
{
|
||||
static $da = null;
|
||||
if ($da === null) {
|
||||
/*
|
||||
* Auch der Ausfall der Datenbank fuehrt hier nur zur Vorgabe. Die
|
||||
* Kacheln holen ihre Zahlen vom Broker, nicht aus MySQL - die
|
||||
* Startseite lief bisher ohne Datenbank, und das soll so bleiben.
|
||||
* Ohne dieses try stuende dort im Ernstfall ein Fatal Error statt des
|
||||
* Hauses.
|
||||
*/
|
||||
try {
|
||||
$res = solarDb()->query("SHOW TABLES LIKE 'kachelWerte'");
|
||||
$da = $res && $res->num_rows > 0;
|
||||
} catch (Throwable $e) {
|
||||
$da = false;
|
||||
}
|
||||
}
|
||||
return $da;
|
||||
}
|
||||
|
||||
/**
|
||||
* Die von Hand gesetzten Werte, nach "Etage|Raum" abgelegt.
|
||||
*
|
||||
* Eine Abfrage je Seitenaufbau, nicht eine je Kachel - die Startseite zeichnet
|
||||
* zwanzig davon.
|
||||
*/
|
||||
function kachelUeberschreibungen()
|
||||
{
|
||||
static $werte = null;
|
||||
if ($werte !== null) {
|
||||
return $werte;
|
||||
}
|
||||
$werte = [];
|
||||
if (!kachelTabelleDa()) {
|
||||
return $werte;
|
||||
}
|
||||
try {
|
||||
$res = solarDb()->query("SELECT floor, room, werte FROM kachelWerte");
|
||||
while ($res && $row = $res->fetch_assoc()) {
|
||||
$liste = json_decode($row["werte"], true);
|
||||
if (is_array($liste)) {
|
||||
$werte[$row["floor"] . "|" . $row["room"]] = array_slice($liste, 0, 3);
|
||||
}
|
||||
}
|
||||
} catch (Throwable $e) {
|
||||
$werte = []; // siehe kachelTabelleDa(): dann eben die Vorgabe
|
||||
}
|
||||
return $werte;
|
||||
}
|
||||
|
||||
/**
|
||||
* Die Messwerte einer Kachel, fertig ausgeschrieben.
|
||||
*
|
||||
* Zuerst das, was auf der Einstellungsseite gewählt wurde; sonst die Vorgabe.
|
||||
*
|
||||
* Die Symbole für "heizt" und "Pufferbetrieb" hängen am Raum, nicht an der
|
||||
* Anzeige: ein Thermostatraum bleibt einer, auch wenn auf seiner Kachel
|
||||
* inzwischen etwas anderes steht. Anderswo gibt es nichts zu heizen.
|
||||
*/
|
||||
function mitWerten($room)
|
||||
{
|
||||
$room["heizung"] = !isset($room["werte"]);
|
||||
$eigen = kachelUeberschreibungen()[$room["floor"] . "|" . $room["id"]] ?? null;
|
||||
$room["werte"] = $eigen !== null ? $eigen : kachelVorgabe($room);
|
||||
return $room;
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user