IAColmenas / app.py
XA-vito's picture
Update app.py
17a8c89 verified
raw
history blame
4.13 kB
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()