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 <noreply@anthropic.com>
This commit is contained in:
2026-09-08 23:41:18 +02:00
co-authored by Claude Opus 5
parent cd398bc800
commit 060336c891
3 changed files with 42 additions and 12 deletions
+13
View File
@@ -122,6 +122,12 @@ const homeSVG = {
* Wie er dasteht, sagt entweder "format" oder das Paar aus "einheit" und * Wie er dasteht, sagt entweder "format" oder das Paar aus "einheit" und
* "stellen": "stellen" schneidet Nachkommastellen ab, ohne Angabe bleibt * "stellen": "stellen" schneidet Nachkommastellen ab, ohne Angabe bleibt
* der Text so, wie das Geraet ihn meldet. * 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) { kachelWert: function (mqttData, wert) {
const roh = wert.wechselrichter const roh = wert.wechselrichter
@@ -138,6 +144,13 @@ const homeSVG = {
return null; // noch keine vollstaendige Nachricht 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. // Leistungen skalieren mit: unter tausend Watt in W, darueber in kW.
// powerToString() aus common.js macht genau das und wird auf der // powerToString() aus common.js macht genau das und wird auf der
// Solarseite fuer dieselben Zahlen benutzt - eine eigene Regel hier // Solarseite fuer dieselben Zahlen benutzt - eine eigene Regel hier
+24 -12
View File
@@ -316,22 +316,29 @@ function kachelQuelle(wert) {
* und aus drei Kuerzeln wuerden drei Zeilen. * und aus drei Kuerzeln wuerden drei Zeilen.
*/ */
function kachelWertKurz(wert, kachel) { 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 || ""); 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; 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 : ""); + (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("/"); // Das Minus steht vorne, wie es auf der Kachel auch stuende - und zwar bei
let text = teile[teile.length - 1] || topic; // jeder Herkunft, deshalb erst hier und nicht in den drei Zweigen.
if (wert.pfad) text += " · " + wert.pfad; return wert.negativ ? "" + text : text;
return einheit ? text + " " + einheit : text;
} }
/** Eine Kachel im Modell finden. */ /** Eine Kachel im Modell finden. */
@@ -575,6 +582,10 @@ function kachelWertZeile(wert, i, kachel) {
+ '<label title="Leistung: skaliert selbst zwischen W und kW">' + '<label title="Leistung: skaliert selbst zwischen W und kW">'
+ '<input type="checkbox" class="form-check-input" data-feld="format"' + '<input type="checkbox" class="form-check-input" data-feld="format"'
+ (wert.format === "leistung" ? " checked" : "") + "> kW</label>" + (wert.format === "leistung" ? " checked" : "") + "> kW</label>"
+ '<label title="Vorzeichen umdrehen - für Zähler, die verkehrt herum'
+ ' eingebaut sind">'
+ '<input type="checkbox" class="form-check-input" data-feld="negativ"'
+ (wert.negativ ? " checked" : "") + "> negativ</label>"
+ '<label title="Die Zahl steht gross auf der Kachel">' + '<label title="Die Zahl steht gross auf der Kachel">'
+ '<input type="checkbox" class="form-check-input" data-feld="gross"' + '<input type="checkbox" class="form-check-input" data-feld="gross"'
+ (wert.gross ? " checked" : "") + "> groß</label>" + (wert.gross ? " checked" : "") + "> groß</label>"
@@ -638,6 +649,7 @@ function kachelWertLesen(feldZeile) {
} }
const icon = (hol("icon") || "").trim(); const icon = (hol("icon") || "").trim();
if (icon) wert.icon = icon; if (icon) wert.icon = icon;
if (hol("negativ")) wert.negativ = true;
if (hol("gross")) wert.gross = true; if (hol("gross")) wert.gross = true;
return wert; return wert;
} }
+5
View File
@@ -17,6 +17,8 @@
* format "leistung" skaliert selbst zwischen W und kW * format "leistung" skaliert selbst zwischen W und kW
* einheit sonst die Einheit, die hinter der Zahl steht * einheit sonst die Einheit, die hinter der Zahl steht
* stellen Nachkommastellen (0-3) * stellen Nachkommastellen (0-3)
* negativ das Vorzeichen umdrehen - fuer Zaehler, die verkehrt
* herum eingebaut sind
* gross die Zahl steht gross auf der Kachel * gross die Zahl steht gross auf der Kachel
* icon Symbol vor der Zahl: der Name eines Bootstrap-Icons ohne * icon Symbol vor der Zahl: der Name eines Bootstrap-Icons ohne
* das "bi-" davor ("thermometer-half"). Erlaubt ist jedes, * das "bi-" davor ("thermometer-half"). Erlaubt ist jedes,
@@ -357,6 +359,9 @@ function kachelWertPruefen($wert, $nummer)
} }
$sauber["icon"] = $icon; $sauber["icon"] = $icon;
} }
if (!empty($wert["negativ"])) {
$sauber["negativ"] = true;
}
if (!empty($wert["gross"])) { if (!empty($wert["gross"])) {
$sauber["gross"] = true; $sauber["gross"] = true;
} }