
IlmasĂŒsteeme, mis pakuvad ilmainfoteenuseid, on palju, kuid millisele neist usaldada? Kui hakkasin sageli jalgrattaga sĂ”itma, soovisin omada kĂ”ige tĂ€psemat teavet ilmastikuolude kohta seal, kus ma sĂ”idan.
Esimene mĂ”te oli kokku panna vĂ€ike DIY ilmapost ja saada andmeid selle kaudu. Kuid ma ei hakanud âratast leiutamaâ ja valisin usaldusvÀÀrseteks andmeallikateks ilmainformatsiooni, mida kasutatakse tsiviillennunduses, nimelt METAR (METeorological Aerodrome Report) ja TAF (TAF â Terminal Aerodrome Forecast). Lennunduses sĂ”ltuvad ilmad eeskĂ€tt sadade inimeste eludest, mistĂ”ttu on prognoosid maksimaalselt tĂ€psed.
See teave edastatakse jooksvalt hÀÀlega igas kaasaegses lennujaamas ATIS (Automatic Terminal Information Service) ja VOLMET (prantsuse keelest vol â lend ja mĂ©tĂ©o â ilm). Esimene annab teavet lennujaamas toimuva reaalse ilma kohta, teine â lĂ€hiaja 24-30 tunni ilmaprognoosi, mitte ainult edastava lennujaama kohta, vaid ka teiste kohta.
Vnukovo lennujaama ATIS nÀide:
Vnukovo lennujaama VOLMET nÀide
Alati on ebamugav igal ajal kaasas kanda raadiovastuvĂ”tjat vĂ”i vastuvĂ”tjat vastavas sagedusvahemikus, seega soovisin luua Telegramis robotit, mis ĂŒhe nupuvajutusega vĂ”imaldab saada sarnast prognoosi. Eraldi serveri kĂ€itamine selleks oleks vĂ€hemalt ebaefektiivne, samuti pole mĂ”tet kĂ€ivitada pĂ€ringuid koduses Raspberry's.
SeetĂ”ttu otsustasin tagakĂŒljena kasutada teenust . KĂŒsimuste arv jÀÀb olematuks, seega maksab selline teenus sisuliselt tasuta (minu arvutuste kohaselt umbes 22 rubla 100 000 pĂ€ringu kohta).
TagakĂŒlje ettevalmistamine
Funktsiooni loomine
Juhtpaneelil avamme rakenduse Pilveplatvorm ja loome uue projekti:

PĂ€rast projekti loomist liikume jaotisse Funktsioonid:

KlÔpsame nuppu Loo funktsioon ja mÀÀrame sellele vajaliku nime:

PĂ€rast nupule vajutamist Loo funktsioon kuvatakse loodud funktsiooni vaade:

