El clima en donde vivo tiene sus peculiaridades por así decirlo. Es un clima desértico en el que rara vez nieva, cualquier llovizna provoca un caos y no se digan las famosas tolvaneras en las que terminas como cucaracha de panadería.
Es normal revisar las condiciones actuales, las del día, pero rara vez reviso las predicciones a futuro, ya sea para prepararme para esas condiciones o cuando menos estar al pendiente.
Entonces fue que me dije a mi mismo ¿Y si haces un script que revise las predicciones y te avise si hay condiciones climáticas severas?
En este artículo …
- Usando Deepseek para programar en Python.
- ¿Qué son las condiciones climáticas severas?
- Requisitos
- Código del programa
- Consideraciones finales
Usando Deepseek para programar en Python.
No puedo estar ajeno al uso de las inteligencias artificiales, en estos días he estado probando Gemini, DeepSeek (nunca he usado ChatGPT) y estoy abierto a cualquier recomendación, pero me he entiendido mejor con Deepseek.
Le platiqué cual era la intención del programa y en menos de un minuto ya tenía algo de código para empezar a masticar.
Les aclaro que no todo es miel sobre hojuelas, me encontré con un par de errores. Lo bueno es que si no entiendes algo, le pides ayuda, te explica y hasta te da ejemplos de código para entender mejor y muy amablemente te «amplia» 😆 las dudas.
Otra ventaja que tengo al usar la IA para programar es que me expone a enfoques de los que no tenía idea. Hay mil formas de atacar un problema y no esta de más aprender trucos nuevos.
Por ejemplo, yo no quería publicar en el código el TOKEN de Telegram o la API_KEY necesaria para descargar los datos de OpenWeatherMap. Le pregunté a la IA que opciones tenía y me sugirió el uso de la extensión python-dotenv.
Básicamente guarda esta información en un archivo .env al que se le manda llamar dentro del programa.
Quizás estoy divagando mucho, pero recomiendo ampliamente el uso de una IA como un tutor para aprender un lenguaje, mientras más herramientas mejor.
¿Qué son las condiciones climáticas severas?
Definir que es una condición climática severa es parte del problema. Por ejemplo considero que en la Comarca Lagunera las alertas estarían más o menos definidas así:
- Temperaturas menores a 0ºC.
- Temperaturas mayores a 40ºC, muy usual en el verano.
- Precipitaciones, cualquier lluvia es inusual y generan un caos en la ciudad.
- Vientos, provocan accidentes, caídas de árboles y tolvaneras.
En otros lugares las condiciones pueden ser totalmente diferentes, pero las alertas son configurables en el código.
Pasó un detalle curioso, justo ayer hubo una tolvanera en la región, la famosa «lluvia lagunera» y no tuve ningún aviso.

