import gradio as gr import joblib import numpy as np import os import requests import time import threading from datetime import datetime from sklearn.ensemble import RandomForestClassifier # Configuración de la API de Node-RED NODE_RED_URL = "https://appairedecolmena.es/colmena1/datos" USERNAME = "tu_usuario" PASSWORD = "tu_contraseña" # Ruta del modelo modelo_path = "modelo_colmena.pkl" # Cargar el modelo si existe, si no, crearlo vacío if os.path.exists(modelo_path): modelo = joblib.load(modelo_path) else: modelo = RandomForestClassifier(n_estimators=100) # Variable para rastrear el último timestamp ultimo_timestamp = None def obtener_datos_colmena(): """Obtiene los datos de Node-RED con autenticación.""" try: respuesta = requests.get(NODE_RED_URL, auth=(USERNAME, PASSWORD), timeout=5) if respuesta.status_code == 200: return respuesta.json() else: print(f"⚠️ Error en la API de Node-RED: {respuesta.status_code}") return None except Exception as e: print("❌ No se pudo conectar a Node-RED:", e) return None def entrenar_nuevo_modelo(datos): """Entrena un nuevo modelo con los datos recibidos.""" global modelo # Convertir los datos en un array entrada = np.array([[float(datos["temperaturaInterior"]), float(datos["humedadInterior"]), float(datos["peso"]), float(datos["co2"]), float(datos["vco"]), float(datos["frecuencia"]), float(datos["voltaje"]), float(datos["temperatura_exterior"]), float(datos["humedad_exterior"]), float(datos["ver_tempSelect"])]]) # Salidas: [ultrasonido, calefactor, ventilador] salida = np.array([[int(datos["ver_ultrasonido"]), int(datos["ver_calefactor"]), int(datos["ver_ventilador"])]]) # Reentrenar el modelo modelo.fit(entrada, salida) # Guardar el nuevo modelo joblib.dump(modelo, modelo_path) print("✅ Modelo actualizado con nuevos datos.") def verificar_nuevos_datos(): """Consulta Node-RED cada hora y aprende si hay datos nuevos.""" global ultimo_timestamp while True: datos = obtener_datos_colmena() if datos: timestamp_actual = datos["timestamp"] if timestamp_actual != ultimo_timestamp: print(f"📌 Nuevos datos detectados: {timestamp_actual}") entrenar_nuevo_modelo(datos) ultimo_timestamp = timestamp_actual else: print("⏳ No hay datos nuevos, esperando la próxima consulta...") else: print("⚠️ No se pudieron obtener datos.") # Esperar 1 hora antes de la próxima consulta time.sleep(3600) # Iniciar el proceso en segundo plano thread = threading.Thread(target=verificar_nuevos_datos, daemon=True) thread.start() # Función para hacer predicciones con el modelo def predecir(temp, humedad, peso, co2, vco, frecuencia, voltaje, temp_ext, humedad_ext, ver_tempSelect): valores = [temp, humedad, peso, co2, vco, frecuencia, voltaje, temp_ext, humedad_ext, ver_tempSelect] valores_limpios = [0 if v is None or np.isnan(v) else v for v in valores] # Reemplaza NaN y None con 0 entrada = np.array([valores_limpios]) prediccion = modelo.predict(entrada)[0] # El modelo devuelve [ultrasonido, calefactor, ventilador] mensaje = f"🔹 Ultrasonido: {'ENCENDER' if prediccion[0] == 1 else 'APAGAR'}" mensaje += f"\n🔹 Calefactor: {'ENCENDER' if prediccion[1] == 1 else 'APAGAR'}" mensaje += f"\n🔹 Ventilador: {'ENCENDER' if prediccion[2] == 1 else 'APAGAR'}" return mensaje # Crear la API en Gradio iface = gr.Interface( fn=predecir, inputs=["number", "number", "number", "number", "number", "number", "number", "number", "number", "number"], outputs="text", title="🐝 IA Inteligente para Colmenas", description="Introduce los datos de la colmena y la IA predecirá si es necesario activar ventilador, calefactor y ultrasonidos." ) # Lanzar la API iface.launch()