- C++ 82.6%
- C 17.4%
| include | ||
| src | ||
| .gitignore | ||
| platformio.ini | ||
| README.md | ||
| requirements.txt | ||
WolBox
ESP32-C3 siempre encendido que orquesta el arranque del PC para que no quede colgado pidiendo passphrase de LUKS.
Por qué
El PC tiene la raíz en LUKS y se autodesbloquea por red vía NBDE/clevis contra un Tang que corre en container. Si el PC bootea antes de que Tang esté vivo, clevis falla y queda esperando la passphrase en el initramfs.
Al arrancar, WolBox:
- (Opcional,
ENABLE_NAS) Manda WoL al NAS y confirma por ping, en paralelo con el paso 2. - Espera a que Tang responda
GET /advcon HTTP 200 (sin timeout: reintenta para siempre). - Recién ahí enciende el PC con un tap de power (pulso corto al power switch vía PC817) y confirma por ping.
Si Tang no responde, el PC nunca se enciende (evita que caiga a passphrase). Una vez conectado el WiFi, el ESP no se reinicia más.
Por qué el PC ya no usa WoL
El r8169 olvida el wol g al apagar (había que reponerlo). El botón físico no
tiene ese problema: el ESP "aprieta" el power switch a través de un optoacoplador
PC817, como si apretaras el botón del gabinete.
Ojo — el power NO es idempotente: un tap sobre una máquina ya encendida (o a
medio bootear) la apaga o suspende. Por eso el arranque hace pre-check por ping
(si ya responde, no toca nada) y la ventana antes de re-tapear es larga
(PC_CONFIRM_WAIT_MS, 3 min): tiene que superar el peor caso de POST + unlock
LUKS + boot + red.
Hardware
ESP32-C3 SuperMini (board = lolin_c3_mini), USB-Serial/JTAG nativo (upload y
monitor sin driver extra).
| GPIO | Función |
|---|---|
| 8 | LED onboard (activo en bajo) — diagnóstico |
| 1 | PC817 → reset switch del PC |
| 3 | PC817 → power switch del PC (tap = encender/apagar ACPI, hold 6 s = apagado forzado) |
Los PC817 arrancan sueltos (presserInit los pone en el nivel "no apretado" en
setup()). Polaridad configurable con GPIO_PRESS_ACTIVE_HIGH según el cableado
del LED del opto.
LED de diagnóstico
Parpadeo simple a distinta velocidad por fase (más rápido = más urgente):
| Estado | LED |
|---|---|
| Tomando WiFi | parpadeo rápido |
| Trabajando (tap/ping/Tang) | parpadeo medio |
| Todo listo | fijo |
Acciones sobre el PC
En src/main.cpp:
pcPowerTap()— pulso corto = encender / apagado ACPI limpio. Lo usa el arranque.pcForceOff()— hold de 6 s = apagado forzado. Implementado, sin disparador aún.pcReset()— pulso al reset switch = reinicio en caliente. Implementado, sin disparador aún.
El motor de "apriete" (Presser) es no bloqueante: un hold de 6 s no congela
LED/OTA/log.
Config
include/config.h— lógica y timings, se commitea. Ahí estáENABLE_NAS(0 = NAS apagado), los pines/tiempos del PC817 y las ventanas.include/config.local.h— datos del sitio (WiFi, password OTA, URL de Tang,PC_IP, y MAC del NAS siENABLE_NAS). Gitignoreado. Crearlo desde la plantilla:
y completar los valores reales.cp include/config.local.h.example include/config.local.h
No hay web admin: para cambiar algo se reflashea (o se sube por OTA).
Flashear
Primera vez, por USB:
cd wolbox
pio run -t upload
pio device monitor # 115200
De ahí en más, por WiFi (sin cable):
pio run -t upload --upload-port wolbox.local
Pide el password de OTA_PASSWORD (config.local.h).
Ver logs sin USB
El ESP corre un mini servidor de log en el puerto 23:
nc wolbox.local 23
Muestra todo lo que iría al serial, más un heartbeat cada 10s con el RSSI (útil para probar orientación/ubicación sin depender del cable).
Prerrequisitos en los equipos target
- IP del PC (
PC_IP, se pinguea para confirmar): por DHCP oip neigh. - Reset/power switch cableados a los PC817: en el header del panel frontal del motherboard, en paralelo con los botones del gabinete.
- El PC debe quedar apagado tras un corte de luz (BIOS: stay off, no power on after AC loss) — si booteara solo, arrancaría antes que Tang.
- (Si
ENABLE_NAS) WoL en el NAS: DSM ▸ Panel de control ▸ Hardware y energía ▸ WOL en LAN 1.
Verificación end-to-end
- Con el PC apagado: resetear el ESP (
nc wolbox.local 23para ver el log) y confirmar que el PC termina encendido, recién tras Tang. - Parar el container de Tang y resetear el ESP: el PC no debe encenderse hasta que Tang vuelva.
- Confirmar que el PC, al despertar, desbloquea LUKS solo (no pide passphrase).
Extensión futura
Disparador para pcReset() / pcForceOff() (comando por el puerto 23 o
endpoint HTTP). Web admin para editar config sin reflashear.