La prévision météorologique la plus précise : un bot pour Telegram sur des fonctions cloud

La prévision météorologique la plus précise : un bot pour Telegram sur des fonctions cloud
Il existe de nombreux services fournissant des informations météorologiques, mais à qui faire confiance ? Lorsque j'ai commencé à faire du vélo régulièrement, je voulais avoir les informations les plus précises sur les conditions météorologiques à l'endroit où je roule.

La première idée a été de créer une petite station météo DIY avec des capteurs et d'obtenir des données à partir de celle-ci. Mais je n'ai pas voulu « réinventer la roue » et j'ai choisi comme source de données fiables les informations météorologiques utilisées en aviation civile, à savoir METAR (METeorological Aerodrome Report) et TAF (TAF — Terminal Aerodrome Forecast). En aviation, les conditions météorologiques peuvent affecter la vie de centaines de personnes, c'est pourquoi les prévisions sont extrêmement précises.

Ces informations sont diffusées en continu par voix sur chaque aérodrome moderne sous forme de ATIS (Automatic Terminal Information Service) et VOLMET (du fr. vol — vol et météo — météo). Le premier fournit des informations sur les conditions météorologiques actuelles à l'aérodrome, tandis que le second donne une prévision pour les 24 à 30 heures suivantes, non seulement pour l'aérodrome émetteur, mais aussi pour d'autres.

Exemple de fonctionnement de l'ATIS de l'aéroport de Vnoukovo :

Exemple de fonctionnement du VOLMET de l'aéroport de Vnoukovo

Il est peu pratique d'emporter un scanner radio ou un émetteur-récepteur correspondant à la bonne fréquence, et j'ai souhaité créer un bot sur Telegram qui, d'une simple pression sur un bouton, permettrait d'obtenir une prévision similaire. Allouer un serveur dédié à cela n'est pas vraiment efficace, tout comme faire des requêtes sur un Raspberry Pi à domicile.

C'est pourquoi j'ai décidé d'utiliser le service Fonctions Cloud Selectel. Le nombre de requêtes sera insignifiant, donc ce service sera en fait presque gratuit (selon mes calculs, cela coûtera 22 roubles pour 100 000 requêtes).

Préparation du backend

Création de la fonction

Dans le panneau de contrôle my.selectel.ru nous ouvrons la vue Plateforme Cloud et créons un nouveau projet :

La prévision météorologique la plus précise : un bot pour Telegram sur des fonctions cloud
Après la création du projet, nous allons dans la section Fonctions:

La prévision météorologique la plus précise : un bot pour Telegram sur des fonctions cloud
Cliquez sur le bouton Créer une fonction et lui donnons un nom approprié :

La prévision météorologique la plus précise : un bot pour Telegram sur des fonctions cloud
Après avoir cliqué sur Créer une fonction nous obtiendrons la vue de la fonction créée :

La prévision météorologique la plus précise : un bot pour Telegram sur des fonctions cloud
Avant de commencer à écrire le code en Python, il faudra créer un bot sur Telegram. Je ne vais pas expliquer comment faire, une instruction détaillée est disponible dans notre base de connaissances.. L'essentiel pour nous est le token du bot créé.

Préparons le code

J'ai choisi comme source de données fiables l'Administration nationale océanique et atmosphérique des États-Unis (anglais : National Oceanic and Atmospheric Administration, NOAA). Cette agence scientifique met à jour en temps réel les données sur son serveur au format TXT.

Lien pour obtenir les données METAR (notez la casse) :

https://tgftp.nws.noaa.gov/data/observations/metar/stations/.TXT

Dans mon cas, l'aéroport le plus proche est Vnoukovo, son code ICAO est UUWW. Accéder à l'URL formée donnera :

2020/08/10 11:30
UUWW 101130Z 31004MPS 9999 SCT048 24/13 Q1014 R01/000070 NOSIG

