Ci hè una mansa di servizii chì furnisce l'infurmazioni climatichi, ma quale duvete fidà? Quandu aghju cuminciatu à andà in bicicletta à spessu, vulia avè l'infurmazioni più precise nantu à e cundizioni climatichi in u locu induve cavalcà.
U mo primu pensamentu era di custruisce una piccula stazione meteorologica DIY cù sensori è riceve dati da ellu. Ma ùn aghju micca "reinventatu a rota" è hà sceltu l'infurmazioni climatichi chì sò utilizati in l'aviazione civile cum'è fonte di dati verificati, vale à dì. METAR (Rapportu di l'Aerodromu Meteorologicu) è impiegu (TAF - Previsioni di l'Aerodromu Terminal). In l'aviazione, a vita di centinaie di persone dipende da u clima, cusì e previsioni sò più precise pussibule.
Questa informazione hè trasmessa 24/7 per voce in ogni campu d'aviazione mudernu in a forma ATIS (Serviziu d'infurmazione di u terminal automaticu) è VOLMET (da u francese. vol - volu è météo - tempu). U primu furnisce infurmazioni nantu à u tempu attuale in l'aeròdromu, è u sicondu furnisce una previsione per l'ora di 24-30, micca solu in u campu d'aviazione, ma ancu in altri.
Esempiu di operazione ATIS à l'aeroportu di Vnukovo:
Un esempiu di cumu travaglia VOLMET in l'aeroportu di Vnukovo
Hè sconveniente per portà un scanner di radiu o un transceiver cun voi ogni volta per a gamma currispondente, è vulia creà un bot in Telegram chì, à u clicu di un buttone, vi permette di ottene a stessa previsione. Hè almenu impraticabile di assignà un servitore separatu per questu, è ancu di mandà dumande à a vostra casa Raspberry.
Dunque, aghju decisu di utilizà u serviziu cum'è backend
Preparazione backend
Crià una Funzione
In u pannellu di cuntrollu
Dopu chì u prugettu hè creatu, andate à a rùbbrica Funzioni:
Pulsà u buttone Crea una funzione è dà u nome desideratu:
Dopu avè pressatu Crea una funzione averemu una rapprisintazioni di a funzione creata:
Prima di inizià a creazione di codice in Python, avete bisognu di creà un bot in Telegram. Ùn descriveraghju micca cumu hè fattu questu - ci sò struzzioni detallati
Preparazione di u codice
Aghju sceltu l'Amministrazione Naziunale di l'Oceanu è l'Atmosferica (NOAA) cum'è una fonte di dati affidabili. Questa agenza scientifica aghjurnà e dati in tempu reale nantu à u so servitore in formatu TXT.
Link per uttene dati METAR (nota u casu):
https://tgftp.nws.noaa.gov/data/observations/metar/stations/<код аэропорта по ICAO>.TXT
In u mo casu, l'aeroportu più vicinu hè Vnukovo, u so codice ICAO hè UUWW. Andendu à l'URL generatu darà i seguenti:
2020/08/10 11:30
UUWW 101130Z 31004MPS 9999 SCT048 24/13 Q1014 R01/000070 NOSIG
A prima linea hè l'ora attuale di a previsione in Greenwich Mean Time. A seconda linea hè un riassuntu di u clima attuale. I piloti di l'aviazione civile ùn anu micca prublemi à capisce ciò chì significa sta linea, ma avemu bisognu di una spiegazione:
- [UUWW] - Vnukovo, Mosca (Russia - RU);
- [101130Z] - 10th ghjornu di u mese, 11:30 am GMT;
- [31004MPS] - direzzione di u ventu 310 gradi, vitezza 4 m/s;
- [9999] - visibilità horizontale 10 km o più;
- [SCT048] - nuvuli spargugliati / spargugliati à 4800 piedi (~1584m);
- [24 / 13] - temperatura 24 ° C, puntu di rugiada 13 ° C;
- [Q1014] - pressione (QNH) 1014 hectopascals (750 mm Hg);
- [R01/000070] - coefficient d'aderenza nantu à a strada 01 - 0,70;
- [NOSIG] - senza cambiamenti significativu.
Accuminciamu à scrive u codice di u prugramma. Prima vi tocca à impurtà funzioni dumanda и pytaf:
from urllib import request
import pytaf
Specificate e variàbili è preparanu a funzione di decodificazione:
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()
Passemu à TAF (u casu hè ancu impurtante).
https://tgftp.nws.noaa.gov/data/forecasts/taf/stations/<код аэропорта по ICAO>.TXT
Cum'è in l'esempiu precedente, fighjemu a previsione in l'aeroportu 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
Fighjemu in particulare attente à e linee TEMPO и BECMG. TEMPO significa chì u tempu attuale durante u periodu specificatu cambierà periodicamente. BECMG - u clima cambierà gradualmente in un periudu di tempu.
Hè, a linea:
TEMPO 1012/1020 -TSRA BKN020CB
Vulerà dì:
- [1012 / 1020] - trà 12 è 20 ore (Greenwich Mean Time);
- [-TSRA] - tempesta (TS = tempesta) cù piova (RA = pioggia) di intensità bassa (signu minus);
- [BKN020CB] - nuvole significative (BKN = rotte), cumulonimbus (CB = cumulonimbus) à 2000 piedi (610 metri) sopra u livellu di u mari.
Ci sò assai termini per i fenomeni climatichi, è ricurdà di elli hè difficiule. U codice per a dumanda TAF hè scrittu in modu simili.
Caricà u codice à u nuvulu
Per ùn perde u tempu, pigliamu un mudellu di telegram bot da u nostru repository
Siccomu in u codice seremu accede à u modulu pytaf, allura a so versione deve esse aghjuntu immediatamente esigenze.txt
pytaf~=1.2.1
- Passemu à l'edità bot/tele_bot.py. Sguassemu tutte e cose inutili è aghjunghje u nostru 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)
- Imballemu tuttu u cartulare in un archiviu ZIP è andemu à u pannellu di cuntrollu à a funzione creata.
- Pulsà Edit è scaricate l'archiviu cù u codice.
- Inserite a strada relativa in u schedariu tele_bot (estensione francese py pò micca esse specificatu) è una funzione endpoint (in l'esempiu datu questu hè principale).
- rùbbrica Variabili di l'ambiente scrive una variabile TOKEN è assignà u token di u bot telegramma desideratu.
- Pulsà Salvà è espansione, dopu chì andemu à a rùbbrica triggers.
- Mettimu u switch dumanda HTTPper fà a dumanda publica.
Avemu avà un URL per chjamà publicamente a funzione. Tuttu ciò chì resta hè
/setwebhook <you bot token> <public URL of your function>
risultatu
Se tuttu hè fattu bè, u vostru bot principia immediatamente à travaglià è mostra l'ultimu rapportu climaticu di l'aviazione direttamente in u messenger.
Di sicuru, u codice pò esse migliuratu, ma ancu in u so statu attuale hè abbastanza per sapè u tempu più precisu è a previsione da una fonte di fiducia.
Truverete a versione completa di u codice in u nostru
Source: www.habr.com