Skip to content

Releases: zEhmsy/lightflow

LightFlow V2.5

26 Aug 08:58

Choose a tag to compare

v2.5.0 — Scoperta affidabile via mDNS + fallback

Questa release introduce una scansione dispositivi molto più robusta: prima tenta mDNS/Bonjour, poi cade su UDP JSON e infine su uno sweep HTTP /24 leggero e parallelo. Niente più dead-end su iOS con “no route to host”.


✨ Novità

  • Supporto mDNS/Bonjour (_ledctrl.tcp)

    • Rilevamento istanze tipo led-XXXXXX.local con risoluzione SRV + A.
    • Richiede le chiavi iOS in Info.plist (vedi sotto).
  • Discovery “a strati” (triangolazione)

    1. mDNS/Bonjour
    2. UDP JSON su 49999 (broadcast/multicast)
    3. Sweep HTTP /state sull’intera /24 con limite di concorrenza
  • Conferma reachability: ogni device trovato viene verificato con GET /state e ordinato con i raggiungibili in alto.


🔧 Modifiche tecniche

  • Nuovo DiscoveryService.discover({int listenMs = 900})

    • _discoverMdnsBonjour(timeout: 2500ms)
    • _discoverUdpJson(timeout: listenMs)
    • _discoverHttpSweep(timeoutPerHostMs: 350, concurrency: 16 su iOS / 32 altrove)
  • Fix mDNS: rimosso l’await da MDnsClient.stop() (alcune versioni restituiscono void) e cancellate le subscription prima di chiudere il client.

  • Cleanup socket UDP: cancellazione StreamSubscription prima di close() per evitare warning/leak.

  • Nuova dipendenza: multicast_dns.


🧱 Firmware Arduino (compagno)

  • Aggiunto mDNS con istanza led-XXXXXX e servizi:

    • _ledctrl._tcp (porta 80)
    • _http._tcp (porta 80)
  • Discovery UDP invariato su 49999 con risposta JSON compatibile (t/id/name/ip/port/api/apiv/strips).


📱 Setup piattaforme

iOS (obbligatorio per mDNS)

Aggiungere a Info.plist:

<key>NSLocalNetworkUsageDescription</key>
<string>La rete locale è necessaria per cercare e controllare i dispositivi LED.</string>
<key>NSBonjourServices</key>
<array>
  <string>_ledctrl._tcp</string>
  <string>_http._tcp</string>
</array>

Nota: non servono entitlement speciali se si resta su Bonjour (224.0.0.251:5353). Il multicast “generico” può essere filtrato da iOS.

Android (consigliato)

Su alcune ROM vecchie aiuta:

<uses-permission android:name="android.permission.CHANGE_WIFI_MULTICAST_STATE" />

🧩 Migrazione

  • DiscoveryPage può continuare a chiamare:

    final devices = await DiscoveryService().discover(listenMs: 900);
  • Nessuna breaking change su LedApi o DeviceInfo.


🐛 Bugfix

  • Risolto errore di compilazione: “This expression has type 'void' and can't be used” causato da await client.stop() (mDNS).
  • Ridotte eccezioni su iOS tipo SocketException errno=65 grazie al percorso mDNS “nativo” e allo sweep HTTP come fallback finale.

📦 Dipendenze

Aggiungi a pubspec.yaml:

dependencies:
  multicast_dns: ^0.3.0

✅ Checklist upgrade

  • Aggiorna firmware Arduino con mDNS attivo (_ledctrl._tcp, _http._tcp)
  • flutter pub add multicast_dns
  • iOS: aggiungi NSLocalNetworkUsageDescription e NSBonjourServices
  • (Opzionale) Android: CHANGE_WIFI_MULTICAST_STATE
  • Ricompila ed esegui la nuova Scansione dispositivi

Grazie a questa release la scoperta su iOS diventa affidabile e veloce, con fallback automatici in caso di reti “difficili”.

LightFlow V2

22 Aug 11:21

Choose a tag to compare

LightFlow v2.0.0 — Auto-discovery & Live Apply

Release che introduce rilevamento automatico dei controller in LAN e salvataggio in tempo reale delle modifiche (con debounce), più vari affinamenti dell’interfaccia.

✨ Novità

  • Auto-discovery LAN (UDP)

    • Broadcast LEDCTRL_DISCOVER_V1 su 255.255.255.255:49999 (+ tentativo multicast).
    • Raccolta risposte JSON, verifica via GET /state, elenco dispositivi trovati.
    • Cache id → ip per riconnessioni rapide.
  • Live Apply (auto-salvataggio)

    • Ogni cambio (LED, Bright, Velocità, Colore, Modalità) invia /set automaticamente con debounce (~350 ms).
    • Niente spam: gli input rapidi sono coalesciti in una singola chiamata.
  • Toggle Animazione/Statica

    • Nuovo interruttore per striscia: invia mode=anim|solid.
    • Velocità allineata al firmware: 1..50 ms (1 = più veloce).
  • UI

    • Carosello colori più grande e leggibile.
    • Card comprimibili, rename persistente, griglia “masonry” a altezza variabile.

🧩 Compatibilità API

  • GET /set ora usa mode=anim|solid.
  • s clampato 1..50.
  • Lettura m[] da /state per riflettere la modalità corrente.

