Heizstab kann ganz aus

Dritte Betriebsart neben Automatik und Fest: Aus schickt eine feste Leistung
von null (setMode=-1). In der Automatik liefe der Heizstab beim naechsten
Ueberschuss wieder an. Erkannt wird der Zustand daran, dass das Geraet
feste Betriebsart, aber keine Leistung meldet.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
2026-09-16 10:08:13 +02:00
co-authored by Claude Opus 5
parent 357c73cf8a
commit a50905bb6c
3 changed files with 20 additions and 5 deletions
+10 -1
View File
@@ -5,6 +5,7 @@
* GET das Bedienfenster (Werte und Logik: js/solar/bedienfenster.js) * GET das Bedienfenster (Werte und Logik: js/solar/bedienfenster.js)
* POST setMode=0 Automatik: der SolarManager regelt nach Überschuss * POST setMode=0 Automatik: der SolarManager regelt nach Überschuss
* POST setMode=1..60 feste Leistung in 100 W (60 = 6,0 kW) * POST setMode=1..60 feste Leistung in 100 W (60 = 6,0 kW)
* POST setMode=-1 aus: feste Leistung von 0 W, der Heizstab bleibt kalt
* *
* Seit September 2026 gilt jede Änderung sofort, ohne "Save changes". Die * Seit September 2026 gilt jede Änderung sofort, ohne "Save changes". Die
* Antwort ist leer, wenn der Befehl beim Heizstab ankam, sonst steht dort * Antwort ist leer, wenn der Befehl beim Heizstab ankam, sonst steht dort
@@ -27,6 +28,10 @@ if (isset($_POST["setMode"]) || isset($_GET["setMode"])) {
$pfad = "/set?mode=man&pwr=" . ($stufe * 100); $pfad = "/set?mode=man&pwr=" . ($stufe * 100);
} elseif ($stufe === 0) { } elseif ($stufe === 0) {
$pfad = "/set?mode=eco&pwr=0"; $pfad = "/set?mode=eco&pwr=0";
} elseif ($stufe === -1) {
// Aus ist eine feste Leistung von null: in der Automatik wuerde der
// Heizstab beim naechsten Ueberschuss wieder anlaufen.
$pfad = "/set?mode=man&pwr=0";
} else { } else {
echo "Unbekannte Leistungsstufe."; echo "Unbekannte Leistungsstufe.";
exit; exit;
@@ -74,11 +79,15 @@ if (isset($_POST["setMode"]) || isset($_GET["setMode"])) {
<div class="lade-rechts"> <div class="lade-rechts">
<div class="lade-abschnitt"> <div class="lade-abschnitt">
<h3 id="heiz-modus">Wie heizen?</h3> <h3 id="heiz-modus">Wie heizen?</h3>
<div class="lade-modi zwei" role="radiogroup" aria-labelledby="heiz-modus"> <div class="lade-modi" role="radiogroup" aria-labelledby="heiz-modus">
<button type="button" class="lade-modus" role="radio" aria-checked="false" data-heiz-modus="auto" style="--c:#f7c000"> <button type="button" class="lade-modus" role="radio" aria-checked="false" data-heiz-modus="auto" style="--c:#f7c000">
<span class="lade-sym"><svg viewBox="0 0 24 24"><circle cx="12" cy="12" r="4"/><path d="M12 2v2M12 20v2M2 12h2M20 12h2M4.9 4.9l1.4 1.4M17.7 17.7l1.4 1.4M4.9 19.1l1.4-1.4M17.7 6.3l1.4-1.4"/></svg></span> <span class="lade-sym"><svg viewBox="0 0 24 24"><circle cx="12" cy="12" r="4"/><path d="M12 2v2M12 20v2M2 12h2M20 12h2M4.9 4.9l1.4 1.4M17.7 17.7l1.4 1.4M4.9 19.1l1.4-1.4M17.7 6.3l1.4-1.4"/></svg></span>
<b>Automatik</b><span>heizt mit dem Überschuss der Anlage</span> <b>Automatik</b><span>heizt mit dem Überschuss der Anlage</span>
</button> </button>
<button type="button" class="lade-modus" role="radio" aria-checked="false" data-heiz-modus="aus" style="--c:#9aa6ad">
<span class="lade-sym"><svg viewBox="0 0 24 24"><path d="M12 3v9"/><path d="M7.5 6.5a7 7 0 1 0 9 0"/></svg></span>
<b>Aus</b><span>bleibt kalt, auch bei Überschuss</span>
</button>
<button type="button" class="lade-modus" role="radio" aria-checked="false" data-heiz-modus="fest" style="--c:#e5624f"> <button type="button" class="lade-modus" role="radio" aria-checked="false" data-heiz-modus="fest" style="--c:#e5624f">
<span class="lade-sym"><svg viewBox="0 0 24 24"><path d="M12 3c3 4 5 6.5 5 10a5 5 0 0 1-10 0c0-2 1-3.5 2-4.5.3 1.5 1 2.5 2 3 0-3 .5-5.5 1-8.5z"/></svg></span> <span class="lade-sym"><svg viewBox="0 0 24 24"><path d="M12 3c3 4 5 6.5 5 10a5 5 0 0 1-10 0c0-2 1-3.5 2-4.5.3 1.5 1 2.5 2 3 0-3 .5-5.5 1-8.5z"/></svg></span>
<b>Fest</b><span>eingestellte Leistung, auch aus dem Netz</span> <b>Fest</b><span>eingestellte Leistung, auch aus dem Netz</span>
+8 -3
View File
@@ -79,7 +79,10 @@
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 gemeldetFest = text("solarManager/heatMode") !== undefined && text("solarManager/heatMode") !== "eco";
const modus = g.gilt("modus", gemeldetFest ? "fest" : "auto"); // 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 stufe = g.gilt("stufe", Math.max(1, Math.min(60, Math.round(w / 100) || 30)));
return { return {
w, modus, stufe, w, modus, stufe,
@@ -103,11 +106,13 @@
$("leistung").innerHTML = komma(s.w / 1000, 2) + S + "kW<small>" + (heizt ? "heizt" : "aus") + "</small>"; $("leistung").innerHTML = komma(s.w / 1000, 2) + S + "kW<small>" + (heizt ? "heizt" : "aus") + "</small>";
const pille = $("pille"); const pille = $("pille");
setze(pille, s.modus === "auto" ? "Automatik" : "fest"); setze(pille, s.modus === "auto" ? "Automatik" : s.modus === "aus" ? "aus" : "fest");
pille.className = "lade-pille" + (heizt ? " an" : ""); pille.className = "lade-pille" + (heizt ? " an" : "");
setze($("erklaerung"), s.modus === "auto" setze($("erklaerung"), s.modus === "auto"
? "Heizt nur mit dem Überschuss der Anlage ohne Sonne bleibt der Heizstab aus." ? "Heizt nur mit dem Überschuss der Anlage ohne Sonne bleibt der Heizstab aus."
: s.modus === "aus"
? "Bleibt aus, auch wenn die Anlage Überschuss hat. Das Warmwasser macht dann allein die Therme."
: "Heizt dauerhaft mit " + komma(s.stufe / 10) + S + "kW reicht die Sonne nicht, kommt der Strom aus dem Netz."); : "Heizt dauerhaft mit " + komma(s.stufe / 10) + S + "kW reicht die Sonne nicht, kommt der Strom aus dem Netz.");
wurzel.querySelectorAll("[data-heiz-modus]").forEach(b => b.setAttribute("aria-checked", b.dataset.heizModus === s.modus ? "true" : "false")); wurzel.querySelectorAll("[data-heiz-modus]").forEach(b => b.setAttribute("aria-checked", b.dataset.heizModus === s.modus ? "true" : "false"));
@@ -123,7 +128,7 @@
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); g.merke("modus", modus);
senden(modus === "auto" ? 0 : 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; g.merke("stufe", Number($("regler").value)); zeichnen(); });
$("regler").addEventListener("change", () => { $("regler").addEventListener("change", () => {
+2 -1
View File
@@ -245,7 +245,8 @@ const ENERGIEFLUSS_KATALOG = (function () {
return { return {
leistung: w, fluss: w, ruhe: w < 20, leistung: w, fluss: w, ruhe: w < 20,
neben: grad(oben) + "/" + grad(mitte) + " °C", neben: grad(oben) + "/" + grad(mitte) + " °C",
zeichen: [eco ? { art: "eco", titel: "Automatik (Überschuss)" } : { art: "manuell", titel: "Feste Leistung" }], zeichen: [eco ? { art: "eco", titel: "Automatik (Überschuss)" }
: { art: "manuell", titel: w >= 20 ? "Feste Leistung" : "Aus" }],
zustand: { an: w >= 20, temps: [oben, mitte, unten] }, zustand: { an: w >= 20, temps: [oben, mitte, unten] },
}; };
}, },