La première ligne indique l'heure de validité de la prévision selon le temps universel coordonné. La deuxième ligne est un résumé de la météo réelle. Les pilotes de l'aviation civile comprendront facilement ce que signifie cette ligne, mais nous avons besoin d'une explication :

  • [UUWW] — Vnoukovo, ville de Moscou (Russie — RU) ;
  • [101130Z] — 10ème jour du mois, 11 heures 30 minutes selon le temps universel coordonné ;
  • [31004MPS] — direction du vent à 310 degrés, vitesse 4 m/s ;
  • [9999] — visibilité horizontale de 10 km ou plus ;
  • [SCT048] — nuages épars à une hauteur de 4800 pieds (~1584m) ;
  • [24/13] — température 24°C, point de rosée 13°C ;
  • [Q1014] — pression (QNH) de 1014 hectopascals (750 mm Hg) ;
  • [R01/000070] — coefficient d'adhérence sur la piste 01 — 0,70 ;
  • [NOSIG] — sans changements significatifs.

Nous allons commencer à écrire le code. Pour commencer, nous devons importer les fonctions request et pytaf:

from urllib import request
import pytaf

Définir les variables et préparer la fonction de décodage :

URL_METAR = "https://tgftp.nws.noaa.gov/data/observations/metar/stations/UUWW.TXT"
URL_TAF = "https://tgftp.nws.noaa.gov/data/forecasts/taf/stations/UUWW.TXT"

def parse_data(code):
    code = code.split('n')[1]
    return pytaf.Decoder(pytaf.TAF(code)).decode_taf()

Passons au TAF (la casse est également importante).

https://tgftp.nws.noaa.gov/data/forecasts/taf/stations/.TXT

Comme dans l'exemple précédent, examinons la prévision à l'aéroport de Vnoukovo :

2020/08/10 12:21
TAF UUWW 101050Z 1012/1112 28003G10MPS 9999 SCT030 TX25/1012Z TN15/1103Z 
      TEMPO 1012/1020 -TSRA BKN020CB 
      BECMG 1020/1021 FEW007 BKN016 
      TEMPO 1021/1106 -SHRA BKN020CB PROB40 
      TEMPO 1021/1106 -TSRA BKN020CB 
      BECMG 1101/1103 34006G13MPS

Nous allons porter une attention particulière aux lignes TEMPO et BECMG. TEMPO indique que la météo réelle changera périodiquement pendant l'intervalle donné. BECMG signifie que la météo changera progressivement pendant l'intervalle de temps indiqué.

C'est-à-dire que la ligne :

TEMPO 1012/1020 -TSRA BKN020CB

signifiera :

  • [1012/1020] — entre 12 et 20 heures (temps universel coordonné) ;
  • [-TSRA] — orage (TS = thunderstorm) avec pluie (RA = rain) de faible intensité (signe moins) ;
  • [BKN020CB] — nuages cumulus-nimbostratus (BKN = brisés), cumulonimbus (CB) à une altitude de 2000 pieds (610 mètres) au-dessus du niveau de la mer.

Il existe de nombreux termes désignant des phénomènes météorologiques, et il peut être difficile de les mémoriser. Le code pour demander un TAF s'écrit de manière similaire.

Nous téléchargeons le code dans le cloud.

Pour ne pas perdre de temps, prenons un modèle de bot Telegram de notre dépôt. cloud-telegram-bot. Il y a un fichier déjà préparé. requirements.txt et setup.py avec une structure de répertoires correcte.

Puisque dans le code nous allons faire appel au module pytaf, sa version doit être immédiatement ajoutée dans requirements.txt

pytaf~=1.2.1

  • Passons à l'édition bot/tele_bot.py. Enlèvons tout ce qui est superflu et ajoutons notre code.

import os
from urllib import request
import telebot
import pytaf
 