🐛 Fix

  • Crash iOS dovuto a pacchetto non device (Runner.debug.dylib) → packaging “pulito” per AltStore.
  • Overflow layout nelle card su schermi piccoli.
  • Duplicato apply() nella VM.
  • Icone + splash personalizzate, Info.plist ATS in debug.

📦 Asset

  • LightFlow.ipa (non firmato, per AltStore)
  • (Facoltativo) mock_server.zip (Flask)

🚀 Come installare (AltStore)

  1. Elimina eventuale versione precedente sul telefono.
  2. Copia LightFlow.ipa su iPhone → AltStore → My Apps → + → seleziona IPA → Apple ID.
  3. Per reti diverse: aggiorna IP nella pagina “Connetti” o usa Scansione automatica (LAN).

✅ Verifica rapida

  • Scansione trova i device e GET /state risponde.
  • Slider Velocità mostra 1..50 ms e si applica subito.
  • Toggle Animazione/Statica cambia la modalità (controlla /state.m[]).
  • Il carosello colori è più grande e reattivo.

🔎 Problemi noti

  • Reti che bloccano broadcast/multicast: usare IP manuale.
  • AltStore con Apple ID free richiede Refresh ogni 7 giorni.

V 1.0.0

22 Aug 08:21

Choose a tag to compare

Ecco un testo pronto (Markdown) per la release v1.0.0 – LightFlow da incollare su GitHub.


LightFlow v1.0.0

Controller mobile per 8 strisce LED compatibile con firmware tipo FastLED.
Inserisci l’IP del microcontrollore e controlla LED, luminosità, velocità e colore per ogni striscia. UI moderna, card comprimibili ed espandibili, carosello colori compatto, salvataggio nomi strisce.

✨ Novità principali

  • UI modulare con card per striscia:

    • vista compatta (nome + dot colore + preview luminosa),
    • vista espansa con stepper LED, slider Bright/Velocità, HEX e color picker.
  • Carosello colori con elemento centrale enfatizzato.

  • Rinomina striscia con persistenza (SharedPreferences).

  • Griglia “masonry” a altezza variabile (no più overflow).

  • Icone app (Android/iOS) e splash screen personalizzati.

  • Mock server Flask per test locale (/state, /set, /sync).

🚦 Requisiti

  • Flutter 3.x
  • Android: SDK 21+ (Android 5.0+), NDK 27.0.12077973 (per plugin shared_preferences_android)
  • iOS: iOS 12.0+
  • Rete: HTTP in chiaro abilitato in debug (Android usesCleartextTraffic=true, iOS ATS aperto)

🔌 Endpoints attesi (firmware)

  • GET /state{ used:[...], b:[...], s:[...], c:["RRGGBB", ...] }
  • GET /set?which=&n=&b=&s=&c=
  • GET /sync

🧪 Test rapido (Mock server)

  1. cd mock_server && python3 -m venv .venv && source .venv/bin/activate

  2. pip install flask && python server.py

  3. In app:

    • Android Emulatorhttp://10.0.2.2:5000
    • iOS Simulatorhttp://127.0.0.1:5000

📲 Installazione su dispositivi

Android (debug):

flutter run -d <android_device>

iOS (AltStore, senza account dev a pagamento):

  1. flutter build ios --release

  2. Crea IPA non firmato:

    cd build/ios/iphoneos
    mkdir -p Payload && cp -R Runner.app Payload/
    ditto -ck --sequesterRsrc --keepParent Payload LightFlow.ipa
  3. Invia LightFlow.ipa a iPhone → AltStore → My Apps+ → seleziona IPA.

Per iOS Simulator: flutter run -d iOS.

🧱 Asset della release (allega qui su GitHub)

  • LightFlow.ipa (non firmato, per AltStore)
  • mock_server.zip (opzionale: cartella mock_server compressa)
  • Facoltativi: screenshot, icone (assets/icon/*.png)

✅ Verifica

  • L’app si avvia con splash LightFlow.
  • La pagina Connetti accetta IP/porta e salva l’ultimo indirizzo.
  • Le card si espandono/collassano e non “sbordano”.
  • Rename strisce persistente dopo ✔︎ o chiusura tastiera.
  • /set applica la modifica alla striscia corrente; /sync invia sync globale.

🧭 Config di build (promemoria)

  • Android: android/app/build.gradle.kts

    android { ndkVersion = "27.0.12077973" }
  • iOS: Info.plist con ATS aperto in debug:

    <key>NSAppTransportSecurity</key>
    <dict><key>NSAllowsArbitraryLoads</key><true/></dict>

🐞 Problemi noti

  • AltStore (account free): durata firma 7 giorni (usare Refresh).
  • mDNS (esp32.local) può non risolversi in emulatore: usare IP LAN.

🔄 Changelog

  • feat: UI card minimal + espansione, carosello colori
  • feat: rename con persistenza
  • feat: icone app + splash personalizzati
  • feat: mock server Flask
  • fix: overflow griglia con masonry
  • chore: NDK 27, ATS/cleartext per debug

Grazie per provare LightFlow!
Segnalazioni e idee → apri una Issue o una Discussion.