Códigos del Proyecto
Descripción general de los códigos utilizados en el sistema
1.app.py
app.py es el núcleo de la aplicación web desarrollada con Flask. Gestiona autenticación, control de luces por infrarrojo (IR), modo automático, paneles diferenciados por rol (dueño/inquilino) y persistencia de datos en SQLite.
Funcionalidades principales:
• Login/Logout con sesiones seguras y registro de intentos (IP + timestamp).
• Roles diferenciados:
→ dueño: crea inquilinos, controla habitaciones
→ inquilino: controla las habitaciones que se le ha asignado.
• Control de luces por habitación:
→ Encendido/apagado (IR: KEY_POWER / KEY_OFF).
→ Cambio de color (15 colores predefinidos vía rueda de colores).
→ Ajuste de intensidad (+/-).
→ Modo automático: activa secuencia preprogramada (modoauto.py).
• Envío de comandos IR mediante irsend (LIRC).
• Base de datos SQLite (database.db) con:
→ usuarios (id, usuario, contraseña, rol, nombre).
→ habitaciones (id, usuario_id, nombre, estado, modo, color, intensidad).
→ logs_acceso (intentos de login).
Rutas clave:
/ → GET: Redirige según sesión
/login → GET/POST: Autenticación
/logout → GET: Cierra sesión
/inquilino → GET: Panel del inquilino
/dueño → GET: Panel del dueño
/habitacion/<id> → GET: Vista detallada de habitación
/cambiar_luz/<id> → POST: Toggle ON/OFF
/cambiar_modo/<id> → POST: Auto/Manual
/cambiar_color/<id> → POST: Color vía rueda
/cambiar_intensidad/<id> → POST: Subir/bajar brillo
/crear_inquilino → GET/POST: Dueño crea inquilino + 4 habitaciones
Dependencias externas:
• irsend (LIRC) → comandos IR.
• modoauto.py → lógica del modo automático.
• Plantillas Jinja2 (templates/) + CSS
Ejecución:
python app.py — escucha en 0.0.0.0:5000 (debug activado).
2.prueba_mov.py
prueba_mov.py es un script de prueba para detectar movimiento usando un sensor PIR conectado a una Raspberry Pi.
Configura el pin GPIO 27 como entrada, espera 2 segundos para estabilizar el sensor y entra en un bucle infinito que verifica el estado del pin cada segundo.
Funcionamiento:
• Si el sensor detecta movimiento → imprime "Movimiento detectado!"
• Si no hay movimiento → imprime "Sin movimiento"
Salida controlada: Se detiene con Ctrl+C, limpiando los pines GPIO al finalizar.
Dependencias:
• RPi.GPIO (biblioteca para control de pines en Raspberry Pi).
• Sensor PIR conectado al pin GPIO 27 (BCM).
Ejecución:
python3 prueba_mov.py — ideal para verificar funcionamiento del sensor antes de integrarlo en proyectos domóticos.
3. modoauto.py
modoauto.py implementa el modo automático para el control inteligente de luces en una habitación.
Usa un sensor PIR (movimiento) en GPIO 27 y un sensor de luz TSL2561 (I2C) para encender la luz automáticamente cuando:
• Hay movimiento y la luz ambiental es < 20 lux.
• Se apaga tras 30 segundos sin movimiento.
Características clave:
• Filtro anti-ruido en PIR: requiere 2 lecturas consecutivas para confirmar movimiento.
• Registro en SQLite: guarda valores de luz y movimiento solo al encender (tabla sensores).
• Consulta dinámica del modo: detiene el bucle si el usuario cambia a manual desde la web.
• Hilo daemon: se activa con activar_modo_automatico(id) desde app.py sin bloquear Flask.
• Importa funciones IR desde ir_control.py (encender(), apagar()).
Robustez:
• Manejo de errores en GPIO, I2C y DB.
• Valor por defecto: 10 lux si falla el sensor de luz.
• Limpieza de GPIO en finally.
Prueba local: python3 modoauto.py ejecuta el modo para habitación ID 8.
→ Ideal para domótica: luz solo cuando es necesario.
4.models.py
models.py define la estructura de la base de datos SQLite y funciones para inicializarla y crear usuarios
Funciones principales:
• init_db(): crea (si no existen) las tablas usuarios y habitaciones con restricciones de integridad.
• create_user(): inserta un usuario con contraseña cifrada usando werkzeug.security (PBKDF2).
Tablas:
• usuarios: id, usuario (único), contraseñarol (dueño o inquilino).
• habitaciones: id, usuario_id (FK), nombre, estado (on/off), intensidad (0–100), color, modo (manual/automatico).
Restricciones: claves foráneas, valores válidos con CHECK, unicidad por (usuario_id, nombre).
→ Garantiza consistencia y seguridad desde el modelo de datos.
5.ir_control.py
ir_control.py gestiona el envío de comandos infrarrojos (IR) mediante irsend (LIRC) de forma segura y no bloqueante.
Funciones principales:
• encender(): enciende la luz y selecciona color blanco en una secuencia asíncrona usando un hilo daemon:
→ KEY_POWER → espera 0.5s → KEY_WHITE.
• apagar(): envía KEY_OFF inmediatamente.
Seguridad y robustez:
• _enviar_ir() encapsula la ejecución con timeout=3s, captura errores y salida.
• Manejo de TimeoutExpired, CalledProcessError y excepciones generales.
• Logs claros en consola para depuración.
→ Ideal para integración con Flask: no bloquea el servidor al encender.
6.crear_dueño.py
crea_dueño.py es un script de inicialización única que crea el usuario administrador (dueño) en la base de datos SQLite.
Acción:
• Inserta un usuario con:
→ usuario = 'Equipo'
→ contraseña = 'admin124' (almacenada en texto plano – uso exclusivo en setup inicial)
→ rol = 'dueño'
Advertencia: No utiliza hash de contraseña (a diferencia de models.py). Solo para configuración inicial en entorno controlado.
→ Ejecutar una sola vez al desplegar el sistema.
INTERFAZ
1.crear_inquilino.html
crear_inquilino.html es la plantilla Jinja2 para el formulario de creación de inquilinos, accesible solo por el usuario con rol dueño.
Elementos clave:
• Formulario POST con campos usuario y contraseña (ambos requeridos).
• Envía datos a la ruta /crear_inquilino.
• Botón Volver al panel del dueño.
• Muestra mensajes flash (success, danger) para feedback (ej. "Inquilino creado").
Estilos: usa style.css para diseño consistente con el resto de la aplicación.
→ Interfaz limpia, segura y centrada en usabilidad para el administrador.
2.habitacion.html
habitacion.html es la pantalla de control individual para una habitación, accesible por inquilinos (y dueños). Muestra estado actual y permite controlar luces, color, intensidad y modo.
Información mostrada:
• Nombre y número de habitación.
• Estado: ENCENDIDA / APAGADA.
• Color actual y modo (AUTOMÁTICO o MANUAL).
Controles:
• Encender/Apagar: botón toggle.
• Modo: alterna entre Automático/Manual (color rojo/verde).
• Rueda de colores: 15 botones circulares (CSS: .pizza-wheel + .slice) con colores predefinidos.
• Intensidad: botones + Subir / - Bajar
Modo automático: todos los controles (excepto cambiar modo) se disabled visualmente (opacos, cursor bloqueado).
→ Usa estilos de style.css + CSS inline para layout flexible y responsive.
→ Enlace Volver al piso al panel del inquilino.
3.index_dueño.html
index_dueño.html es el panel de administración exclusivo para el usuario con rol dueño. Permite gestionar inquilinos y acceder a sus pisos.
Acciones disponibles:
• Crear Nuevo Inquilino: enlace directo al formulario.
• Cerrar Sesión: logout seguro.
• Lista de inquilinos: muestra cada usuario con botón Ver Piso que lleva a sus habitaciones.
→ Interfaz minimalista, clara y centrada en la gestión administrativa. Usa estilos globales de style.css para consistencia visual.
4.index_inquilino.html
index_inquilino.html es el panel principal del inquilino, que muestra un resumen visual de todas sus habitaciones en una cuadrícula responsive.
Elementos clave:
• Header: título “Mi piso”, botón Volver (al panel del dueño, si aplica) y Cerrar Sesión.
• Cuadrícula de habitaciones: cada tarjeta muestra:
→ Nombre
→ Estado de luz (Encendida / Apagada)
→ Color actual
→ Intensidad (%)
→ Modo (Automático / Manual)
→ Botón Controlar → enlace a habitacion.html
→ Diseño limpio y funcional, optimizado para móviles. Usa style.css para estilos globales y estructura de tarjetas.
5.login.html
login.html es la pantalla de inicio de sesión del sistema, con diseño limpio y enfocado en la usabilidad.
Elementos principales:
• Logo SVG en la parte superior (img_inicio.svg) para identidad visual.
• Formulario centrado con campos:
→ usuario (texto, autocompletado)
→ contraseña (oculta, autocompletado)
• Botón Entrar que envía POST a /login.
• Muestra mensajes flash (éxito o error) debajo del formulario.
→ Usa style.css para estilos globales y clases como .login-page, .logo-container y .login-container para un diseño moderno, responsive y profesional.
6.piso_inquilino.html
piso_inquilino.html es la vista detallada del piso para el dueño, mostrando todas las habitaciones de un inquilino específico en una cuadrícula clara y responsive.
Características:
• Header: título “Piso del Inquilino”, botón Volver al panel del dueño y Cerrar Sesión.
• Cuadrícula de habitaciones: cada tarjeta incluye:
→ Nombre de la habitación
→ Estado de luz (Encendida / Apagada)
→ Color actual
→ Intensidad en porcentaje
→ Modo (Automático / Manual)
→ Botón Controlar → enlace a habitacion.html
→ Permite al dueño inspeccionar y acceder al control de cualquier habitación del inquilino. Usa style.css para diseño consistente y profesional.
ESTILO
1.style.css
style.css es el hoja de estilos global del proyecto, que define una interfaz moderna, responsive y consistente con diseño tipo “glassmorphism” y animaciones sutiles.
Características clave:
• Fondo dinámico con imagen fija y contenedores semitransparentes con backdrop-filter: blur.
• Botones interactivos: gradiente azul, hover con escala y sombra, estados [disabled] atenuados (excepto .slice).
• Rueda de colores (pizza wheel): 15 rebanadas con clip-path, rotación precisa (24° por slice), hover con escala y brillo.
• Estados deshabilitados: en modo automático, los controles se oscurecen (opacity: 0.6 + filter: brightness(0.6)) sin desaparecer.
• Grid responsive para tarjetas de habitaciones, formularios centrados y mensajes flash con colores semánticos.
→ Optimizado para móviles y escritorio. Incluye animación de entrada (fadeIn) y transiciones suaves en todos los elementos interactivos.