Zum Inhalt

ESP32 E-Paper Provisioning - Workflow Visualisierung

πŸ”„ Kompletter Setup-Workflow

β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
β”‚ PHASE 1: UNBOXING & ERSTKONTAKT                                    β”‚
β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜

πŸ“¦ Benutzer erhΓ€lt ESP32 E-Paper Display
    β”‚
    β”œβ”€> Strom anschließen (USB oder 5V Netzteil)
    β”‚
    └─> ESP32 bootet zum ersten Mal
         β”‚
         β”œβ”€> Keine WLAN-Konfiguration gefunden
         β”‚
         └─> ⚑ Startet automatisch im SETUP-MODUS



β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
β”‚ PHASE 2: SETUP-MODUS (Access Point)                                β”‚
β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜

ESP32 erstellt eigenes WLAN:

    πŸ“‘ SSID: "SolarLog-Setup-A1B2"
    πŸ”“ Offen (kein Passwort)

    β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
    β”‚  E-Paper Display zeigt:       β”‚
    β”‚                                β”‚
    β”‚  β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” β”‚
    β”‚  β”‚  πŸ”§ SETUP-MODUS          β”‚ β”‚
    β”‚  β”‚                          β”‚ β”‚
    β”‚  β”‚  πŸ“± Verbinden mit:       β”‚ β”‚
    β”‚  β”‚     SolarLog-Setup-A1B2  β”‚ β”‚
    β”‚  β”‚                          β”‚ β”‚
    β”‚  β”‚  🌐 Browser ΓΆffnet       β”‚ β”‚
    β”‚  β”‚     automatisch          β”‚ β”‚
    β”‚  β”‚                          β”‚ β”‚
    β”‚  β”‚  [●●●●○○○] Schritt 1/5  β”‚ β”‚
    β”‚  β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ β”‚
    β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜



β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
β”‚ PHASE 3: CAPTIVE PORTAL (Automatische Browser-Umleitung)           β”‚
β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜

