diff --git a/ajax/room.php b/ajax/room.php
index d979de1..49b82ac 100644
--- a/ajax/room.php
+++ b/ajax/room.php
@@ -112,7 +112,7 @@ foreach ($katalog as $d) {
// einer Geraeteliste: ein Regler fuer den Raum statt einer Karte je Geraet.
$fertig = [];
if ($hatThermostat) {
- $karte = "
"
+ $karte = "
"
. "
"
. ""
. "–"
diff --git a/css/solar.css b/css/solar.css
index a0a0bdd..c13f101 100644
--- a/css/solar.css
+++ b/css/solar.css
@@ -296,13 +296,14 @@ input[type='range']::-webkit-slider-runnable-track {
}
/* Auf, Stop, Zu untereinander - die Knoepfe zeigen in die Richtung, in die
- sie fahren. Schmal, weil nur Symbole darin stehen. */
+ sie fahren. Breit genug fuer einen Daumen: sie sind das, was man im
+ Vorbeigehen antippt, die Regler daneben braucht man seltener. */
.raum-fahrt {
- flex: 0 0 auto;
+ flex: 0 0 3.1rem;
}
.raum-fahrt .btn {
- padding: 0.2rem 0.55rem;
- line-height: 1.4;
+ padding: 0.3rem 0;
+ line-height: 1.5;
}
/* Eine Spalte mit senkrechtem Regler: Name, oberes Wort, Bahn, unteres
diff --git a/js/solar/autoActionFuncs.js b/js/solar/autoActionFuncs.js
index cce2519..1a2403a 100644
--- a/js/solar/autoActionFuncs.js
+++ b/js/solar/autoActionFuncs.js
@@ -637,6 +637,8 @@ function openAutoActionModal(params) {
const alt = document.getElementById("modalSaveBtn");
const btn = alt.cloneNode(true);
alt.replaceWith(btn);
+ // Das Raum-Modal versteckt ihn; hier wird er gebraucht.
+ btn.hidden = false;
btn.addEventListener("click", submitAutoAction);
// Der Editor braucht mehr Breite als die Ladedialoge, gibt sie aber wieder
@@ -742,6 +744,8 @@ function openRoomModal() {
const alt = document.getElementById("modalSaveBtn");
const btn = alt.cloneNode(true);
alt.replaceWith(btn);
+ // Das Raum-Modal versteckt ihn; hier wird er gebraucht.
+ btn.hidden = false;
btn.addEventListener("click", speichereRaeume);
const dialog = document.querySelector("#modalEV .modal-dialog");
diff --git a/js/solar/homeMQTT.js b/js/solar/homeMQTT.js
index bf3ace1..58c2cf5 100644
--- a/js/solar/homeMQTT.js
+++ b/js/solar/homeMQTT.js
@@ -177,12 +177,16 @@ function switchFloor(floor){
.replace("ue", "ü").replace("ae", "ä").replace("oe", "ö");
// Der Speichern-Knopf gehoert allen Modals gemeinsam. Ein Klon ohne
- // Zuhoerer stellt sicher, dass nicht auch der Handler eines vorher
- // geoeffneten Modals mitfeuert.
+ // Zuhoerer stellt sicher, dass nicht der Handler eines vorher
+ // geoeffneten Modals mitfeuert; im Raum-Modal bleibt er weg. Hier wird
+ // nichts gesammelt und dann abgeschickt - jeder Rollladen, jeder
+ // Schalter und jede Lampe wirkt sofort, und die Solltemperatur tut es
+ // jetzt auch. Ein Knopf, der nur fuer einen der Reiter gilt, waere in
+ // allen anderen eine Falle.
const alt = document.getElementById("modalSaveBtn");
const btn = alt.cloneNode(true);
alt.replaceWith(btn);
- btn.addEventListener("click", () => sendeSolltemperatur(raum));
+ btn.hidden = true;
const koerper = document.getElementById("modal-body");
koerper.innerHTML = loadingHTML("Wird geladen...");
@@ -202,11 +206,11 @@ function switchFloor(floor){
wert => wert + " °C");
const stand = mqttData["Raumtemp"]?.[teile[0]]?.[teile[1]]?.["Set Temp[degC]"];
slider.value = typeof stand !== "undefined" ? stand : 10;
+ // Nur "input": das zeichnet die Anzeige, schickt aber nichts.
slider.dispatchEvent(new Event("input"));
+ // "change" kommt beim Loslassen - wie bei den Rollladenreglern.
+ slider.addEventListener("change", () => sendeSolltemperatur(raum));
}
- // Ohne Thermostat gibt es nichts zu speichern - dann waere der Knopf
- // eine Falle.
- btn.hidden = !slider;
raumBedienungAktivieren(koerper);
raumMesswerteAktualisieren(teile[0], teile[1]);
@@ -396,13 +400,23 @@ function switchFloor(floor){
});
}
+ /**
+ * Die neue Solltemperatur schicken.
+ *
+ * Das Modal bleibt danach offen: frueher schloss es sich, weil der
+ * Speichern-Knopf das Ende der Bedienung war. Jetzt ist das Verschieben
+ * des Reglers die Bedienung, und wer dreimal nachjustiert, will nicht
+ * dreimal neu aufmachen.
+ */
function sendeSolltemperatur(raum) {
const slider = document.getElementById("modal-slider");
if (!slider) return;
+ const karte = slider.closest(".raum-geraet");
+ if (karte) karte.classList.add("raum-warte");
raumRequest("temp", { room: raum, temp: Number(slider.value) })
.then(antwort => {
+ if (karte) karte.classList.remove("raum-warte");
raumMeldung(antwort);
- if (!antwort.error) setTimeout(() => modalEV.hide(), 700);
});
}