From 060336c89143859dccc46c4edc4a08005c0885ce Mon Sep 17 00:00:00 2001 From: "m0@nas" Date: Tue, 8 Sep 2026 23:41:18 +0200 Subject: [PATCH] Kachelwerte koennen das Vorzeichen umdrehen Ein Zaehler zaehlt in der Richtung, in der er eingebaut ist - einer der beiden Shelly-Zaehler meldet deshalb mit umgekehrtem Vorzeichen, und auf der Kachel stand der Verbrauch als Minusleistung. Neu gibt es dafuer den Schalter "negativ" an jedem Kachelwert. Er sitzt in der Anzeige und nicht am Zaehler: Automatiken und Statistik lesen dieselbe Nachricht und rechnen mit dem Vorzeichen, das dort steht - wer es an der Quelle drehte, verschoebe die Rechnung an einer Stelle, an der niemand danach sucht. Gedreht wird vor dem Formatieren, also auch vor der Skalierung zwischen W und kW und vor den Nachkommastellen. Aus -0 wird wieder 0. Was keine Zahl ist, bleibt unangetastet und die Kachel zeigt weiter ihren Strich. In der eingeklappten Kurzfassung steht das Minus vor dem Namen, damit man ohne Aufklappen sieht, welcher Wert gedreht ist. Co-Authored-By: Claude Opus 5 --- js/solar/homeMQTT.js | 13 +++++++++++++ js/solar/settings.js | 36 ++++++++++++++++++++++++------------ restricted/kacheln.php | 5 +++++ 3 files changed, 42 insertions(+), 12 deletions(-) diff --git a/js/solar/homeMQTT.js b/js/solar/homeMQTT.js index 0b953fb..f9bca9e 100644 --- a/js/solar/homeMQTT.js +++ b/js/solar/homeMQTT.js @@ -122,6 +122,12 @@ const homeSVG = { * Wie er dasteht, sagt entweder "format" oder das Paar aus "einheit" und * "stellen": "stellen" schneidet Nachkommastellen ab, ohne Angabe bleibt * der Text so, wie das Geraet ihn meldet. + * + * "negativ" dreht das Vorzeichen. Ein Zaehler zaehlt in der Richtung, in + * der er eingebaut ist - einer der beiden meldet den Bezug deshalb mit + * Minus. Das gehoert an die Anzeige und nicht an den Zaehler: die + * Automatiken und die Statistik lesen dieselbe Nachricht und rechnen mit + * dem Vorzeichen, das dort steht. */ kachelWert: function (mqttData, wert) { const roh = wert.wechselrichter @@ -138,6 +144,13 @@ const homeSVG = { return null; // noch keine vollstaendige Nachricht } } + if (wert.negativ) { + const zahl = Number(text); + if (text === "" || isNaN(zahl)) return null; + // "+ 0" macht aus -0 wieder 0: "-0 W" hat noch niemanden erfreut. + text = String(-zahl + 0); + } + // Leistungen skalieren mit: unter tausend Watt in W, darueber in kW. // powerToString() aus common.js macht genau das und wird auf der // Solarseite fuer dieselben Zahlen benutzt - eine eigene Regel hier diff --git a/js/solar/settings.js b/js/solar/settings.js index ff3efc4..1d88880 100644 --- a/js/solar/settings.js +++ b/js/solar/settings.js @@ -316,22 +316,29 @@ function kachelQuelle(wert) { * und aus drei Kuerzeln wuerden drei Zeilen. */ function kachelWertKurz(wert, kachel) { - if (wert.wechselrichter) { - const n = wert.wechselrichter.length; - return "Wechselrichter (" + n + ")"; - } - const treffer = katalogTreffer(wert); const einheit = wert.format === "leistung" ? "W/kW" : (wert.einheit || ""); - if (treffer) { + const treffer = wert.wechselrichter ? null : katalogTreffer(wert); + let text; + + if (wert.wechselrichter) { + text = "Wechselrichter (" + wert.wechselrichter.length + ")"; + } else if (treffer) { + // Das Geraet steht nur dabei, wenn es ein fremdes ist - im eigenen Raum + // waere es auf jeder Zeile dasselbe Wort. const fremd = !kachel || treffer.geraet.raum !== kachel.name; - return (fremd ? treffer.geraet.label + " · " : "") + treffer.wert.name + text = (fremd ? treffer.geraet.label + " · " : "") + treffer.wert.name + (einheit ? " " + einheit : ""); + } else { + const topic = wert.topic || ""; + const teile = topic.split("/"); + text = teile[teile.length - 1] || topic; + if (wert.pfad) text += " · " + wert.pfad; + if (einheit) text += " " + einheit; } - const topic = wert.topic || ""; - const teile = topic.split("/"); - let text = teile[teile.length - 1] || topic; - if (wert.pfad) text += " · " + wert.pfad; - return einheit ? text + " " + einheit : text; + + // Das Minus steht vorne, wie es auf der Kachel auch stuende - und zwar bei + // jeder Herkunft, deshalb erst hier und nicht in den drei Zweigen. + return wert.negativ ? "−" + text : text; } /** Eine Kachel im Modell finden. */ @@ -575,6 +582,10 @@ function kachelWertZeile(wert, i, kachel) { + '" + + '" + '" @@ -638,6 +649,7 @@ function kachelWertLesen(feldZeile) { } const icon = (hol("icon") || "").trim(); if (icon) wert.icon = icon; + if (hol("negativ")) wert.negativ = true; if (hol("gross")) wert.gross = true; return wert; } diff --git a/restricted/kacheln.php b/restricted/kacheln.php index 3654b95..b5e711e 100644 --- a/restricted/kacheln.php +++ b/restricted/kacheln.php @@ -17,6 +17,8 @@ * format "leistung" skaliert selbst zwischen W und kW * einheit sonst die Einheit, die hinter der Zahl steht * stellen Nachkommastellen (0-3) + * negativ das Vorzeichen umdrehen - fuer Zaehler, die verkehrt + * herum eingebaut sind * gross die Zahl steht gross auf der Kachel * icon Symbol vor der Zahl: der Name eines Bootstrap-Icons ohne * das "bi-" davor ("thermometer-half"). Erlaubt ist jedes, @@ -357,6 +359,9 @@ function kachelWertPruefen($wert, $nummer) } $sauber["icon"] = $icon; } + if (!empty($wert["negativ"])) { + $sauber["negativ"] = true; + } if (!empty($wert["gross"])) { $sauber["gross"] = true; }