Կան բազմաթիվ ծառայություններ, որոնք տրամադրում են եղանակի մասին տեղեկատվություն, բայց որի՞ն պետք է վստահել: Երբ ես սկսեցի հաճախակի հեծանիվ վարել, ես ուզում էի ամենաճշգրիտ տեղեկություն ունենալ այն վայրում, որտեղ ես վարում եմ եղանակային պայմանները:
Իմ առաջին միտքը տվիչներով փոքրիկ DIY եղանակային կայան կառուցելն ու դրանից տվյալներ ստանալն էր: Բայց ես չվերաստեղծեցի անիվը և ընտրեցի եղանակային տեղեկատվությունը, որն օգտագործվում է քաղաքացիական ավիացիայում որպես ստուգված տվյալների աղբյուր, մասնավորապես. ՄԵՏԱՐ (Օդերեւութաբանական աերոդրոմի հաշվետվություն) և Taf (TAF - Terminal Aerodrome Forecast): Ավիացիայում հարյուրավոր մարդկանց կյանքը կախված է եղանակից, ուստի կանխատեսումները հնարավորինս ճշգրիտ են:
Այս տեղեկատվությունը XNUMX/XNUMX ձայնով հեռարձակվում է յուրաքանչյուր ժամանակակից օդանավակայանում այս ձևով ԱՏԻՍ (Ավտոմատ Տերմինալի տեղեկատվական ծառայություն) և ՎՈԼՄԵՏ (ֆրանսերենից. ք - թռիչք և meteo - եղանակ): Առաջինը տեղեկատվություն է տրամադրում օդանավակայանի իրական եղանակի մասին, իսկ երկրորդը տրամադրում է առաջիկա 24-30 ժամվա կանխատեսումը ոչ միայն հեռարձակման օդանավակայանում, այլև մյուսներում:
Վնուկովո օդանավակայանում ATIS շահագործման օրինակ.
Օրինակ, թե ինչպես է աշխատում VOLMET-ը Վնուկովո օդանավակայանում
Անհարմար է ձեզ հետ ամեն անգամ համապատասխան տիրույթի համար ռադիո սկաներ կամ հաղորդիչ տանելը, և ես ուզում էի Telegram-ում ստեղծել բոտ, որը կոճակի սեղմումով թույլ կտա ստանալ նույն կանխատեսումը: Առնվազն գործնական չէ առանձին սերվեր հատկացնել դրա համար, ինչպես նաև հարցումներ ուղարկել ձեր տան Raspberry-ին:
Հետևաբար, ես որոշեցի օգտագործել ծառայությունը որպես հետին պլան
Backend պատրաստում
Ֆունկցիայի ստեղծում
Կառավարման վահանակում
Նախագիծը ստեղծելուց հետո անցեք բաժին Գործառույթներ:
Սեղմեք կոճակը Ստեղծեք գործառույթ և տվեք նրան ցանկալի անունը.
Սեղմելուց հետո Ստեղծեք գործառույթ մենք կունենանք ստեղծված ֆունկցիայի ներկայացում.
Նախքան Python-ում կոդ ստեղծելը, ձեզ հարկավոր է բոտ ստեղծել Telegram-ում: Ես չեմ նկարագրի, թե ինչպես է դա արվում, կան մանրամասն հրահանգներ
Կոդը պատրաստելը
Որպես վստահելի տվյալների աղբյուր ես ընտրեցի Օվկիանոսների և մթնոլորտի ազգային վարչությունը (NOAA): Այս գիտական գործակալությունը իրական ժամանակում թարմացնում է տվյալները իր սերվերում TXT ձևաչափով:
Հղում METAR-ի տվյալներ ստանալու համար (նշեք դեպքը).
https://tgftp.nws.noaa.gov/data/observations/metar/stations/<код аэропорта по ICAO>.TXT
Իմ դեպքում մոտակա օդանավակայանը Վնուկովոն է, նրա ԻԿԱՕ կոդը UUWW. Ստեղծված URL-ին անցնելը կտա հետևյալը.
2020/08/10 11:30
UUWW 101130Z 31004MPS 9999 SCT048 24/13 Q1014 R01/000070 NOSIG
Առաջին տողը Գրինվիչի ժամանակով կանխատեսման ընթացիկ ժամն է: Երկրորդ տողը փաստացի եղանակի ամփոփումն է: Քաղաքացիական ավիացիայի օդաչուները խնդիր չեն ունենա հասկանալու, թե ինչ է նշանակում այս գիծը, բայց մեզ բացատրություն է պետք.
- [UUWW] — Վնուկովո, Մոսկվա (Ռուսաստան — RU);
- [101130Z] — ամսվա 10-րդ օրը, 11:30 GMT;
- [31004 MPS] — քամու ուղղությունը 310 աստիճան, արագությունը 4 մ/վ;
- [9999] — հորիզոնական տեսանելիություն 10 կմ և ավելի;
- [SCT048] — ցրված/ցրված ամպեր 4800 ոտնաչափ (~1584 մ);
- [24 / 13] — ջերմաստիճանը 24°C, ցողի կետը 13°C;
- [Q1014] - ճնշում (QNH) 1014 հեկտոպասկալ (750 մմ Hg);
- [R01/000070] — կպչունության գործակիցը 01 գծի վրա — 0,70;
- [NOSIG] - առանց էական փոփոխությունների.
Սկսենք գրել ծրագրի կոդը։ Նախ անհրաժեշտ է ներմուծել գործառույթներ պահանջել и պիտաֆ:
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()
Անցնենք 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
Եկեք հատկապես ուշադրություն դարձնենք տողերին ՏԵՄՊՈ и BECMG. TEMPO նշանակում է, որ փաստացի եղանակը նշված ժամանակահատվածում պարբերաբար կփոխվի: BECMG - եղանակը աստիճանաբար կփոխվի որոշակի ժամանակահատվածում:
Այսինքն՝ տողը.
TEMPO 1012/1020 -TSRA BKN020CB
Կնշանակի.
- [1012 / 1020] — 12-ից 20 ժամ (Գրինվիչի միջին ժամանակում);
- [-TSRA] — ամպրոպ (TS = ամպրոպ) ցածր ինտենսիվության անձրևով (ՀՀ = անձրև) (մինուս նշան);
- [BKN020CB] - զգալի (BKN = կոտրված), կուտակային (CB = cumulonimbus) ամպեր ծովի մակարդակից 2000 ֆուտ (610 մետր) բարձրության վրա:
Եղանակային երևույթների տերմինները բավականին շատ են, և դրանք հիշելը դժվար է։ TAF հարցման ծածկագիրը գրված է նույն ձևով:
Կոդը վերբեռնվում է ամպի վրա
Որպեսզի ժամանակ չկորցնենք, եկեք մեր պահոցից վերցնենք հեռագրային բոտի կաղապար
Քանի որ կոդում մենք մուտք գործելու ենք մոդուլ պիտաֆ, ապա դրա տարբերակը պետք է անմիջապես ավելացնել պահանջները. txt
pytaf~=1.2.1
- Անցնենք խմբագրմանը bot/tele_bot.py. Մենք հեռացնում ենք բոլոր ավելորդ բաները և ավելացնում մեր կոդը:
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)
- Մենք փաթեթավորում ենք ամբողջ գրացուցակը ZIP արխիվի մեջ և գնում դեպի կառավարման վահանակ՝ ստեղծված գործառույթին:
- Սեղմել Редактировать և ներբեռնեք արխիվը ծածկագրով:
- Լրացրեք հարաբերական ուղին ֆայլում tele_bot (ընդլայնում հ կարող է նշված չլինել) և վերջնակետի ֆունկցիա (տրված օրինակում սա է հիմնական).
- Բաժին Շրջակա միջավայրի փոփոխականներ գրել փոփոխական ՏՈԿԵՆ և նշանակեք այն ցանկալի հեռագրային բոտի նշանը:
- Սեղմել Պահպանել և ընդարձակել, որից հետո անցնում ենք բաժին Triggers.
- Մենք դնում ենք անջատիչը HTTP հարցումհարցումը հրապարակայնացնելու համար։
Այժմ մենք ունենք URL գործառույթը հրապարակայնորեն կանչելու համար: Մնում է միայն
/setwebhook <you bot token> <public URL of your function>
Արդյունք
Եթե ամեն ինչ ճիշտ արվի, ձեր բոտն անմիջապես կսկսի աշխատել և կցուցադրի ավիացիոն եղանակի վերջին հաշվետվությունը անմիջապես մեսենջերում։
Իհարկե, կոդը կարող է բարելավվել, բայց նույնիսկ ներկա վիճակում բավական է վստահելի աղբյուրից պարզել եղանակի առավել ճշգրիտ կանխատեսումը։
Կոդի ամբողջական տարբերակը կգտնեք մեր կայքում
Source: www.habr.com