Esistono molti servizi che forniscono informazioni meteorologiche, ma di quale dovresti fidarti? Quando ho iniziato a pedalare frequentemente, volevo avere informazioni più precise sulle condizioni meteorologiche del luogo in cui pedalo.
Il mio primo pensiero è stato quello di costruire una piccola stazione meteorologica fai-da-te con sensori e riceverne i dati. Ma non ho “reinventato la ruota” e ho scelto le informazioni meteorologiche utilizzate nell’aviazione civile come fonte di dati verificati, vale a dire METARO (Rapporto MEteorologico dell'Aerodromo) e TAF (TAF - Previsione Terminal Aerodromo). Nel settore dell'aviazione, la vita di centinaia di persone dipende dalle condizioni meteorologiche, quindi le previsioni sono quanto più accurate possibile.
Queste informazioni vengono trasmesse a voce XNUMX ore su XNUMX, XNUMX giorni su XNUMX in ogni aeroporto moderno sotto forma di modulo ATI (Servizio automatico di informazioni sui terminali) e VOLMET (dal francese. vol - volo e Tempo - tempo atmosferico). Il primo fornisce informazioni sul tempo reale presso l'aerodromo e il secondo fornisce previsioni per le prossime 24-30 ore, non solo presso l'aerodromo trasmesso, ma anche in altri.
Esempio di operazione ATIS all'aeroporto di Vnukovo:
Un esempio di come funziona VOLMET all'aeroporto di Vnukovo
È scomodo portare ogni volta con sé una radio scanner o un ricetrasmettitore per la portata corrispondente, e volevo creare un bot in Telegram che, con un semplice clic, ti permetta di ottenere la stessa previsione. È almeno poco pratico allocare un server separato per questo, così come inviare richieste al tuo Raspberry di casa.
Pertanto, ho deciso di utilizzare il servizio come backend
Preparazione del back-end
Crea una funzione
Nel pannello di controllo
Dopo aver creato il progetto, vai alla sezione funzioni:
Spingere il pulsante Crea una funzione e dagli il nome desiderato:
Dopo aver premuto Crea una funzione avremo una rappresentazione della funzione creata:
Prima di iniziare a creare codice in Python, dovrai creare un bot in Telegram. Non descriverò come è fatto: ci sono istruzioni dettagliate
Preparazione del codice
Ho scelto la National Oceanic and Atmospheric Administration (NOAA) come fonte di dati affidabili. Questa agenzia scientifica aggiorna i dati in tempo reale sul suo server in formato TXT.
Link per ottenere i dati METAR (notare il caso):
https://tgftp.nws.noaa.gov/data/observations/metar/stations/<код аэропорта по ICAO>.TXT
Nel mio caso, l'aeroporto più vicino è Vnukovo, il suo codice ICAO è UUWW. Andando all'URL generato verrà visualizzato quanto segue:
2020/08/10 11:30
UUWW 101130Z 31004MPS 9999 SCT048 24/13 Q1014 R01/000070 NOSIG
La prima riga è l'ora attuale della previsione nel meridiano di Greenwich. La seconda riga è un riepilogo del tempo reale. I piloti dell'aviazione civile non avranno problemi a capire cosa significa questa riga, ma abbiamo bisogno di una spiegazione:
- [UUWW] — Vnukovo, Mosca (Russia — RU);
- [101130Z] — 10 del mese, 11:30 GMT;
- [31004MPS] — direzione del vento 310 gradi, velocità 4 m/s;
- , — visibilità orizzontale pari o superiore a 10 km;
- [SCT048] — nubi sparse/sparse a 4800 piedi (~1584 m);
- [24 / 13] — temperatura 24°C, punto di rugiada 13°C;
- [Q1014] — pressione (QNH) 1014 ettopascal (750 mm Hg);
- [R01/000070] — coefficiente di aderenza sulla corsia 01 — 0,70;
- [NOSIG] - senza cambiamenti significativi.
Iniziamo a scrivere il codice del programma. Per prima cosa devi importare funzioni richiesta и pytaf:
from urllib import request
import pytaf
Specificare 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 (importante è anche il caso).
https://tgftp.nws.noaa.gov/data/forecasts/taf/stations/<код аэропорта по ICAO>.TXT
Come nell'esempio precedente, diamo un'occhiata alle previsioni per l'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
Prestiamo particolare attenzione alle linee TEMPO и BECMG. TEMPO significa che il tempo reale durante il periodo specificato cambierà periodicamente. BECMG: il tempo cambierà gradualmente entro un periodo di tempo specificato.
Cioè, la riga:
TEMPO 1012/1020 -TSRA BKN020CB
Significherà:
- [1012 / 1020] — tra le 12 e le 20 ore (ora di Greenwich);
- [-TSRA] — temporale (TS = temporale) con pioggia (RA = pioggia) di bassa intensità (segno meno);
- [BKN020CB] - nubi significative (BKN = spezzate), cumulonembi (CB = cumulonembi) a 2000 piedi (610 metri) sopra il livello del mare.
Esistono molti termini per descrivere i fenomeni meteorologici ed è difficile ricordarli. Il codice per la richiesta TAF è scritto in modo simile.
Caricamento del codice sul cloud
Per non perdere tempo, prendiamo un modello di bot di Telegram dal nostro repository
Poiché nel codice accederemo al modulo pytaf, la sua versione dovrebbe essere immediatamente aggiunta requirements.txt
pytaf~=1.2.1
- Passiamo alla modifica bot/tele_bot.py. Rimuoviamo tutte le cose non necessarie 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 = "Привет. Это бот для получения авиационного прогноза погоды "
"с серверов NOAA. Бот настроен на аэропорт Внуково (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):
# Fetch info from server.
code = request.urlopen(URL_METAR).read().decode('utf-8')
# Send formatted answer.
bot.send_message(message.chat.id, parse_data(code), reply_markup=keyboard)
def get_taf(message):
# Fetch info from server.
code = request.urlopen(URL_TAF).read().decode('utf-8')
# Send formatted answer.
bot.send_message(message.chat.id, parse_data(code), reply_markup=keyboard)
def route_command(command, message):
"""
Commands router.
"""
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):
"""
Serverless environment entry point.
"""
print(f'Received: "{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 on "{message.text}"')
route_command(message.text.lower(), message)
- Imballiamo l'intera directory in un archivio ZIP e andiamo al pannello di controllo alla funzione creata.
- Clicca qui Редактировать e scarica l'archivio con il codice.
- Compilare il percorso relativo nel file tele_bot (estensione .py potrebbe non essere specificato) e una funzione endpoint (nell'esempio fornito è principale).
- Nella sezione variabili ambientali scrivere una variabile GETTONE e assegnagli il token del bot telegram desiderato.
- Clicca qui Salva ed espandi, dopodiché andiamo alla sezione trigger.
- Mettiamo l'interruttore Richiesta HTTPrendere pubblica la richiesta.
Ora abbiamo un URL per chiamare pubblicamente la funzione. Tutto ciò che resta è
/setwebhook <you bot token> <public URL of your function>
risultato
Se tutto è stato eseguito correttamente, il tuo bot inizierà immediatamente a funzionare e visualizzerà l'ultimo bollettino meteorologico dell'aviazione direttamente nel messenger.
Naturalmente, il codice può essere migliorato, ma anche nel suo stato attuale è sufficiente scoprire il tempo e le previsioni più accurate da una fonte attendibile.
Troverai la versione completa del codice nel nostro
Fonte: habr.com