TOKEN = os.environ.get('TOKEN')
URL_METAR = "https://tgftp.nws.noaa.gov/data/observations/metar/stations/UUWW.TXT"
URL_TAF = "https://tgftp.nws.noaa.gov/data/forecasts/taf/stations/UUWW.TXT"
 
bot = telebot.TeleBot(token=TOKEN, threaded=False)
keyboard = telebot.types.ReplyKeyboardMarkup(resize_keyboard=True)
keyboard.row('start', 'get_metar', 'get_taf')
 
def start(message):
    msg = "Bonjour. C'est un bot pour obtenir les prévisions météorologiques aéronautiques " 
          "des serveurs NOAA. Le bot est configuré pour l'aéroport de Vnoukovo (UUWW)."
    bot.send_message(message.chat.id, msg, reply_markup=keyboard)
 
def parse_data(code):
    code = code.split('n')[1]
    return pytaf.Decoder(pytaf.TAF(code)).decode_taf()
 
def get_metar(message):
    # Récupérer les informations du serveur.
    code = request.urlopen(URL_METAR).read().decode('utf-8')
    # Envoyer la réponse formatée.
    bot.send_message(message.chat.id, parse_data(code), reply_markup=keyboard)
 
def get_taf(message):
    # Récupérer les informations du serveur.
    code = request.urlopen(URL_TAF).read().decode('utf-8')
    # Envoyer la réponse formatée.
    bot.send_message(message.chat.id, parse_data(code), reply_markup=keyboard)
 
def route_command(command, message):
    """
    Routeur de commandes.
    """
    if command == 'start':
        return start(message)
    elif command == 'get_metar':
        return get_metar(message)
    elif command == 'get_taf':
        return get_taf(message)
 
def main(**kwargs):
    """
    Point d'entrée de l'environnement sans serveur.
    """
    print(f'Reçu: "{kwargs}"')
    message = telebot.types.Update.de_json(kwargs)
    message = message.message or message.edited_message
    if message and message.text and message.text[0] == '/':
        print(f'Echo sur "{message.text}"')
        route_command(message.text.lower(), message)

  • Nous emballons tout le répertoire dans une archive ZIP et nous allons dans le panneau de contrôle pour la fonction créée.
  • Cliquez Modifier et téléchargeons l'archive avec le code.

La prévision météorologique la plus précise : un bot pour Telegram sur des fonctions cloud

  • Remplissons le chemin relatif vers le fichier tele_bot (l'extension .py n'est pas nécessaire) et la fonction d'endpoint (dans cet exemple, c'est main).
  • Dans la section Variables d'environnement nous écrivons la variable TOKEN et lui attribuons le token du bot Telegram souhaité.
  • Cliquez Sauvegarder et déployer, puis nous allons dans la section Déclencheurs.
  • Nous activons l'interrupteur Requête HTTP, pour rendre la demande publique.

La prévision météorologique la plus précise : un bot pour Telegram sur des fonctions cloud
Nous avons créé une URL pour appeler la fonction publiquement. Il ne reste plus qu'à configurer le webhook. Trouvez notre bot @SelectelServerless_bot sur Telegram et enregistrez votre bot avec la commande :

/setwebhook <you bot token> <public URL of your function>

Résultat

Si tout est fait correctement, votre bot commencera immédiatement à fonctionner et affichera le résumé actuel de la météo aviation directement dans le messager.

La prévision météorologique la plus précise : un bot pour Telegram sur des fonctions cloud
Bien sûr, le code peut être amélioré, mais même dans son état actuel, il est suffisant pour obtenir les conditions météorologiques les plus précises et les prévisions provenant d'une source fiable.

Vous trouverez la version complète du code dans notre répertoire sur GitHub.

La prévision météorologique la plus précise : un bot pour Telegram sur des fonctions cloud

Source : habr.com

Acheter un hébergement fiable pour les sites avec protection DDoS, serveurs VPS VDS 🔥 Acheter un hébergement fiable pour les sites avec protection DDoS, serveurs VPS VDS | ProHoster