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 <noreply@anthropic.com>
This commit is contained in:
+42
-11
@@ -58,6 +58,13 @@
|
|||||||
const $ = name => wurzel.querySelector('[data-heiz="' + name + '"]');
|
const $ = name => wurzel.querySelector('[data-heiz="' + name + '"]');
|
||||||
const g = geruest(wurzel, () => $("meldung"), "Änderungen gelten sofort");
|
const g = geruest(wurzel, () => $("meldung"), "Änderungen gelten sofort");
|
||||||
let ziehen = false;
|
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) {
|
async function senden(stufe) {
|
||||||
g.meldung("wird geschickt …");
|
g.meldung("wird geschickt …");
|
||||||
@@ -78,12 +85,30 @@
|
|||||||
|
|
||||||
function stand() {
|
function stand() {
|
||||||
const w = zahl("solarManager/pHeat") || 0;
|
const w = zahl("solarManager/pHeat") || 0;
|
||||||
const gemeldetFest = text("solarManager/heatMode") !== undefined && text("solarManager/heatMode") !== "eco";
|
const gemeldet = text("solarManager/heatMode");
|
||||||
// Der Heizstab meldet seine Betriebsart und die Leistung, die er gerade
|
const gemeldetFest = gemeldet !== undefined && gemeldet !== "eco";
|
||||||
// zieht - nicht die eingestellte. "Fest" ohne Leistung ist deshalb das,
|
// Kurz nach dem Absenden meldet das Geraet noch den alten Stand -
|
||||||
// was hier "Aus" heisst: eine feste Leistung von null.
|
// solange gilt die eigene Wahl.
|
||||||
const modus = g.gilt("modus", !gemeldetFest ? "auto" : w >= 20 ? "fest" : "aus");
|
const frisch = g.gilt("frisch", false) === true;
|
||||||
const stufe = g.gilt("stufe", Math.max(1, Math.min(60, Math.round(w / 100) || 30)));
|
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 {
|
return {
|
||||||
w, modus, stufe,
|
w, modus, stufe,
|
||||||
temps: ["t_buffT", "t_buffM", "t_buffB"].map(t => zahl("solarManager/" + t)),
|
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"));
|
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", () => {
|
wurzel.querySelectorAll("[data-heiz-modus]").forEach(b => b.addEventListener("click", () => {
|
||||||
const modus = b.dataset.heizModus;
|
const modus = b.dataset.heizModus;
|
||||||
g.merke("modus", modus);
|
waehlen(modus);
|
||||||
senden(modus === "auto" ? 0 : modus === "aus" ? -1 : Number($("regler").value));
|
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", () => {
|
$("regler").addEventListener("change", () => {
|
||||||
ziehen = false;
|
ziehen = false;
|
||||||
g.merke("modus", "fest");
|
waehlen("fest", Number($("regler").value));
|
||||||
senden(Number($("regler").value));
|
senden(Number($("regler").value));
|
||||||
});
|
});
|
||||||
wurzel.querySelectorAll("[data-heiz-stufe]").forEach(c => c.addEventListener("click", () => {
|
wurzel.querySelectorAll("[data-heiz-stufe]").forEach(c => c.addEventListener("click", () => {
|
||||||
const stufe = Number(c.dataset.heizStufe);
|
const stufe = Number(c.dataset.heizStufe);
|
||||||
g.merke("stufe", stufe);
|
waehlen("fest", stufe);
|
||||||
g.merke("modus", "fest");
|
|
||||||
senden(stufe);
|
senden(stufe);
|
||||||
}));
|
}));
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user