Kacheln zeigen frei gewaehlte Messwerte, Heizung nur wo eine haengt
Drei Sachen an den Kacheln und am Raum-Modal. Die Platzhalter sind nur noch Striche. Vorher stand dort "---- hPa", gefuellt wurde die Zeile aber mit der Solltemperatur - eine Einheit, die nie kam, an einer Stelle, die etwas anderes zeigt. Der Heizungs-Reiter erscheint nur noch, wo auch ein Thermostat haengt. Frueher entschied das "hat der Raum eine Kachel" - das stimmte, solange nur Raeume mit Thermostat eine bekamen. Seit auch Kueche und Technik eine haben, bekamen sie einen Regler fuer eine Heizung, die es dort nicht gibt. Jetzt zaehlt, ob im Raum ein Geraet der Bedienform "heizung" steht. Und eine Kachel zeigt jetzt ein bis drei frei gewaehlte Messwerte. In restricted/rooms.php steht je Raum unter "werte", welche das sind: topic, optional pfad (Schluessel in einer JSON-Nachricht), einheit, stellen. Ohne Angabe bleibt es bei den drei Thermostatwerten samt Heizsymbol, also genau wie bisher - nur diese Raeume zeichnen die Symbole ueberhaupt noch. Alles kommt live ueber MQTT, auch die beiden Shelly-Zaehler: sie schicken ihre sechzehn Werte als eine JSON-Nachricht auf Power_EG/status/em:0, aus der "pfad" den gesuchten Schluessel greift. Der Browser meldet nicht mehr fest "Raumtemp/#" an, sondern die Zweige, die die Raumtabelle nennt - derzeit vier statt vierzig einzelner Topics. Damit steht auf EG Technik die Leistung (gemessen 293 W), auf UG Technik Leistung und Wasserzaehler (78 W, 400,4 m3). Raeume ohne Messwert tragen ihren Namen und oeffnen den Raum; ein leeres Rechteck saehe aus wie ein Fehler. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
+30
-6
@@ -107,15 +107,36 @@
|
||||
</g>
|
||||
<?php foreach ($floors as $floor): ?>
|
||||
<g id="<?= $floor ?>_Info" <?php if ($floor != "OG") echo 'opacity="0" '; ?><?php if($_GET["floor"] != $floor){echo "display='none'";} ?> >
|
||||
<?php foreach (roomsOnFloor($floor) as $room): ?>
|
||||
<?php foreach (array_map("mitWerten", roomsOnFloor($floor)) as $room): ?>
|
||||
<?php
|
||||
/*
|
||||
* Grundlinien je nach Anzahl der Werte. Die Kachel ist 19 hoch; mit
|
||||
* drei Werten sind es dieselben Zeilen wie eh und je (klein, gross,
|
||||
* klein), mit weniger ruecken sie in die Mitte.
|
||||
*/
|
||||
$zeilen = [1 => [12], 2 => [9, 16], 3 => [5, 11.5, 16.5]];
|
||||
$y = $zeilen[count($room["werte"])] ?? [];
|
||||
?>
|
||||
<g transform="translate(<?= $room["x"] ?>,<?= $room["y"] ?>)" onclick="openHeaterSettings('<?= $floor ?>_<?= $room["mqtt"] ?>');" cursor="pointer">
|
||||
<rect width="24" height="19" rx="5" fill="#0006" />
|
||||
<?php if ($room["heizung"]): ?>
|
||||
<use id="<?= $floor ?>_<?= $room["id"] ?>_heater" href="#heater" display="none" />
|
||||
<use id="<?= $floor ?>_<?= $room["id"] ?>_buffer" href="#buffer" display="none" />
|
||||
<?php endif; ?>
|
||||
<text fill="#fff" style="font: 4px sans-serif;">
|
||||
<tspan id="<?= $floor ?>_pres_<?= $room["id"] ?>" y="5" x="12" text-anchor="middle">---- hPa</tspan>
|
||||
<tspan id="<?= $floor ?>_tmp_<?= $room["id"] ?>" x="12" dy="1em" font-size="1.6em" text-anchor="middle">--,- °C</tspan>
|
||||
<tspan id="<?= $floor ?>_hum_<?= $room["id"] ?>" x="12" dy="1.2em" text-anchor="middle">-- %rF</tspan>
|
||||
<?php if (!$room["werte"]): ?>
|
||||
<!-- Kein Messwert: die Kachel traegt ihren Namen und
|
||||
oeffnet den Raum. Ein leeres Rechteck saehe aus
|
||||
wie ein Fehler. -->
|
||||
<tspan x="12" y="11.5" font-size="1.2em" text-anchor="middle"><?= htmlspecialchars($room["mqtt"]) ?></tspan>
|
||||
<?php endif; ?>
|
||||
<?php foreach ($room["werte"] as $i => $wert): ?>
|
||||
<!-- Der Platzhalter ist nur ein Strich: bevor der
|
||||
erste Wert da ist, soll hier keine Einheit
|
||||
stehen, die vielleicht gar nicht passt. -->
|
||||
<tspan id="<?= $floor ?>_w<?= $i ?>_<?= $room["id"] ?>" x="12" y="<?= $y[$i] ?>"
|
||||
<?= empty($wert["gross"]) ? "" : 'font-size="1.6em"' ?> text-anchor="middle">–</tspan>
|
||||
<?php endforeach; ?>
|
||||
</text>
|
||||
</g>
|
||||
<?php endforeach; ?>
|
||||
@@ -198,8 +219,11 @@
|
||||
|
||||
<script>
|
||||
// Raumtabelle aus restricted/rooms.php - homeMQTT.js aktualisiert darueber
|
||||
// die SVG-Kacheln, ohne die Raeume noch einmal aufzufuehren.
|
||||
const homeRooms = <?= json_encode(roomsWithTile()) ?>;
|
||||
// die SVG-Kacheln, ohne die Raeume noch einmal aufzufuehren. In "werte"
|
||||
// steht, welche Messwerte eine Kachel zeigt; homeTopics sind die Zweige,
|
||||
// die der Browser dafuer beim Broker anmelden muss.
|
||||
const homeRooms = <?= json_encode(roomsWithTile(), JSON_UNESCAPED_UNICODE) ?>;
|
||||
const homeTopics = <?= json_encode(tileTopics(), JSON_UNESCAPED_UNICODE) ?>;
|
||||
<?php if ($_GET["floor"] != "OG" && in_array($_GET["floor"], $floors)): ?>
|
||||
document.addEventListener('readystatechange', function () {
|
||||
if (event.target.readyState === 'complete') {
|
||||
|
||||
+74
-8
@@ -9,9 +9,15 @@
|
||||
*
|
||||
* floor Etage; bestimmt zugleich den Zweig Raumtemp/<floor>/
|
||||
* mqtt Name des Raums im MQTT-Baum: Raumtemp/<floor>/<mqtt>/...
|
||||
* id Kürzel in den SVG-Element-IDs: <floor>_tmp_<id>, <floor>_<id>_heater
|
||||
* 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
|
||||
* topic, optional pfad (Schlüssel in einer JSON-Nachricht),
|
||||
* einheit und stellen (Nachkommastellen). Fehlt der Eintrag, sind
|
||||
* es die drei Thermostatwerte - Soll, Ist, Feuchte - wie bisher.
|
||||
* Eine leere Liste heisst: kein Messwert, die Kachel trägt nur
|
||||
* ihren Namen und öffnet den Raum.
|
||||
*
|
||||
* Ein Raum ohne x/y ist trotzdem ein Raum: Geräte lassen sich ihm zuordnen
|
||||
* (siehe die Spalte actors.room und den Zuordnungsdialog in der Karte
|
||||
@@ -34,19 +40,35 @@ $rooms = [
|
||||
["floor" => "OG", "mqtt" => "Schlafzimmer", "id" => "schlafen", "x" => 235, "y" => 70],
|
||||
["floor" => "OG", "mqtt" => "Bad", "id" => "bad", "x" => 260, "y" => 120],
|
||||
["floor" => "OG", "mqtt" => "Buero", "id" => "buero", "x" => 265, "y" => 175],
|
||||
["floor" => "OG", "mqtt" => "Kueche", "id" => "kueche", "x" => 122, "y" => 138],
|
||||
["floor" => "OG", "mqtt" => "Technik", "id" => "technik", "x" => 173, "y" => 67],
|
||||
// Kein Thermostat, und noch kein Gerät zugeordnet - die Kachel trägt
|
||||
// vorerst nur ihren Namen.
|
||||
["floor" => "OG", "mqtt" => "Kueche", "id" => "kueche", "x" => 122, "y" => 138,
|
||||
"werte" => []],
|
||||
["floor" => "OG", "mqtt" => "Technik", "id" => "technik", "x" => 173, "y" => 67,
|
||||
"werte" => []],
|
||||
["floor" => "EG", "mqtt" => "Wohnzimmer", "id" => "wozi", "x" => 185, "y" => 150],
|
||||
["floor" => "EG", "mqtt" => "Florian", "id" => "kizi", "x" => 130, "y" => 90],
|
||||
["floor" => "EG", "mqtt" => "Schlafen", "id" => "schlafen", "x" => 235, "y" => 80],
|
||||
["floor" => "EG", "mqtt" => "Bad", "id" => "bad", "x" => 253, "y" => 130],
|
||||
["floor" => "EG", "mqtt" => "Magdalena", "id" => "buero", "x" => 258, "y" => 180],
|
||||
["floor" => "EG", "mqtt" => "Kueche", "id" => "kueche", "x" => 126, "y" => 146],
|
||||
["floor" => "EG", "mqtt" => "Technik", "id" => "technik", "x" => 172, "y" => 78],
|
||||
["floor" => "EG", "mqtt" => "Kueche", "id" => "kueche", "x" => 126, "y" => 146,
|
||||
"werte" => []],
|
||||
// Der Shelly-Zähler des EG meldet seine Werte als JSON in einer einzigen
|
||||
// Nachricht; "pfad" greift den Schlüssel daraus heraus.
|
||||
["floor" => "EG", "mqtt" => "Technik", "id" => "technik", "x" => 172, "y" => 78,
|
||||
"werte" => [
|
||||
["topic" => "Power_EG/status/em:0", "pfad" => "total_act_power",
|
||||
"einheit" => "W", "stellen" => 0, "gross" => true],
|
||||
]],
|
||||
["floor" => "UG", "mqtt" => "Buero", "id" => "buero", "x" => 140, "y" => 140],
|
||||
["floor" => "UG", "mqtt" => "Bad", "id" => "bad", "x" => 210, "y" => 80],
|
||||
["floor" => "UG", "mqtt" => "Kueche", "id" => "kueche", "x" => 190, "y" => 195],
|
||||
["floor" => "UG", "mqtt" => "Technik", "id" => "technik", "x" => 238, "y" => 93],
|
||||
["floor" => "UG", "mqtt" => "Technik", "id" => "technik", "x" => 238, "y" => 93,
|
||||
"werte" => [
|
||||
["topic" => "Power_UG/status/em:0", "pfad" => "total_act_power",
|
||||
"einheit" => "W", "stellen" => 0, "gross" => true],
|
||||
["topic" => "wasser/main/value", "einheit" => "m³", "stellen" => 1],
|
||||
]],
|
||||
];
|
||||
|
||||
/**
|
||||
@@ -72,7 +94,51 @@ function allRooms()
|
||||
/** Nur die Räume mit Kachel, für die Aktualisierungsschleife im Browser. */
|
||||
function roomsWithTile()
|
||||
{
|
||||
return array_values(array_filter($GLOBALS["rooms"], function ($room) {
|
||||
return array_values(array_map("mitWerten", array_filter($GLOBALS["rooms"], function ($room) {
|
||||
return isset($room["x"]);
|
||||
}));
|
||||
})));
|
||||
}
|
||||
|
||||
/**
|
||||
* Die Messwerte einer Kachel, fertig ausgeschrieben.
|
||||
*
|
||||
* 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.
|
||||
*/
|
||||
function mitWerten($room)
|
||||
{
|
||||
if (isset($room["werte"])) {
|
||||
$room["heizung"] = false;
|
||||
$room["werte"] = array_slice($room["werte"], 0, 3);
|
||||
return $room;
|
||||
}
|
||||
$zweig = "Raumtemp/" . $room["floor"] . "/" . $room["mqtt"] . "/";
|
||||
$room["heizung"] = true;
|
||||
$room["werte"] = [
|
||||
["topic" => $zweig . "Set Temp[degC]", "einheit" => "°C", "stellen" => 0],
|
||||
["topic" => $zweig . "Temp[degC]", "einheit" => "°C", "gross" => true],
|
||||
["topic" => $zweig . "rHum[%]", "einheit" => "%rF"],
|
||||
];
|
||||
return $room;
|
||||
}
|
||||
|
||||
/**
|
||||
* Was der Browser beim Broker anmelden muss, damit die Kacheln laufen.
|
||||
*
|
||||
* Nicht die einzelnen Topics, sondern ihre Zweige: aus vierzig Anmeldungen
|
||||
* für Raumtemp werden so vier insgesamt. Der Zweig bringt ausserdem mit,
|
||||
* was die Kachel nebenbei braucht - "Heating" und "mode" stehen in keiner
|
||||
* Werteliste, das Heizsymbol lebt aber davon.
|
||||
*/
|
||||
function tileTopics()
|
||||
{
|
||||
$zweige = [];
|
||||
foreach (roomsWithTile() as $room) {
|
||||
foreach ($room["werte"] as $wert) {
|
||||
$zweige[explode("/", $wert["topic"])[0] . "/#"] = true;
|
||||
}
|
||||
}
|
||||
return array_keys($zweige);
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user