Ir daudz pakalpojumu, kas sniedz informāciju par laikapstākļiem, bet kuram no tiem vajadzētu uzticēties? Kad sāku bieži braukt ar velosipēdu, vēlējos iegūt pēc iespējas precīzāku informāciju par laikapstākļiem vietā, kur braucu.
Mana pirmā doma bija uzbūvēt nelielu DIY laika staciju ar sensoriem un saņemt no tās datus. Bet es neizgudroju riteni no jauna un kā pārbaudīto datu avotu izvēlējos informāciju par laikapstākļiem, kas tiek izmantota civilajā aviācijā, proti, METĀRS (METeoroloģiskā lidlauka ziņojums) un TAF (TAF - Terminal Aerodrome Forecast). Aviācijā simtiem cilvēku dzīvības ir atkarīgas no laikapstākļiem, tāpēc prognozes ir pēc iespējas precīzākas.
Šī informācija tiek pārraidīta XNUMX/XNUMX ar balsi katrā mūsdienu lidlaukā formā ATIS (Automātiskais termināļa informācijas pakalpojums) un VOLMET (no franču valodas. vol - lidojums un Meteo - laikapstākļi). Pirmajā tiek sniegta informācija par faktiskajiem laikapstākļiem lidlaukā, bet otrajā tiek sniegta prognoze turpmākajām 24-30 stundām ne tikai apraides lidlaukā, bet arī citos.
ATIS darbības piemērs Vnukovo lidostā:
Piemērs, kā VOLMET strādā Vnukovas lidostā
Ir neērti katru reizi nēsāt līdzi radio skeneri vai raiduztvērēju attiecīgajam diapazonam, un es gribēju izveidot telegrammā robotu, kas, noklikšķinot uz pogas, ļauj iegūt tādu pašu prognozi. Šim nolūkam ir vismaz nepraktiski piešķirt atsevišķu serveri, kā arī nosūtīt pieprasījumus uz jūsu mājas Raspberry.
Tāpēc es nolēmu izmantot pakalpojumu kā aizmuguri
Aizmugursistēmas sagatavošana
Izveidojiet funkciju
Vadības panelī
Kad projekts ir izveidots, dodieties uz sadaļu Funkcijas:
Nospiediet pogu Izveidojiet funkciju un piešķiriet tai vēlamo nosaukumu:
Pēc nospiešanas Izveidojiet funkciju mums būs izveidotās funkcijas attēlojums:
Pirms sākat izveidot kodu Python, jums būs jāizveido robots Telegram. Es neaprakstīšu, kā tas tiek darīts - ir detalizētas instrukcijas
Koda sagatavošana
Es izvēlējos Nacionālo okeānu un atmosfēras pārvaldi (NOAA) kā uzticamu datu avotu. Šī zinātniskā aģentūra reāllaikā atjaunina datus savā serverī TXT formātā.
Saite, lai iegūtu METAR datus (ņemiet vērā gadījumu):
https://tgftp.nws.noaa.gov/data/observations/metar/stations/<код аэропорта по ICAO>.TXT
Manā gadījumā tuvākā lidosta ir Vnukovo, tās ICAO kods ir UUWW. Pārejot uz ģenerēto URL, tiks parādīts šāds:
2020/08/10 11:30
UUWW 101130Z 31004MPS 9999 SCT048 24/13 Q1014 R01/000070 NOSIG
Pirmajā rindā ir pašreizējais prognozes laiks pēc Griničas laika. Otrā rinda ir faktisko laikapstākļu kopsavilkums. Civilās aviācijas pilotiem nebūs problēmu saprast, ko šī līnija nozīmē, taču mums ir nepieciešams skaidrojums:
- [UUWW] — Vnukovo, Maskava (Krievija — RU);
- [101130Z] — mēneša 10. datums, 11:30 pēc GMT;
- [31004MPS] — vēja virziens 310 grādi, ātrums 4 m/s;
- [9999] — horizontālā redzamība 10 km vai vairāk;
- [SCT048] — izkliedēti/izkliedēti mākoņi 4800 pēdu (~1584m) augstumā;
- [24 / 13] — temperatūra 24°C, rasas punkts 13°C;
- [Q1014] — spiediens (QNH) 1014 hektopaskāli (750 mm Hg);
- [R01/000070] — saķeres koeficients 01. joslā — 0,70;
- [NOSIG] - bez būtiskām izmaiņām.
Sāksim rakstīt programmas kodu. Vispirms jums ir jāimportē funkcijas pieprasīt и pytaf:
from urllib import request
import pytaf
Norādiet mainīgos un sagatavojiet dekodēšanas funkciju:
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()
Pārejam pie TAF (svarīgs ir arī gadījums).
https://tgftp.nws.noaa.gov/data/forecasts/taf/stations/<код аэропорта по ICAO>.TXT
Tāpat kā iepriekšējā piemērā, apskatīsim prognozi Vnukovo lidostā:
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
Īpašu uzmanību pievērsīsim līnijām LAIKS и BECMG. TEMPO nozīmē, ka faktiskie laikapstākļi norādītajā periodā periodiski mainīsies. BECMG - laika apstākļi pakāpeniski mainīsies noteiktā laika periodā.
Tas ir, rinda:
TEMPO 1012/1020 -TSRA BKN020CB
Nozīmēs:
- [1012 / 1020] — no 12 līdz 20 stundām (pēc Griničas laika);
- [-TSRA] — pērkona negaiss (TS = pērkona negaiss) ar zemas intensitātes lietu (RA = lietus) (mīnusa zīme);
- [BKN020CB] - nozīmīgi (BKN = sadalīti), gubu (CB = gubu) mākoņi 2000 pēdu (610 metru) augstumā virs jūras līmeņa.
Laikapstākļu parādībām ir diezgan daudz terminu, un tos atcerēties ir grūti. TAF pieprasījuma kods ir uzrakstīts līdzīgi.
Koda augšupielāde mākonī
Lai netērētu laiku, paņemsim telegrammas robota veidni no mūsu krātuves
Tā kā kodā mēs piekļūsim modulim pytaf, tad tā versija nekavējoties jāpievieno prasības.txt
pytaf~=1.2.1
- Pāriesim pie rediģēšanas bot/tele_bot.py. Mēs noņemam visas nevajadzīgās lietas un pievienojam savu kodu.
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)
- Mēs iesaiņojam visu direktoriju ZIP arhīvā un pārejam uz vadības paneli uz izveidoto funkciju.
- Noklikšķiniet šeit Rediģēt un lejupielādējiet arhīvu ar kodu.
- Failā ievadiet relatīvo ceļu tele_bot (pagarinājums .py var nebūt norādīts) un beigu punkta funkcija (dotajā piemērā tas ir galvenais).
- Iedaļā Vides mainīgie uzrakstiet mainīgo TOKEN un piešķiriet tam vajadzīgās telegrammas robota marķieri.
- Noklikšķiniet šeit Saglabāt un paplašināt, pēc kura mēs ejam uz sadaļu Trigeri.
- Mēs ievietojam slēdzi HTTP pieprasījumslai pieprasījums būtu publisks.
Tagad mums ir URL funkcijas publiskai izsaukšanai. Viss, kas palicis, ir
/setwebhook <you bot token> <public URL of your function>
Piedzīvojiet efektīvu rezultātu spēku
Ja viss ir izdarīts pareizi, jūsu robots nekavējoties sāks darboties un parādīs jaunāko aviācijas laikapstākļu ziņojumu tieši kurjerā.
Protams, kodu var uzlabot, taču pat tā pašreizējā stāvoklī ir pietiekami, lai uzzinātu precīzākos laikapstākļus un prognozes no uzticama avota.
Pilnu koda versiju atradīsit mūsu
Avots: www.habr.com