# LED-signalering: stabiele verbinding **Issue:** [#4](https://git.eddydevink.nl/eddy/Project_SylDa/issues/4) — Leds mogen uit na een minuut stabiele verbinding **Datum:** 2026-08-02 **Status:** goedgekeurd ## Doel Uniforme LED-signalering voor zowel server als client. De LED dient als debug-indicator tijdens opstarten en bij verbindingsproblemen. Na 60 seconden continue stabiele verbinding schakelt de LED uit. ## Kleurenschema Identiek voor server (`main.cpp`) en client (`client.cpp`): | State | LED | Prioriteit | |-------|-----|-----------| | OTA in progress | Groen knipperend (100ms interval) | 1 (hoogst) | | OTA completed, waiting confirm | Geel vast | 1 | | Geen verbinding | Rood | 2 | | Verbinding actief (< 60s) | Geel | 3 | | Verbinding stabiel (>= 60s) | **Uit** | 4 (laagst) | | Relais-flash (overlay) | Groen 150ms | overlay | Relais-flash is een overlay: toont kort groen bij verandering in relais-status, daarna keert LED terug naar de kleur die hoort bij de huidige verbindingsstatus. ## Timer-logica - Timer (`connectionStableMs`) start zodra de **eerste** verbinding tot stand komt - `connectionStableMs` telt op zolang er minstens 1 verbinding is (connectedCount > 0 voor server, connected == true voor client) - Nieuwe verbindingen die later bijkomen resetten de timer **niet** - Bij disconnect van een verbinding terwijl er nog andere verbindingen zijn: timer loopt door - Pas als **alle** verbindingen wegvallen: `connectionStableMs` = 0, LED direct rood - Drempel: `STABLE_LED_TIMEOUT_MS = 60000` ### Server-specifiek - `connectedCount`: aantal actieve BLE-clients (0-2) - Timer loopt als `connectedCount > 0` - Alle clients disconnect = reset ### Client-specifiek - `connected`: boolean, of client verbonden is met server - Timer loopt als `connected == true` - Disconnect = reset ## Relais-flash mechanisme - Detectie: vergelijk huidige relais-state met vorige loop-iteratie - Bij verandering: zet `relayFlashUntil = millis() + 150` - Zolang `millis() < relayFlashUntil`: LED groen (overschrijft verbindingskleur) - Flash reset de 60s timer **niet** - **Server:** detecteert verandering in `relay1State || relay2State` (combinatie van touch, button, en BLE-commands) - **Client:** detecteert verandering in `relay1State || relay2State` (alleen touch/button) ## OTA (beide firmwares) OTA heeft hoogste prioriteit en override alle andere LED-states: - **OTA in progress** (`otaInProgress == true`): groen knipperend, 100ms interval - **OTA completed, waiting confirm** (`otaEnded == true && !otaConfirmed`): geel vast - **OTA confirm timeout** of **OTA error**: valt terug naar normale verbindings-LED - **OTA success + reboot**: groen vast, dan reboot Client heeft OTA-logica nog niet geïmplementeerd, maar de LED-code wordt alvast voorbereid met dezelfde OTA-override structuur zodat toekomstige OTA-implementatie direct past. ## LED-update volgorde in loop() ``` 1. Bepaal base-kleur op basis van verbindingsstatus (rood/geel/uit) 2. Controleer relais-flash: als actief -> groen 3. Controleer OTA-override: als actief -> OTA-kleur 4. FastLED.show() ``` ## Wijzigingen per bestand ### `src/main.cpp` (server) - Toevoegen: `STABLE_LED_TIMEOUT_MS`, `connectionStableMs`, `relayFlashUntil`, `lastRelayActive` - Aanpassen: LED-logica in `loop()` — base-kleur uit `connectionStableMs` i.p.v. `connectedCount > 0` - Toevoegen: relais-flash detectie - Behouden: OTA LED-override (werkt al, prioriteit blijft hoogst) - Verwijderen: setup LED-blinks (drie groene knipperingen) — vervangen door rood (geen verbinding) ### `src/client.cpp` (client) - Toevoegen: `STABLE_LED_TIMEOUT_MS`, `connectionStableMs`, `relayFlashUntil`, `lastRelayActive` - Aanpassen: LED-logica in `loop()` — base-kleur uit `connectionStableMs`, geen aparte relais-kleur meer - Toevoegen: relais-flash detectie - Toevoegen: OTA-override structuur (placeholder, `otaInProgress` default `false`) - Setup: LED rood i.p.v. direct rood (blijft rood, maar nu als onderdeel van uniform schema) ### `src/version.h` - Server versie bump naar "16" - Client versie bump naar "2"