From fe73517c17e471bf2a90dc95c2e4938760c3d677 Mon Sep 17 00:00:00 2001 From: Moirtz Wagner Date: Sat, 5 Sep 2026 13:13:02 +0200 Subject: [PATCH] Raum-Modal fragt die Jalousien beim Oeffnen an der Box nach Wer eine Jalousie faehrt, das Modal zumacht und gleich wieder aufmacht, sah weiter den alten Stand - und zwar dauerhaft. Zwei Gruende, die sich uebereinandergelegt haben: die Box meldet die neue Hoehe erst am Ende der Fahrt (gemessen rund zwanzig Sekunden), und das Modal zeichnet sich nur beim Oeffnen. Was in diesen zwanzig Sekunden aufgemacht wurde, blieb falsch stehen, bis jemand es noch einmal aufmachte. Beim Oeffnen wird jetzt jede Jalousie des Raums einmal an der Box nachgefragt. Faehrt sie gerade, bleibt die Verfolgung dran, bis sie steht. Ohne Auftrag gibt es keinen Vorlauf abzuwarten und nichts nachzureichen, deshalb genau eine Abfrage je Jalousie - drei fuer das Wohnzimmer. Damit stimmt die Anzeige in beiden Richtungen: der Server schreibt nach jedem Fahrbefehl nach (67c2a77), das Modal holt sich beim Aufmachen den Stand. Geprueft an der Wozi-Schiebetuer, genau der gemeldete Ablauf: Regler auf 10, Modal nach 1,2 s zu, nach weiteren 0,6 s wieder auf. Es zeigte 60, verfolgte weiter und sprang nach 28 Sekunden auf 10. Ein ruhiges Oeffnen kostet drei Abfragen fuer drei Jalousien. Dazu dreizehn Faelle gegen die echte Datei. Co-Authored-By: Claude Opus 5 --- js/solar/homeMQTT.js | 39 ++++++++++++++++++++++++++++++++------- 1 file changed, 32 insertions(+), 7 deletions(-) diff --git a/js/solar/homeMQTT.js b/js/solar/homeMQTT.js index e9ea5ec..bdac51c 100644 --- a/js/solar/homeMQTT.js +++ b/js/solar/homeMQTT.js @@ -333,6 +333,12 @@ function switchFloor(floor){ } raumBedienungAktivieren(koerper); + // Jede Jalousie im Raum einmal an der Box nachfragen. Der Wert im + // Modal kommt aus actor_states und ist damit hoechstens so frisch + // wie der letzte Poll des Runners - und wer das Modal waehrend einer + // Fahrt aufmacht, saehe sonst den Stand von davor und nie wieder + // etwas anderes: gezeichnet wird nur beim Oeffnen. + koerper.querySelectorAll(".raum-geraet").forEach(k => jalousieVerfolgen(k, null)); raumMesswerteAktualisieren(teile[0], teile[1]); }) .catch(fehler => { koerper.innerHTML = "Konnte den Raum nicht laden: " + fehler.message; }); @@ -564,6 +570,11 @@ function switchFloor(floor){ if (!karte || !karte.querySelector(".raum-jalousie")) return; const actor = Number(karte.dataset.actor); if (!actor) return; + // Ohne Auftrag - beim Oeffnen des Modals - gibt es keine Traegheit + // abzuwarten und nichts nachlaufen zu lassen: was die Box beim ersten + // Blick meldet, gilt. Faehrt sie gerade, wird bis zum Stillstand + // weitergesehen. + const vorlaufNoetig = !!auftrag; // Ein zweiter Fahrbefehl schiebt nur das Ende hinaus. Zwei Schleifen // wuerden dieselbe Box doppelt so oft fragen, ohne mehr zu zeigen. @@ -578,11 +589,14 @@ function switchFloor(floor){ // dazwischen, und zwischen ihnen steht die Jalousie still. Wer da // aufhoert, schreibt die Zwischenstellung fest - gemessen "Neigung 0", // wo 62 gemeint war. - let ruheAb = Infinity; - Promise.resolve(auftrag).then( - function () { ruheAb = Date.now() + JALOUSIE_NACHLAUF_MS; }, - function () { ruheAb = Date.now(); } - ); + let ruheAb = 0; + if (auftrag) { + ruheAb = Infinity; + Promise.resolve(auftrag).then( + function () { ruheAb = Date.now() + JALOUSIE_NACHLAUF_MS; }, + function () { ruheAb = Date.now(); } + ); + } function aufhoeren() { delete karte.dataset.jalousieLaeuft; @@ -618,11 +632,22 @@ function switchFloor(floor){ // danach holt den Wert, den die Box beim Anhalten setzt. const fertig = !stand.faehrt && Date.now() >= ruheAb - && (gefahren || Date.now() - beginn >= JALOUSIE_VORLAUF_MS); + && (gefahren || !vorlaufNoetig + || Date.now() - beginn >= JALOUSIE_VORLAUF_MS); + // Die Bestaetigungsrunde faengt Werte ab, die die Box erst nach dem + // Anhalten nachreicht. Beim blossen Aufmachen eines Raums, in dem + // sich nichts geruehrt hat, gibt es nichts nachzureichen - dann + // bleibt es bei einer Abfrage je Jalousie. + if (fertig && !vorlaufNoetig && !gefahren) { + aufhoeren(); + return; + } setTimeout(() => runde(fertig), JALOUSIE_TAKT_MS); }); } - setTimeout(() => runde(false), JALOUSIE_TAKT_MS); + // Beim Oeffnen sofort nachsehen, nach einem Kommando erst im Takt: da + // stuende die Box ohnehin noch auf dem alten Wert. + setTimeout(() => runde(false), auftrag ? JALOUSIE_TAKT_MS : 0); } /**