Постоји много услуга које пружају информације о времену, али којој од њих треба веровати? Када сам почео често да возим бицикл, желео сам да имам што тачније информације о временским приликама у месту где возим.
Моја прва мисао била је да саставим малу „уради сам“ метеоролошку станицу са сензорима и примам податке од ње. Али нисам „измислио точак“ и одабрао информације о времену које се користе у цивилном ваздухопловству као извор проверених података, тј. МЕТАР (МЕТеоролошки извештај са аеродрома) и ТАФ (ТАФ - Терминал Аеродроме Форецаст). У ваздухопловству животи стотина људи зависе од времена, па су прогнозе што тачније.
Ова информација се емитује 24/7 гласом на сваком модерном аеродрому у форми АТИС (Информациона служба за аутоматске терминале) и ВОЛМЕТ (са француског. вол - лет и прогнозу - време). Први даје информације о стварном времену на аеродрому, а други даје прогнозу за наредних 24-30 сати, не само на аеродрому за емитовање, већ и на другим.
Пример рада АТИС-а на аеродрому Внуково:
Пример како ВОЛМЕТ ради на аеродрому Внуково
Незгодно је сваки пут са собом носити радио скенер или примопредајник за одговарајући домет, а ја сам желео да направим бота у Телеграму који ће вам једним кликом на дугме омогућити да добијете исту прогнозу. У најмању руку је непрактично издвојити посебан сервер за ово, као и слање захтева вашем кућном Распберри-у.
Стога сам одлучио да користим услугу као бацкенд
Бацкенд припрема
Креирање функције
У контролној табли
Након што је пројекат креиран, идите на одељак Функције:
Притиснете дугме Креирајте функцију и дајте му жељено име:
Након притиска Креирајте функцију имаћемо приказ креиране функције:
Пре него што почнете да креирате код у Питхон-у, мораћете да направите бота у Телеграму. Нећу описивати како се то ради - постоје детаљна упутства
Припрема кода
Одабрао сам Националну управу за океане и атмосферу (НОАА) као извор поузданих података. Ова научна агенција ажурира податке у реалном времену на свом серверу у ТКСТ формату.
Линк за добијање МЕТАР података (обратите пажњу на случај):
https://tgftp.nws.noaa.gov/data/observations/metar/stations/<код аэропорта по ICAO>.TXT
У мом случају, најближи аеродром је Внуково, његов ИЦАО код је УУВВ. Одлазак на генерисани УРЛ ће дати следеће:
2020/08/10 11:30
UUWW 101130Z 31004MPS 9999 SCT048 24/13 Q1014 R01/000070 NOSIG
Први ред је тренутно време прогнозе у средњем времену по Гриничу. Други ред је резиме стварног времена. Пилоти цивилног ваздухопловства неће имати проблема да схвате шта ова линија значи, али нам је потребно објашњење:
- [УУВВ] — Внуково, Москва (Русија — РУ);
- [101130З] — 10. дан у месецу, 11:30 ГМТ;
- [31004МПС] — правац ветра 310 степени, брзина 4 м/с;
- [КСНУМКС] — хоризонтална видљивост 10 км или више;
- [СЦТ048] — разбацани/разбацани облаци на 4800 стопа (~1584м);
- [КСНУМКС / КСНУМКС] — температура 24°Ц, тачка росе 13°Ц;
- [К1014] — притисак (КНХ) 1014 хектопаскала (750 мм Хг);
- [Р01/000070] — коефицијент адхезије на траци 01 — 0,70;
- [НОСИГ] - без значајнијих промена.
Почнимо да пишемо програмски код. Прво морате да увезете функције захтева и питаф:
from urllib import request
import pytaf
Наведите варијабле и припремите функцију декодирања:
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()
Пређимо на ТАФ (случај је такође важан).
https://tgftp.nws.noaa.gov/data/forecasts/taf/stations/<код аэропорта по ICAO>.TXT
Као иу претходном примеру, погледајмо прогнозу на аеродрому Внуково:
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
Посебно обратимо пажњу на линије ВРЕМЕ и БЕЦМГ. ТЕМПО значи да ће се стварно време током наведеног периода периодично мењати. БЕЦМГ - време ће се постепено мењати у одређеном временском периоду.
То јест, линија:
TEMPO 1012/1020 -TSRA BKN020CB
ће значити:
- [КСНУМКС / КСНУМКС] — између 12 и 20 сати (средње време по Гриничу);
- [-ТСРА] — грмљавина (ТС = грмљавина) са кишом (РА = киша) слабог интензитета (знак минус);
- [БКН020ЦБ] - значајни (БКН = испрекидани), кумулонимбус (ЦБ = кумулонимбус) облаци на 2000 стопа (610 метара) изнад нивоа мора.
Постоји доста термина за временске појаве, а запамтити их је тешко. Код за ТАФ захтев је написан на сличан начин.
Отпремање кода у облак
Да не бисмо губили време, узмимо шаблон телеграм бота из нашег спремишта
Пошто ћемо у коду приступати модулу питаф, онда треба одмах додати његову верзију захтеве.ткт
pytaf~=1.2.1
- Пређимо на уређивање бот/теле_бот.пи. Уклањамо све непотребне ствари и додајемо наш код.
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)
- Пакујемо цео директоријум у ЗИП архиву и идемо на контролни панел до креиране функције.
- Притисни Уреди и преузмите архиву са кодом.
- Попуните релативну путању у датотеци теле_бот (продужетак .пи можда није наведено) и функцију крајње тачке (у датом примеру ово је главни).
- У секцији Променљиве окружења написати променљиву ТОКЕН и доделите му токен жељеног телеграм бота.
- Притисни Сачувај и прошири, након чега идемо на одељак Окидачи.
- Ставили смо прекидач ХТТП захтевда се захтев учини јавним.
Сада имамо УРЛ за јавно позивање функције. Све што је остало је
/setwebhook <you bot token> <public URL of your function>
Резултат
Ако је све урађено како треба, ваш бот ће одмах почети са радом и приказати најновији извештај о времену у ваздухопловству директно у месинџеру.
Наравно, код се може побољшати, али чак иу његовом тренутном стању довољно је сазнати најтачније време и прогнозу из поузданог извора.
Наћи ћете пуну верзију кода у нашој
Извор: ввв.хабр.цом