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); }); }