Ana akeh layanan sing nyedhiyakake informasi cuaca, nanging sing kudu dipercaya? Nalika aku miwiti muter asring, Aku wanted kanggo duwe informasi paling akurat bab kondisi cuaca ing panggonan ngendi aku numpak.
Pikiranku pisanan yaiku mbangun stasiun cuaca DIY cilik kanthi sensor lan nampa data saka iku. Nanging aku ora "reinvent roda" lan milih informasi cuaca sing digunakake ing penerbangan sipil minangka sumber data sing wis diverifikasi, yaiku METAR (Laporan Aerodrome METeorologis) lan TAF (TAF - Prakiraan Aerodrome Terminal). Ing penerbangan, urip atusan wong gumantung marang cuaca, mula ramalan kasebut akurat.
Informasi iki disiarake XNUMX/XNUMX kanthi swara ing saben lapangan udara modern ing wangun ATIS (Layanan Informasi Terminal Otomatis) lan VOLMET (saka basa Prancis. vol - pesawat lan Météo - cuaca). Kapisan nyedhiyakake informasi babagan cuaca nyata ing lapangan terbang, lan sing kapindho nyedhiyakake ramalan kanggo 24-30 jam sabanjure, ora mung ing lapangan udara siaran, nanging uga ing wong liya.
Conto operasi ATIS ing Bandara Vnukovo:
Conto cara kerja VOLMET ing Bandara Vnukovo
Ora trep kanggo nggawa scanner radio utawa transceiver karo sampeyan saben wektu kanggo sawetara sing cocog, lan aku pengin nggawe bot ing Telegram sing, kanthi ngeklik tombol, ngidini sampeyan entuk ramalan sing padha. Paling ora praktis kanggo nyedhiyakake server sing kapisah kanggo iki, uga ngirim panjaluk menyang Raspberry omah sampeyan.
Mulane, aku mutusake nggunakake layanan kasebut minangka backend
Persiapan mburi
Nggawe fungsi
Ing panel kontrol
Sawise proyek digawe, pindhah menyang bagean kasebut Fungsi:
Pencet tombol Nggawe fungsi lan wenehi jeneng sing dikarepake:
Sawise mencet Nggawe fungsi kita bakal duwe perwakilan saka fungsi sing digawe:
Sadurunge miwiti nggawe kode ing Python, sampeyan kudu nggawe bot ing Telegram. Aku ora bakal njlèntrèhaké carane iki rampung - ana instruksi rinci
Nyiyapake kode
Aku milih National Oceanic and Atmospheric Administration (NOAA) minangka sumber data sing bisa dipercaya. Agensi ilmiah iki nganyari data ing wektu nyata ing server ing format TXT.
Link kanggo njaluk data METAR (cathetan kasus):
https://tgftp.nws.noaa.gov/data/observations/metar/stations/<код аэропорта по ICAO>.TXT
Ing kasusku, bandara paling cedhak yaiku Vnukovo, kode ICAO UUWW. Menyang URL sing digawe bakal menehi ing ngisor iki:
2020/08/10 11:30
UUWW 101130Z 31004MPS 9999 SCT048 24/13 Q1014 R01/000070 NOSIG
Baris pisanan yaiku wektu ramalan saiki ing Greenwich Mean Time. Baris kapindho minangka ringkesan cuaca sing nyata. Pilot penerbangan sipil ora bakal duwe masalah ngerti apa tegese baris iki, nanging kita butuh panjelasan:
- [UUWW] - Vnukovo, Moscow (Rusia - RU);
- [101130Z] — 10 dina sasi, 11:30 GMT;
- [31004MPS] - arah angin 310 derajat, kacepetan 4 m / s;
- [9999] - visibilitas horisontal 10 km utawa luwih;
- [SCT048] — mega kasebar / kasebar ing 4800 kaki (~1584 m);
- [24 / 13] - suhu 24°C, titik embun 13°C;
- [Q1014] - tekanan (QNH) 1014 hectopascals (750 mm Hg);
- [R01/000070] - koefisien adhesion ing jalur 01 - 0,70;
- [NOSIG] - tanpa owah-owahan sing signifikan.
Ayo miwiti nulis kode program. Pisanan sampeyan kudu ngimpor fungsi Nyuwun и pytaf:
from urllib import request
import pytaf
Nemtokake variabel lan nyiapake fungsi dekoding:
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()
Ayo pindhah menyang TAF (kasus uga penting).
https://tgftp.nws.noaa.gov/data/forecasts/taf/stations/<код аэропорта по ICAO>.TXT
Kaya ing conto sadurunge, ayo goleki ramalan ing 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
Ayo kita mbayar manungsa waé khusus kanggo garis MASA и BECMG. TEMPO tegese cuaca sing nyata sajrone periode sing ditemtokake bakal ganti kanthi periodik. BECMG - cuaca bakal mboko sithik ganti ing wektu tartamtu.
Yaiku, baris:
TEMPO 1012/1020 -TSRA BKN020CB
Bakal tegese:
- [1012 / 1020] - antarane 12 lan 20 jam (Greenwich Mean Time);
- [-TSRA] - badai (TS = badai) kanthi udan (RA = udan) kanthi intensitas kurang (tanda minus);
- [BKN020CB] - awan signifikan (BKN = rusak), cumulonimbus (CB = cumulonimbus) awan ing 2000 kaki (610 meter) saka lumahing segara.
Ana cukup akeh istilah kanggo fenomena cuaca, lan ngelingi iku angel. Kode kanggo panyuwunan TAF ditulis kanthi cara sing padha.
Ngunggah kode menyang awan
Supaya ora mbuwang wektu, ayo njupuk cithakan bot telegram saka gudang
Wiwit ing kode kita bakal ngakses modul pytaf, banjur versi kasebut kudu langsung ditambahake syarat.txt
pytaf~=1.2.1
- Ayo pindhah menyang nyunting bot/tele_bot.py. Kita mbusak kabeh sing ora perlu lan nambah kode kita.
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)
- Kita ngemas kabeh direktori menyang arsip ZIP lan pindhah menyang panel kontrol menyang fungsi sing digawe.
- Tekan Sunting lan download arsip karo kode.
- Isi path relatif ing file tele_bot (ekstensi .py bisa uga ora kasebut) lan fungsi endpoint (ing conto diwenehi iki utama).
- bagean Variabel Lingkungan nulis variabel TOKEN lan wenehake token bot telegram sing dikarepake.
- Tekan Simpen lan Expand, sawise iku kita pindhah menyang bagean pemicu.
- Kita sijine saklar panjalukan HTTPkanggo nggawe panjalukan umum.
Saiki kita duwe URL kanggo nelpon umum fungsi kasebut. Sing isih ana
/setwebhook <you bot token> <public URL of your function>
asil
Yen kabeh wis rampung kanthi bener, bot sampeyan bakal langsung kerja lan nampilake laporan cuaca penerbangan paling anyar langsung ing utusan.
Mesthi, kode kasebut bisa ditingkatake, nanging sanajan ing kahanan saiki, cukup kanggo ngerteni cuaca lan ramalan sing paling akurat saka sumber sing dipercaya.
Sampeyan bakal nemokake versi lengkap kode ing kita
Source: www.habr.com