Spaces:
Sleeping
Sleeping
File size: 4,131 Bytes
8ae2c7c d39334c 17a8c89 d39334c 17a8c89 d39334c 17a8c89 d39334c 17a8c89 d39334c e49d6b5 383dc66 341a8c4 17a8c89 d39334c 17a8c89 d39334c 8ae2c7c d39334c 8ae2c7c d39334c 17a8c89 8ae2c7c 17a8c89 8ae2c7c |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 |
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()
|