Solar: Anlage-Ansicht neu, im Stil der Energiefluss-Uebersicht

Der alte Plan (pvplan.svg) ist ersetzt durch einen Katalog der Anlage
(js/solar/anlageKatalog.js: Flaechen, Wechselrichter, echte Lage jeder
Platte) und einen Renderer (js/solar/anlage.js):

- Flaechen mit Leistung und Anteil als Balken
- Lageplan: Farbe stufenlos nach Leistung im Vergleich zu den staerksten
  Platten der Flaeche, Warnzeichen nur bei genug Licht unter 70 % des
  Medians, "ohne Daten" wenn der Wechselrichter nichts meldet;
  Auftritt, Lichtwelle bei Sonne, pulsierende Warnung; hochkant gedreht
  auf schmalen Schirmen
- Detail zu Platte, String oder Wechselrichter (Eingaenge als Balken,
  Auslastung, Temperatur), Verlauf je Platte ab Seitenaufruf
- Wechselrichterliste mit Zustand ok / hochgerechnet / keine Daten

Die Flaechen im Sonnenring der Uebersicht kommen jetzt aus demselben
Katalog.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
2026-09-15 17:56:37 +02:00
co-authored by Claude Opus 5
parent a59277e33e
commit de2892f7a7
9 changed files with 834 additions and 230 deletions
+13 -21
View File
@@ -142,11 +142,12 @@ function setFlowWidth(id, width) {
flow.style.willChange = sichtbar ? "transform" : "auto";
}
// Die Energiefluss-Uebersicht (js/solar/energiefluss.js) und der PV-Lageplan.
// Bis September 2026 stand hier updateValuesMQTT fuer das feste realtime.svg -
// jeder Kreis mit eigenen Zeilen. Was ein Kreis zeigt, steht jetzt im Katalog
// (energieflussKatalog.js); hier bleibt nur der Lageplan hinter der Sonne.
// Die Energiefluss-Uebersicht (js/solar/energiefluss.js) und die Anlage-Ansicht
// (js/solar/anlage.js). Bis September 2026 stand hier updateValuesMQTT fuer das
// feste realtime.svg - jeder Kreis mit eigenen Zeilen. Was gezeigt wird, steht
// jetzt in den Katalogen (energieflussKatalog.js, anlageKatalog.js).
let energiefluss = null;
let anlage = null;
const solarSVG = {
updateCnt: 99,
@@ -163,23 +164,8 @@ const solarSVG = {
},
updateValuesMQTT: function (mqttData) {
if (energiefluss) energiefluss.aktualisieren(mqttData);
// Lageplan (assets/img/pvplan.svg): Leistung je Eingang und die Liste
// der Wechselrichter.
let pvn = [];
try { pvn = JSON.parse(mqttData["solarManager/P_PVn"]); } catch (e) { pvn = []; }
for (let i = 0; i < pvn.length; i++) {
if (svgElement("det_pv" + i + "P")) setText("det_pv" + i + "P", powerToString(pvn[i]));
}
let liste = "";
for (let i = 0; mqttData["solarManager/inverters" + i + "/name"] !== undefined; i++) {
const basis = "solarManager/inverters" + i;
const gestoert = mqttData[basis + "/error"] > 0;
liste += '<tspan x="0" dy="1.2em">' + mqttData[basis + "/name"] + ":</tspan>"
+ '<tspan x="160">' + (gestoert ? "--" : Math.round(mqttData[basis + "/temp"])) + " °C</tspan>"
+ '<tspan x="215">' + (gestoert ? "-- W" : powerToString(mqttData[basis + "/p_AC"])) + "</tspan>";
}
if (svgElement("invList")) setHTML("invList", liste);
// Auch verborgen: so schreibt die Anlage ihren Verlauf je Platte mit.
if (anlage) anlage.aktualisieren(mqttData);
}
};
@@ -220,6 +206,12 @@ function energieflussStarten() {
},
});
energiefluss.zeichnen();
const anlageBehaelter = document.getElementById("anlage");
if (anlageBehaelter && typeof Anlage !== "undefined") {
anlage = new Anlage(anlageBehaelter);
anlage.zeichnen();
}
}
var chartSettings = {