Hava durumu bilgisi sağlayan pek çok hizmet var ama hangisine güvenmelisiniz? Sık sık bisiklet sürmeye başladığımda bisiklet sürdüğüm yerdeki hava koşulları hakkında en doğru bilgiye sahip olmak istedim.
İlk düşüncem, sensörlü küçük bir DIY hava durumu istasyonu kurmak ve ondan veri almaktı. Ancak ben “tekerleği yeniden icat etmedim” ve doğrulanmış veri kaynağı olarak sivil havacılıkta kullanılan hava durumu bilgisini seçtim. METAR (METeorolojik Havaalanı Raporu) ve TSK (TAF - Terminal Havaalanı Tahmini). Havacılıkta yüzlerce insanın hayatı hava durumuna bağlıdır, dolayısıyla tahminler mümkün olduğu kadar doğrudur.
Bu bilgiler her modern havaalanında XNUMX/XNUMX sesli olarak yayınlanmaktadır. ATIS (Otomatik Terminal Bilgi Servisi) ve VOLMET (Fransızca'dan. cilt - uçuş ve météo - hava durumu). Birincisi, havaalanındaki gerçek hava durumu hakkında bilgi sağlarken, ikincisi, yalnızca yayın yapılan havaalanında değil, diğerlerinde de önümüzdeki 24-30 saat için tahmin sağlıyor.
Vnukovo Havalimanı'ndaki ATIS operasyonu örneği:
VOLMET'in Vnukovo Havalimanı'nda nasıl çalıştığına bir örnek
İlgili aralık için her zaman yanınızda bir radyo tarayıcısı veya alıcı-verici taşımak sakıncalıdır ve Telegram'da, bir düğmeye tıklayarak aynı tahmini almanızı sağlayan bir bot oluşturmak istedim. Bunun için ayrı bir sunucu tahsis etmenin yanı sıra evinize Raspberry'e istek göndermek en azından pratik değildir.
Bu nedenle hizmeti arka uç olarak kullanmaya karar verdim
Arka uç hazırlığı
Fonksiyon Yaratmak
kontrol panelinde
Proje oluşturulduktan sonra bölüme gidin fonksiyonlar:
Butona bas Bir işlev oluştur ve ona istediğiniz adı verin:
bastıktan sonra Bir işlev oluştur oluşturulan fonksiyonun bir temsiline sahip olacağız:
Python'da kod oluşturmaya başlamadan önce Telegram'da bir bot oluşturmanız gerekecektir. Bunun nasıl yapıldığını açıklamayacağım - ayrıntılı talimatlar var
Kodun hazırlanması
Güvenilir veri kaynağı olarak Ulusal Okyanus ve Atmosfer İdaresi'ni (NOAA) seçtim. Bu bilimsel kurum, sunucusundaki verileri TXT formatında gerçek zamanlı olarak günceller.
METAR verilerini alma bağlantısı (duruma dikkat edin):
https://tgftp.nws.noaa.gov/data/observations/metar/stations/<код аэропорта по ICAO>.TXT
Benim durumumda en yakın havaalanı Vnukovo, ICAO kodu UUWW. Oluşturulan URL'ye gitmek aşağıdakileri verecektir:
2020/08/10 11:30
UUWW 101130Z 31004MPS 9999 SCT048 24/13 Q1014 R01/000070 NOSIG
İlk satır, Greenwich Ortalama Saatine göre tahminin geçerli saatidir. İkinci satır gerçek hava durumunun bir özetidir. Sivil havacılık pilotları bu cümlenin ne anlama geldiğini anlamakta zorluk çekmeyecekler ancak bir açıklamaya ihtiyacımız var:
- [UUWW] — Vnukovo, Moskova (Rusya — RU);
- [101130Z] — Ayın 10'uncu günü, 11:30 GMT;
- [31004MPS] — rüzgar yönü 310 derece, hız 4 m/s;
- [9999] - yatay görüş 10 km veya daha fazla;
- [SCT048] — 4800 feet'te (~1584 m) dağınık/dağınık bulutlar;
- [24 / 13] — sıcaklık 24°C, çiğ noktası 13°C;
- [S1014] — basınç (QNH) 1014 hektopaskal (750 mm Hg);
- [R01/000070] - şerit 01 - 0,70'e yapışma katsayısı;
- [NOSİG] - önemli değişiklikler olmadan.
Program kodunu yazmaya başlayalım. İlk önce işlevleri içe aktarmanız gerekir talep и pytaf:
from urllib import request
import pytaf
Değişkenleri belirtin ve kod çözme işlevini hazırlayın:
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()
Gelelim TAF'a (durum da önemli).
https://tgftp.nws.noaa.gov/data/forecasts/taf/stations/<код аэропорта по ICAO>.TXT
Önceki örnekte olduğu gibi Vnukovo havaalanındaki hava tahminine bakalım:
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
Özellikle çizgilere dikkat edelim ZAMAN и BECMG. TEMPO, belirtilen dönemdeki gerçek hava durumunun periyodik olarak değişeceği anlamına gelir. BECMG - hava durumu belirli bir süre içinde kademeli olarak değişecektir.
Yani satır:
TEMPO 1012/1020 -TSRA BKN020CB
Şu anlama gelecektir:
- [1012 / 1020] — 12 ila 20 saat arasında (Greenwich Ortalama Saati);
- [-TSRA] — düşük yoğunlukta (eksi işareti) yağmurlu (RA = yağmur) gök gürültülü sağanak yağış (TS = fırtına);
- [BKN020CB] - deniz seviyesinden 2000 feet (610 metre) yükseklikte önemli (BKN = kırık), kümülonimbus (CB = kümülonimbus) bulutları.
Hava olayları için oldukça fazla terim vardır ve bunları hatırlamak zordur. TAF talebinin kodu da benzer şekilde yazılmıştır.
Kodu buluta yükleme
Zaman kaybetmemek için depomuzdan bir telgraf bot şablonu alalım
Kodda modüle erişeceğimiz için pytaf, sürümü hemen eklenmelidir gereksinimler.txt
pytaf~=1.2.1
- Hadi düzenlemeye geçelim bot/tele_bot.py. Gereksiz tüm şeyleri kaldırıp kodumuzu ekliyoruz.
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)
- Dizinin tamamını bir ZIP arşivine paketliyoruz ve kontrol paneline oluşturulan işleve gidiyoruz.
- Tıklayın Düzenle ve arşivi kodla birlikte indirin.
- Dosyadaki ilgili yolu doldurun tele_bot (eklenti .py belirtilmeyebilir) ve bir uç nokta işlevi (verilen örnekte bu ana).
- Bölümünde Ortam Değişkenleri bir değişken yaz JETONU ve ona istediğiniz telgraf botunun jetonunu atayın.
- Tıklayın Kaydet ve Genişlet, ardından bölüme gidiyoruz tetikleyiciler.
- Anahtarı koyduk HTTP isteğiTalebin kamuya duyurulması.
Artık işlevi herkese açık olarak çağırmak için bir URL'miz var. Geriye kalan tek şey
/setwebhook <you bot token> <public URL of your function>
sonuç
Her şey doğru yapılırsa, botunuz hemen çalışmaya başlayacak ve en son havacılık hava durumu raporunu doğrudan messenger'da görüntüleyecektir.
Elbette kod geliştirilebilir, ancak mevcut durumunda bile güvenilir bir kaynaktan en doğru hava durumunu ve tahmini öğrenmek yeterlidir.
Kodun tam sürümünü sitemizde bulabilirsiniz.
Kaynak: habr.com