Benutzer:
    β”‚
    β”œβ”€> Γ–ffnet WLAN-Einstellungen auf Laptop/Smartphone
    β”‚
    β”œβ”€> WΓ€hlt "SolarLog-Setup-A1B2"
    β”‚
    └─> Verbindung wird hergestellt
         β”‚
         └─> ✨ Browser ΓΆffnet AUTOMATISCH

              β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
              β”‚  http://192.168.4.1                 β”‚
              β”œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€
              β”‚  πŸ”Œ SolarLog ESP32 Setup            β”‚
              β”‚                                      β”‚
              β”‚  Willkommen! In 4 Schritten         β”‚
              β”‚  richten wir dein GerΓ€t ein.        β”‚
              β”‚                                      β”‚
              β”‚  [Los geht's β†’]                     β”‚
              β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜



β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
β”‚ PHASE 4: SCHRITT-FÜR-SCHRITT KONFIGURATION                         β”‚
β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜

┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┓
┃ SCHRITT 1: WLAN-VERBINDUNG                                      ┃
┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┛

Browser-Seite:
    β”‚
    β”œβ”€> [πŸ“‘ Netzwerke scannen] Button
    β”‚
    └─> ESP32 scannt verfΓΌgbare WLANs
         β”‚
         └─> Liste wird angezeigt:

             β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
             β”‚ VerfΓΌgbare Netzwerke:           β”‚
             β”‚                                  β”‚
             β”‚ β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”  β”‚
             β”‚ β”‚ πŸ“Ά PV-Anlage-WLAN  -65 dBm β”‚πŸ”’β”‚
             β”‚ β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜  β”‚
             β”‚ β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”  β”‚
             β”‚ β”‚ πŸ“Ά FritzBox 7590   -48 dBm β”‚πŸ”’β”‚
             β”‚ β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜  β”‚
             β”‚ β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”  β”‚
             β”‚ β”‚ πŸ“Ά Gast-WLAN       -72 dBm β”‚  β”‚
             β”‚ β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜  β”‚
             β”‚                                  β”‚
             β”‚ Oder manuell eingeben:          β”‚
             β”‚ SSID: [____________]            β”‚
             β”‚ Pass: [____________]            β”‚
             β”‚                                  β”‚
             β”‚ [Weiter β†’]                      β”‚
             β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜

Benutzer:
    β”œβ”€> Klickt auf "PV-Anlage-WLAN"
    β”œβ”€> Gibt Passwort ein
    └─> Klickt "Weiter"


┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┓
┃ SCHRITT 2: PORTAL-ANMELDUNG                                     ┃
┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┛

Browser-Seite:
             β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
             β”‚ Portal-Verbindung               β”‚
             β”‚                                  β”‚
             β”‚ Portal-URL:                     β”‚
             β”‚ [solarlog-api.karma.organic]    β”‚
             β”‚                                  β”‚
             β”‚ Deine Zugangsdaten:             β”‚
             β”‚ E-Mail: [___________________]   β”‚
             β”‚ Pass:   [___________________]   β”‚
             β”‚                                  β”‚
             β”‚ [Login & GerΓ€t registrieren]    β”‚
             β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜

Was passiert im Hintergrund:

    ESP32 β†’ Portal:
    β”‚
    β”œβ”€> POST /api/v1/auth/login
    β”‚   {email, password}
    β”‚
    β”œβ”€> βœ“ ErhΓ€lt: access_token
    β”‚
    └─> POST /api/v1/devices/register
        {mac_address: "A1:B2:C3:D4:E5:F6", 
         model: "ESP32-S3 E-Paper"}
        Authorization: Bearer <access_token>

        Portal β†’ ESP32:
        β”‚
        └─> βœ“ Generiert Device-Token
            {
              device_id: 42,
              device_token: "eyJhbGc...",
              mqtt_credentials: {...}
            }

    βœ… GerΓ€t ist jetzt im Portal registriert!


┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┓
┃ SCHRITT 3: INVERTER-ERKENNUNG                                   ┃
┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┛

Browser-Seite:
             β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
             β”‚ Inverter-Auswahl                β”‚
             β”‚                                  β”‚
             β”‚ [πŸ” Inverter scannen]           β”‚
             β”‚                                  β”‚
             β”‚ ⏳ Scanne Netzwerk...           β”‚
             β”‚    192.168.1.1 ... βœ—            β”‚
             β”‚    192.168.1.2 ... βœ—            β”‚
             β”‚    ...                           β”‚
             β”‚    192.168.1.50 ... βœ“ SMA!      β”‚
             β”‚    ...                           β”‚
             β”‚    192.168.1.100 ... βœ“ Kostal!  β”‚
             β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜

ESP32 Auto-Discovery:
    β”‚
    β”œβ”€> Scannt lokales Netzwerk (192.168.1.1-254)
    β”‚
    β”œβ”€> Testet jeden Host:
    β”‚   β”œβ”€> HTTP Port 80 (Webinterface?)
    β”‚   β”œβ”€> Modbus Port 502
    β”‚   └─> Herstellerspezifische Ports
    β”‚
    └─> Identifiziert Inverter-Typ via:
        β”œβ”€> HTTP Response Header
        β”œβ”€> Modbus Device ID
        └─> Hersteller-Fingerprinting

Ergebnis:
             β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
             β”‚ Gefundene Inverter:             β”‚
             β”‚                                  β”‚
             β”‚ β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”  β”‚
             β”‚ β”‚ ⚑ SMA Sunny Boy 3.0        β”‚  β”‚
             β”‚ β”‚    192.168.1.50            β”‚  β”‚
             β”‚ β”‚    4.2 kW aktuell          β”‚  β”‚
             β”‚ β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜  β”‚
             β”‚ β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”  β”‚
             β”‚ β”‚ ⚑ Kostal Plenticore 5.5   β”‚  β”‚
             β”‚ β”‚    192.168.1.100           β”‚  β”‚
             β”‚ β”‚    2.8 kW aktuell          β”‚  β”‚
             β”‚ β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜  β”‚
             β”‚                                  β”‚
             β”‚ Oder manuell:                   β”‚
             β”‚ Typ: [SMA β–Ό]                    β”‚
             β”‚ IP:  [____________]             β”‚
             β”‚                                  β”‚
             β”‚ [πŸ§ͺ Verbindung testen]          β”‚
             β”‚ [Weiter β†’]                      β”‚
             β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜


┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┓
┃ SCHRITT 4: FEINABSTIMMUNG                                       ┃
┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┛

Browser-Seite:
             β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
             β”‚ Einstellungen                   β”‚
             β”‚                                  β”‚
             β”‚ Display Update:                 β”‚
             β”‚ [ 30 Sekunden β–Ό]                β”‚
             β”‚                                  β”‚
             β”‚ API Daten-Upload:               β”‚
             β”‚ [ 60 Sekunden β–Ό]                β”‚
             β”‚                                  β”‚
             β”‚ Zeitzone:                       β”‚
             β”‚ [ Europe/Berlin β–Ό]              β”‚
             β”‚                                  β”‚
             β”‚ [βœ“ Speichern & Starten]         β”‚
             β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜

ESP32:
    β”‚
    β”œβ”€> Speichert komplette Konfiguration in Flash:
    β”‚   
    β”‚   {
    β”‚     "wifi": {
    β”‚       "ssid": "PV-Anlage-WLAN",
    β”‚       "password": "***********"
    β”‚     },
    β”‚     "portal": {
    β”‚       "url": "https://solarlog-api.karma.organic",
    β”‚       "device_id": 42,
    β”‚       "device_token": "eyJhbGc..."
    β”‚     },
    β”‚     "inverter": {
    β”‚       "type": "SMA",
    β”‚       "ip": "192.168.1.50",
    β”‚       "modbus_unit_id": 3
    β”‚     },
    β”‚     "intervals": {
    β”‚       "display_update": 30,
    β”‚       "api_upload": 60
    β”‚     },
    β”‚     "timezone": "Europe/Berlin"
    β”‚   }
    β”‚
    └─> βœ… Konfiguration gespeichert!


┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┓
┃ SCHRITT 5: FERTIGSTELLUNG                                       ┃
┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┛

Browser-Seite:
             β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
             β”‚ βœ… Setup abgeschlossen!         β”‚
             β”‚                                  β”‚
             β”‚ Dein ESP32 wurde erfolgreich    β”‚
             β”‚ konfiguriert.                   β”‚
             β”‚                                  β”‚
             β”‚ Das GerΓ€t startet in 3 Sek.     β”‚
             β”‚ neu und verbindet sich          β”‚
             β”‚ automatisch mit deinem WLAN.    β”‚
             β”‚                                  β”‚
             β”‚ NΓ€chste Schritte:               β”‚
             β”‚ 1. Laptop wieder mit normalem   β”‚
             β”‚    WLAN verbinden               β”‚
             β”‚ 2. Portal ΓΆffnen:               β”‚
             β”‚    solarlog.karma.organic       β”‚
             β”‚ 3. GerΓ€t sollte nach ~30 Sek    β”‚
             β”‚    online sein                  β”‚
             β”‚                                  β”‚
             β”‚ [Zum Portal β†’]                  β”‚
             β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜

ESP32:
    β”‚
    β”œβ”€> Countdown: 3... 2... 1...
    β”‚
    └─> πŸ”„ NEUSTART!



β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
β”‚ PHASE 5: NORMALBETRIEB                                             β”‚
β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜

ESP32 bootet neu:
    β”‚
    β”œβ”€> Liest Konfiguration aus Flash
    β”‚
    β”œβ”€> Verbindet mit "PV-Anlage-WLAN"
    β”‚   └─> βœ“ Verbunden! (IP: 192.168.1.201)
    β”‚
    β”œβ”€> Verbindet mit Portal
    β”‚   └─> POST /api/v1/devices/42/heartbeat
    β”‚       Authorization: Bearer <device_token>
    β”‚       └─> βœ“ Portal antwortet: "Welcome back!"
    β”‚
    β”œβ”€> Verbindet mit Inverter (192.168.1.50)
    β”‚   └─> Modbus Read: Register 30775 (AC Power)
    β”‚       └─> βœ“ 4237 W
    β”‚
    └─> Startet Haupt-Loop:

        β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
        β”‚  ENDLOS-SCHLEIFE                    β”‚
        β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜

        Jede 30 Sekunden:
        β”‚
        β”œβ”€> Inverter-Daten lesen
        β”‚   β”œβ”€> Current Power: 4237 W
        β”‚   β”œβ”€> Daily Energy: 28.5 kWh
        β”‚   └─> Total Energy: 12450 kWh
        β”‚
        β”œβ”€> E-Paper Display aktualisieren
        β”‚   
        β”‚   β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
        β”‚   β”‚  SMA Sunny Boy 3.0            β”‚
        β”‚   β”‚  192.168.1.50                 β”‚
        β”‚   β”‚                                β”‚
        β”‚   β”‚  ⚑ AKTUELL    4.2 kW         β”‚
        β”‚   β”‚  β˜€οΈ HEUTE     28.5 kWh        β”‚
        β”‚   β”‚  πŸ“Š GESAMT    12.45 MWh       β”‚
        β”‚   β”‚                                β”‚
        β”‚   β”‚  πŸ“‘ Online    ━━━━ 92%        β”‚
        β”‚   β”‚  πŸ• 18:32    23.10.2025       β”‚
        β”‚   β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜
        β”‚
        └─> Jede 60 Sekunden zusΓ€tzlich:
            β”‚
            └─> Daten an Portal senden
                β”‚
                └─> POST /api/v1/devices/42/data
                    {
                      "timestamp": "2025-10-23T18:32:15Z",
                      "current_power": 4237,
                      "daily_energy": 28.5,
                      "total_energy": 12450,
                      "dc_voltage": 385.2,
                      "dc_current": 11.4,
                      "ac_voltage": 234.8,
                      "ac_current": 18.0,
                      "temperature": 42.5,
                      "status": "producing"
                    }

                    Portal β†’ ESP32:
                    └─> βœ“ 200 OK {"stored": true}



β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
β”‚ PHASE 6: PORTAL-ANSICHT (Benutzer-Perspektive)                    β”‚
β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜

Benutzer ΓΆffnet Portal im Browser:

    https://solarlog.karma.organic

    β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
    β”‚  🏠 Dashboard                              admin@example.com β–Όβ”‚
    β”œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€
    β”‚                                                               β”‚
    β”‚  πŸ“Š Meine GerΓ€te                            [+ GerΓ€t hinzu]  β”‚
    β”‚                                                               β”‚
    β”‚  β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”   β”‚
    β”‚  β”‚  ESP32 E-Paper #42                    🟒 Online      β”‚   β”‚
    β”‚  β”‚  MAC: A1:B2:C3:D4:E5:F6                              β”‚   β”‚
    β”‚  β”‚  ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ β”‚   β”‚
    β”‚  β”‚                                                       β”‚   β”‚
    β”‚  β”‚  Inverter: SMA Sunny Boy 3.0 @ 192.168.1.50         β”‚   β”‚
    β”‚  β”‚                                                       β”‚   β”‚
    β”‚  β”‚  πŸ“Š Aktuelle Leistung:       4.2 kW                 β”‚   β”‚
    β”‚  β”‚  β˜€οΈ Heute produziert:       28.5 kWh                β”‚   β”‚
    β”‚  β”‚  πŸ“ˆ Gesamt produziert:    12.45 MWh                 β”‚   β”‚
    β”‚  β”‚                                                       β”‚   β”‚
    β”‚  β”‚  πŸ”‹ Status:                 Producing                β”‚   β”‚
    β”‚  β”‚  🌑️  Temperatur:            42.5Β°C                  β”‚   β”‚
    β”‚  β”‚  πŸ“‘ WLAN-SignalstΓ€rke:     -65 dBm (gut)            β”‚   β”‚
    β”‚  β”‚  ⏱️  Letzte Aktualisierung: vor 12 Sekunden         β”‚   β”‚
    β”‚  β”‚  ⏰ Online seit:            18:31:45 (42 Min)       β”‚   β”‚
    β”‚  β”‚                                                       β”‚   β”‚
    β”‚  β”‚  [πŸ“Š Details] [βš™οΈ Einstellungen] [πŸ”„ Neu starten]  β”‚   β”‚
    β”‚  β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜   β”‚
    β”‚                                                               β”‚
    β”‚  Klick auf [πŸ“Š Details]:                                    β”‚
    β”‚                                                               β”‚
    β”‚  β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”   β”‚
    β”‚  β”‚  πŸ“ˆ Produktions-Verlauf                              β”‚   β”‚
    β”‚  β”‚                                                       β”‚   β”‚
    β”‚  β”‚  [Heute] [Woche] [Monat] [Jahr]                     β”‚   β”‚
    β”‚  β”‚                                                       β”‚   β”‚
    β”‚  β”‚   30 kWh ─                                 ╭─────    β”‚   β”‚
    β”‚  β”‚          β”‚                             ╭───╯         β”‚   β”‚
    β”‚  β”‚   20 kWh β”‚                         ╭───╯             β”‚   β”‚
    β”‚  β”‚          β”‚                     ╭───╯                 β”‚   β”‚
    β”‚  β”‚   10 kWh β”‚                 ╭───╯                     β”‚   β”‚
    β”‚  β”‚          β”‚             ╭───╯                         β”‚   β”‚
    β”‚  β”‚    0 kWh └─────────────┴───────────────────────────  β”‚   β”‚
    β”‚  β”‚          06:00   09:00   12:00   15:00   18:00      β”‚   β”‚
    β”‚  β”‚                                                       β”‚   β”‚
    β”‚  β”‚  πŸ› Debug-Logs:                                      β”‚   β”‚
    β”‚  β”‚  18:32:15  [INFO]  Data uploaded successfully       β”‚   β”‚
    β”‚  β”‚  18:31:15  [INFO]  Data uploaded successfully       β”‚   β”‚
    β”‚  β”‚  18:30:15  [INFO]  Data uploaded successfully       β”‚   β”‚
    β”‚  β”‚  18:29:15  [WARN]  Inverter read timeout, retry...  β”‚   β”‚
    β”‚  β”‚  18:29:16  [INFO]  Inverter connected               β”‚   β”‚
    β”‚  β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜   β”‚
    β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜



β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
β”‚ FEHLERBEHANDLUNG & RECOVERY                                        β”‚
β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜

Szenario 1: WLAN-Verbindung fehlgeschlagen
    β”‚
    ESP32:
    β”‚
    β”œβ”€> Versuch 1: Verbinden... βœ— Timeout
    β”œβ”€> Versuch 2: Verbinden... βœ— Auth Failed
    β”œβ”€> Versuch 3: Verbinden... βœ— No Response
    β”‚
    └─> ⚠️ 3 Fehlversuche!
        β”‚
        └─> Automatischer Fallback:
            β”‚
            β”œβ”€> Startet wieder im AP-Modus
            β”‚   SSID: "SolarLog-Setup-A1B2"
            β”‚
            └─> E-Paper zeigt:
                β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
                β”‚  ⚠️ VERBINDUNGSFEHLER       β”‚
                β”‚                              β”‚
                β”‚  WLAN nicht erreichbar.     β”‚
                β”‚                              β”‚
                β”‚  Bitte neu konfigurieren:   β”‚
                β”‚  1. Mit ESP32 verbinden     β”‚
                β”‚  2. Setup-Seite ΓΆffnet sich β”‚
                β”‚                              β”‚
                β”‚  SSID: SolarLog-Setup-A1B2  β”‚
                β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜

Szenario 2: Portal nicht erreichbar
    β”‚
    ESP32:
    β”‚
    β”œβ”€> Inverter-Daten lesen: βœ“ OK
    β”œβ”€> Display aktualisieren: βœ“ OK
    β”œβ”€> Portal-Upload versuchen: βœ— Connection Refused
    β”‚
    └─> Fallback-Strategie:
        β”‚
        β”œβ”€> Daten lokal zwischenspeichern (Buffer fΓΌr 100 Datenpunkte)
        β”‚
        β”œβ”€> Weiter lokale Anzeige aktualisieren
        β”‚
        β”œβ”€> Exponential Backoff:
        β”‚   β”œβ”€> NΓ€chster Versuch in 1 Sekunde
        β”‚   β”œβ”€> NΓ€chster Versuch in 2 Sekunden
        β”‚   β”œβ”€> NΓ€chster Versuch in 4 Sekunden
        β”‚   └─> ... max. 60 Sekunden
        β”‚
        └─> Sobald Portal wieder erreichbar:
            β”‚
            └─> Alle gepufferten Daten nachholen
                (Bulk Upload)

Szenario 3: Inverter nicht erreichbar
    β”‚
    ESP32:
    β”‚
    β”œβ”€> Modbus Read: βœ— Timeout
    β”œβ”€> Retry 1: βœ— Timeout
    β”œβ”€> Retry 2: βœ— Connection Refused
    β”‚
    └─> E-Paper zeigt:
        β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
        β”‚  SMA Sunny Boy 3.0          β”‚
        β”‚  192.168.1.50               β”‚
        β”‚                              β”‚
        β”‚  ⚠️ INVERTER OFFLINE        β”‚
        β”‚                              β”‚
        β”‚  Letzte bekannte Daten:     β”‚
        β”‚  ⚑ AKTUELL    0.0 kW       β”‚
        β”‚  β˜€οΈ HEUTE     28.5 kWh      β”‚
        β”‚                              β”‚
        β”‚  πŸ”„ Versuche neu zu          β”‚
        β”‚     verbinden...             β”‚
        β”‚                              β”‚
        β”‚  πŸ• 18:35    23.10.2025     β”‚
        β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜

        Portal erhΓ€lt:
        POST /api/v1/devices/42/data
        {
          "current_power": 0,
          "status": "inverter_offline",
          "error": "Modbus read timeout after 3 retries"
        }



β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
β”‚ WARTUNG & UPDATES                                                   β”‚
β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜

Over-The-Air (OTA) Firmware Update:

    Portal-Admin:
    β”‚
    β”œβ”€> LΓ€dt neue Firmware-Version hoch (v1.2.0)
    β”‚
    └─> Markiert GerΓ€te fΓΌr Update:
        β”œβ”€> ESP32 #42
        β”œβ”€> ESP32 #43
        └─> ESP32 #44

    ESP32 #42:
    β”‚
    β”œβ”€> NΓ€chster Heartbeat:
    β”‚   POST /api/v1/devices/42/heartbeat
    β”‚   {firmware_version: "1.1.0"}
    β”‚
    β”‚   Portal β†’ ESP32:
    β”‚   {
    β”‚     "update_available": true,
    β”‚     "version": "1.2.0",
    β”‚     "url": "https://solarlog-api.karma.organic/firmware/v1.2.0.bin",
    β”‚     "checksum": "sha256:abc123..."
    β”‚   }
    β”‚
    β”œβ”€> E-Paper zeigt:
    β”‚   β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
    β”‚   β”‚  πŸ”„ UPDATE VERFÜGBAR        β”‚
    β”‚   β”‚                              β”‚
    β”‚   β”‚  v1.1.0 β†’ v1.2.0            β”‚
    β”‚   β”‚                              β”‚
    β”‚   β”‚  Download lΓ€uft...          β”‚
    β”‚   β”‚  [β–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–‘β–‘] 80%           β”‚
    β”‚   β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜
    β”‚
    β”œβ”€> Download Firmware
    β”œβ”€> Checksum verifizieren
    β”œβ”€> Flash schreiben
    └─> Neustart

        Nach Neustart:
        └─> POST /api/v1/devices/42/heartbeat
            {firmware_version: "1.2.0"}

            Portal β†’ ESP32:
            └─> "Update successful! βœ“"

Remote-Konfiguration:

    Portal-Benutzer Γ€ndert Einstellung:
    β”‚
    β”œβ”€> "API Upload Intervall: 60s β†’ 300s"
    β”‚
    └─> Speichern

        Portal:
        β”‚
        └─> NΓ€chster Heartbeat von ESP32:
            β”‚
            └─> Sendet neue Konfiguration:
                {
                  "config_updated": true,
                  "intervals": {
                    "api_upload": 300
                  }
                }

        ESP32:
        β”‚
        β”œβ”€> EmpfΓ€ngt neue Config
        β”œβ”€> Speichert in Flash
        β”œβ”€> Wendet sofort an
        └─> BestΓ€tigung:
            POST /api/v1/devices/42/config-ack
            {"applied": true}

πŸ“Š Statistiken & Performance

Typischer Datenfluss (pro Stunde)

ESP32 β†’ Inverter:    120 Requests  (alle 30s Display-Update)
ESP32 β†’ Portal:       60 Requests  (alle 60s API-Upload)
Portal β†’ ESP32:        1 Request   (Heartbeat-Response)

Datenvolumen:
β”œβ”€> Upstream (ESP32 β†’ Portal):   ~15 KB/Stunde  (~360 KB/Tag)
β”œβ”€> Downstream (Portal β†’ ESP32): ~2 KB/Stunde   (~48 KB/Tag)
└─> GESAMT:                      ~17 KB/Stunde  (~408 KB/Tag)

Pro GerΓ€t und Monat: ~12 MB
Bei 1000 GerΓ€ten:    ~12 GB/Monat

Stromverbrauch ESP32

Idle:                 ~80 mA  @ 5V = 0.4W
WiFi aktiv:          ~120 mA @ 5V = 0.6W
E-Paper Update:      ~150 mA @ 5V = 0.75W (2-3 Sekunden)
Durchschnitt:        ~100 mA @ 5V = 0.5W

Pro Tag:  0.5W Γ— 24h = 12 Wh = 0.012 kWh
Pro Jahr: 0.012 kWh Γ— 365 = 4.4 kWh
Kosten:   4.4 kWh Γ— 0.35 €/kWh = 1.54 € pro Jahr

ZuverlΓ€ssigkeit

MTBF (Mean Time Between Failures): >2 Jahre
VerfΓΌgbarkeit:                      99.9%
Max. Offline-Zeit:                  <5 Minuten (bei WLAN-Ausfall)
Recovery-Zeit:                      <30 Sekunden