Ada banyak sekali layanan yang menyediakan informasi cuaca, tapi mana yang harus Anda percayai? Ketika saya mulai sering bersepeda, saya ingin mendapatkan informasi paling akurat tentang kondisi cuaca di tempat saya bersepeda.
Pikiran pertama saya adalah membangun stasiun cuaca kecil DIY dengan sensor dan menerima data darinya. Namun saya tidak “menemukan kembali roda” dan memilih informasi cuaca yang digunakan dalam penerbangan sipil sebagai sumber data terverifikasi, yaitu METAR (Laporan Bandar Udara METeorologi) dan TAF (TAF - Prakiraan Terminal Aerodrome). Dalam penerbangan, kehidupan ratusan orang bergantung pada cuaca, sehingga prakiraan cuaca dibuat seakurat mungkin.
Informasi ini disiarkan XNUMX/XNUMX melalui suara di setiap lapangan terbang modern dalam bentuk ATIS (Layanan Informasi Terminal Otomatis) dan VOLMET (dari bahasa Perancis. vol - penerbangan dan MÉTÉO - cuaca). Yang pertama memberikan informasi tentang cuaca aktual di lapangan terbang, dan yang kedua memberikan prakiraan cuaca untuk 24-30 jam ke depan, tidak hanya di lapangan terbang siaran, tetapi juga di lapangan terbang lainnya.
Contoh pengoperasian ATIS di bandara Vnukovo:
Contoh cara kerja VOLMET di Bandara Vnukovo
Tidak nyaman untuk membawa pemindai radio atau transceiver setiap saat untuk rentang yang sesuai, dan saya ingin membuat bot di Telegram yang, dengan mengklik tombol, memungkinkan Anda mendapatkan perkiraan yang sama. Setidaknya tidak praktis untuk mengalokasikan server terpisah untuk ini, serta mengirimkan permintaan ke Raspberry rumah Anda.
Oleh karena itu, saya memutuskan untuk menggunakan layanan ini sebagai backend
Persiapan bagian belakang
Membuat Fungsi
Di panel kontrol
Setelah proyek dibuat, buka bagian tersebut Fungsi:
Tekan tombolnya Buat fungsi dan beri nama yang diinginkan:
Setelah menekan Buat fungsi kita akan memiliki representasi dari fungsi yang dibuat:
Sebelum Anda mulai membuat kode dengan Python, Anda perlu membuat bot di Telegram. Saya tidak akan menjelaskan bagaimana hal ini dilakukan - ada instruksi terperinci
Mempersiapkan kode
Saya memilih National Oceanic and Atmospheric Administration (NOAA) sebagai sumber data yang dapat dipercaya. Badan ilmiah ini memperbarui data secara real time di servernya dalam format TXT.
Tautan untuk mendapatkan data METAR (perhatikan kasusnya):
https://tgftp.nws.noaa.gov/data/observations/metar/stations/<код аэропорта по ICAO>.TXT
Dalam kasus saya, bandara terdekat adalah Vnukovo, kode ICAO-nya adalah UUWW. Membuka URL yang dihasilkan akan memberikan yang berikut:
2020/08/10 11:30
UUWW 101130Z 31004MPS 9999 SCT048 24/13 Q1014 R01/000070 NOSIG
Baris pertama adalah waktu perkiraan saat ini dalam Greenwich Mean Time. Baris kedua adalah ringkasan cuaca sebenarnya. Pilot penerbangan sipil tidak akan kesulitan memahami arti garis ini, namun kami memerlukan penjelasan:
- [UUWW] — Vnukovo, Moskow (Rusia — RU);
- [101130Z] — tanggal 10 setiap bulannya, 11:30 GMT;
- [31004 MPS] — arah angin 310 derajat, kecepatan 4 m/s;
- [9999] — visibilitas horizontal 10 km atau lebih;
- [SCT048] — awan tersebar/tersebar pada ketinggian 4800 kaki (~1584m);
- [24 / 13] — suhu 24°C, titik embun 13°C;
- [Q1014] — tekanan (QNH) 1014 hektopascal (750 mm Hg);
- [R01/000070] — koefisien adhesi pada jalur 01 — 0,70;
- [NOSIG] - tanpa perubahan signifikan.
Mari kita mulai menulis kode program. Pertama, Anda perlu mengimpor fungsi permintaan и petasan:
from urllib import request
import pytaf
Tentukan variabel dan siapkan fungsi decoding:
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()
Mari beralih ke TAF (kasus juga penting).
https://tgftp.nws.noaa.gov/data/forecasts/taf/stations/<код аэропорта по ICAO>.TXT
Seperti pada contoh sebelumnya, mari kita lihat ramalan cuaca di bandara Vnukovo:
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
Mari kita memberi perhatian khusus pada garis-garisnya TEMPO и BECMG. TEMPO artinya cuaca sebenarnya pada periode tertentu akan berubah secara berkala. BECMG - cuaca akan berubah secara bertahap dalam jangka waktu tertentu.
Artinya, baris:
TEMPO 1012/1020 -TSRA BKN020CB
Artinya:
- [1012 / 1020] — antara 12 dan 20 jam (Greenwich Mean Time);
- [-TSRA] — badai petir (TS = badai petir) disertai hujan (RA = hujan) dengan intensitas rendah (tanda minus);
- [BKN020CB] - awan cumulonimbus (CB = cumulonimbus) yang signifikan (BKN = pecah) pada ketinggian 2000 kaki (610 meter) di atas permukaan laut.
Ada cukup banyak istilah untuk fenomena cuaca, dan sulit untuk mengingatnya. Kode untuk permintaan TAF ditulis dengan cara yang sama.
Mengunggah kode ke cloud
Agar tidak membuang waktu, mari kita ambil template bot telegram dari repositori kita
Karena di dalam kode kita akan mengakses modul petasan, maka versinya harus segera ditambahkan requirement.txt
pytaf~=1.2.1
- Mari beralih ke pengeditan bot/tele_bot.py. Kami menghapus semua hal yang tidak perlu dan menambahkan kode kami.
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)
- Kami mengemas seluruh direktori ke dalam arsip ZIP dan pergi ke panel kontrol ke fungsi yang dibuat.
- Klik disini Mengedit dan unduh arsip dengan kodenya.
- Isi jalur relatif dalam file tele_bot (perpanjangan .py mungkin tidak ditentukan) dan fungsi titik akhir (dalam contoh yang diberikan, ini adalah utama).
- Pada bagian Variabel Lingkungan menulis variabel TOKEN dan berikan token bot telegram yang diinginkan.
- Klik disini Simpan dan Perluas, setelah itu kita pergi ke bagian tersebut Pemicu.
- Kami mematikan saklarnya permintaan HTTPuntuk mempublikasikan permintaan tersebut.
Kami sekarang memiliki URL untuk memanggil fungsi tersebut secara publik. Yang tersisa hanyalah
/setwebhook <you bot token> <public URL of your function>
Hasil
Jika semuanya dilakukan dengan benar, bot Anda akan segera mulai bekerja dan menampilkan laporan cuaca penerbangan terbaru langsung di messenger.
Tentu saja, kodenya dapat ditingkatkan, tetapi bahkan dalam kondisi saat ini, cukup mengetahui cuaca dan prakiraan cuaca paling akurat dari sumber tepercaya.
Anda akan menemukan versi lengkap kodenya di kami
Sumber: www.habr.com