
Ci sono molti servizi che forniscono informazioni meteorologiche, ma a quale credere? Quando ho iniziato a pedalare spesso, desideravo avere le informazioni più precise sulle condizioni meteorologiche nel luogo in cui mi trovavo.
La prima idea è stata quella di costruire una piccola stazione meteo fai-da-te con sensori per raccogliere dati. Ma non volevo ‘inventare la ruota’ e ho scelto come fonte di dati affidabili le informazioni meteorologiche utilizzate in aviazione civile, ossia METAR (METeorological Aerodrome Report) e TAF (TAF — Terminal Aerodrome Forecast). Nell'aviazione, il meteo influisce sulla vita di centinaia di persone, quindi le previsioni sono estremamente precise.
Queste informazioni vengono trasmesse 24 ore su 24, ogni giorno, vocalmente in tutti gli aeroporti moderni tramite ATIS (Automatic Terminal Information Service) e VOLMET (da fr. vol — volo e météo — meteo). Il primo fornisce informazioni sul meteo attuale dell'aeroporto, mentre il secondo offre previsioni per le prossime 24-30 ore, non solo per l'aeroporto che trasmette, ma anche per altri.
Esempio di ATIS dell'aeroporto di Vnukovo:
Esempio di VOLMET dell'aeroporto di Vnukovo
Portare sempre con sé uno scanner radio o un ricetrasmettitore per la gamma corretta è scomodo, e ho deciso di creare un bot su Telegram che, premendo un pulsante, permette di ricevere la stessa previsione. Dedicare un server specifico a questo scopo è perlomeno poco pratico, così come inviare richieste a una Raspberry di casa.
Pertanto, come backend ho deciso di utilizzare il servizio . Il numero di richieste sarà veramente irrisorio, quindi un tale servizio costerà praticamente zero (secondo i miei calcoli si tratterà di 22 rubli per 100.000 richieste).
Preparazione del backend
Creazione della funzione
Nella dashboard apriamo la vista Piattaforma Cloud e creiamo un nuovo progetto:

Dopo aver creato il progetto, passiamo alla sezione Le funzioni:

Clicchiamo il pulsante Crea funzione e diamo un nome appropriato:

Dopo aver cliccato su Crea funzione avremo la vista della funzione creata:

