Ilmateavet pakuvad palju teenuseid, kuid millist neist peaksite usaldama? Kui hakkasin sageli jalgrattaga sõitma, tahtsin saada võimalikult täpset teavet selle koha ilmastikutingimuste kohta, kus ma sõidan.
Minu esimene mõte oli ehitada väike DIY ilmajaam koos anduritega ja sealt andmeid vastu võtta. Kuid ma ei leiutanud ratast uuesti ja valisin kontrollitud andmete allikaks tsiviillennunduses kasutatava ilmateabe, nimelt METAR (METeorological Aerodrome Report) ja TAF (TAF – Terminal Aerodrome Forecast). Lennunduses sõltub ilmast sadade inimeste elu, seega on prognoosid võimalikult täpsed.
Seda teavet edastatakse XNUMX/XNUMX häälega igal kaasaegsel lennuväljal kujul ATIS (Automaatne terminali teabeteenus) ja VOLMET (prantsuse keelest. maht - lend ja météo - ilm). Esimene annab teavet lennuvälja tegeliku ilma kohta ja teine prognoosi järgmiseks 24-30 tunniks mitte ainult saatelennuväljal, vaid ka teistel.
Näide ATISe tegevusest Vnukovo lennujaamas:
Näide sellest, kuidas VOLMET Vnukovo lennujaamas töötab
Ebamugav on iga kord vastava vahemiku jaoks raadioskannerit või transiiverit kaasas kanda ja tahtsin luua Telegramis roboti, mis võimaldab ühe nupuvajutusega saada sama prognoosi. Eraldi serveri eraldamine selleks, nagu ka päringute saatmine oma kodusesse Raspberrysse, on vähemalt ebapraktiline.
Seetõttu otsustasin teenust taustaprogrammina kasutada
Taustaprogrammi ettevalmistamine
Looge funktsioon
Juhtpaneelil
Pärast projekti loomist minge jaotisse Funktsioonid:
Vajutage nuppu Looge funktsioon ja andke sellele soovitud nimi:
Pärast vajutamist Looge funktsioon meil on loodud funktsiooni esitus:
Enne Pythonis koodi loomise alustamist peate Telegramis looma roboti. Ma ei kirjelda, kuidas seda tehakse - seal on üksikasjalikud juhised
Koodi ettevalmistamine
Usaldusväärsete andmete allikaks valisin National Oceanic and Atmospheric Administration (NOAA). See teadusagentuur värskendab andmeid reaalajas oma serveris TXT-vormingus.
Link METAR-i andmete saamiseks (pange tähele juhtumit):
https://tgftp.nws.noaa.gov/data/observations/metar/stations/<код аэропорта по ICAO>.TXT
Minu puhul on lähim lennujaam Vnukovo, selle ICAO kood on UUWW. Loodud URL-i avamine annab järgmise:
2020/08/10 11:30
UUWW 101130Z 31004MPS 9999 SCT048 24/13 Q1014 R01/000070 NOSIG
Esimene rida on prognoosi praegune aeg Greenwichi aja järgi. Teine rida on kokkuvõte tegelikust ilmast. Tsiviillennunduse pilootidel pole probleeme selle rea tähenduse mõistmisega, kuid vajame selgitust:
- [UUWW] — Vnukovo, Moskva (Venemaa — RU);
- [101130Z] — kuu 10. päev, 11 GMT;
- [31004MPS] — tuule suund 310 kraadi, kiirus 4 m/s;
- [9999] — horisontaalne nähtavus 10 km või rohkem;
- [SCT048] — hajus-/hajupilved 4800 jala (~1584 m) kõrgusel;
- [24 / 13] — temperatuur 24°C, kastepunkt 13°C;
- [Q1014] — rõhk (QNH) 1014 hektopaskalit (750 mm Hg);
- [R01/000070] — haardetegur rajal 01 — 0,70;
- [NOSIG] - ilma oluliste muudatusteta.
Alustame programmi koodi kirjutamist. Kõigepealt peate funktsioonid importima taotleda и pytaf:
from urllib import request
import pytaf
Määrake muutujad ja valmistage ette dekodeerimisfunktsioon:
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()
Liigume edasi TAF-i juurde (tähtis on ka suurtäht).
https://tgftp.nws.noaa.gov/data/forecasts/taf/stations/<код аэропорта по ICAO>.TXT
Nagu eelmises näites, vaatame Vnukovo lennujaama prognoosi:
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
Pöörame erilist tähelepanu joontele AEG и BECMG. TEMPO tähendab, et tegelik ilm määratud perioodil muutub perioodiliselt. BECMG – ilm muutub teatud aja jooksul järk-järgult.
See tähendab, et rida:
TEMPO 1012/1020 -TSRA BKN020CB
Tähendab:
- [1012 / 1020] — 12–20 tundi (Greenwichi aja järgi);
- [-TSRA] — äikesetorm (TS = äike) madala intensiivsusega vihmaga (RA = vihm) (miinusmärk);
- [BKN020CB] - olulised (BKN = murtud), rünkpilved (CB = cumulonimbus) 2000 jala (610 meetri) kõrgusel merepinnast.
Ilmastikunähtuste mõisteid on päris palju ja nende meeldejätmine on keeruline. TAF päringu kood on kirjutatud sarnaselt.
Koodi pilve üleslaadimine
Et mitte aega raisata, võtame oma hoidlast telegrammi roboti malli
Kuna koodis pääseme juurde moodulile pytaf, siis tuleks selle versioon kohe lisada nõuded.txt
pytaf~=1.2.1
- Liigume edasi toimetamise juurde bot/tele_bot.py. Eemaldame kõik mittevajalikud asjad ja lisame oma koodi.
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)
- Pakime kogu kataloogi ZIP-arhiivi ja läheme juhtpaneelile loodud funktsiooni juurde.
- Vajuta siia Muuda ja laadige alla arhiiv koos koodiga.
- Täitke faili suhteline tee tele_bot (pikendus .py ei pruugi olla määratud) ja lõpp-punkti funktsioon (antud näites on see põhiline).
- Jaotises Keskkonnamuutujad kirjutada muutuja PÖÖRDUD ja määrake sellele soovitud telegrammi roboti tunnus.
- Vajuta siia Salvesta ja laienda, mille järel läheme sektsiooni Päästikud.
- Panime lüliti sisse HTTP taotluset taotlus avalikuks teha.
Nüüd on meil funktsiooni avalikuks kutsumiseks URL. Kõik, mis on jäänud, on
/setwebhook <you bot token> <public URL of your function>
Tulemus
Kui kõik on õigesti tehtud, hakkab teie bot kohe tööle ja kuvab värskeima lennuilmateate otse messengeris.
Loomulikult saab koodi täiustada, kuid ka praeguses seisus piisab sellest, kui usaldusväärsest allikast teada saada kõige täpsem ilm ja prognoos.
Koodi täisversiooni leiate meie veebisaidilt
Allikas: www.habr.com