ShineBridge v1.12.1 — Feature: Wetterprognose-Vorschau im Einstellungen-Tab
v1.12.0 hat die Prognose nur intern verrechnet, nirgends sichtbar gemacht. Neuer Endpunkt GET /api/weather-forecast (weather_forecast.summary()) liefert aktuelle Solarstrahlung (naechste 3h/12h Maximum) + ein Beispiel, wie sich der Zwangslade-Timeout dadurch gerade veraendern wuerde (Basis: erster konfigurierter Kathrein-Timeout, sonst 2h-Default). Wird direkt unter den Standort-Feldern angezeigt, aktualisiert sich nach dem Speichern. Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
This commit is contained in:
@@ -243,6 +243,7 @@
|
||||
<input type="number" id="cfg-site-lon" step="0.0001" placeholder="z.B. 13.4050"></div>
|
||||
</div>
|
||||
<button class="btn btn-primary" onclick="saveLocation()">Speichern</button>
|
||||
<div id="weather-preview" style="margin-top:.75rem;font-size:.85rem"></div>
|
||||
</div>
|
||||
|
||||
<div class="settings-section">
|
||||
@@ -1252,6 +1253,7 @@ async function loadSettings() {
|
||||
document.getElementById("cfg-backup-retention").value = cfg.config_backup_retention_days ?? 14;
|
||||
document.getElementById("cfg-site-lat").value = cfg.site_lat ?? "";
|
||||
document.getElementById("cfg-site-lon").value = cfg.site_lon ?? "";
|
||||
loadWeatherPreview();
|
||||
}
|
||||
|
||||
async function saveLocation() {
|
||||
@@ -1263,9 +1265,30 @@ async function saveLocation() {
|
||||
body: JSON.stringify({ site_lat: lat === "" ? null : lat, site_lon: lon === "" ? null : lon }),
|
||||
});
|
||||
showToast("Gespeichert!", "ok");
|
||||
setTimeout(loadWeatherPreview, 500);
|
||||
} catch(e) { showToast("Fehler beim Speichern", "err"); }
|
||||
}
|
||||
|
||||
async function loadWeatherPreview() {
|
||||
const el = document.getElementById("weather-preview");
|
||||
let data;
|
||||
try { data = await fetchJSON(api("api/weather-forecast")); }
|
||||
catch(e) { el.innerHTML = ""; return; }
|
||||
|
||||
if (!data.configured) {
|
||||
el.innerHTML = `<span style="color:var(--text-dim)">Kein Standort gesetzt — Zwangslade-Timeout bleibt fest.</span>`;
|
||||
return;
|
||||
}
|
||||
if (data.error) {
|
||||
el.innerHTML = `<span style="color:var(--red)">${esc(data.error)}</span>`;
|
||||
return;
|
||||
}
|
||||
const verdictColor = data.verdict === "verlängert" ? "var(--green)" : data.verdict === "verkürzt" ? "var(--orange, #ffa657)" : "var(--text-dim)";
|
||||
el.innerHTML = `
|
||||
<div style="color:var(--text-dim)">Solarstrahlung nächste 3h: <strong style="color:var(--text)">${data.next_3h_max_ghi} W/m²</strong> · nächste 12h: <strong style="color:var(--text)">${data.horizon_12h_max_ghi} W/m²</strong></div>
|
||||
<div style="margin-top:4px;color:${verdictColor}">Beispiel bei ${data.example_base_h}h Basis-Timeout: <strong>${data.example_adjusted_h}h</strong> (${data.verdict})</div>`;
|
||||
}
|
||||
|
||||
async function savePrices() {
|
||||
const isSpot = document.getElementById("tariff-spot").checked;
|
||||
const body = {
|
||||
|
||||
Reference in New Issue
Block a user