Skip to content

Commit 4dd5e9e

Browse files
committed
telegram y cosas
1 parent 72540f3 commit 4dd5e9e

File tree

7 files changed

+317
-8
lines changed

7 files changed

+317
-8
lines changed

backend/bot.py

Lines changed: 144 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,144 @@
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")

backend/poetry.lock

Lines changed: 159 additions & 2 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

backend/pyproject.toml

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,9 @@ SQLAlchemy = "^2.0.35"
1212
uvicorn = "^0.31.0"
1313
paho-mqtt = "^2.1.0"
1414
pandas = "^2.2.3"
15+
python-jose = "^3.3.0"
16+
python-multipart = "^0.0.17"
17+
python-telegram-bot = "^21.7"
1518

1619

1720
[build-system]

backend/test.db

16 KB
Binary file not shown.

backend/token_bot.env

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,2 @@
1+
TELEGRAM_BOT_TOKEN=7761279644:AAG0663RjkDQq-m460CiWL6YeJWnqDB2Rj8
2+
TELEGRAM_CHAT_ID=-1002352348955

frontend/src/components/MapComponent.tsx

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -54,8 +54,8 @@ const MapComponent: React.FC = () => {
5454
[-43.192349, -65.083941],
5555
[-43.33826, -65.21180],
5656
];
57-
const polygon = L.polygon(polygonCoords, { color: 'purple', fillOpacity: 0.3 }).addTo(initialMap);
58-
polygon.bindPopup('Área delimitada: Zona de interés');
57+
// const polygon = L.polygon(polygonCoords, { color: 'purple', fillOpacity: 0.3 }).addTo(initialMap);
58+
// polygon.bindPopup('Área delimitada: Zona de interés');
5959

6060
// Establecer límites máximos del mapa
6161
const bounds = L.latLngBounds(polygonCoords);

0 commit comments

Comments
 (0)