Prima di procedere alla scrittura del codice in Python, sarà necessario creare un bot su Telegram. Non descriverò come si fa — esiste un'istruzione dettagliata . La cosa importante per noi è il token del bot creato.
Prepariamo il codice
Come fonte affidabile di dati, ho scelto il National Oceanic and Atmospheric Administration degli Stati Uniti (in inglese National Oceanic and Atmospheric Administration, NOAA). Questo ente scientifico aggiorna i dati in tempo reale sul suo server in formato TXT.
Link per ottenere i dati METAR (si prega di prestare attenzione al maiuscolo):
https://tgftp.nws.noaa.gov/data/observations/metar/stations/.TXTNel mio caso, l'aeroporto più vicino è Vnukovo, il cui codice ICAO è UUWW. Accedendo all'URL formato verrà visualizzato quanto segue:
2020/08/10 11:30
UUWW 101130Z 31004MPS 9999 SCT048 24/13 Q1014 R01/000070 NOSIG
La prima riga indica l'orario di validità della previsione in Greenwich. La seconda riga fornisce un riepilogo del meteo attuale. I piloti dell'aviazione civile comprenderanno facilmente cosa significa questa riga, ma abbiamo bisogno di una decodifica:
- [UUWW] — Vnukovo, città di Mosca (Russia — RU);
- [101130Z] — 10° giorno del mese, 11 ore e 30 minuti in GMT;
- [31004MPS] — direzione del vento 310 gradi, velocità 4 m/s;
- [9999] — visibilità orizzontale 10 km o più;
- [SCT048] — nuvole sparse/distribuite a 4800 piedi (~1584 m);
- [24/13] — temperatura 24°C, punto di rugiada 13°C;
- [Q1014] — pressione (QNH) 1014 ettopascal (750 mmHg);
- [R01/000070] — coefficiente di aderenza sulla pista 01 — 0,70;
- [NOSIG] — senza cambiamenti significativi.
Iniziamo a scrivere il codice. Per cominciare, sarà necessario importare le funzioni request e pytaf:
from urllib import request
import pytafDefinire le variabili e preparare la funzione di decodifica:
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()Passiamo al TAF (anche la registrazione è importante).
https://tgftp.nws.noaa.gov/data/forecasts/taf/stations/.TXTCome nell'esempio precedente, diamo un'occhiata alla previsione all'aeroporto di Vnukovo:
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
Presteremo particolare attenzione alle righe TEMPO e BECMG. TEMPO significa che il tempo effettivo cambierà periodicamente nell'intervallo indicato. BECMG — il tempo cambierà gradualmente nell'intervallo di tempo specificato.
Cioè, la riga:
TEMPO 1012/1020 -TSRA BKN020CBSignificherà:
- [1012/1020] — nell'intervallo dalle 12 alle 20 ore (in Greenwich);
- [-TSRA] — tempesta (TS = thunderstorm) con pioggia (RA = rain) di bassa intensità (segno meno);
- [BKN020CB] — nuvolosità significativa (BKN = rotta), nuvole cumulonembi (CB = cumulonimbus) a un'altitudine di 2000 piedi (610 metri) sul livello del mare.
Ci sono molte terminologie che indicano fenomeni atmosferici, e memorizzarle può essere difficile. Il codice per richiedere il TAF viene scritto allo stesso modo.
Carichiamo il codice nel cloud.
Per non perdere tempo, utilizziamo un modello di bot Telegram dal nostro repository. . Qui c'è già un file requirements.txt e setup.py con una struttura di directory corretta.
Poiché nel codice ci riferiremo al modulo pytaf, dovremmo aggiungere subito la sua versione in requirements.txt
pytaf~=1.2.1- Passiamo alla modifica di bot/tele_bot.py.Rimuoviamo tutto il superfluo e aggiungiamo il nostro codice.
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 = "Ciao. Questo è un bot per ottenere il bollettino meteorologico per l'aviazione "
"dai server NOAA. Il bot è configurato per l'aeroporto di Vnukovo (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):
# Recupera le informazioni dal server.
code = request.urlopen(URL_METAR).read().decode('utf-8')
# Invia la risposta formattata.
bot.send_message(message.chat.id, parse_data(code), reply_markup=keyboard)
def get_taf(message):
# Recupera le informazioni dal server.
code = request.urlopen(URL_TAF).read().decode('utf-8')
# Invia la risposta formattata.
bot.send_message(message.chat.id, parse_data(code), reply_markup=keyboard)
def route_command(command, message):
"""
Router dei comandi.
"""
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):
"""
Punto di ingresso dell'ambiente serverless.
"""
print(f'Ricevuto: "{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 su "{message.text}"')
route_command(message.text.lower(), message)
- Imballiamo l'intera directory in un archivio ZIP e accediamo al pannello di controllo per creare la funzione.
- Clicchiamo su Modifica e carichiamo l'archivio con il codice.

- Compiliamo il percorso relativo al file tele_bot (estensione .py può essere omessa) e l'endpoint della funzione (nell'esempio riportato è main).
- Nella sezione Variabili ambiente scriviamo la variabile TOKEN e le assegniamo il token del bot di Telegram desiderato.
- Clicchiamo su Salva e distribuisci, dopodiché ci spostiamo nella sezione Trigger.
- Attiviamo l'interruttore Richiesta HTTP, per rendere la richiesta pubblica.

Abbiamo ottenuto un URL per la chiamata pubblica della funzione. Non resta che . Trova il nostro bot su Telegram e registra il tuo bot con il comando:
/setwebhook <you bot token> <public URL of your function>Risultato
Se tutto è stato eseguito correttamente, il tuo bot inizierà subito a funzionare e mostrerà il riepilogo attuale del meteo aeroportuale direttamente nel messaggero.

Naturalmente, è possibile migliorare il codice, tuttavia anche così com'è, è sufficiente per ottenere le previsioni più accurate e il meteo da una fonte affidabile.
Troverai la versione completa del codice nel nostro .
Fonte: habr.com
