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()