DEV Community

Cover image for Get the rain alerts in Telegram
Jaime
Jaime

Posted on

Get the rain alerts in Telegram

(English version bellow...)

La semana pasada estaba mirando el tiempo en la página de la Aemet y me di cuenta hay disponible un API REST publica para consultar información meteorológica.

Este API es Open Data y tiene varios recursos interesantes, como el siguiente:

Este endpoint devuelve la predicción de lluvia, tormentas y nieve en un municipio en concreto, el cual le pasamos por parámetro. Este recurso es muy útil ya que la Aemet lo actualiza varias veces al día.

Teniendo esto en cuenta he desarrollado un proyecto en Node, escrito en TypeScript, que consulta este recurso y en función de los datos, te envía un mensaje usando un bot Telegram diciéndote la probabilidad que hay de lluvia, tormentas o nieve en las próximas horas. La lógica es la siguiente:

El proyecto usa el paquete cron para establecer la frecuencia con la que se consulta el API de la Aemet, por ejemplo, cada hora.

Cada vez que obtenemos los datos de la Aemet, comprobamos si los datos han sido actualizados desde la última ejecución.

Si los datos han sido actualizados, obtenemos los datos diarios y elaboramos el mensaje que se enviara a través de un bot Telegram. Puedes crear tu bot de Telegram siguiendo este tutorial. Para enviar mensajes a través del bot se usa este paquete.

Instalación y ejecución

Este es el repositorio del proyecto y estos son los pasos para ejecutarlo en tu local:

Clonamos el proyecto:

 git clone https://github.com/jaime2196/alertaLluvia.git
Enter fullscreen mode Exit fullscreen mode

Después hay que configurar una serie de variables en un fichero '.env' en la raiz del proyecto:

#Api Aemet
location=28013 #Madrid, por ejemplo
apiKey=???
#Umbral de avisos (%)
avisoTormenta=5
avisoPrecipitacion=5
avisoNieve=5
#Api telegram
token=???
usuarios=???
#Config cron
configCron=*/10 * * * * #Cada 10 minutos
#Node Time Zone
TZ=Europe/Madrid
Enter fullscreen mode Exit fullscreen mode
  • location: código de la localidad sobre la que quieres recibir los avisos. Puedes encontrarlo aquí.
  • apiKey: necesitas una API key para usar los servicios de Aemet. Puede solicitarla aquí.
  • avisoTormenta: es el % mínimo de probabilidad con el que quieres recibir los avisos de tormenta. Por ejemplo, si estableces el 5, serás notificado si hay un 5% o más de probabilidad de tormenta.
  • avisoPrecipitacion: igual que el anterior, pero para la lluvia.
  • avisoNieve: igual que el anterior, pero para la nieve.
  • token: es el token de Telegram que has generado al crear tu bot.
  • usuarios: ID de usuarios de Telegram (separados por ",") a los que quieres enviar notificaciones. Para conocer tu ID de usuario puedes usar el bot '@userinfobot'
  • configCron: frecuencia con la que se consulta el API de Aemet para obtener los datos. Solo te llegara una notificación cada vez que Aemet actualiza sus datos, por lo que es probable que el API de Aemet se consulte varias veces, pero no te lleguen notificaciones, ya que los datos no han cambiado.

Puede obtener más información sobre programar tareas con cron aquí.

  • TZ: si lo ejecutamos desde Docker, es mejor especificar la zona horaria para que los valores de las fechas sean correctos.

Después instalamos las dependencias de Node y ejecutamos:

npm install 
npm run start
Enter fullscreen mode Exit fullscreen mode

Ejecución con Docker

He construido una imagen para varias arquitecturas para que sea más fácil de ejecutar.
Las arquitecturas disponibles son:

  • amd64
  • arm/v7
  • arm64/v8

Para ejecutarlo con Docker simplemente creamos el archivo '.env' con las variables y ejecutamos:

 docker run -d --env-file ./.env jaime2196/node-alertalluvia
Enter fullscreen mode Exit fullscreen mode

Ejemplo

Este es un aviso recibido en Telegram:

Ejemplo

Contacto

English version

Last week I was looking at the weather on the page of Aemet (the Spanish meteorological agency) and I realized there is a public REST API available to consult meteorological information.

This API is Open Data and has several interesting resources, such as the following:

This endpoint returns the rain forecast, storms and snow in a specific town, which we pass as a parameter. This resource is very useful since Aemet updates it several times a day.

With this in mind I have developed a project in Node, written in TypeScript, which queries this resource and based on the data, sends you a message using a Telegram bot telling you the probability of rain, storms or snow in the next few hours. This project only works with cities in Spain, since the meteorological data is provided by the Spanish meteorological agency.
The logic is the following:

The project uses the cron package to set the frequency with which the Aemet API is queried, for example, every hour.

Every time we get the data from Aemet, we check if the data has been updated since the last run.

If the data has been updated, we obtain the daily data and prepare the message that will be sent through a Telegram bot. You can create your Telegram bot by following this tutorial. To send messages through the bot use this package.

Installation and execution

This is the repository of the project and these are the steps to run it:

Clone the project:

 git clone https://github.com/jaime2196/alertaLluvia.git
Enter fullscreen mode Exit fullscreen mode

Then you have to configure a series of variables in an '.env' file in the root of the project:

#Api Aemet
location=28013 #Madrid, for example
apiKey=???
#Threshold of warnings (%)
avisoTormenta=5
avisoPrecipitacion=5
avisoNieve=5
#Api telegram
token=???
usuarios=???
#Config cron
configCron=*/10 * * * * #Cada 10 minutos
#Node Time Zone
TZ=Europe/Madrid
Enter fullscreen mode Exit fullscreen mode
  • location: code of the town about which you want to receive notifications. You can find it here.
  • apiKey: you need an API key to use Aemet services. You can request it here.
  • avisoTormenta: it is the minimum % probability with which you want to receive storm warnings. For example, if you set 5, you will be notified if there is a 5% or greater chance of a storm.
  • avisoPrecipitation: the same as the previous one, but for the rain.
  • avisoNieve: same as above, but for snow.
  • token: it is the Telegram token that you have generated when creating your bot.
  • usuarios: Telegram user ID (separated by ",") to whom you want to send notifications. To know your user ID you can use the bot '@userinfobot'.
  • configCron: frequency with which the Aemet API is consulted to obtain the data. You will only receive a notification each time Aemet updates its data, so it is likely that the Aemet API is queried several times, but you do not receive notifications, since the data has not changed.

You can get more information about scheduling tasks with cron here.

  • TZ: if we run it from Docker, it is better to specify the time zone so that the date values are correct.

Then install the Node dependencies and execute:

npm install
npm run start
Enter fullscreen mode Exit fullscreen mode

Running with Docker

I've built a multi-arch image to make it easier to run.
The available architectures are:

  • amd64 *arm/v7 *arm64/v8

To run it with Docker simply create the '.env' file with the variables and execute:

  docker run -d --env-file ./.env jaime2196/node-rainalert
Enter fullscreen mode Exit fullscreen mode

Example

This is a notification received on Telegram:

Example

What it means:
❗ From 14:00 to 20:00, there is a 35% chance of rain 🌧 and a 35% chance of thunderstorm ⛈
❗ From 20:00 to 02:00, there is a 5% chance of rain 🌧 and a 5% chance of thunderstorm ⛈

Stay in touch

Top comments (0)