Enne kui alustame Pythonis koodi loomist, tuleb luua robot Telegramis. Ma ei hakka kirjeldama, kuidas see kĂ€ib â ĂŒksikasjalik juhend on olemas . Meile on oluline loodud roboti token.
Valmistame koodi
UsaldusvÀÀrsete andmete allikana valisin USA Rahvusliku Ookeaniliste ja AtmosfÀÀriliste Uuringute Ameti (ingl. National Oceanic and Atmospheric Administration, NOAA). See teaduslik agentuur vÀrskendab oma serveris andmeid reaalajas TXT-formaadis.
METAR andmete saamise link (pange tÀhele suurtÀhtede kasutamist):
https://tgftp.nws.noaa.gov/data/observations/metar/stations/.TXTMinu puhul on lĂ€him lennujaam Vnukovo, mille ICAO kood on UUWW. Ăleminekul genereeritud URL-le kuvatakse jĂ€rgmine teave:
2020/08/10 11:30
UUWW 101130Z 31004MPS 9999 SCT048 24/13 Q1014 R01/000070 NOSIG
Esimene rida on prognoosi kehtivusaeg Greenwichi aja jÀrgi. Teine rida on tegeliku ilma kokkuvÔte. Tsiviillennunduse piloodid saavad sellest nÀiteks aru, kuid vajame selgitust:
- [UUWW] â Vnukovo, Moskva linn (Venemaa â RU);
- [101130Z] â kuu 10. pĂ€ev, 11 tundi 30 minutit Greenwichi aja jĂ€rgi;
- [31004MPS] â tuule suund 310 kraadi, kiirus 4 m/s;
- [9999] â horisontaalne nĂ€htavus 10 km vĂ”i rohkem;
- [SCT048] â hajutatud/jaotunud pilved 4800 jalga (~1584m) kĂ”rgusel;
- [24/13] â temperatuur 24°C, kastepunkt 13°C;
- [Q1014] â rĂ”hk (QNH) 1014 hektopaskalit (750 mm elavhĂ”be);
- [R01/000070] â pidurisĂŒsteemil 01 â 0,70;
- [NOSIG] â ilma oluliste muutusteta.
Alustame programmi kirjutamist. Esiteks tuleb importida funktsioonid request ja pytaf:
from urllib import request
import pytafMÀÀrata muutujad ja valmistada 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 TAFi juurde (ka suurus on oluline).
https://tgftp.nws.noaa.gov/data/forecasts/taf/stations/.TXTNagu eelnevas nÀites, vaatame ennustust Vnukovo lennujaamas:
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
Eriti tĂ€helepanu pöörame ridadele TEMPO ja BECMG. TEMPO tĂ€hendab, et tegelik ilm antud ajavahemikus muutub perioodiliselt. BECMG â ilm muutub jĂ€rk-jĂ€rgult antud ajavahemikus.
See tÀhendab rida:
TEMPO 1012/1020 -TSRA BKN020CBTĂ€hendab:
- [1012/1020] â ajavahemikus 12 kuni 20 tundi (Greenwichi jĂ€rgi);
- [-TSRA] â Ă€ike (TS = thunderstorm) mÔÔduka intensiivsusega vihma (RA = rain) eest vĂ€ikese intensiivsusega (miinusmĂ€rk);
- [BKN020CB] â mĂ€rkimisvÀÀrne (BKN = purunenud), kogunemispilvedest (CB = kumulonimbus) koosnev pilvemass 2000 jalga (610 meetrit) merepinnast.
IlmastikunÀhtusi tÀhistavaid termineid on palju ja nende meeldejÀtmine on keeruline. TAF-i pÀringu kood kirjutatakse sarnasel viisil.
Laeme koodi pilve
Kuna aega ei taha raisata, vĂ”tame meie hoidlast Telegrami boti ŃĐ°Đ±Đ»ĐŸon. . Seal on eelnevalt valmistatud requirements.txt ja setup.py korrektse kataloogistruktuuriga.
Kuna me koodis pöördume mooduli poole, pytaftuleb selle versioon kohe lisada requirements.txt
pytaf~=1.2.1- Liigume redigeerimise juurde bot/tele_bot.py. Eemaldame kÔik liigsed 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 = "Tere. See on bot, mis pakub lennujaamade ilmaennustust "
"NOAA serveritelt. Bot on seadistatud Vnukovo lennujaama (UUWW) jaoks."
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)
- Kompresseerime kogu kausta ZIP-arhiiviks ja liigume juhtpaneeli loodud funktsiooni juurde.
- Vajutame Redigeeri ja laadime arhiivi koos koodiga ĂŒles.

- TÀidame faili suhtelise tee tele_bot (laiendust .py ei pruugi nÀidata) ja lÔpp-punkti funktsiooni (antud nÀites see main).
- Jaotises Keskkonnamuutujad defineerime muutujana TOKEN ja mÀÀrame sellele vajaliku Telegrami boti tokeni.
- Vajutame Salvesta ja rakenda, pÀrast mida liigume jaotisse KÀivitajad.
- LĂŒlitame HTTP-pĂ€ringu, et teha pĂ€ring avalikuks.

Meil on nĂŒĂŒd URL avaliku funktsioonikutsumise jaoks. JÀÀnud on vaid . Leidke meie bot Telegramis ja registreerige oma bot jĂ€rgmise kĂ€suga:
/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 lennuilma ĂŒlevaate otse messengeris.

Muidugi on koodi vÔimalik tÀiustada, kuid isegi praeguses seisus on seda piisavalt, et saada kÔige tÀpsem ilm ja prognoos usaldusvÀÀrsest allikast.
Koodi tÀieliku versiooni leiate meie .
Allikas: habr.com
