Existuje veľa služieb, ktoré poskytujú informácie o počasí, ale ktorej z nich by ste mali dôverovať? Keď som začal často bicyklovať, chcel som mať čo najpresnejšie informácie o poveternostných podmienkach v mieste, kde jazdím.
Moja prvá myšlienka bola zostaviť malú DIY meteostanicu so senzormi a prijímať z nej dáta. Ale „nevynašiel som koleso“ a ako zdroj overených údajov som si vybral informácie o počasí, ktoré sa používajú v civilnom letectve, a to METAR (Meteorologická správa z letiska) a TAF (TAF - Terminal Airport Forecast). V letectve závisia od počasia životy stoviek ľudí, takže predpovede sú čo najpresnejšie.
Tieto informácie sú vysielané XNUMX/XNUMX hlasom na každom modernom letisku vo forme ATIS (Automatická informačná služba terminálu) a VOLMET (z francúzštiny. vol - let a Meteo - počasie). Prvý poskytuje informácie o aktuálnom počasí na letisku a druhý poskytuje predpoveď na najbližších 24-30 hodín nielen na vysielacom letisku, ale aj na iných.
Príklad prevádzky ATIS na letisku Vnukovo:
Príklad fungovania VOLMET na letisku Vnukovo
Je nepohodlné nosiť so sebou rádiový skener alebo transceiver zakaždým pre príslušný rozsah a chcel som vytvoriť robota v telegrame, ktorý vám po kliknutí na tlačidlo umožní získať rovnakú predpoveď. Je prinajmenšom nepraktické vyčleniť na to samostatný server, ako aj posielať požiadavky na váš domáci Raspberry.
Preto som sa rozhodol využiť službu ako backend
Príprava backendu
Vytvorte funkciu
V ovládacom paneli
Po vytvorení projektu prejdite do sekcie Funkcia:
Stlačte tlačidlo Vytvorte funkciu a dajte mu požadovaný názov:
Po stlačení Vytvorte funkciu budeme mať reprezentáciu vytvorenej funkcie:
Predtým, ako začnete vytvárať kód v Pythone, budete musieť vytvoriť robota v telegrame. Nebudem popisovať, ako sa to robí - existujú podrobné pokyny
Príprava kódu
Ako zdroj spoľahlivých údajov som si vybral Národný úrad pre oceán a atmosféru (NOAA). Táto vedecká agentúra aktualizuje údaje v reálnom čase na svojom serveri vo formáte TXT.
Odkaz na získanie údajov METAR (všimnite si prípad):
https://tgftp.nws.noaa.gov/data/observations/metar/stations/<код аэропорта по ICAO>.TXT
V mojom prípade je najbližšie letisko Vnukovo, jeho ICAO kód je UUWW. Prechod na vygenerovanú adresu URL poskytne nasledovné:
2020/08/10 11:30
UUWW 101130Z 31004MPS 9999 SCT048 24/13 Q1014 R01/000070 NOSIG
Prvý riadok je aktuálny čas predpovede v Greenwichskom strednom čase. Druhý riadok je sumárom aktuálneho počasia. Piloti civilného letectva nebudú mať problém pochopiť, čo tento riadok znamená, ale potrebujeme vysvetlenie:
- [UUWW] — Vnukovo, Moskva (Rusko – RU);
- [101130Z] — 10. deň v mesiaci, 11:30 GMT;
- [31004MPS] — smer vetra 310 stupňov, rýchlosť 4 m/s;
- [9999] — horizontálna viditeľnosť 10 km alebo viac;
- [SCT048] — rozptýlené/rozptýlené oblaky vo výške 4800 stôp (~1584 m);
- [24 / 13] — teplota 24°C, rosný bod 13°C;
- [Q1014] — tlak (QNH) 1014 hektopascalov (750 mm Hg);
- [R01/000070] — koeficient adhézie na pruhu 01 – 0,70;
- [NOSIG] - bez výrazných zmien.
Začnime písať programový kód. Najprv musíte importovať funkcie požiadať и pytaf:
from urllib import request
import pytaf
Zadajte premenné a pripravte dekódovaciu funkciu:
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()
Prejdime k TAF (veľké písmená sú tiež dôležité).
https://tgftp.nws.noaa.gov/data/forecasts/taf/stations/<код аэропорта по ICAO>.TXT
Ako v predchádzajúcom príklade, pozrime sa na predpoveď na letisku 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
Venujme pozornosť najmä čiaram TEMPO и BECMG. TEMPO znamená, že skutočné počasie počas určeného obdobia sa bude pravidelne meniť. BECMG - počasie sa bude postupne meniť v určenom časovom období.
Teda riadok:
TEMPO 1012/1020 -TSRA BKN020CB
Bude znamenať:
- [1012 / 1020] — medzi 12 a 20 hodinami (Greenwichský čas);
- [-TSRA] — búrka (TS = búrka) s dažďom (RA = dážď) nízkej intenzity (znamienko mínus);
- [BKN020CB] - výrazné (BKN = rozbité), kupovité (CB = cumulonimbus) oblaky vo výške 2000 stôp (610 metrov) nad morom.
Výrazov pre poveternostné javy je pomerne veľa a zapamätať si ich je náročné. Kód pre požiadavku TAF je napísaný podobným spôsobom.
Nahrávanie kódu do cloudu
Aby sme nestrácali čas, vezmime si šablónu telegramového bota z nášho úložiska
Keďže v kóde budeme pristupovať k modulu pytaf, potom by sa jeho verzia mala okamžite pridať do request.txt
pytaf~=1.2.1
- Prejdime k úprave bot/tele_bot.py. Odstránime všetky nepotrebné veci a pridáme náš kód.
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)
- Celý adresár zabalíme do ZIP archívu a prejdeme na ovládací panel k vytvorenej funkcii.
- lis Edit a stiahnite si archív s kódom.
- Vyplňte relatívnu cestu v súbore tele_bot (predĺženie .py nemusí byť špecifikované) a funkcia koncového bodu (v uvedenom príklade to je hlavné).
- V sekcii Premenné prostredia napíšte premennú TOKEN a priraďte mu token požadovaného telegramového robota.
- lis Uložiť a rozbaliť, po ktorej prejdeme do sekcie spúšťače.
- Dali sme vypínač HTTP požiadavkazverejniť žiadosť.
Teraz máme URL na verejné volanie funkcie. Ostalo už len
/setwebhook <you bot token> <public URL of your function>
Výsledok
Ak je všetko vykonané správne, váš bot začne okamžite pracovať a zobrazí najnovšiu správu o leteckom počasí priamo v messengeri.
Kód sa samozrejme dá vylepšiť, no aj v aktuálnom stave stačí zistiť čo najpresnejšie počasie a predpoveď z dôveryhodného zdroja.
Úplnú verziu kódu nájdete v našom
Zdroj: hab.com