███████╗ ██████╗ ██████╗ ███████╗██╗ ██╗██╗████████╗ ██████╗██╗ ██╗ ██╔════╝██╔════╝██╔═══██╗██╔════╝██║ ██║██║╚══██╔══╝██╔════╝██║ ██║ █████╗ ██║ ██║ ██║███████╗██║ █╗ ██║██║ ██║ ██║ ███████║ ██╔══╝ ██║ ██║ ██║╚════██║██║███╗██║██║ ██║ ██║ ██╔══██║ ███████╗╚██████╗╚██████╔╝███████║╚███╔███╔╝██║ ██║ ╚██████╗██║ ██║ ╚══════╝ ╚═════╝ ╚═════╝ ╚══════╝ ╚══╝╚══╝ ╚═╝ ╚═╝ ╚═════╝╚═╝ ╚═╝
"Un objeto que no solo carga tus dispositivos, sino que los protege, los monitorea y habla contigo."
🌐 App en producción: monolithic-eco.vercel.app
| Integrante | Rol |
|---|---|
| Juan Pablo Caballero Castellanos | Líder FullStack · Cloud · AI · 3D Modeling · Prototipado |
| Robinson Steven Núñez Portela | FullStack · IA · 3D Modeling · Prototipado |
| Oscar Andrés Sánchez Porras | Frontend · Integración de IA · 3D Modeling · Prototipado |
| Juan Sebastián Guayazán Clavijo | Frontend · Desarrollo de interfaces · Soporte FullStack · Prototipado |
| Martin Andres Ruiz Sarmiento | Administración · Electricista autodidacta · Prototipado · 3D Modeling |
- Descripción
- Por qué un Dodecaedro
- Documentación del proyecto
- Arquitectura del sistema
- Endpoints API
- Stack tecnológico
- Vistas y funcionalidades
- Evolución del prototipo
- Instalación local
- Variables de entorno
- Tríptico 1 · Proceso del proyecto
- Tríptico 2 · Desarrollo del producto
EcoSwitch nació de una pregunta simple: ¿cuánta energía desperdicías cada noche dejando el celular conectado hasta la mañana? La respuesta nos llevó a diseñar algo que va mucho más allá de un adaptador inteligente.
Es una estación de carga con forma de dodecaedro, un sólido platónico de 12 caras pentagonales que integra tomas eléctricas NEMA 5-15R, puertos USB, iluminación NeoPixel y un ESP32 que lo conecta todo con tu teléfono. Detecta cuándo tu dispositivo terminó de cargar, corta el suministro automáticamente y te lo hace saber. Todo en tiempo real, desde la app.
Así funciona de principio a fin:
Dispositivo conectado
│
▼
ESP32 monitorea corriente
│
▼
¿Carga completa? ──► NO ──► Sigue cargando · NeoPixel verde
│
SÍ
│
▼
Relé corta el suministro
│
▼
NeoPixel cambia a azul · App recibe notificación
│
▼
Historial guardado en MongoDB Atlas
No fue un capricho estético. Fue la conclusión de semanas de iteración donde cada forma anterior fallaba en algo.
El rectángulo era funcional pero genérico. El cilindro desperdiciaba espacio interno. El enchufe giratorio que desarrollamos en MID fidelidad resolvía la rotación pero no la escala. Necesitábamos una forma que distribuyera tomas en múltiples orientaciones, que tuviera suficiente volumen interno para la electrónica y que al mismo tiempo se viera bien sobre un escritorio.
El dodecaedro resolvió todo eso de un golpe:
| Problema | Solución que da el dodecaedro |
|---|---|
| Tomas en una sola cara | 12 caras pentagonales disponibles en 360° |
| Poco espacio interno | Cavidad amplia y orgánica para PCB, relé y anillos LED |
| Difícil de agarrar | Cuerpo de 10 cm validado con P95 masculino de anchura de mano |
| Indistinguible en el mercado | Forma única que convierte el dispositivo en objeto de diseño |
| Inestabilidad al apoyarlo | Base pentagonal de 200 x 180 mm con 20 mm de espesor |
Las caras translúcidas de PLA superiores funcionan además como difusores de luz para el modo lámpara, integrando estética y utilidad en un mismo componente. No hay ninguna otra regleta en el mercado con esa forma. Eso, en términos de producto, vale mucho.
| Parámetro | Valor |
|---|---|
| Forma | Dodecaedro regular · 12 caras pentagonales |
| Arista por cara | 70 mm ±0.5 mm |
| Altura total con base | 132 mm |
| Altura sin base | 112 mm |
| Base rectangular | 200 x 180 mm |
| Espesor de base | 20 mm |
| Carcasa superior | PLA translúcido · modo lámpara |
| Carcasa inferior | PLA opaco · soporte estructural |
| Tomas integradas | 3x NEMA 5-15R · 40 x 40 mm · profundidad 35 mm |
| Norma eléctrica | RETIE · NTC 2050 · IEC 60335-1 |
| Documento | Descripción |
|---|---|
| 📘 Bitácora PRTO | Registro completo del proceso: bocetos, árbol funcional, canvas, antropometría y evolución del prototipo |
El sistema tiene tres capas que se comunican entre sí en tiempo real:
┌─────────────────────────────────────────────────────────────────┐
│ USUARIO FINAL │
│ App Web · monolithic-eco.vercel.app │
│ React 18 · TypeScript · Tailwind │
└─────────────────────────┬───────────────────────────────────────┘
│ HTTPS · REST
┌─────────────────────────▼───────────────────────────────────────┐
│ BACKEND · API REST │
│ FastAPI 0.115 · Python 3.12 · Render │
│ │
│ /auth /device/toggle /history /analytics │
│ │
│ MongoDB Atlas · Motor async · Beanie 1.30 │
└────────────────┬──────────────────────────────┬─────────────────┘
│ MQTT · WebSocket │ Read/Write
┌────────────────▼──────────────┐ ┌────────────▼────────────────┐
│ FIRMWARE · ESP32 │ │ BASE DE DATOS │
│ Arduino Framework │ │ MongoDB Atlas │
│ │ │ │
│ relay_control.h │ │ Users · Devices │
│ neopixel_status.h │ │ PowerRecords · Sessions │
│ wifi_mqtt.h │ │ │
└────────────────┬──────────────┘ └─────────────────────────────┘
│ GPIO · AC Control
┌────────────────▼──────────────────────────────────────────────┐
│ HARDWARE · DODECAEDRO │
│ │
│ Relé de corte AC Anillo NeoPixel x2 Tomas NEMA 5-15R │
│ Sensor corriente Fuente AC switching Bloque USB Hembra │
│ LED piloto rojo Interruptor On/Off Cable SJT 3x14 AWG │
└───────────────────────────────────────────────────────────────┘
ECOSWITCH/
├── frontend/
│ └── src/
│ ├── pages/ # Dashboard · Control · Historial · Configuración
│ ├── components/ # Componentes reutilizables
│ └── services/ # Llamadas a la API
│
├── backend/
│ └── src/com/ecoswitch/app/
│ ├── main.py # Punto de entrada FastAPI + CORS + rutas
│ ├── database/
│ │ └── repository.py # Motor + MongoDB Atlas
│ ├── models/
│ │ ├── user.py # Documento User
│ │ └── device.py # Documento Device y PowerRecord
│ ├── schemas/
│ │ └── schemas.py # Validación Pydantic
│ └── services/
│ ├── relay_service.py # Control del relé vía MQTT
│ ├── auth_service.py # bcrypt + JWT
│ └── google_auth_service.py # OAuth2 Google
│
└── firmware/
└── ecoswitch_esp32/
├── main.ino # Lógica principal
├── relay_control.h # Corte automático AC
├── neopixel_status.h # Anillos LED
└── wifi_mqtt.h # Conectividad Wi-Fi + MQTT
| Método | Ruta | Descripción |
|---|---|---|
POST |
/register |
Registro con email y contraseña |
POST |
/login |
Login con email y contraseña |
POST |
/auth/google/register |
Registro con cuenta Google |
POST |
/auth/google/login |
Login con cuenta Google |
| Método | Ruta | Descripción |
|---|---|---|
POST |
/device/toggle |
Activar o desactivar una toma específica |
GET |
/device/status/{device_id} |
Estado actual de todas las tomas y LEDs |
POST |
/device/schedule |
Programar corte automático por tiempo |
DELETE |
/device/schedule/{id} |
Cancelar una programación activa |
| Método | Ruta | Descripción |
|---|---|---|
GET |
/history/{email} |
Historial de sesiones de carga del usuario |
GET |
/analytics/{email} |
Resumen de consumo energético por período |
| Capa | Tecnología |
|---|---|
| Frontend | React 18 · TypeScript · Tailwind CSS · Vite |
| Backend | FastAPI 0.115 · Python 3.12 · Pydantic |
| Base de datos | MongoDB Atlas · Motor async · Beanie 1.30 |
| Microcontrolador | ESP32 · Arduino Framework · MQTT · NeoPixel |
| Hardware | Relé AC · Sensor de corriente · Tomas NEMA 5-15R · Fuente AC switching |
| Autenticación | bcrypt · Google OAuth2 · JWT |
| Despliegue | Vercel para frontend · Render para backend |
| Modelado 3D | Autodesk Fusion 360 |
| Fabricación | Impresión 3D en PLA translúcido · Corte láser en madera |
| Vista | Qué hace |
|---|---|
| Dashboard | Estado en tiempo real de cada toma del dodecaedro con indicadores visuales |
| Control remoto | Activar o desactivar individualmente cada puerto de carga desde cualquier lugar |
| Historial | Registro de sesiones de carga con timestamps y consumo estimado |
| Análisis | Gráficas de consumo energético por período |
| Configuración | Umbrales de corte automático, objetivos de carga y preferencias de notificación |
El proyecto vivió tres iteraciones reales antes de llegar al dodecaedro. Cada una resolvió algo que la anterior no podía.
| 🟤 LOW | 🔵 MID | 🟢 MID-HI · PMV Final | |
|---|---|---|---|
| Forma | Caja rectangular 6x4x3 cm | Enchufe giratorio 360° NEMA 5-15P | Dodecaedro 12 caras pentagonales |
| Electrónica | ESP32 + relé + LED simple | ESP32 + relé + LEDs duales + shunt sensor | ESP32 + 2x anillo NeoPixel + fuente AC switching + relé |
| Tomas | 1 toma hembra básica | 1 toma NEMA + estación USB complementaria | 3x NEMA 5-15R integradas en caras + bloque USB |
| Conectividad | Wi-Fi básico | Wi-Fi + Bluetooth | Wi-Fi + BT + MQTT + WebSocket |
| Carcasa | Boceto 3D · sin fabricar | ABS blanco · planos técnicos completos | PLA translúcido superior + PLA opaco inferior |
| App | Mockup de pantallas | Wireframes funcionales | App React desplegada en Vercel |
| Norma | Sin certificación | RETIE referenciado | RETIE · NTC 2050 · IEC 60335-1 |
| Estado | Concepto validado | Prototipo funcional | PMV físico y digital operativo |
Los primeros bocetos planteaban un módulo compacto que se intercalara entre el cargador y la pared. El foco era validar la lógica eléctrica básica: ESP32 conectado a un relé, un LED indicador y un sensor de corriente para detectar fin de carga. Simple, directo, funcional.
La segunda versión escaló hacia un enchufe inteligente con cabezal giratorio 360°. Se incorporaron indicadores LED duales, cable flexible SJT 3x14 AWG de 150 cm y una estación de carga complementaria con puertos USB-C PD y USB-A. Los planos técnicos llegaron a tener vistas frontal, lateral y corte transversal A-A' con dimensiones reales.
El salto al dodecaedro fue el más grande del proyecto, no solo en forma sino en complejidad técnica. Las fases 6 y 7 del ensamblaje integraron el bus periférico de cableado radial, la gestión de potencia a múltiples tomas, la unión mecánica de las caras translúcidas y el cierre final del sólido con todos los componentes adentro funcionando.
# 1. Clonar el repositorio
git clone https://github.com/ecoswitch/ecoswitch-backend.git
cd ecoswitch-backend
# 2. Crear y activar entorno virtual
python -m venv venv
source venv/bin/activate # Mac · Linux
.\venv\Scripts\activate # Windows
# 3. Instalar dependencias
pip install -r requirements.txt
# 4. Configurar variables de entorno
cp .env.example .env
# Editar .env con tus credenciales
# 5. Levantar el servidor
uvicorn src.com.ecoswitch.app.main:app --reloadLa API queda disponible en http://localhost:8000 y la documentación interactiva en http://localhost:8000/docs.
# 1. Clonar el repositorio
git clone https://github.com/ecoswitch/ecoswitch-frontend.git
cd ecoswitch-frontend
# 2. Instalar dependencias
npm install
# 3. Configurar variables de entorno
cp .env.example .env.local
# Editar .env.local con la URL del backend
# 4. Levantar en desarrollo
npm run devLa app queda disponible en http://localhost:5173.
# Requisitos: Arduino IDE 2.x con soporte ESP32
# 1. Abrir ecoswitch_esp32/main.ino en Arduino IDE
# 2. Instalar librerías necesarias desde el Library Manager
# Adafruit NeoPixel
# PubSubClient · MQTT
# ArduinoJson
# 3. Editar wifi_mqtt.h con tus credenciales
# WIFI_SSID · WIFI_PASSWORD · MQTT_BROKER · MQTT_PORT
# 4. Seleccionar placa: ESP32 Dev Module
# Upload Speed: 115200
# 5. Flashear con Sketch > UploadCrear un archivo .env en la raíz del proyecto backend:
MONGO_URI=mongodb+srv://usuario:password@cluster.mongodb.net/ECOSWITCH_DB
GOOGLE_CLIENT_ID=tu_google_oauth_client_id
JWT_SECRET=tu_secreto_jwt
PORT=8000
PYTHON_VERSION=3.12| Variable | Descripción |
|---|---|
MONGO_URI |
Cadena de conexión a MongoDB Atlas |
GOOGLE_CLIENT_ID |
Client ID de Google Cloud Console |
JWT_SECRET |
Clave secreta para firmar tokens JWT |
PORT |
Puerto del servidor · Render lo asigna automáticamente |
Crear un archivo .env.local en la raíz del proyecto frontend:
VITE_API_URL=https://tu-backend.onrender.com
VITE_GOOGLE_CLIENT_ID=tu_google_oauth_client_idEditar directamente wifi_mqtt.h:
#define WIFI_SSID "tu_red_wifi"
#define WIFI_PASSWORD "tu_contraseña"
#define MQTT_BROKER "tu_broker_mqtt"
#define MQTT_PORT 1883
#define DEVICE_ID "ecoswitch_01"El mapa mental del proyecto articula tres ejes: Usuario con capacidades físicas, riesgos y experiencia digital; Acciones de conectar y desconectar de forma remota; y Entorno con lugares que tienen enchufes eléctricos, condiciones físicas de uso y normatividad RETIE, NTC e IEC.
EcoSwitch tiene un canvas con socios clave como fabricantes de componentes y laboratorios de certificación RETIE/ICONTEC, una propuesta de valor centrada en desconexión automática + ahorro energético + diseño diferencial, y segmentos de clientes que abarcan usuarios domésticos, estudiantes y profesionales con múltiples dispositivos.
El esquema detalla la arquitectura eléctrica del dispositivo: cabezal macho NEMA con Fase, Neutro y Tierra hacia el relé de corte y luego a la toma hembra, con el ESP32 como cerebro central, diodo de protección y resistencia 220Ω para el LED indicador.
Vista isométrica con cortes del dodecaedro mostrando la distribución interna: PCB principal, anillos NeoPixel, ESP32, relé, bloque USB, indicadores LED, tomas NEMA 5-15R y gestión de cableado radial del bus periférico.
Todos los componentes del dodecaedro fueron modelados en Fusion 360, desde las piezas eléctricas individuales hasta el ensamblaje final. Los archivos .f3d están disponibles para descarga en la carpeta files/.
Componentes eléctricos
Iluminación y conectividad
Ensamblaje final
Archivos de modelado disponibles
| Archivo | Descripción |
|---|---|
| 📁 Descargar · nema.f3d | Conector NEMA macho y hembra |
| 📁 Descargar · tomacorriente.f3d | Toma corriente integrada |
| 📁 Descargar · rele.f3d | Módulo relé de corte AC |
| 📁 Descargar · leds.f3d | Anillos LED NeoPixel |
| 📁 Descargar · enchufe360.f3d | Enchufe giratorio 360° |
| 📁 Descargar · dodecaedro.f3d | Cuerpo dodecaédrico completo |
| 📁 Descargar · ecoswitch.f3d | Ensamblaje final EcoSwitch |
- El backend está en Render free tier y puede tardar hasta 50 segundos en responder tras inactividad.
- El firmware del ESP32 no se versiona en binario compilado. Se genera localmente con Arduino IDE.
- Las caras translúcidas actúan como difusores de luz para el modo lámpara, sin necesidad de piezas adicionales.
- El CORS del backend acepta requests desde
localhost:5173y el dominio de Vercel del frontend.









