<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Openweathermap on LinuxmanR4</title><link>https://linuxmanr4.com/tags/openweathermap/</link><description>Recent content in Openweathermap on LinuxmanR4</description><generator>Hugo -- gohugo.io</generator><language>es</language><copyright>LinuxmanR4</copyright><lastBuildDate>Fri, 28 Mar 2025 19:03:14 +0000</lastBuildDate><atom:link href="https://linuxmanr4.com/tags/openweathermap/index.xml" rel="self" type="application/rss+xml"/><item><title>Automatiza Alertas Climáticas con Python y Telegram: Que nunca más te sorprenda una tormenta</title><link>https://linuxmanr4.com/2025/03/28/alertas-climaticas-python-telegram/</link><pubDate>Fri, 28 Mar 2025 19:03:14 +0000</pubDate><guid>https://linuxmanr4.com/2025/03/28/alertas-climaticas-python-telegram/</guid><description>&lt;img src="https://linuxmanr4.com/wp-content/uploads/2025/03/alerta_climatica_python_telegram.jpg" alt="Featured image of post Automatiza Alertas Climáticas con Python y Telegram: Que nunca más te sorprenda una tormenta" />&lt;p>Les presento un programa de alertas climáticas con Python usando la API de OpenWeatherMap y enviando notificaciones a un canal de Telegram. Les prometo que es un tema interesante.&lt;/p>
&lt;p>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.&lt;/p>
&lt;p>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.&lt;/p>
&lt;p>Entonces fue que me dije a mí mismo ¿Y si haces un script que revise las predicciones y te avise si hay condiciones climáticas severas?&lt;/p>
&lt;h2 id="usando-deepseek-para-programar-en-python">Usando Deepseek para programar en Python.
&lt;/h2>&lt;p>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 entendido mejor con &lt;a class="link" href="https://www.deepseek.com/en" target="_blank" rel="noopener"
>Deepseek&lt;/a>
&lt;span style="white-space: nowrap;">&lt;svg width=".7em"
height=".7em" viewBox="0 0 21 21" xmlns="http://www.w3.org/2000/svg">
&lt;path d="m13 3l3.293 3.293l-7 7l1.414 1.414l7-7L21 11V3z" fill="currentColor" />
&lt;path d="M19 19H5V5h7l-2-2H5c-1.103 0-2 .897-2 2v14c0 1.103.897 2 2 2h14c1.103 0 2-.897 2-2v-5l-2-2v7z"
fill="currentColor">
&lt;/svg>&lt;/span>
.&lt;/p>
&lt;p>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.&lt;/p>
&lt;p>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 &amp;ldquo;amplia&amp;rdquo; 😆 las dudas.&lt;/p>
&lt;p>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.&lt;/p>
&lt;p>Por ejemplo, yo no quería publicar en el código el TOKEN de &lt;a class="link" href="https://telegram.org/" target="_blank" rel="noopener"
>Telegram&lt;/a>
&lt;span style="white-space: nowrap;">&lt;svg width=".7em"
height=".7em" viewBox="0 0 21 21" xmlns="http://www.w3.org/2000/svg">
&lt;path d="m13 3l3.293 3.293l-7 7l1.414 1.414l7-7L21 11V3z" fill="currentColor" />
&lt;path d="M19 19H5V5h7l-2-2H5c-1.103 0-2 .897-2 2v14c0 1.103.897 2 2 2h14c1.103 0 2-.897 2-2v-5l-2-2v7z"
fill="currentColor">
&lt;/svg>&lt;/span>
o la API_KEY necesaria para descargar los datos de &lt;a class="link" href="https://openweathermap.org/" target="_blank" rel="noopener"
>OpenWeatherMap&lt;/a>
&lt;span style="white-space: nowrap;">&lt;svg width=".7em"
height=".7em" viewBox="0 0 21 21" xmlns="http://www.w3.org/2000/svg">
&lt;path d="m13 3l3.293 3.293l-7 7l1.414 1.414l7-7L21 11V3z" fill="currentColor" />
&lt;path d="M19 19H5V5h7l-2-2H5c-1.103 0-2 .897-2 2v14c0 1.103.897 2 2 2h14c1.103 0 2-.897 2-2v-5l-2-2v7z"
fill="currentColor">
&lt;/svg>&lt;/span>
. Le pregunté a la IA que opciones tenía y me sugirió el uso de la extensión &lt;a class="link" href="https://pypi.org/project/python-dotenv/" target="_blank" rel="noopener"
>python-dotenv&lt;/a>
&lt;span style="white-space: nowrap;">&lt;svg width=".7em"
height=".7em" viewBox="0 0 21 21" xmlns="http://www.w3.org/2000/svg">
&lt;path d="m13 3l3.293 3.293l-7 7l1.414 1.414l7-7L21 11V3z" fill="currentColor" />
&lt;path d="M19 19H5V5h7l-2-2H5c-1.103 0-2 .897-2 2v14c0 1.103.897 2 2 2h14c1.103 0 2-.897 2-2v-5l-2-2v7z"
fill="currentColor">
&lt;/svg>&lt;/span>
.&lt;/p>
&lt;p>Básicamente, guarda esta información en un archivo &lt;strong>.env&lt;/strong> al que se le manda llamar dentro del programa.&lt;/p>
&lt;p>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.&lt;/p>
&lt;h2 id="qué-son-las-condiciones-climáticas-severas">¿Qué son las condiciones climáticas severas?
&lt;/h2>&lt;p>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í:&lt;/p>
&lt;ul>
&lt;li>Temperaturas menores a 0ºC.&lt;/li>
&lt;li>Temperaturas mayores a 40ºC, muy usual en el verano.&lt;/li>
&lt;li>Precipitaciones, cualquier lluvia es inusual y generan un caos en la ciudad.&lt;/li>
&lt;li>Vientos, provocan accidentes, caídas de árboles y tolvaneras.&lt;/li>
&lt;/ul>
&lt;p>En otros lugares las condiciones pueden ser totalmente diferentes, pero las alertas son configurables en el código.&lt;/p>
&lt;p>Pasó un detalle curioso, justo ayer hubo una tolvanera en la región, la famosa &amp;ldquo;lluvia lagunera&amp;rdquo; y no tuve ningún aviso.&lt;/p>
&lt;figure>&lt;img src="https://linuxmanr4.com/wp-content/uploads/2025/03/tolvanera%5Ftorreon%5F2025.jpg"
alt="La típica &amp;#39;lluvia lagunera&amp;#39;">&lt;figcaption>
&lt;p>La típica &amp;rsquo;lluvia lagunera'&lt;/p>
&lt;/figcaption>
&lt;/figure>
&lt;p>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?!.&lt;/p>
&lt;p>Por eso decidí integrar una alerta &lt;strong>moderada&lt;/strong>, pero estos valores los estaré ajustando con el tiempo.&lt;/p>
&lt;h2 id="requisitos">Requisitos
&lt;/h2>&lt;h3 id="cuenta-en-openweathermap">Cuenta en OpenWeatherMap
&lt;/h3>&lt;p>Para descargar la información meteorológica es necesario tener una &lt;a class="link" href="https://home.openweathermap.org/users/sign_up" target="_blank" rel="noopener"
>cuenta gratuita de de OpenWeatherMap&lt;/a>
&lt;span style="white-space: nowrap;">&lt;svg width=".7em"
height=".7em" viewBox="0 0 21 21" xmlns="http://www.w3.org/2000/svg">
&lt;path d="m13 3l3.293 3.293l-7 7l1.414 1.414l7-7L21 11V3z" fill="currentColor" />
&lt;path d="M19 19H5V5h7l-2-2H5c-1.103 0-2 .897-2 2v14c0 1.103.897 2 2 2h14c1.103 0 2-.897 2-2v-5l-2-2v7z"
fill="currentColor">
&lt;/svg>&lt;/span>
para obtener la &lt;strong>API_KEY&lt;/strong>&lt;/p>
&lt;ul>
&lt;li>&lt;a class="link" href="https://openweathermap.org/forecast5" target="_blank" rel="noopener"
>Documentación de la API para la predicción de 5 días&lt;/a>
&lt;span style="white-space: nowrap;">&lt;svg width=".7em"
height=".7em" viewBox="0 0 21 21" xmlns="http://www.w3.org/2000/svg">
&lt;path d="m13 3l3.293 3.293l-7 7l1.414 1.414l7-7L21 11V3z" fill="currentColor" />
&lt;path d="M19 19H5V5h7l-2-2H5c-1.103 0-2 .897-2 2v14c0 1.103.897 2 2 2h14c1.103 0 2-.897 2-2v-5l-2-2v7z"
fill="currentColor">
&lt;/svg>&lt;/span>
.&lt;/li>
&lt;li>&lt;a class="link" href="https://openweathermap.org/weather-data" target="_blank" rel="noopener"
>Documentación de las unidades de medida de la información&lt;/a>
&lt;span style="white-space: nowrap;">&lt;svg width=".7em"
height=".7em" viewBox="0 0 21 21" xmlns="http://www.w3.org/2000/svg">
&lt;path d="m13 3l3.293 3.293l-7 7l1.414 1.414l7-7L21 11V3z" fill="currentColor" />
&lt;path d="M19 19H5V5h7l-2-2H5c-1.103 0-2 .897-2 2v14c0 1.103.897 2 2 2h14c1.103 0 2-.897 2-2v-5l-2-2v7z"
fill="currentColor">
&lt;/svg>&lt;/span>
.&lt;/li>
&lt;li>&lt;a class="link" href="https://openweathermap.org/find" target="_blank" rel="noopener"
>Información de la Latitud y la longitud de las ciudades&lt;/a>
&lt;span style="white-space: nowrap;">&lt;svg width=".7em"
height=".7em" viewBox="0 0 21 21" xmlns="http://www.w3.org/2000/svg">
&lt;path d="m13 3l3.293 3.293l-7 7l1.414 1.414l7-7L21 11V3z" fill="currentColor" />
&lt;path d="M19 19H5V5h7l-2-2H5c-1.103 0-2 .897-2 2v14c0 1.103.897 2 2 2h14c1.103 0 2-.897 2-2v-5l-2-2v7z"
fill="currentColor">
&lt;/svg>&lt;/span>
.&lt;/li>
&lt;/ul>
&lt;p>La versión gratuita tiene un límite bastante generoso de 1000 llamadas al día, que no esta nada mal para este proyecto.&lt;/p>
&lt;h3 id="bot-de-telegram">Bot de Telegram
&lt;/h3>&lt;p>También es necesario hacer un bot de Telegram. No voy a ahondar mucho en este tema, en internet y YouTube hay un montón de información y tutoriales al respecto.&lt;/p>
&lt;p>Basta y sobra decir que para recibir notificaciones por Telegram son necesarios el &lt;strong>TOKEN&lt;/strong> del bot y el &lt;strong>CHAT_ID&lt;/strong> del canal.&lt;/p>
&lt;p>Ahora si&amp;hellip; veamos el código.&lt;/p>
&lt;h2 id="código-del-programa">Código del programa
&lt;/h2>&lt;p>Archivo &lt;strong>.env&lt;/strong> que guarda la configuración del programa.&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-fallback" data-lang="fallback">&lt;span class="line">&lt;span class="cl"># -- Parámetros generales --
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">CITY=&amp;#34;Tu Ciudad&amp;#34;
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"># Parámetros de la API de OpenWeatherMap
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"># API_KEY Gratuita en https://home.openweathermap.org/users/sign_up
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"># Documentación de la API https://openweathermap.org/forecast5
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">API_KEY = &amp;#34;&amp;#34;
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"># Las coordenadas están disponibles en el buscador
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"># https://openweathermap.org/find
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">LAT =&amp;#34;&amp;#34;
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">LON =&amp;#34;&amp;#34;
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">UNITS = &amp;#34;metric&amp;#34;
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">LANG = &amp;#34;es&amp;#34;
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"># Parámetros para telegram
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">CHAT_ID = &amp;#34;&amp;#34;
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">TOKEN = &amp;#34;&amp;#34;
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>Archivo &lt;strong>alerta_climatica.py&lt;/strong>&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-python" data-lang="python">&lt;span class="line">&lt;span class="cl">&lt;span class="kn">import&lt;/span> &lt;span class="nn">os&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="kn">import&lt;/span> &lt;span class="nn">requests&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="kn">from&lt;/span> &lt;span class="nn">datetime&lt;/span> &lt;span class="kn">import&lt;/span> &lt;span class="n">datetime&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">timedelta&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="kn">from&lt;/span> &lt;span class="nn">dotenv&lt;/span> &lt;span class="kn">import&lt;/span> &lt;span class="n">load_dotenv&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="n">load_dotenv&lt;/span>&lt;span class="p">()&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># -- Carga de parámetros&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># OpenWeatherMap&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="n">CITY&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">os&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">getenv&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s2">&amp;#34;CITY&amp;#34;&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="n">API_KEY&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">os&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">getenv&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s2">&amp;#34;API_KEY&amp;#34;&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="n">LAT&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">os&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">getenv&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s2">&amp;#34;LAT&amp;#34;&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="n">LON&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">os&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">getenv&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s2">&amp;#34;LON&amp;#34;&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="n">UNITS&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">os&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">getenv&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s2">&amp;#34;UNITS&amp;#34;&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="n">LANG&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">os&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">getenv&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s2">&amp;#34;LANG&amp;#34;&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># Telegram&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="n">CHAT_ID&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">os&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">getenv&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s2">&amp;#34;CHAT_ID&amp;#34;&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="n">TOKEN&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">os&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">getenv&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s2">&amp;#34;TOKEN&amp;#34;&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># Umbrales para alertas futuras (ajusta según tu región)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># ajustando estos valores para falsas alarmas.&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># Para revisar las unidades de los valores:&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># https://openweathermap.org/weather-data&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># La velocidad del viento de la API esta en m/s&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># Para convertir km/h a m/s multiplicar por 0.2778&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="n">ALERT_THRESHOLDS&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="p">{&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="s2">&amp;#34;temp_min&amp;#34;&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="mi">0&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="c1"># Temperatura mínima (°C)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="s2">&amp;#34;temp_max&amp;#34;&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="mi">40&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="c1"># Temperatura máxima (°C)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="s2">&amp;#34;precipitation&amp;#34;&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="mi">20&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="c1"># Lluvia acumulada (mm en 3h)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="s2">&amp;#34;wind_speed_mod&amp;#34;&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="mi">20&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="c1"># Vientos moderados - 20 km/s aprox&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="s2">&amp;#34;wind_speed_alert&amp;#34;&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="mi">40&lt;/span> &lt;span class="c1"># Vientos fuertes, mayores de 40 km/h&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="p">}&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="k">def&lt;/span> &lt;span class="nf">ms2km&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">ms&lt;/span>&lt;span class="p">):&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="c1"># Convierte m/s a km/h&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">return&lt;/span> &lt;span class="nb">round&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">ms&lt;/span>&lt;span class="o">/&lt;/span>&lt;span class="mf">0.2778&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="mi">2&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="k">def&lt;/span> &lt;span class="nf">obtener_prediccion&lt;/span>&lt;span class="p">():&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">url&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="sa">f&lt;/span>&lt;span class="s2">&amp;#34;https://api.openweathermap.org/data/2.5/forecast?lat=&lt;/span>&lt;span class="si">{&lt;/span>&lt;span class="n">LAT&lt;/span>&lt;span class="si">}&lt;/span>&lt;span class="s2">&amp;amp;lon=&lt;/span>&lt;span class="si">{&lt;/span>&lt;span class="n">LON&lt;/span>&lt;span class="si">}&lt;/span>&lt;span class="s2">&amp;amp;units=&lt;/span>&lt;span class="si">{&lt;/span>&lt;span class="n">UNITS&lt;/span>&lt;span class="si">}&lt;/span>&lt;span class="s2">&amp;amp;lang=&lt;/span>&lt;span class="si">{&lt;/span>&lt;span class="n">LANG&lt;/span>&lt;span class="si">}&lt;/span>&lt;span class="s2">&amp;amp;appid=&lt;/span>&lt;span class="si">{&lt;/span>&lt;span class="n">API_KEY&lt;/span>&lt;span class="si">}&lt;/span>&lt;span class="s2">&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nb">print&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">url&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">response&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">requests&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">get&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">url&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">return&lt;/span> &lt;span class="n">response&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">json&lt;/span>&lt;span class="p">()&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="k">def&lt;/span> &lt;span class="nf">analizar_pronostico&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">data&lt;/span>&lt;span class="p">):&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">alertas&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="p">[]&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">ahora&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">datetime&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">now&lt;/span>&lt;span class="p">()&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">for&lt;/span> &lt;span class="n">entry&lt;/span> &lt;span class="ow">in&lt;/span> &lt;span class="n">data&lt;/span>&lt;span class="p">[&lt;/span>&lt;span class="s2">&amp;#34;list&amp;#34;&lt;/span>&lt;span class="p">]:&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="c1"># Calcular diferencia de tiempo&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">fecha_prediccion&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">datetime&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">fromtimestamp&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">entry&lt;/span>&lt;span class="p">[&lt;/span>&lt;span class="s2">&amp;#34;dt&amp;#34;&lt;/span>&lt;span class="p">])&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">diferencia&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">fecha_prediccion&lt;/span> &lt;span class="o">-&lt;/span> &lt;span class="n">ahora&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="c1"># Solo considerar próximas 24-120 horas&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">if&lt;/span> &lt;span class="n">timedelta&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">hours&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="mi">24&lt;/span>&lt;span class="p">)&lt;/span> &lt;span class="o">&amp;lt;=&lt;/span> &lt;span class="n">diferencia&lt;/span> &lt;span class="o">&amp;lt;=&lt;/span> &lt;span class="n">timedelta&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">hours&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="mi">120&lt;/span>&lt;span class="p">):&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">temp&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">entry&lt;/span>&lt;span class="p">[&lt;/span>&lt;span class="s2">&amp;#34;main&amp;#34;&lt;/span>&lt;span class="p">][&lt;/span>&lt;span class="s2">&amp;#34;temp&amp;#34;&lt;/span>&lt;span class="p">]&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">lluvia&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">entry&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">get&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s2">&amp;#34;rain&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="p">{})&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">get&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s2">&amp;#34;3h&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="mi">0&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="c1"># Para mayor claridad, convertí los m/s a km/h&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">viento&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">ms2km&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">entry&lt;/span>&lt;span class="p">[&lt;/span>&lt;span class="s2">&amp;#34;wind&amp;#34;&lt;/span>&lt;span class="p">][&lt;/span>&lt;span class="s2">&amp;#34;speed&amp;#34;&lt;/span>&lt;span class="p">])&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="c1"># humedad = entry[&amp;#34;main&amp;#34;][&amp;#34;humidity&amp;#34;]&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">clima&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">entry&lt;/span>&lt;span class="p">[&lt;/span>&lt;span class="s2">&amp;#34;weather&amp;#34;&lt;/span>&lt;span class="p">][&lt;/span>&lt;span class="mi">0&lt;/span>&lt;span class="p">][&lt;/span>&lt;span class="s2">&amp;#34;description&amp;#34;&lt;/span>&lt;span class="p">]&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="c1"># Verificar umbrales&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">if&lt;/span> &lt;span class="n">temp&lt;/span> &lt;span class="o">&amp;lt;=&lt;/span> &lt;span class="n">ALERT_THRESHOLDS&lt;/span>&lt;span class="p">[&lt;/span>&lt;span class="s2">&amp;#34;temp_min&amp;#34;&lt;/span>&lt;span class="p">]:&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">alertas&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">append&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="sa">f&lt;/span>&lt;span class="s2">&amp;#34;Temperatura BAJA (&lt;/span>&lt;span class="si">{&lt;/span>&lt;span class="n">temp&lt;/span>&lt;span class="si">}&lt;/span>&lt;span class="s2">°C) el &lt;/span>&lt;span class="si">{&lt;/span>&lt;span class="n">fecha_prediccion&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">strftime&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s1">&amp;#39;&lt;/span>&lt;span class="si">%d&lt;/span>&lt;span class="s1">/%m %H:%M&amp;#39;&lt;/span>&lt;span class="p">)&lt;/span>&lt;span class="si">}&lt;/span>&lt;span class="s2">&amp;#34;&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">elif&lt;/span> &lt;span class="n">temp&lt;/span> &lt;span class="o">&amp;gt;=&lt;/span> &lt;span class="n">ALERT_THRESHOLDS&lt;/span>&lt;span class="p">[&lt;/span>&lt;span class="s2">&amp;#34;temp_max&amp;#34;&lt;/span>&lt;span class="p">]:&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">alertas&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">append&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="sa">f&lt;/span>&lt;span class="s2">&amp;#34;Temperatura ALTA (&lt;/span>&lt;span class="si">{&lt;/span>&lt;span class="n">temp&lt;/span>&lt;span class="si">}&lt;/span>&lt;span class="s2">°C) el &lt;/span>&lt;span class="si">{&lt;/span>&lt;span class="n">fecha_prediccion&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">strftime&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s1">&amp;#39;&lt;/span>&lt;span class="si">%d&lt;/span>&lt;span class="s1">/%m %H:%M&amp;#39;&lt;/span>&lt;span class="p">)&lt;/span>&lt;span class="si">}&lt;/span>&lt;span class="s2">&amp;#34;&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">if&lt;/span> &lt;span class="n">lluvia&lt;/span> &lt;span class="o">&amp;gt;=&lt;/span> &lt;span class="n">ALERT_THRESHOLDS&lt;/span>&lt;span class="p">[&lt;/span>&lt;span class="s2">&amp;#34;precipitation&amp;#34;&lt;/span>&lt;span class="p">]:&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">alertas&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">append&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="sa">f&lt;/span>&lt;span class="s2">&amp;#34;Lluvia SEVERA (&lt;/span>&lt;span class="si">{&lt;/span>&lt;span class="n">lluvia&lt;/span>&lt;span class="si">}&lt;/span>&lt;span class="s2"> mm/3h) el &lt;/span>&lt;span class="si">{&lt;/span>&lt;span class="n">fecha_prediccion&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">strftime&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s1">&amp;#39;&lt;/span>&lt;span class="si">%d&lt;/span>&lt;span class="s1">/%m %H:%M&amp;#39;&lt;/span>&lt;span class="p">)&lt;/span>&lt;span class="si">}&lt;/span>&lt;span class="s2">&amp;#34;&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">if&lt;/span> &lt;span class="n">viento&lt;/span> &lt;span class="o">&amp;gt;=&lt;/span> &lt;span class="n">ALERT_THRESHOLDS&lt;/span>&lt;span class="p">[&lt;/span>&lt;span class="s2">&amp;#34;wind_speed_mod&amp;#34;&lt;/span>&lt;span class="p">]&lt;/span> &lt;span class="ow">and&lt;/span> &lt;span class="n">viento&lt;/span> &lt;span class="o">&amp;lt;=&lt;/span> &lt;span class="n">ALERT_THRESHOLDS&lt;/span>&lt;span class="p">[&lt;/span>&lt;span class="s2">&amp;#34;wind_speed_alert&amp;#34;&lt;/span>&lt;span class="p">]:&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">alertas&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">append&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="sa">f&lt;/span>&lt;span class="s2">&amp;#34;Vientos moderados (viento: &lt;/span>&lt;span class="si">{&lt;/span>&lt;span class="n">viento&lt;/span>&lt;span class="si">}&lt;/span>&lt;span class="s2"> km/h) el &lt;/span>&lt;span class="si">{&lt;/span>&lt;span class="n">fecha_prediccion&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">strftime&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s1">&amp;#39;&lt;/span>&lt;span class="si">%d&lt;/span>&lt;span class="s1">/%m %H:%M&amp;#39;&lt;/span>&lt;span class="p">)&lt;/span>&lt;span class="si">}&lt;/span>&lt;span class="s2">&amp;#34;&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">if&lt;/span> &lt;span class="n">viento&lt;/span> &lt;span class="o">&amp;gt;=&lt;/span> &lt;span class="n">ALERT_THRESHOLDS&lt;/span>&lt;span class="p">[&lt;/span>&lt;span class="s2">&amp;#34;wind_speed_alert&amp;#34;&lt;/span>&lt;span class="p">]:&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">alertas&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">append&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="sa">f&lt;/span>&lt;span class="s2">&amp;#34;Vientos fuertes (viento: &lt;/span>&lt;span class="si">{&lt;/span>&lt;span class="n">viento&lt;/span>&lt;span class="si">}&lt;/span>&lt;span class="s2"> km/h) el &lt;/span>&lt;span class="si">{&lt;/span>&lt;span class="n">fecha_prediccion&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">strftime&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s1">&amp;#39;&lt;/span>&lt;span class="si">%d&lt;/span>&lt;span class="s1">/%m %H:%M&amp;#39;&lt;/span>&lt;span class="p">)&lt;/span>&lt;span class="si">}&lt;/span>&lt;span class="s2">&amp;#34;&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">return&lt;/span> &lt;span class="n">alertas&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="k">def&lt;/span> &lt;span class="nf">enviar_alerta&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">mensaje&lt;/span>&lt;span class="p">):&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="c1"># Manda notificación al canal de telegram&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">url&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="s2">&amp;#34;https://api.telegram.org/bot&amp;#34;&lt;/span> &lt;span class="o">+&lt;/span> &lt;span class="n">TOKEN&lt;/span> &lt;span class="o">+&lt;/span> &lt;span class="s2">&amp;#34;/sendMessage&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">params&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="p">{&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="s1">&amp;#39;chat_id&amp;#39;&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="n">CHAT_ID&lt;/span>&lt;span class="p">,&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="s1">&amp;#39;text&amp;#39;&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="n">mensaje&lt;/span>&lt;span class="p">,&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="s1">&amp;#39;parse_mode&amp;#39;&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="s2">&amp;#34;Markdown&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">}&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nb">print&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">mensaje&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">requests&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">post&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">url&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">params&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="n">params&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="k">if&lt;/span> &lt;span class="vm">__name__&lt;/span> &lt;span class="o">==&lt;/span> &lt;span class="s2">&amp;#34;__main__&amp;#34;&lt;/span>&lt;span class="p">:&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">datos&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">obtener_prediccion&lt;/span>&lt;span class="p">()&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">alertas&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">analizar_pronostico&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">datos&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nb">print&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s2">&amp;#34;⛅ análisis terminado.&amp;#34;&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">if&lt;/span> &lt;span class="n">alertas&lt;/span>&lt;span class="p">:&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">mensaje&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="sa">f&lt;/span>&lt;span class="s2">&amp;#34;⚠ Alertas para *&lt;/span>&lt;span class="si">{&lt;/span>&lt;span class="n">CITY&lt;/span>&lt;span class="si">}&lt;/span>&lt;span class="s2">* (próximas 24-120 h):&lt;/span>&lt;span class="se">\n&lt;/span>&lt;span class="s2">&amp;#34;&lt;/span> &lt;span class="o">+&lt;/span> &lt;span class="s2">&amp;#34;&lt;/span>&lt;span class="se">\n&lt;/span>&lt;span class="s2">&amp;#34;&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">join&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">alertas&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">enviar_alerta&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">mensaje&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h2 id="consideraciones-finales">Consideraciones finales
&lt;/h2>&lt;p>En un principio iba a mandar la &lt;a class="link" href="https://linuxmanr4.com/2018/07/17/enviar-correos-electronicos-con-python/" >alerta por correo electrónico&lt;/a>
, que también es posible, pero me pareció más &lt;em>cool&lt;/em> hacerlo por Telegram.&lt;/p>
&lt;figure>&lt;img src="https://linuxmanr4.com/wp-content/uploads/2025/03/alerta-telegram.webp"
alt="Notificación al canal de telegram del programa.">&lt;figcaption>
&lt;p>Notificación al canal de telegram del programa.&lt;/p>
&lt;/figcaption>
&lt;/figure>
&lt;p>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.&lt;/p>
&lt;p>También muestra las alertas en la terminal por si quiero ejecutarlo manualmente.&lt;/p>
&lt;figure>&lt;img src="https://linuxmanr4.com/wp-content/uploads/2025/03/imagen.jpg"
alt="Resultados del programa en la terminal informando las alertas climáticas que encontró.">&lt;figcaption>
&lt;p>Resultados del programa en la terminal informando las alertas climáticas que encontró.&lt;/p>
&lt;/figcaption>
&lt;/figure>
&lt;p>Algunos querrán ejecutar el programa en un &lt;a class="link" href="https://linuxmanr4.com/2019/04/26/agregar-tareas-cron-pfsense/" >cronjob&lt;/a>
, pero eso será al gusto de cada quien.&lt;/p>
&lt;p>Por último, hice el proyecto usando &lt;a class="link" href="https://linuxmanr4.com/2024/11/13/poetry-comandos-basicos-python/" >Poetry&lt;/a>
para el manejo de las dependencias y entornos virtuales.&lt;/p>
&lt;p>¿Listo para crear tu propio sistema de alertas? Clona el repositorio &lt;a class="link" href="https://github.com/linuxman/alerta_climatica" target="_blank" rel="noopener"
>Alerta Climática desde GitHub&lt;/a>
&lt;span style="white-space: nowrap;">&lt;svg width=".7em"
height=".7em" viewBox="0 0 21 21" xmlns="http://www.w3.org/2000/svg">
&lt;path d="m13 3l3.293 3.293l-7 7l1.414 1.414l7-7L21 11V3z" fill="currentColor" />
&lt;path d="M19 19H5V5h7l-2-2H5c-1.103 0-2 .897-2 2v14c0 1.103.897 2 2 2h14c1.103 0 2-.897 2-2v-5l-2-2v7z"
fill="currentColor">
&lt;/svg>&lt;/span>
y adáptalo a tus necesidades.&lt;/p></description></item></channel></rss>