From 87d33b41c76e8f16a8e98b64048328a12c747863 Mon Sep 17 00:00:00 2001 From: Gilles Soulier Date: Sat, 23 May 2026 20:34:46 +0200 Subject: [PATCH] =?UTF-8?q?feat:=20gestion=20WiFi=20=E2=80=94=20NVS=20cred?= =?UTF-8?q?entials=20+=20scan=20+=20UI=20Gruvbox?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - network.h/.cpp : lecture credentials NVS (Preferences) au boot, fallback config.h si vide ; network_get_ssid() et network_save_credentials() exposés - web_server.cpp : 3 nouvelles routes REST GET /api/wifi/current → SSID/IP/RSSI/modeAP GET /api/wifi/networks → scan async + polling état POST /api/wifi/connect → sauvegarde NVS + ESP.restart() - index.html : modal WiFi (réseau actuel, liste scannée avec barres signal ▁▂▃▄▅ + cadenas, formulaire SSID/mdp, bouton œil, message redémarrage avec lien esp_jardin.local) design Gruvbox Seventies cohérent avec le reste Co-Authored-By: Claude Sonnet 4.6 --- data/index.html | 346 +++++++++++++++++++++++++++++++++++++++++++++ include/network.h | 6 + src/network.cpp | 38 ++++- src/web_server.cpp | 75 ++++++++++ 4 files changed, 463 insertions(+), 2 deletions(-) diff --git a/data/index.html b/data/index.html index 0552923..f51f45a 100644 --- a/data/index.html +++ b/data/index.html @@ -237,6 +237,99 @@ input.fi:focus{border-color:var(--accent)} :root[data-theme="dark"] *::-webkit-scrollbar{width:6px;height:6px} :root[data-theme="dark"] *::-webkit-scrollbar-track{background:var(--bg-2)} :root[data-theme="dark"] *::-webkit-scrollbar-thumb{background:var(--bg-4);border-radius:3px} +/* ── Modal WiFi ── */ +.wifi-modal-backdrop{ + display:none;position:fixed;inset:0; + background:rgba(0,0,0,.7);z-index:200; + align-items:flex-start;justify-content:center; + padding-top:60px;overflow-y:auto; +} +.wifi-modal-backdrop.open{display:flex} +.wifi-modal{ + background:var(--bg-2);border:1px solid var(--border-2); + border-radius:12px;padding:24px;width:min(96vw,480px); + box-shadow:0 8px 40px rgba(0,0,0,.6); + display:flex;flex-direction:column;gap:18px; + margin-bottom:60px; +} +.wifi-modal-header{ + display:flex;justify-content:space-between;align-items:center; +} +.wifi-modal-titre{font-size:15px;font-weight:700;color:var(--ink-1);letter-spacing:.04em} +/* Bloc réseau actuel */ +.wifi-current{ + background:var(--bg-3);border-radius:10px;border:1px solid var(--border-1); + padding:14px 16px;display:flex;flex-direction:column;gap:6px; +} +.wifi-current-titre{ + font-size:11px;font-weight:600;text-transform:uppercase; + letter-spacing:.08em;color:var(--ink-3);margin-bottom:4px; +} +.wifi-current-row{display:flex;justify-content:space-between;align-items:center;gap:8px;} +.wifi-current-label{font-size:12px;color:var(--ink-3);font-family:var(--font-ui);} +.wifi-current-val{font-family:var(--font-mono);font-size:13px;color:var(--ink-1);} +/* Liste réseaux */ +.wifi-scan-header{display:flex;align-items:center;justify-content:space-between;gap:8px} +.wifi-scan-titre{font-size:11px;font-weight:600;text-transform:uppercase;letter-spacing:.08em;color:var(--ink-3)} +.wifi-networks-list{ + display:flex;flex-direction:column;gap:4px; + max-height:220px;overflow-y:auto; + background:var(--bg-3);border-radius:10px;border:1px solid var(--border-1); + padding:6px; +} +.wifi-net-item{ + display:flex;align-items:center;gap:10px; + padding:8px 10px;border-radius:8px;cursor:pointer; + transition:background .15s;border:1px solid transparent; +} +.wifi-net-item:hover{background:var(--bg-4);border-color:var(--border-2)} +.wifi-net-ssid{flex:1;font-size:13px;color:var(--ink-1);font-family:var(--font-ui);white-space:nowrap;overflow:hidden;text-overflow:ellipsis} +.wifi-net-signal{font-family:var(--font-terminal);font-size:14px;color:var(--blue);letter-spacing:-.05em;flex-shrink:0} +.wifi-net-lock{font-size:12px;color:var(--ink-3);flex-shrink:0} +.wifi-scan-msg{ + font-size:12px;color:var(--ink-3);font-family:var(--font-terminal); + padding:12px;text-align:center; +} +/* Formulaire connexion */ +.wifi-form-titre{font-size:11px;font-weight:600;text-transform:uppercase;letter-spacing:.08em;color:var(--ink-3)} +.wifi-form{display:flex;flex-direction:column;gap:10px} +.wifi-field{display:flex;flex-direction:column;gap:4px} +.wifi-label{font-size:11px;color:var(--ink-3);letter-spacing:.04em} +.wifi-input{ + background:var(--bg-3);border:1px solid var(--border-2);border-radius:8px; + color:var(--ink-1);font-family:var(--font-mono);font-size:13px; + padding:8px 12px;outline:none;width:100%; + transition:border-color .15s; +} +.wifi-input:focus{border-color:var(--accent)} +.wifi-pass-wrap{position:relative;display:flex;align-items:center} +.wifi-pass-wrap .wifi-input{padding-right:38px} +.wifi-pass-toggle{ + position:absolute;right:8px;background:none;border:none; + cursor:pointer;color:var(--ink-3);font-size:16px;padding:2px; + line-height:1;transition:color .15s; +} +.wifi-pass-toggle:hover{color:var(--ink-1)} +.btn-wifi-save{ + background:var(--accent);color:#1a1a1a;font-weight:700; + border:none;border-radius:9px;padding:10px 18px; + cursor:pointer;font-size:13px;font-family:var(--font-ui); + letter-spacing:.04em;transition:background .15s;margin-top:4px; +} +.btn-wifi-save:hover{background:var(--accent-soft);color:#fff} +.btn-wifi-save:disabled{background:var(--bg-4);color:var(--ink-4);cursor:not-allowed} +.wifi-feedback{ + font-size:12px;font-family:var(--font-terminal);min-height:18px; + text-align:center;color:var(--ok); +} +.btn-scan{ + background:var(--bg-4);border:1px solid var(--border-2); + color:var(--ink-2);cursor:pointer;border-radius:7px; + padding:5px 12px;font-size:12px;font-family:var(--font-ui); + transition:background .15s,color .15s; +} +.btn-scan:hover{background:var(--bg-3);color:var(--ink-1)} +.btn-scan:disabled{cursor:not-allowed;color:var(--ink-4)} @@ -248,6 +341,7 @@ input.fi:focus{border-color:var(--accent)}
RSSI —
+ @@ -394,6 +488,73 @@ input.fi:focus{border-color:var(--accent)} + +
+
+ + +
+ 📶 Gestion WiFi + +
+ + +
+
Réseau actuel
+
+ SSID + +
+
+ Adresse IP + +
+
+ RSSI + +
+
+ Mode + +
+
+ + +
+
+ Réseaux disponibles + +
+
+
+
Appuyer sur "Scanner" pour détecter les réseaux.
+
+
+
+ + +
+
Connexion
+
+
+ + +
+
+ +
+ + +
+
+ +
+
+
+ +
+
+