diff --git a/README.md b/README.md index cf94bb0..2083c9c 100644 --- a/README.md +++ b/README.md @@ -1,6 +1,6 @@ # ShineBridge -Lokale Solar-Wechselrichter-Integration für Home Assistant — ohne Cloud, ohne Hersteller-App. Modbus TCP via ShineLAN-X, MQTT Discovery, persistente History, PV-Überschussladen. +Lokale Solar-Wechselrichter-Integration für Home Assistant — ohne Cloud, ohne Hersteller-App. Modbus TCP via ShineLAN-X, MQTT Discovery, persistente History, PV-Überschussladen, Energie-Dashboard. > **Repository:** `https://gitea.bitfire.work/retr0/shinebridge` @@ -10,8 +10,8 @@ Lokale Solar-Wechselrichter-Integration für Home Assistant — ohne Cloud, ohne | Komponente | Beschreibung | Status | |---|---|---| -| **ShineBridge Add-on** | HAOS Add-on: Modbus TCP / UDP → MQTT Discovery | ✅ v1.5.3 | -| **ShineLAN-X Firmware** | NuttX auf STM32F103: Modbus RTU ↔ TCP | ✅ Produktiv | +| **ShineBridge Add-on** | HAOS Add-on: Modbus TCP / UDP → MQTT Discovery | ✅ v1.8.18 | +| **ShineLAN-X Firmware** | NuttX auf STM32F103: Modbus RTU ↔ TCP + OTA | ✅ Produktiv | | **ShineWifi-X ESPHome** | ESPHome-Configs für ESP8266-Stick | ✅ Getestet | | **ShineDiag** | Portables Vor-Ort-Diagnose-Tool (Pi 3B) | ✅ Bereit | @@ -30,13 +30,15 @@ Wechselrichter / Energiezähler │ UDP/8899 (Goodwe) │ Modbus TCP Port 502 (Kathrein Wallbox) │ -[ShineBridge Add-on] +[ShineBridge Add-on] Port 8099 (HAOS Ingress) ├── Modbus TCP / Goodwe UDP / Kathrein Wallbox lesen ├── EMS-Controller: PV-Überschussladen + Zwangsladen ├── MQTT Discovery → Home Assistant Sensoren ├── Aggregat-Gerät „ShineBridge Gesamt" ├── Persistente History (SQLite, 7 Tage) - └── Web UI: Geräte verwalten, Live-Daten, Sparklines, EMS-Konfig + ├── Energie-Dashboard (SVG-Flussdiagramm, EPEX Spot) + ├── Finanzen-Tab (Abschlags-Tracker, Eigenversorgung) + └── Web UI: Live-Daten, Geräte, Einstellungen, Flash-Wizard ``` ### Features @@ -45,9 +47,16 @@ Wechselrichter / Energiezähler - **MQTT Discovery** — Sensoren erscheinen automatisch in HA - **Aggregat-Gerät** — summiert alle Geräte für das HA Energie-Dashboard - **Persistente History** — Messwerte überleben Add-on-Neustarts (SQLite, 7 Tage) +- **Energie-Dashboard** — HA-Style SVG-Flussdiagramm mit animierten Dots; EPEX-Spot-Chart +- **Finanzen-Tab** — kWh-Kosten, Eigenversorgung, Abschlags-Tracker (monatliche Rate + Grundpreis) +- **Flexibler Tarif** — Festpreis oder EPEX Spot (aWATTar DE/AT) mit Aufschlag - **Sparklines** — Live-Graphen der letzten 5 Minuten pro Sensor - **EMS-Controller** — PV-Überschussladen der Kathrein Wallbox, Zwangsladen-Fallback +- **Setup-Wizard** — Geführte Ersteinrichtung (MQTT + erster Wechselrichter) +- **Flash-Wizard** — ShineLAN-X Firmware direkt aus dem Add-on flashen (OTA oder ST-Link-Anleitung) +- **Überschuss-Geräte** — Zigbee2MQTT-Geräte bei PV-Überschuss automatisch einschalten - **Konfig-Export/Import** — JSON im Einstellungen-Tab +- **Port-Sicherheit** — `/api/*` nur über HAOS-Ingress erreichbar, kein Direktzugriff von außen - **Kein Cloud-Zwang** — vollständig lokal ### Unterstützte Geräte @@ -82,37 +91,37 @@ Konfigurierbar pro Gerät im Web UI: ### Netzleistung (grid_power) -Der Sensor `grid_power` (Goodwe) zeigt die Netzleistung intuitiv: +Der Sensor `grid_power` zeigt die Netzleistung intuitiv: - **Positiv** = Netzbezug (Strom vom Netz) - **Negativ** = Einspeisung (Strom ins Netz) -Bei reinen Growatt-Anlagen (ohne Goodwe) wird `power_to_grid` als Proxy verwendet (nur Einspeisung bekannt). +Bei reinen Growatt-Anlagen (ohne Goodwe) wird `power_to_grid` als Proxy verwendet. ### Installation -**Schritt 1 — NuttX auf den ShineLAN-X flashen** *(einmalig, ST-Link nötig)* - -```bash -# dapboot Bootloader -st-flash write ShineLAN-X/releases/dapboot.bin 0x08000000 - -# NuttX Firmware -st-flash write ShineLAN-X/releases/nuttx-mbusd-shinelanx-dfu.bin 0x08002000 -``` - -SWD-Pinbelegung: `PA13=SWDIO PA14=SWCLK GND 3.3V` - -**Schritt 2 — Add-on in Home Assistant installieren** +**Schritt 1 — Add-on in Home Assistant installieren** 1. **Einstellungen → Add-ons → Add-on-Store → ⋮ → Repositories** 2. URL: `https://gitea.bitfire.work/retr0/shinebridge` 3. „ShineBridge" → Installieren → Starten -4. MQTT-Zugangsdaten in der Add-on-Konfiguration eintragen -5. Web UI öffnen → Gerät hinzufügen + +**Schritt 2 — ShineLAN-X flashen** + +Beim ersten Start erscheint der **Setup-Wizard** automatisch. Der Tab **Flash** im Web UI führt durch beide Szenarien: + +- **OTA-Modus** (Stick bereits geflasht): IP eingeben → Firmware auswählen → Flashen. Die aktuelle Firmware ist im Add-on integriert. +- **Erstflash via ST-Link** (Stick noch ungeflasht): Schritt-für-Schritt-Anleitung mit Pinout und `st-flash`-Befehl. + +Für den manuellen Erstflash: +```bash +# SWD-Pinbelegung: PA13=SWDIO PA14=SWCLK GND 3.3V + +st-flash --reset write nuttx-mbusd-shinelanx.bin 0x08000000 +``` **Schritt 3 — Gerät konfigurieren** -Im Web UI → „+ Gerät hinzufügen": +Im Web UI → „+ Gerät hinzufügen" (oder Setup-Wizard beim ersten Start): - Name, Modell, IP, Port, Modbus-Adresse, MQTT Topic-Präfix, Abfrageintervall - Bei Kathrein Wallbox: EMS-Parameter konfigurieren @@ -142,25 +151,42 @@ Gibt alle Messpunkte des gewählten Zeitfensters zurück (max. 7 Tage). ## ShineLAN-X Firmware -Der **Growatt ShineLAN-X** ist ein LAN-Monitoring-Stick (STM32F103RC + ENC28J60) der im USB-Port des Wechselrichters steckt. Die Custom-Firmware (NuttX + mbusd) macht ihn zum Modbus TCP Gateway. +Der **Growatt ShineLAN-X** ist ein LAN-Monitoring-Stick (STM32F103RC + ENC28J60) der im USB-Port des Wechselrichters steckt. Die Custom-Firmware (NuttX + mbusd) macht ihn zum Modbus TCP Gateway mit OTA-Update-Funktion. -> **Firmware von [mwalle (Martin Walle)](https://github.com/mwalle/shinelanx-modbus)** -> Das Binary `nuttx-mbusd-shinelanx-dfu.bin` ist das Werk von Martin Walle und wird hier unverändert weitergegeben. +> **Firmware basiert auf [mwalle (Martin Walle)](https://github.com/mwalle/shinelanx-modbus)** > Lizenzen: Board-Support Apache 2.0 · mbusd BSD 3-Clause · Gateway-App BSD 2-Clause. -> Quellcode und Kompilieranleitung: [github.com/mwalle/shinelanx-modbus](https://github.com/mwalle/shinelanx-modbus) +> Quellcode: [github.com/mwalle/shinelanx-modbus](https://github.com/mwalle/shinelanx-modbus) ### Flash-Layout ``` -0x08000000 dapboot (7 KB) ← Bootloader für USB DFU OTA -0x08002000 NuttX (93 KB) ← Modbus RTU ↔ TCP, Port 502 +0x08000000 dapboot (8 KB) ← Bootloader, nicht überschrieben +0x08002000 NuttX (93 KB) ← Modbus RTU ↔ TCP, Port 502 + OTA HTTP, Port 80 + ↕ +0x08020000 Staging (≤124 KB) ← OTA: Neue Firmware temporär hier ``` +### OTA-Update + +Ab der DFU-Variante (`nuttx-mbusd-shinelanx-dfu.bin`) ist OTA ohne ST-Link möglich. Der Stick hostet einen HTTP-Server auf Port 80: + +| Endpunkt | Beschreibung | +|---|---| +| `GET /` | Status-JSON: `{"ota":true,"app_base":"0x08002000",...}` | +| `POST /update` | Firmware-Binary empfangen, in Staging schreiben, anwenden, Reset | +| `POST /reboot` | Software-Reset | + +Der OTA-Prozess läuft zweistufig (Single-Bank STM32 Einschränkung): +1. **Stage 1** — Firmware in die obere Flash-Hälfte (Staging) schreiben, TCP-Stack läuft noch +2. **Stage 2** — Aus SRAM heraus: Staging → App-Bereich kopieren, Reset + +Das Add-on steuert OTA über den **Flash-Tab** im Web UI. + ### Hardware | Komponente | Details | |---|---| -| MCU | STM32F103RC — 256 kB Flash, 64 kB RAM | +| MCU | STM32F103RC — 256 kB Flash, 48 kB SRAM | | Ethernet | ENC28J60 (SPI2) | | USB | PA11=D−, PA12=D+, PA8=Pullup | | SWD | PA13=SWDIO, PA14=SWCLK | @@ -224,8 +250,11 @@ shinebridge/ ├── haos-addon/ ← HAOS Add-on │ ├── config.yaml │ ├── Dockerfile +│ ├── firmware/ # Integrierte ShineLAN-X Binaries +│ │ ├── nuttx-mbusd-shinelanx.bin # Direktflash (0x08000000) +│ │ └── nuttx-mbusd-shinelanx-dfu.bin # OTA-fähig (0x08002000) │ └── src/ -│ ├── main.py # Flask, Poll-Threads, REST API, Aggregation +│ ├── main.py # Flask, Poll-Threads, REST API, Flash-Proxy │ ├── modbus_client.py # Modbus TCP, Float32-Dekodierung │ ├── goodwe_client.py # Goodwe UDP/8899 via goodwe-Bibliothek │ ├── wallbox_client.py # Kathrein Wallbox Modbus TCP @@ -233,11 +262,16 @@ shinebridge/ │ ├── mqtt_publisher.py # MQTT Discovery + Aggregat │ ├── inverters.py # Register-Maps aller Geräte │ ├── history.py # SQLite Persistenz -│ └── web/index.html # Web UI +│ └── web/index.html # Web UI (Energie, Finanzen, Live, Geräte, Flash) ├── ShineLAN-X/ │ └── releases/ -│ ├── dapboot.bin +│ ├── nuttx-mbusd-shinelanx.bin │ └── nuttx-mbusd-shinelanx-dfu.bin +├── shinelanx-modbus/ ← NuttX Firmware Quellcode +│ └── apps/shinelanx-modbus-gw/ +│ ├── main.c # Startup: MAC, DHCP, OTA-Thread, mbusd +│ ├── ota_http.c # OTA HTTP-Server (Zwei-Phasen Flash) +│ └── ota_http.h ├── ShineWifi-X/ ← ESPHome Configs ├── tools/ │ └── shinediag/ ← Vor-Ort-Diagnose-Tool