{"id":31567912,"url":"https://github.com/ayresnet/ayreswifimanager","last_synced_at":"2025-10-05T09:46:15.052Z","repository":{"id":311449491,"uuid":"1043011656","full_name":"ayresnet/AyresWiFiManager","owner":"ayresnet","description":"AyresWiFiManager (AWM): Wi-Fi manager pro para ESP32/ESP8266. Portal cautivo AP+DNS, credenciales en LittleFS, HTML embebido, escaneo JSON (/scan), botón 2–5s/≥5s, LED por estados, NTP y check de Internet.","archived":false,"fork":false,"pushed_at":"2025-09-30T00:13:36.000Z","size":172,"stargazers_count":5,"open_issues_count":0,"forks_count":3,"subscribers_count":0,"default_branch":"main","last_synced_at":"2025-09-30T02:24:22.454Z","etag":null,"topics":["arduino-ide","arduinojson","css3","dns","esp32","esp8266","html5","iot","javascript","json","littlefs","ntp","platformio","ux-experience","webserver","wifi"],"latest_commit_sha":null,"homepage":"https://ayresnet.com","language":"HTML","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/ayresnet.png","metadata":{"files":{"readme":"README.es.md","changelog":null,"contributing":"CONTRIBUTING.md","funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":null,"dco":null,"cla":null}},"created_at":"2025-08-23T01:02:37.000Z","updated_at":"2025-09-30T00:13:39.000Z","dependencies_parsed_at":null,"dependency_job_id":"ca000f5c-d687-41e9-92c7-df938159cff9","html_url":"https://github.com/ayresnet/AyresWiFiManager","commit_stats":null,"previous_names":["ayresnet/ayreswifimanager"],"tags_count":3,"template":false,"template_full_name":null,"purl":"pkg:github/ayresnet/AyresWiFiManager","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ayresnet%2FAyresWiFiManager","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ayresnet%2FAyresWiFiManager/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ayresnet%2FAyresWiFiManager/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ayresnet%2FAyresWiFiManager/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/ayresnet","download_url":"https://codeload.github.com/ayresnet/AyresWiFiManager/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ayresnet%2FAyresWiFiManager/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":278437951,"owners_count":25986760,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","status":"online","status_checked_at":"2025-10-05T02:00:06.059Z","response_time":54,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["arduino-ide","arduinojson","css3","dns","esp32","esp8266","html5","iot","javascript","json","littlefs","ntp","platformio","ux-experience","webserver","wifi"],"created_at":"2025-10-05T09:46:13.171Z","updated_at":"2025-10-05T09:46:15.044Z","avatar_url":"https://github.com/ayresnet.png","language":"HTML","funding_links":[],"categories":[],"sub_categories":[],"readme":"\u003cdiv align=\"center\"\u003e\n\n# AyresWiFiManager (AWM)\n\n[![GitHub stars](https://img.shields.io/github/stars/ayresnet/AyresWiFiManager?style=social)](https://github.com/ayresnet/AyresWiFiManager/stargazers)\n\n⭐ **Si te resulta útil, considera darle una estrella. Gracias. **\n\n---\n\u003c!-- Línea 1: identidad y estado del proyecto --\u003e\n![AWM](https://img.shields.io/badge/AWM-Portal%20Cautivo-4361ee?style=flat-square)\n![Release](https://img.shields.io/github/v/release/ayresnet/AyresWiFiManager?include_prereleases\u0026label=release\u0026style=flat-square)\n![License](https://img.shields.io/github/license/ayresnet/AyresWiFiManager?style=flat-square)\n![Issues](https://img.shields.io/github/issues/ayresnet/AyresWiFiManager?style=flat-square)\n\n\u003c!-- Línea 2: plataformas y frameworks --\u003e\n![ESP32](https://img.shields.io/badge/ESP32-supported-2ec27e?logo=espressif\u0026logoColor=white\u0026style=flat-square)\n![ESP8266](https://img.shields.io/badge/ESP8266-supported-2ec27e?logo=espressif\u0026logoColor=white\u0026style=flat-square)\n![Arduino](https://img.shields.io/badge/Arduino-Library-00979D?logo=arduino\u0026logoColor=white\u0026style=flat-square)\n![PlatformIO](https://img.shields.io/badge/PlatformIO-ready-f5822a?logo=platformio\u0026logoColor=white\u0026style=flat-square)\n\n\u003c!-- Línea 3: características clave --\u003e\n![LittleFS](https://img.shields.io/badge/LittleFS-OK-2ec27e?style=flat-square)\n![Captive Portal](https://img.shields.io/badge/Captive%20Portal-ON-4361ee?style=flat-square)\n![DNS catch-all](https://img.shields.io/badge/DNS-catch--all-4cc9f0?style=flat-square)\n![NTP](https://img.shields.io/badge/NTP-sync-4cc9f0?style=flat-square)\n![ArduinoJson](https://img.shields.io/badge/ArduinoJson-%5E6.21.2-6c757d?logo=json\u0026logoColor=white\u0026style=flat-square)\n\n\u003c!-- (Opcional) métricas --\u003e\n\u003c!-- ![Downloads](https://img.shields.io/github/downloads/ayresnet/AyresWiFiManager/total?style=flat-square) --\u003e\n\n\u003c/div\u003e\n\n\u003cdiv align=\"center\" style=\"background-color: #f0f0f0; border: 2px solid #336699; padding: 15px; border-radius: 10px;\"\u003e\n  \u003ctable\u003e\n    \u003ctr\u003e\n      \u003ctd style=\"padding: 5px;\"\u003e\n        \u003cimg src=\"https://res.cloudinary.com/dxunooptp/image/upload/v1756089447/awm01_vyzkbw.png\" alt=\"Imagen 1\" width=\"250\"\u003e\n      \u003c/td\u003e\n      \u003ctd style=\"padding: 5px;\"\u003e\n        \u003cimg src=\"https://res.cloudinary.com/dxunooptp/image/upload/v1756089447/awm02_mvzmxr.png\" alt=\"Imagen 2\" width=\"250\"\u003e\n      \u003c/td\u003e\n      \u003ctd style=\"padding: 5px;\"\u003e\n        \u003cimg src=\"https://res.cloudinary.com/dxunooptp/image/upload/v1756093584/imagen_2025-08-25_004621649_gpiecd.png\" width=\"250\"\u003e\n      \u003c/td\u003e\n    \u003c/tr\u003e\n  \u003c/table\u003e\n\u003c/div\u003e\n\n---\n\n📢 ¡Disponible en el Arduino IDE!\n\nInstalá AyresWiFiManager directamente desde el Library Manager del IDE de Arduino.  \nSolo buscá “AyresWiFiManager” y tocá “Instalar”.\n\n---\n\n**AWM - Gestor Wi‑Fi “pro” para ESP32/ESP8266** con portal cautivo real (AP+DNS), UI moderna servida desde **LittleFS**, almacenamiento seguro de credenciales, **políticas de fallback**, botón de provisión, LED de estado, **NTP**, chequeo de Internet y **logging** configurable.\n\n\u003e Proyecto: https://github.com/AyresNet/AyresWiFiManager  \n\u003e Licencia: MIT — (c) 2025 AyresNet\n\n---\n\n## ⭐ ¿Por qué AyresWiFiManager?\n\n- **Portal cautivo real**: DNS *catch‑all* + rutas de detección (Android/iOS/Windows) para forzar apertura en `http://192.168.4.1`.\n- **UI ligera (sin dependencias externas)** servida desde `/data` (LittleFS): búsqueda, reescaneo, barras de señal y opción de borrar credenciales desde el portal.\n- **API clara** y multiplataforma (ESP32/ESP8266) con políticas explícitas.\n- **Fallbacks inteligentes**: `NO_CREDENTIALS_ONLY` (default), `ON_FAIL`, `SMART_RETRIES`, `BUTTON_ONLY`, `NEVER`.\n- **Botón y LED** integrados:\n  - Botón (LOW): **2–5 s** abre portal · **≥5 s** borra JSON y reinicia.\n  - LED: `ON` conectado · `BLINK_SLOW` portal · `BLINK_FAST` escaneo · `OFF` idle (+ patrones dobles/triples para feedback).\n- **Borrado seguro** de `.json` con **lista blanca** y recursivo en ESP32.\n- **Logging profesional** (macros `AWM_LOG*`) con nivel ajustable por `build_flags`.\n- **Utilidades**: NTP (pool.ntp.org/time.nist.gov), `hayInternet()` (Google `204`), RSSI, timestamp, reconexión automática.\n\n---\n\n## 🚀 Características\n\n- **Almacenamiento de credenciales** en `/wifi.json` (LittleFS).\n- **Rutas del portal**\n  - `GET /` → `index.html`\n  - `POST /save` → guarda `{ssid,password}` y reinicia\n  - `GET /scan` o `/scan.json` → `[{ssid,rssi,secure}]`\n  - `POST /erase` → borra `.json` (respeta protegidos) y reinicia\n- **HTML/JS/CSS** de ejemplo incluidos: `data/index.html`, `data/success.html`, `data/error.html`\n- **ESP32**: `esp_wifi_set_ps(WIFI_PS_NONE)`, `LittleFS.begin(true)` (auto‑formateo)  \n  **ESP8266**: `WiFi.setSleepMode(WIFI_NONE_SLEEP)`, iteración LittleFS no recursiva\n\n---\n\n## 📦 Instalación\n\n### PlatformIO (recomendado)\n\n`platformio.ini` mínimo:\n\n```ini\n[env:esp32dev]\nplatform = espressif32\nboard = esp32dev\nframework = arduino\nmonitor_speed = 115200\nboard_build.filesystem = littlefs\n\n; Opcional: logging\nbuild_flags =\n  -D AWM_ENABLE_LOG=1     ; 0=off, 1=on\n  -D AWM_LOG_LEVEL=3      ; 1=E, 2=W, 3=I, 4=D, 5=V\n```\n\n- Coloca tus archivos del portal en `data/` (por ejemplo `index.html`).\n- Sube el FS: `pio run -t uploadfs`.\n- Flashea el sketch y abre el monitor serie.\n\n### Arduino IDE\n\n- Añadí las cores ESP32/ESP8266 oficiales.\n- Instalá el **uploader de LittleFS** correspondiente (ESP32/ESP8266).\n- Subí la carpeta `data/` al FS con la herramienta “Data Upload”.\n- Compilá y cargá el sketch.\n\n---\n\n## ✏️ Uso mínimo\n\n```cpp\n#include \u003cAyresWiFiManager.h\u003e\n\nAyresWiFiManager wifi;\n\nvoid setup() {\n  Serial.begin(115200);\n\n  wifi.setAPCredentials(\"ayreswifimanager\",\"123456789\");\n  wifi.setPortalTimeout(300);   // 5 min por inactividad\n  wifi.setAPClientCheck(true);  // no cierra si hay clientes\n  wifi.setWebClientCheck(true); // cada request reinicia el timer\n  // wifi.setCaptivePortal(false); // desactiva redirecciones, si querés\n\n  wifi.begin();  // monta FS, carga /wifi.json si existe\n  wifi.run();    // intenta STA; si falla aplica la política de fallback\n}\n\nvoid loop() {\n  wifi.update(); // sirve HTTP/DNS y maneja timeouts/LED\n}\n```\n\n---\n\n## 🪄 Flujo de arranque recomendado\n\nEl ejemplo **`examples/30sVentana/src/main.cpp`** hace:\n\n- Si **hay** credenciales → abre portal con *timeout por inactividad* de **30 s**; si no lo usás, se cierra solo y continúa.\n- Si **no hay** credenciales → abre portal “normal” (ej. **5 min** por inactividad).\n- En ambos casos, si usás el portal (clientes AP o requests HTTP), **no se cierra** hasta que dejes de usarlo.\n\n---\n\n## 🧩 API principal\n\n```cpp\n// Portal / AP\nvoid setHtmlPathPrefix(const String\u0026 prefix);  // ej: \"/wifimanager\"\nvoid setHostname(const String\u0026 host);\nvoid setAPCredentials(const String\u0026 ssid, const String\u0026 pass);\nvoid setCaptivePortal(bool enabled);           // DNS + rutas captive\nvoid setPortalTimeout(uint32_t seconds);       // 0 = sin timeout\nvoid setAPClientCheck(bool enabled);           // no cerrar si hay clientes\nvoid setWebClientCheck(bool enabled);          // cada request reinicia timer\nvoid openPortal();\nvoid closePortal();\nbool isPortalActive() const;\n\n// Fallback\nenum class FallbackPolicy { ON_FAIL, NO_CREDENTIALS_ONLY, SMART_RETRIES, BUTTON_ONLY, NEVER };\nvoid setFallbackPolicy(FallbackPolicy p);\nvoid setSmartRetries(uint8_t maxRetries, uint32_t windowMs);\nvoid enableButtonPortal(bool enable);\nvoid setAutoReconnect(bool enabled);\n\n// Estado / utilidades\nbool tieneCredenciales() const;\nbool connectToWiFi();\nbool isConnected();\nint  getSignalStrength();     // RSSI\nuint64_t getTimestamp();      // ms (0 si no hay NTP)\nbool hayInternet();           // generate_204\nbool scanRedDetectada();\nvoid forzarReconexion();\n\n// LED\nenum class LedPattern { OFF, ON, BLINK_SLOW, BLINK_FAST, BLINK_DOUBLE, BLINK_TRIPLE };\nvoid setLedAuto(bool enable);\nvoid setLedPatternManual(LedPattern p);\n\n// Seguridad FS (.json protegidos)\nvoid setProtectedJsons(std::initializer_list\u003cconst char*\u003e names); // ej: {\"/wifi.json\",\"licencia.json\"}\n```\n\n---\n\n## 🔘 Botón y 💡 LED\n\n- **Botón** (pin por defecto **0**, `INPUT_PULLUP`, activo en LOW):\n  - **2–5 s** → abre portal (si `enableButtonPortal(true)`)\n  - **≥5 s** → borra `.json` (respeta `setProtectedJsons`) y reinicia\n- **LED** (pin por defecto **2**):\n  - `ON` conectado a Wi‑Fi\n  - `BLINK_SLOW` portal activo\n  - `BLINK_FAST` escaneando\n  - `BLINK_DOUBLE / TRIPLE` feedback al mantener botón\n  - `OFF` sin enlace/portal\n\n\u003e Podés fijar el patrón manual (`setLedPatternManual`) o dejarlo automático (`setLedAuto(true)`).\n\n---\n\n## 📋 Logging (opcional, recomendado)\n\nIncluye `include/AWM_Logging.h` con macros:\n\n```cpp\nAWM_LOGE(\"error: %d\", code);   // Error\nAWM_LOGW(\"warning...\");\nAWM_LOGI(\"info...\");\nAWM_LOGD(\"debug x=%d\", x);\nAWM_LOGV(\"verbose...\");\n```\n\nActivación por **flags de compilación** (PlatformIO):\n\n```ini\nbuild_flags =\n  -D AWM_ENABLE_LOG=1\n  -D AWM_LOG_LEVEL=3    ; 1=ERROR, 2=WARN, 3=INFO, 4=DEBUG, 5=VERBOSE\n```\n\n- Poné `AWM_ENABLE_LOG=0` para apagar **todos** los logs (macro‑noops).\n- Subí/bajá `AWM_LOG_LEVEL` según lo que quieras ver.\n\n---\n\n## 🗂 Archivos del portal (LittleFS)\n\n- `data/index.html` – escaneo, filtro, selección de SSID, formulario de guardado, opciones avanzadas  \n- `data/success.html` – confirmación de guardado (SVG con pulso; el equipo se reinicia)  \n- `data/error.html` – error de guardado (SVG con vibración sutil + enlace “Volver”)\n\n\u003e Cambiá la raíz con `setHtmlPathPrefix(\"/wifimanager\")` si preferís otra carpeta.\n\n**Subida del FS**  \n- PlatformIO: `pio run -t uploadfs`  \n- Arduino IDE: herramienta “Data Upload”\n\n---\n\n## 🔁 Migrando desde tzapu/WiFiManager\n\nAyresWiFiManager busca ser **simple y explícito**:\n\n- Sin *auto‑magia* de configuración: vos decidís **cuándo** abrir portal y **por cuánto**.\n- Portal verdaderamente **cautivo** (DNS + rutas), no solo un AP + webserver.\n- UI moderna sin CDNs, pensada para ESPs con poca RAM/flash.\n- **Borrado seguro** de `.json` con whitelist y (en ESP32) **recursivo**.\n- **Logging** integrable y niveles ajustables.\n\n---\n\n## 📚 Ejemplos\n\n- `examples/AWM_Minimal/AWM_Minimal.ino` – uso mínimo (`begin()`, `update()`, `isConnected()`).  \n- `examples/AWM_Advanced/AWM_Advanced.ino` – LED de estado, botón de pulsación corta → portal, NTP, reconexión.  \n- `examples/standard/main.cpp` – flujo simple estándar.  \n- `examples/30sVentana/main.cpp` – “ventana” de arranque de 30 s si existen credenciales.  \n- `examples/usedExample/usedExample.ino` – ejemplo de uso legado.\n\n---\n\n## 🗃 Estructura del repo\n\n```text\nAyresWiFiManager/\n├─ data/                     # Captive-portal HTML/CSS/JS (LittleFS examples)\n│  ├─ index.html             # Main portal page\n│  ├─ success.html           # Confirmation after saving credentials\n│  └─ error.html             # Error page\n│\n├─ examples/                 # Example sketches (Arduino IDE \u0026 PlatformIO)\n│  ├─ AWM_Minimal/\n│  │   └─ AWM_Minimal.ino    # Minimal usage (begin + update + isConnected)\n│  ├─ AWM_Advanced/\n│  │   └─ AWM_Advanced.ino   # Advanced: LED, button, NTP, reconnect\n│  ├─ standard/\n│  │   └─ main.cpp           # Simple reference flow\n│  ├─ 30sVentana/\n│  │   └─ main.cpp           # 30s \"boot window\" captive portal\n│  └─ usedExample/\n│      └─ usedExample.ino    # Legacy usage example\n│\n├─ src/                      # Core library sources\n│  ├─ AyresWiFiManager.h     # Main header (public API)\n│  ├─ AyresWiFiManager.cpp   # Implementation\n│  └─ AWM_Logging.h          # Optional lightweight logging macros\n│\n├─ library.properties        # Arduino Library Manager metadata\n├─ library.json              # PlatformIO metadata\n├─ platformio.ini            # Example PIO project config\n├─ LICENSE                   # MIT License\n├─ README.md                 # Main documentation (English)\n└─ README.es.md              # Documentation in Spanish\n```\n\n\u003e Si querés mantener librerías locales fuera del repo, añadí rutas a `.gitignore` (ej.: `lib/AyresShell/`).\n\n---\n\n## 📂 Captive portal HTML\n\nLos archivos del portal (`index.html`, `success.html`, `error.html`) deben\nsubirse al **LittleFS del sketch del usuario**:\n\n1. Copiá los archivos desde `data/` de esta librería al directorio `data/`\n   de **tu sketch**.\n2. Subilos al dispositivo:\n   - **Arduino IDE**: menú → *ESP32 LittleFS Data Upload*\n   - **PlatformIO**:  \n     ```bash\n     pio run --target uploadfs\n     ```\n\n\u003e ⚠️ **Nota importante:**  \n\u003e El `data/` en la raíz de esta librería es **solo de referencia/ejemplo**.  \n\u003e No se sube automáticamente cuando compilás un sketch.\n\n---\n\n## ✅ Consejos de producción\n\n- **Protegé** archivos críticos:  \n  `wifi.setProtectedJsons({\"/wifi.json\",\"licencia.json\"});`\n- Definí **timeouts por inactividad** coherentes (`setPortalTimeout`) y activá `setAPClientCheck(true)` + `setWebClientCheck(true)` si no querés que se cierre mientras lo usan.\n- Para instalaciones remotas, `setFallbackPolicy(SMART_RETRIES)` + `setAutoReconnect(true)` suelen dar buena experiencia.\n- Si necesitás ahorrar logs en producción: `-D AWM_ENABLE_LOG=0`.\n\n---\n\n## 🧩 Compatibilidad\n\n- **ESP32** (Arduino core)  \n- **ESP8266** (Arduino core)\n\n\u003e Requiere **LittleFS**. En ESP32 se auto‑formatea si `begin(true)` falla.\n\n---\n\n## 🤝 Contribuir\n\n¡PRs e issues son bienvenidos!  \nIdeas: ejemplos adicionales, traducciones, mejoras UI/UX del portal, nuevas políticas de fallback.\n\n---\n\n## 📄 Licencia\n\nMIT — ver archivo `LICENSE` (o cabeceras SPDX en el código).\n\n---\n\n\u003e 📘 [Leer en ingles → README.md](README.md)\n\n¿Dudas o ideas? Abrí un issue en el repo. ¡Gracias por probar **AyresWiFiManager**! 🚀\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fayresnet%2Fayreswifimanager","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fayresnet%2Fayreswifimanager","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fayresnet%2Fayreswifimanager/lists"}