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