|
| 1 | +import os |
| 2 | +from dotenv import load_dotenv |
| 3 | +import asyncio |
| 4 | +from telegram import Bot |
| 5 | +import paho.mqtt.client as mqtt |
| 6 | +import json |
| 7 | +from datetime import datetime |
| 8 | +from pathlib import Path |
| 9 | +from dotenv import load_dotenv |
| 10 | + |
| 11 | +# Obtener la ruta del directorio donde se encuentra bot.py |
| 12 | +base_dir = Path(__file__).parent |
| 13 | +# Construir la ruta completa al archivo .env |
| 14 | +dotenv_path = base_dir / 'token_bot.env' |
| 15 | + |
| 16 | +# Cargar las variables de entorno |
| 17 | +load_dotenv(dotenv_path=dotenv_path) |
| 18 | + |
| 19 | +#7208214203 |
| 20 | +#6738309138 |
| 21 | +#6915513359 |
| 22 | + |
| 23 | +# Cargar las variables de entorno desde el archivo .env |
| 24 | +#dotenv_path = r'C:\Users\Franco\Desktop\aaa\RMA-grupo-3\backend\token_bot.env' |
| 25 | +load_dotenv(dotenv_path=dotenv_path) |
| 26 | +BOT_TOKEN = os.getenv("TELEGRAM_BOT_TOKEN") |
| 27 | +CHAT_ID = os.getenv("TELEGRAM_CHAT_ID") |
| 28 | +if not BOT_TOKEN or not CHAT_ID: |
| 29 | + raise ValueError("El BOT_TOKEN o CHAT_ID no están configurados correctamente.") |
| 30 | + |
| 31 | +# Inicializa el bot de Telegram |
| 32 | +bot = Bot(token=BOT_TOKEN) |
| 33 | + |
| 34 | +# Función asíncrona para enviar mensajes al chat de Telegram |
| 35 | +async def send_telegram_message(message: str): |
| 36 | + """Función asíncrona para enviar mensajes al chat de Telegram.""" |
| 37 | + try: |
| 38 | + await bot.send_message(chat_id=CHAT_ID, text=message) |
| 39 | + print(f"Mensaje enviado: {message}") |
| 40 | + except Exception as e: |
| 41 | + print(f"Error al enviar mensaje: {e}") |
| 42 | + |
| 43 | +# Función para definir los valores normales para diferentes tipos de datos |
| 44 | +def is_data_normal(type: str, dato: float) -> bool: |
| 45 | + """Devuelve True si el dato está dentro del rango normal para el tipo de dato.""" |
| 46 | + if type == 'temp_t': |
| 47 | + # Rango normal para temperatura (ejemplo 18°C a 30°C) |
| 48 | + return 13 <= dato <= 28 |
| 49 | + elif type == 'altitude_t': |
| 50 | + # Rango normal para altitud (ejemplo 0 m a 5000 m) |
| 51 | + return 0 <= dato <= 20 |
| 52 | + elif type == 'voltage_t': |
| 53 | + # Rango normal para voltaje (ejemplo 0V a 240V) |
| 54 | + return 1 <= dato <= 5 |
| 55 | + elif type == 'rainfall_t': |
| 56 | + # Rango normal para lluvia (ejemplo 0 mm a 100 mm) |
| 57 | + return 0 <= dato <= 8 |
| 58 | + else: |
| 59 | + # Para otros tipos de datos, puedes asumir que los valores siempre son normales |
| 60 | + return True |
| 61 | + |
| 62 | +# Función para manejar la conexión con el broker MQTT |
| 63 | +def on_connect(client, userdata, flags, rc): |
| 64 | + print(f"Conectado al broker con código de resultado: {rc}") |
| 65 | + if rc == 0: |
| 66 | + print("Conexión exitosa. Suscrito al tópico...") |
| 67 | + client.subscribe("test_topic") # Asegúrate de que este sea el tópico correcto |
| 68 | + else: |
| 69 | + print("Error de conexión:", rc) |
| 70 | + |
| 71 | +def on_message(client, userdata, message): |
| 72 | + print(f"Mensaje recibido en el tópico {message.topic}: {message.payload.decode()}") |
| 73 | + payload = message.payload.decode("utf-8") |
| 74 | + payload = payload.replace('\'', '"') # Convertir a JSON válido |
| 75 | + try: |
| 76 | + data = json.loads(payload) |
| 77 | + print(f"Datos extraídos: {data}") |
| 78 | + # Extraer los campos del mensaje |
| 79 | + nodo_id = data.get('id', 'Desconocido') |
| 80 | + type = data.get('type', 'Desconocido') |
| 81 | + dato = data.get('data', 'Desconocido') |
| 82 | + time = data.get('time', '1970-01-01 00:00:00.000') # Valor predeterminado con milisegundos |
| 83 | + |
| 84 | + # Convertir 'time' a datetime con milisegundos |
| 85 | + try: |
| 86 | + time = datetime.strptime(time, "%Y-%m-%d %H:%M:%S.%f") # Formato con milisegundos |
| 87 | + except ValueError: |
| 88 | + print(f"Error al convertir 'time' a datetime con milisegundos: {time}") |
| 89 | + return |
| 90 | + |
| 91 | + # Convertir 'dato' a float, si es posible |
| 92 | + try: |
| 93 | + dato = float(dato) |
| 94 | + except ValueError: |
| 95 | + print(f"Error al convertir 'dato' a float: {dato}") |
| 96 | + return |
| 97 | + |
| 98 | + # Verificar si el dato está dentro del rango normal para el tipo de dato |
| 99 | + if not is_data_normal(type, dato): |
| 100 | + # Chequeo de tipo para personalizar el mensaje |
| 101 | + if type == "temp_t": |
| 102 | + mensaje = f"Alerta: Nuevo dato recibido fuera del rango normal. Nodo {nodo_id}: {dato} de tipo Temperatura" |
| 103 | + elif type == "voltage_t": |
| 104 | + mensaje = f"Alerta: Nuevo dato recibido fuera del rango normal. Nodo {nodo_id}: {dato} de tipo Tensión" |
| 105 | + elif type == "altitude_T": |
| 106 | + mensaje = f"Alerta: Nuevo dato recibido fuera del rango normal. Nodo {nodo_id}: {dato} de tipo Altura" |
| 107 | + elif type == "rainfall_T": |
| 108 | + mensaje = f"Alerta: Nuevo dato recibido fuera del rango normal. Nodo {nodo_id}: {dato} de tipo Precipitación" |
| 109 | + else: |
| 110 | + mensaje = f"Alerta: Nuevo dato recibido fuera del rango normal. Nodo {nodo_id}: {dato} de tipo {type}" |
| 111 | + # Enviar el mensaje con Telegram |
| 112 | + asyncio.run(send_telegram_message(mensaje)) |
| 113 | + else: |
| 114 | + print(f"Dato dentro del rango normal: {dato}") |
| 115 | + except json.JSONDecodeError as e: |
| 116 | + print(f"Error al decodificar el mensaje: {e}") |
| 117 | + |
| 118 | +# Función para manejar la suscripción |
| 119 | +def on_subscribe(client, userdata, mid, granted_qos): |
| 120 | + print(f"Suscripción exitosa al tópico. QoS: {granted_qos}") |
| 121 | + |
| 122 | +# Función para configurar y conectar el cliente MQTT |
| 123 | +def setup_mqtt(): |
| 124 | + client = mqtt.Client() |
| 125 | + |
| 126 | + # Asignar las funciones de callback |
| 127 | + client.on_connect = on_connect |
| 128 | + client.on_message = on_message |
| 129 | + client.on_subscribe = on_subscribe |
| 130 | + |
| 131 | + try: |
| 132 | + client.connect("localhost", 1883, 60) # Conéctate al broker en localhost |
| 133 | + except Exception as e: |
| 134 | + print(f"Error al conectar con el broker MQTT: {e}") |
| 135 | + return |
| 136 | + |
| 137 | + # Iniciar el loop para recibir mensajes |
| 138 | + client.loop_forever() |
| 139 | + |
| 140 | +# Llamar a la función de configuración MQTT |
| 141 | +setup_mqtt() |
| 142 | + |
| 143 | +# Genera un mensaje de prueba para confirmar que todo está en funcionamiento |
| 144 | +print("FIN") |
0 commit comments