From f83f8fa2fd1a5a4532147457ac061e8fd7538447 Mon Sep 17 00:00:00 2001 From: "m0@nas" Date: Wed, 16 Sep 2026 11:40:49 +0200 Subject: [PATCH] Heizfenster: eingestellte Leistung bleibt stehen Das Geraet meldet nur die Leistung, die es gerade zieht. Nach acht Sekunden fiel die Anzeige deshalb auf "gemessen/100, sonst 30" zurueck - aus fest eingestellten 0,1 kW wurden 3 kW, sobald der Heizstab nicht zog. Die eigene Wahl gilt jetzt, solange das Fenster offen ist; die Automatik meldet das Geraet weiterhin selbst. Co-Authored-By: Claude Opus 5 --- js/solar/bedienfenster.js | 53 +++++++++++++++++++++++++++++++-------- 1 file changed, 42 insertions(+), 11 deletions(-) diff --git a/js/solar/bedienfenster.js b/js/solar/bedienfenster.js index 5c6370c..54047c0 100644 --- a/js/solar/bedienfenster.js +++ b/js/solar/bedienfenster.js @@ -58,6 +58,13 @@ const $ = name => wurzel.querySelector('[data-heiz="' + name + '"]'); const g = geruest(wurzel, () => $("meldung"), "Änderungen gelten sofort"); let ziehen = false; + // Der Heizstab meldet seine Betriebsart und die Leistung, die er gerade + // zieht - nicht die, die eingestellt ist. Wer 0,1 kW fest einstellt und + // dessen Puffer schon warm ist, sieht also 0 W; daraus liesse sich die + // Einstellung nicht zurueckrechnen (vorher sprang die Anzeige dann auf + // 3 kW). Die eigene Wahl bleibt deshalb stehen, solange das Fenster + // offen ist. + const gewaehlt = { modus: null, stufe: null }; async function senden(stufe) { g.meldung("wird geschickt …"); @@ -78,12 +85,30 @@ function stand() { const w = zahl("solarManager/pHeat") || 0; - const gemeldetFest = text("solarManager/heatMode") !== undefined && text("solarManager/heatMode") !== "eco"; - // Der Heizstab meldet seine Betriebsart und die Leistung, die er gerade - // zieht - nicht die eingestellte. "Fest" ohne Leistung ist deshalb das, - // was hier "Aus" heisst: eine feste Leistung von null. - const modus = g.gilt("modus", !gemeldetFest ? "auto" : w >= 20 ? "fest" : "aus"); - const stufe = g.gilt("stufe", Math.max(1, Math.min(60, Math.round(w / 100) || 30))); + const gemeldet = text("solarManager/heatMode"); + const gemeldetFest = gemeldet !== undefined && gemeldet !== "eco"; + // Kurz nach dem Absenden meldet das Geraet noch den alten Stand - + // solange gilt die eigene Wahl. + const frisch = g.gilt("frisch", false) === true; + let modus; + if (frisch && gewaehlt.modus) { + modus = gewaehlt.modus; + } else if (!gemeldetFest) { + // Automatik sagt das Geraet eindeutig - auch, wenn sie woanders + // eingeschaltet wurde. + modus = "auto"; + if (gewaehlt.modus && gewaehlt.modus !== "auto") gewaehlt.modus = null; + } else if (gewaehlt.modus === "fest" || gewaehlt.modus === "aus") { + // "fest" und "aus" sind fuer das Geraet dasselbe ("man"); welches von + // beiden gemeint war, weiss nur, wer es gewaehlt hat. + modus = gewaehlt.modus; + } else { + modus = w >= 20 ? "fest" : "aus"; + gewaehlt.modus = null; + } + const stufe = gewaehlt.stufe !== null + ? gewaehlt.stufe + : Math.max(1, Math.min(60, Math.round(w / 100) || 30)); return { w, modus, stufe, temps: ["t_buffT", "t_buffM", "t_buffB"].map(t => zahl("solarManager/" + t)), @@ -125,21 +150,27 @@ wurzel.querySelectorAll("[data-heiz-stufe]").forEach(c => c.setAttribute("aria-pressed", Number(c.dataset.heizStufe) === wert ? "true" : "false")); } + /** Eigene Wahl festhalten; "frisch" ueberbrueckt, bis das Geraet meldet. */ + function waehlen(modus, stufe) { + gewaehlt.modus = modus; + if (stufe !== undefined) gewaehlt.stufe = stufe; + g.merke("frisch", true); + } + wurzel.querySelectorAll("[data-heiz-modus]").forEach(b => b.addEventListener("click", () => { const modus = b.dataset.heizModus; - g.merke("modus", modus); + waehlen(modus); senden(modus === "auto" ? 0 : modus === "aus" ? -1 : Number($("regler").value)); })); - $("regler").addEventListener("input", () => { ziehen = true; g.merke("stufe", Number($("regler").value)); zeichnen(); }); + $("regler").addEventListener("input", () => { ziehen = true; gewaehlt.stufe = Number($("regler").value); zeichnen(); }); $("regler").addEventListener("change", () => { ziehen = false; - g.merke("modus", "fest"); + waehlen("fest", Number($("regler").value)); senden(Number($("regler").value)); }); wurzel.querySelectorAll("[data-heiz-stufe]").forEach(c => c.addEventListener("click", () => { const stufe = Number(c.dataset.heizStufe); - g.merke("stufe", stufe); - g.merke("modus", "fest"); + waehlen("fest", stufe); senden(stufe); }));