- bat_discharge_total + bat_charge_total werden jetzt als Perioden-Starts getrackt
- savings_kwh = Batterie-Entladung der Periode (→ Haus + Auto)
- savings_eur = savings_kwh × effektiver Importpreis (Festpreis oder Börsendurchschnitt)
- Neue Karte "Eigenversorgung" (lila) neben Netzbezug/Einspeisung
- Preis-Refaktor: eff_price für Import, Export, Ersparnis aus einer Berechnung
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Vorher: rev:dchOn — bei gleichzeitig aktiven bat_charge/discharge (Messrauschen)
zeigte die Richtung Entladen obwohl Laden aktiv war.
Jetzt: rev:!(batChW >= batDchW) — Richtung folgt dem Nettostrom.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
- hasEV-Flag aus invertersList: nur KATHREIN_WALLBOX zeigt EV-Node
- Ohne Wallbox: flacheres Layout (viewBox 520x278 statt 410)
- SEG-Array und SVG-Node konditionell
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
- Grid-Icon: Sinuswelle (AC-Symbol) statt A-förmiger Übertragungsturm
- Batterie-Node: wird angezeigt sobald bat_* Aggregate vorhanden, nicht erst wenn bat_soc != null
- batSub: SOC-Prozent nur wenn bat_soc nicht null
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
- Kreisförmige Nodes wie im HA Energie-Dashboard (r=44, farbiger Rand)
- Bezier-Kurven mit wandernden Punkten via animateMotion (3 Dots/Pfad)
- Flussrichtung korrekt: reverse für Export, Entladen
- Inaktive Pfade gedimmt, keine Dots
- CSS flowFwd/flowBwd entfernt (nicht mehr benötigt)
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
- Modal zeigt EMS-Felder nur bei KATHREIN_WALLBOX (toggleEmsSection)
- openModal lädt ems_min_pv/timeout/target_hour/phases aus Gerätekonfig
- saveInverter speichert EMS-Parameter in inverters.json
- main.py übergibt EMS-Konfig aus inv_cfg an EmsController()
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Add-on heißt jetzt ShineBridge (slug: shinebridge). Hardware-Name
"Growatt ShineLAN-X" im README und in der Dokumentation unverändert.
WICHTIG: Slug-Änderung erfordert Neuinstallation des Add-ons in HA
(altes Add-on deinstallieren, ShineBridge neu installieren).
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
- Flask bindet auf 127.0.0.1 statt 0.0.0.0 — Port 8099 nicht mehr
direkt im LAN erreichbar (host_network: true umgeht sonst HA-Auth)
- XSS: esc() Funktion + HTML-Escaping für alle user-controlled Werte
in innerHTML (inv.name, modbus_ip, mqtt_topic_prefix, s.name, s.unit)
- API: POST /api/inverters-config validiert inverter_model, Port (1-65535),
Modbus-Adresse (1-247) vor dem Speichern
- _poll_loop: int()-Aufrufe in try/except — kein Thread-Crash bei
ungültiger Config
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
- SVG-Sparkline pro Sensor-Karte, farbkodiert nach device_class
- Backend: (timestamp, value) deque pro Sensor, API filtert auf 300s
- Kein Datenverlust bei Neustart (In-Memory, reicht für Trendanzeige)
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
- Unbegrenzt viele Wechselrichter über Web UI verwaltbar (Add/Edit/Delete)
- Pro Wechselrichter: eigener Poll-Thread, MQTT-Topic-Präfix, HA Device
- Shared MQTT-Publisher: eine Verbindung für alle Wechselrichter
- Migration: bestehende Single-Inverter-Config wird automatisch übernommen
- Live-Daten: pro Wechselrichter mit Online/Offline-Badge
- config.yaml: nur noch MQTT global, Wechselrichter über /data/config.json
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Fehlerzähler zeigte kumulierte Timeouts vor dem NuttX-Flash (4282)
was wie ein Growatt-Fehlercode aussah. Status-Pills zeigen Verbindung.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Fetches verwendeten absolute Pfade (/api/...) → gingen an HA REST API statt Add-on.
Hinter HA Ingress-Proxy muss der Pfad relativ zur Seiten-URL sein.
Fix: BASE = window.location.href + "./" → apiUrl() für alle fetch-Aufrufe.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>