Get the rain alerts in Telegram
Tags: node, typescript, aemet, telegram
Published: 2023-05-27 11:36:00

### (English version bellow...)
La semana pasada estaba mirando el tiempo en la página de la [Aemet](https://www.aemet.es/es) y me di cuenta hay disponible un API REST publica para consultar información meteorológica.

Este API es [Open Data](https://opendata.aemet.es/) y tiene varios recursos interesantes, como el siguiente:

Este [endpoint](https://opendata.aemet.es/dist/index.html?#/predicciones-especificas/Predicci%C3%B3n%20por%20municipios%20horaria.%20Tiempo%20actual.) 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](https://www.typescriptlang.org/), que consulta este recurso y en función de los datos, te envía un mensaje usando un bot [Telegram](https://telegram.org/) 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](https://www.npmjs.com/package/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](https://www.toptal.com/python/telegram-bot-tutorial-python). Para enviar mensajes a través del bot se usa este [paquete](https://www.npmjs.com/package/node-telegram-bot-api).

## Instalación y ejecución
Este es el [repositorio](https://github.com/jaime2196/alertaLluvia) del proyecto y estos son los pasos para ejecutarlo en tu local:

Clonamos el proyecto:
```
 git clone https://github.com/jaime2196/alertaLluvia.git
```
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
```
* location: código de la localidad sobre la que quieres recibir los avisos. Puedes encontrarlo [aquí](https://www.ine.es/daco/daco42/codmun/codmunmapa.htm).
* apiKey: necesitas una API key para usar los servicios de Aemet. Puede solicitarla [aquí](https://opendata.aemet.es/).
* 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í](https://www.redeszone.net/tutoriales/servidores/cron-crontab-linux-programar-tareas/).
* 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
```
## 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:
```bash
 docker run -d --env-file ./.env jaime2196/node-alertalluvia
```
### Ejemplo
Este es un aviso recibido en Telegram:

![Ejemplo](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/abgrz4f17s0xrfucsurl.PNG)

#### Contacto
* [LinkedIn](https://www.linkedin.com/in/jaimesenoret/)
* [Twitter](https://twitter.com/JaimeSenoret)




### English version
Last week I was looking at the weather on the page of [Aemet](https://www.aemet.es/es) (the Spanish meteorological agency) and I realized there is a public REST API available to consult meteorological information.

This API is [Open Data](https://opendata.aemet.es/) and has several interesting resources, such as the following:

This [endpoint](https://opendata.aemet.es/dist/index.html?#/predicciones-especificas/Predicci%C3%B3n%20por%20municipios%20horaria.%20Tiempo%20actual.) 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](https://www.typescriptlang.org/), which queries this resource and based on the data, sends you a message using a [Telegram](https://telegram.org/) 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](https://www.npmjs.com/package/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](https://www.toptal.com/python/telegram-bot-tutorial-python). To send messages through the bot use this [package](https://www.npmjs.com/package/node-telegram-bot-api).

## Installation and execution
This is the [repository](https://github.com/jaime2196/alertaLluvia) of the project and these are the steps to run it:

Clone the project:
```
 git clone https://github.com/jaime2196/alertaLluvia.git
```

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
```
* location: code of the town about which you want to receive notifications. You can find it [here](https://www.ine.es/daco/daco42/codmun/codmunmapa.htm).
* apiKey: you need an API key to use Aemet services. You can request it [here](https://opendata.aemet.es/).
* 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](https://www.redeszone.net/tutoriales/servidores/cron-crontab-linux-schedule-tasks/).
* 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
```
## 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:
```bash
  docker run -d --env-file ./.env jaime2196/node-rainalert
```
### Example
This is a notification received on Telegram:

![Example](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/abgrz4f17s0xrfucsurl.PNG)

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
* [LinkedIn](https://www.linkedin.com/in/jaimesenoret/)
* [Twitter](https://twitter.com/JaimeSenoret)