
Ilma andmeid pakkuvaid teenuseid on palju, kuid kuhu neist usaldada? Kui hakkasin tihti jalgrattaga sÔitma, tahtsin omada kÔige tÀpsemaid teadmisi ilmastikuoludest kohas, kus ma sÔidan.
Esimene mĂ”te oli koguda vĂ€ike DIY ilmapost ja saada sealt andmeid. Kuid ma ei hakanud «ratast leiutama» ja usaldusvÀÀrse andmeallikana valisin ma ilmainfo, mida kasutatakse tsiviillennunduses, nimelt METAR (METeorological Aerodrome Report) ja TAF (TAF â Terminal Aerodrome Forecast). Lennunduses sĂ”ltuvad ilmad sadade inimeste eludest, seetĂ”ttu on prognoosid ÀÀrmiselt tĂ€psed.
Seda teavet edastatakse ööpĂ€evaringselt hÀÀlena iga kaasaegse lennujaama kaudu ATIS (Automatic Terminal Information Service) ja VOLMET (prantsuse keeles vol â lend ja mĂ©tĂ©o â ilm). Esimene edastab teavet lennujaama tegeliku ilma kohta, samas kui teine â prognoosi jĂ€rgmise 24-30 tunni kohta, hĂ”lmates mitte ainult edastamise lennujaama, vaid ka teisi.
Vnukovo lennujaama ATIS nÀide:
Vnukovo lennujaama VOLMET nÀide:
Igakordne raadioskanneri vÔi sobivas sageduses transiiveri kaasas vedamine on ebamugav, ja tahtsin luua Telegramis boti, mis nupule vajutades annab samasuguse prognoosi. Selle jaoks eraldi serveri eraldamine on vÀhemalt ebamugav, nagu ka koduses Raspberry'l pÀringute saatmine.
SeetÔttu otsustasin tagaplaaniks kasutada teenust PÀringute arvu jagu on ÀÀrmiselt vÀike, seega maksab selline teenus praktiliselt tasuta (minu arvutuste kohaselt on see 22 rubla 100 000 pÀringu kohta).
Tagaplaani ettevalmistamine
Funktsiooni loomine
Juhtpaneelis avatakse vaade Pilvemonitor ja loome uue projekti:

PĂ€rast projekti loomist liigume jaotisse Funktsioonid:

Vajutame nuppu Loo funktsioon ja anname sellele vajaliku nime:

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

Enne koodi loomise alustamist Pythonis tuleb luua Telegramis bot. Ma ei hakka seda selgitama â detailne juhend on olemas Oluline on meie jaoks loodud boti token.
Valmistame koodi
UsaldusvÀÀrsete andmete allikana valisin Ameerika Ăhendriikide rahvusliku ookeani ja atmosfÀÀri administratsiooni (ingl. k. National Oceanic and Atmospheric Administration, NOAA). See teadusagentuur vĂ€rskendab oma serveris andmeid reaalajas TXT-formaadis.
Link METAR andmete saamiseks (pange tÀhele, et tÀhed on tundlikud):
https://tgftp.nws.noaa.gov/data/observations/metar/stations/.TXTMinu puhul on lĂ€him lennujaam Vnukovo, mille ICAO kood on UUWW. Ăleminek loodud URL-ile annab jĂ€rgmise tulemuse:
2020/08/10 11:30
UUWW 101130Z 31004MPS 9999 SCT048 24/13 Q1014 R01/000070 NOSIG
Esimene rida on prognoosi kehtivuse aeg Greenwichi aja jÀrgi. Teine rida on vÀliste tingimuste kokkuvÔte. Tsiviillennunduse piloodid saavad kergesti aru, mida see rida tÀhendab, kuid me vajame seda deƥifreerimist:
- [UUWW] â Vnukovo, Moskva (Venemaa â RU);
- [101130Z] â kuu 10. pĂ€ev, kell 11:30 Greenwichi aja jĂ€rgi;
- [31004MPS] â tuule suund 310 kraadi, kiirus 4 m/s;
- [9999] â horisontaalne nĂ€htavus 10 km vĂ”i rohkem;
- [SCT048] â hajutatud pilved kĂ”rgusel 4800 jalga (~1584m);
- [24/13] â temperatuur 24°C, kastepunkt 13°C;
- [Q1014] â rĂ”hk (QNH) 1014 hPa (750 mm Hg);
- [R01/000070] â haardetegur rajal 01 â 0,70;
- [NOSIG] â ilma oluliste muutusteta.
KĂ€ime nĂŒĂŒd koodi kirjutamise juurde. KĂ”igepealt peame impordima funktsioonid request ja pytaf:
from urllib import request
import pytafMÀÀ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 nĂŒĂŒd TAF-i juurde (ka registrit on oluline jĂ€lgida).
https://tgftp.nws.noaa.gov/data/forecasts/taf/stations/.TXTNagu eelnevas 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
EeskĂ€tt pöörame tĂ€helepanu ridadele TEMPO ja BECMG. TEMPO tĂ€hendab, et tegelik ilm muutub mÀÀratud ajavahemikus pidevalt. BECMG â ilm muutub jĂ€rk-jĂ€rgult mÀÀratud ajavahemikus.
Siiski, rida:
TEMPO 1012/1020 -TSRA BKN020CBTĂ€hendab:
- [1012/1020] â ajavahemikus 12 kuni 20 (Greenwichi ajal);
- [-TSRA] â Ă€ikesetorm (TS = thunderstorm) vihmaga (RA = rain) kerge intensiivsusega (miinus);
- [BKN020CB] â mĂ€rkimisvÀÀrne (BKN = katkine), pilvisus (CB = kumulonimbus) 2000 jala (610 meetri) kĂ”rgusel merepinnast.
On palju termineid, mis tÀhistavad ilmastikutingimusi, ja neid on raske meeles pidada. TAF-i pÀringu kood kirjutatakse samamoodi.
Laeme koodi pilve
Kuna ei taha aega raisata, vÔtame meie hoidlast telegrampunkri malle. . Seal on eelnevalt ette valmistatud requirements.txt ja setup.py Ôige direktorite struktuuriga.
Kuna koodis pöördume mooduli poole pytaf, siis tuleb selle versioon kohe lisada requirements.txt
pytaf~=1.2.1- Liigume edasi redigeerimise juurde bot/tele_bot.py. Eemaldame kÔik liialdust 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 lennuilma prognoosi saamiseks "
"NOAA serveritest. 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)
- Pakkime kogu kausta ZIP-arhiivi ja liikume juhtpaneelile loodud funktsiooni juurde.
- KlĂ”psame Redigeerida ja laadime arhiivi koos koodiga ĂŒles.

- TÀidame suhte teed failini tele_bot (laiendit .py ei ole vaja nÀidata) ja lÔpp-funktsiooni (antud nÀite puhul on see main).
- Jaotises Keskkonnamuutujad kirjutame muutuja TOKEN ja mÀÀrame sellele vajaliku telegramm-boti tokeni.
- KlĂ”psame Salvesta ja rakenda, pĂ€rast mida liigume jaotisse LĂŒlitid.
- Asetame lĂŒliti HTTP-pĂ€ring, et teha pĂ€ring avalikuks.

Meil on nĂŒĂŒd URL avalikuks funktsiooni kutsumiseks. JÀÀnud on vaid . Leidke meie bot Telegrammiks ja registreerige oma bot 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 nÀitab reaalajas lennuilma kokkuvÔtet otse messengeri.

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