State.mqtt_cfg wurde beim Start nur mit 4 MQTT-Keys initialisiert — alle
Tarif/Billing-Keys fehlten, wurden nach Neustart auf Defaults zurückgesetzt.
Fix: alle persistenten Keys aus load_config() in State.mqtt_cfg übernehmen.
Finanzen-Tab: mehr Abstände, größere Karten (22px Wert), Abschnittsüberschriften,
Trennlinie vor dem Chart.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
fEur/fKwh waren lokale Funktionen in renderEnergy() — loadFinance()
konnte sie nicht aufrufen (ReferenceError außerhalb des Scopes).
Beide Funktionen in den globalen Scope verschoben, lokale Kopien entfernt.
loadFinance() Rendering-Block in try/catch gewrappt.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Alle erledigten Features als [x] markiert, neue Einträge für
Flash-Wizard, NuttX OTA, Setup-Wizard, MQTT rc=5, Port-Sicherheit,
Mobile-Layout. Changelog bis v1.8.19 ergänzt.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Flask-App + mobile Web UI für Diagnose vor Ort ohne HAOS/MQTT.
Pi 3B: eth0 → ShineLAN-X (DHCP), wlan0 → Hotspot "ShineDiag".
Browser auf http://10.0.1.1: Modell wählen, alle Sensoren auslesen,
Rohdaten-Register-Dump, Export als JSON.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Register 0x0030 liefert je nach SDM-630-Firmware-Variante den Phasenwinkel
statt der Gesamtwirkleistung. total_power wird jetzt zuverlässig aus
power_l1 + power_l2 + power_l3 berechnet und überschreibt den Hardware-Wert.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>