Nagyon sok szolgáltatás nyújt időjárási információkat, de melyikben érdemes megbízni? Amikor elkezdtem gyakran kerékpározni, szerettem volna a lehető legpontosabb információkat kapni az időjárási viszonyokról azon a helyen, ahol lovagolok.
Az első gondolatom az volt, hogy építek egy kis barkácsoló meteorológiai állomást érzékelőkkel, és adatokat fogadok belőle. De nem „találtam fel újra a kereket”, hanem a polgári repülésben használt időjárási információkat választottam az ellenőrzött adatok forrásául, nevezetesen METAR (METeorological Aerodrome Report) és TAF (TAF – Terminal Aerodrome Forecast). A repülésben több száz ember élete függ az időjárástól, így az előrejelzések a lehető legpontosabbak.
Ezt az információt a nap XNUMX órájában sugározzák hangon minden modern repülőtéren a formában ATIS (Automatikus terminálinformációs szolgáltatás) és VOLMET (francia nyelvből. vol - repülés és Meteo - időjárás). Az első a repülőtér aktuális időjárásáról ad tájékoztatást, a második pedig előrejelzést ad a következő 24-30 órára, nem csak a sugárzott repülőtéren, hanem másokon is.
Példa az ATIS működésére a Vnukovo repülőtéren:
Példa a VOLMET működésére a Vnukovo repülőtéren
Kényelmetlen minden alkalommal magával vinni egy rádiós szkennert vagy adó-vevőt a megfelelő tartományhoz, és egy olyan botot akartam létrehozni a Telegramban, amely egyetlen gombnyomással lehetővé teszi ugyanazt az előrejelzést. Ehhez legalábbis nem praktikus külön szervert rendelni, valamint kéréseket küldeni az otthoni Raspberry-re.
Ezért úgy döntöttem, hogy háttérként használom a szolgáltatást
Backend előkészítés
Hozzon létre egy függvényt
A vezérlőpulton
A projekt létrehozása után lépjen a szakaszra függvények:
Nyomja meg a gombot Hozzon létre egy függvényt és adja meg a kívánt nevet:
Megnyomás után Hozzon létre egy függvényt megkapjuk a létrehozott függvény reprezentációját:
Mielőtt elkezdené a kód létrehozását a Pythonban, létre kell hoznia egy botot a Telegramban. Nem írom le, hogy ez hogyan történik - részletes utasítások vannak
A kód előkészítése
Megbízható adatok forrásául a National Oceanic and Atmospheric Administration (NOAA) nevű szervezetet választottam. Ez a tudományos ügynökség valós időben frissíti az adatokat a szerverén TXT formátumban.
Link a METAR adatok lekéréséhez (figyelje meg az esetet):
https://tgftp.nws.noaa.gov/data/observations/metar/stations/<код аэропорта по ICAO>.TXT
Esetemben a legközelebbi repülőtér a Vnukovo, az ICAO kódja UUWW. A generált URL-re lépve a következőt kapjuk:
2020/08/10 11:30
UUWW 101130Z 31004MPS 9999 SCT048 24/13 Q1014 R01/000070 NOSIG
Az első sor az előrejelzés aktuális időpontja greenwichi idő szerint. A második sor az aktuális időjárás összefoglalása. A polgári repülés pilótáinak nem okoz gondot megérteni, mit jelent ez a sor, de magyarázatra van szükségünk:
- [UUWW] – Vnukovo, Moszkva (Oroszország – RU);
- [101130Z] — a hónap 10. napja, 11:30 GMT;
- [31004MPS] — szélirány 310 fok, sebesség 4 m/s;
- [9999] — vízszintes látótávolság legalább 10 km;
- [SCT048] — szórványos/szórt felhők 4800 láb (~1584m) magasságban;
- [24 / 13] — hőmérséklet 24°C, harmatpont 13°C;
- [Q1014] — nyomás (QNH) 1014 hektopascal (750 Hgmm);
- [R01/000070] — tapadási együttható a 01-es sávon — 0,70;
- [NINCS JELENTŐS VÁLTOZÁS] - lényeges változtatások nélkül.
Kezdjük el írni a programkódot. Először is importálnia kell a függvényeket kérni и pytaf:
from urllib import request
import pytaf
Adja meg a változókat és készítse elő a dekódoló függvényt:
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()
Térjünk át a TAF-ra (a kisbetű is fontos).
https://tgftp.nws.noaa.gov/data/forecasts/taf/stations/<код аэропорта по ICAO>.TXT
Az előző példához hasonlóan nézzük meg a Vnukovo repülőtér előrejelzését:
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
Különös figyelmet fordítsunk a vonalakra TEMPO и BECMG. A TEMPO azt jelenti, hogy az aktuális időjárás a megadott időszakban időszakosan változik. BECMG - az időjárás fokozatosan megváltozik egy meghatározott időn belül.
Vagyis a sor:
TEMPO 1012/1020 -TSRA BKN020CB
Jelentése:
- [1012 / 1020] — 12 és 20 óra között (greenwichi idő szerint);
- [-TSRA] — zivatar (TS = zivatar) alacsony intenzitású esővel (RA = eső) (mínusz jel);
- [BKN020CB] - jelentős (BKN = törött), gomolyfelhők (CB = cumulonimbus) 2000 láb (610 méter) tengerszint feletti magasságban.
Elég sok kifejezés létezik az időjárási jelenségekre, és nehéz megjegyezni őket. A TAF kérés kódja hasonló módon van megírva.
Kód feltöltése a felhőbe
Hogy ne vesztegessük az időt, vegyünk egy telegram bot sablont a tárhelyünkből
Mivel a kódban hozzáférünk a modulhoz pytaf, akkor annak verzióját azonnal hozzá kell adni követelmények.txt
pytaf~=1.2.1
- Térjünk át a szerkesztésre bot/tele_bot.py. Eltávolítunk minden felesleges dolgot, és hozzáadjuk a kódunkat.
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)
- A teljes könyvtárat becsomagoljuk egy ZIP archívumba, és a vezérlőpultra lépünk a létrehozott funkcióhoz.
- sajtó szerkesztés és töltse le az archívumot a kóddal.
- Töltse ki a relatív elérési utat a fájlban tele_bot (kiterjesztés .py nem adható meg) és egy végpontfüggvény (a megadott példában ez fő-).
- Szakaszban Környezeti változók írj változót JELKÉPES és rendelje hozzá a kívánt táviratbot tokenjét.
- sajtó Mentés és bővítés, utána megyünk a szakaszra kiváltó.
- Feltesszük a kapcsolót HTTP kéréshogy a kérést nyilvánosságra hozzák.
Most már van egy URL-címünk a függvény nyilvános meghívásához. Már csak az van hátra
/setwebhook <you bot token> <public URL of your function>
Eredmény
Ha minden helyesen történik, a robot azonnal elkezd dolgozni, és közvetlenül a messengerben jeleníti meg a legfrissebb légi időjárás-jelentést.
A kódon persze lehet javítani, de a jelenlegi állapotában is elég megbízható forrásból megtudni a legpontosabb időjárást és előrejelzést.
A kód teljes verzióját megtalálja nálunk
Forrás: will.com