Al revisar la velocidad del viento era de unos miserables 4 m/s (14 km/h aprox.) ¡¿Cómo es posible que un viento tan ligerito cause tanto desgarriate?!.
Por eso decidí integrar una alerta moderada, pero estos valores los estaré ajustando con el tiempo.
Requisitos
Cuenta en OpenWeatherMap
Para descargar la información meteorológica es necesario tener una cuenta gratuita de de OpenWeatherMap para obtener la API_KEY
- Documentación de la API para la predicción de 5 días.
- Documentación de las unidades de medida de la información.
- Información de la Latitud y la longitud de las ciudades.
La versión gratuita tiene un límite bastante generoso de 1000 llamadas al día, que no esta nada mal para este proyecto.
Bot de Telegram
También es necesario hacer un bot de Telegram. No voy a ahondar mucho en este tema, por que en internet y youtube hay un montón de información y tutoriales al respecto.
Basta y sobra decir que para recibir notificaciones por Telegram son necesarios el TOKEN del bot y el CHAT_ID del canal.
Ahora si… veamos el código.
Código del programa
Archivo .env que guarda la configuración del programa.
# -- Parámetros generales -- CITY="Tu Ciudad" # Parámetros de la API de OpenWeatherMap # API_KEY Gratuita en https://home.openweathermap.org/users/sign_up # Documentación de la API https://openweathermap.org/forecast5 API_KEY = "" # Las coordenadas están disponibles en el buscador # https://openweathermap.org/find LAT ="" LON ="" UNITS = "metric" LANG = "es" # Parámetros para telegram CHAT_ID = "" TOKEN = ""
Archivo alerta_climatica.py
import os import requests from datetime import datetime, timedelta from dotenv import load_dotenv load_dotenv() # -- Carga de parámetros # OpenWeatherMap CITY = os.getenv("CITY") API_KEY = os.getenv("API_KEY") LAT = os.getenv("LAT") LON = os.getenv("LON") UNITS = os.getenv("UNITS") LANG = os.getenv("LANG") # Telegram CHAT_ID = os.getenv("CHAT_ID") TOKEN = os.getenv("TOKEN") # Umbrales para alertas futuras (ajusta según tu región) # ajustando estos valores para falsas alarmas. # Para revisar las unidades de los valores: # https://openweathermap.org/weather-data # La velocidad del viento de la API esta en m/s # Para convertir km/h a m/s multiplicar por 0.2778 ALERT_THRESHOLDS = { "temp_min": 0, # Temperatura mínima (°C) "temp_max": 40, # Temperatura máxima (°C) "precipitation": 20, # Lluvia acumulada (mm en 3h) "wind_speed_mod": 20, # Vientos moderados - 20 km/s aprox "wind_speed_alert":40 # Vientos fuertes, mayores de 40 km/h } def ms2km(ms): # Convierte m/s a km/h return round(ms/0.2778,2) def obtener_prediccion(): url = f"https://api.openweathermap.org/data/2.5/forecast?lat={LAT}&lon={LON}&units={UNITS}&lang={LANG}&appid={API_KEY}" print(url) response = requests.get(url) return response.json() def analizar_pronostico(data): alertas = [] ahora = datetime.now() for entry in data["list"]: # Calcular diferencia de tiempo fecha_prediccion = datetime.fromtimestamp(entry["dt"]) diferencia = fecha_prediccion - ahora # Solo considerar próximas 24-120 horas if timedelta(hours=24) <= diferencia <= timedelta(hours=120): temp = entry["main"]["temp"] lluvia = entry.get("rain", {}).get("3h", 0) # Para mayor claridad, convertí los m/s a km/h viento = ms2km(entry["wind"]["speed"]) # humedad = entry["main"]["humidity"] clima = entry["weather"][0]["description"] # Verificar umbrales if temp <= ALERT_THRESHOLDS["temp_min"]: alertas.append(f"Temperatura BAJA ({temp}°C) el {fecha_prediccion.strftime('%d/%m %H:%M')}") elif temp >= ALERT_THRESHOLDS["temp_max"]: alertas.append(f"Temperatura ALTA ({temp}°C) el {fecha_prediccion.strftime('%d/%m %H:%M')}") if lluvia >= ALERT_THRESHOLDS["precipitation"]: alertas.append(f"Lluvia SEVERA ({lluvia} mm/3h) el {fecha_prediccion.strftime('%d/%m %H:%M')}") if viento >= ALERT_THRESHOLDS["wind_speed_mod"] and viento <= ALERT_THRESHOLDS["wind_speed_alert"]: alertas.append(f"Vientos moderados (viento: {viento} km/h) el {fecha_prediccion.strftime('%d/%m %H:%M')}") if viento >= ALERT_THRESHOLDS["wind_speed_alert"]: alertas.append(f"Vientos fuertes (viento: {viento} km/h) el {fecha_prediccion.strftime('%d/%m %H:%M')}") return alertas def enviar_alerta(mensaje): # Manda notificación al canal de telegram url = "https://api.telegram.org/bot" + TOKEN + "/sendMessage" params = { 'chat_id': CHAT_ID, 'text': mensaje, 'parse_mode':"Markdown" } print(mensaje) requests.post(url, params=params) if __name__ == "__main__": datos = obtener_prediccion() alertas = analizar_pronostico(datos) print("⛅ análisis terminado.") if alertas: mensaje = f"⚠ Alertas para *{CITY}* (próximas 24-120 h):\n" + "\n".join(alertas) enviar_alerta(mensaje)
Consideraciones finales
En un principio iba a mandar la alerta por correo electrónico, que también es posible, pero me pareció más cool hacerlo por telegram.

A mi me gusta ejecutar el programa durante el arranque de mi computadora. Claro que si no la arranco o estoy de vacaciones el programa no se ejecuta. Pero estoy bien con eso.
También muestra las alertas en la terminal por si quiero ejecutarlo manualmente.

Algunos querrán ejecutar el programa en un cronjob pero eso será al gusto de cada quien.
Por último, hice el proyecto usando Poetry para el manejo de las dependencias y entornos virtuales.
¿Listo para crear tu propio sistema de alertas? Clona el repositorio Alerta Climática desde GitHub y adáptalo a tus necesidades.
Muchas gracias por todo lo que publicas y ayudas. Me gustan tus referencias.