Säätietoja tarjoavat monet palvelut, mutta kumpaan kannattaa luottaa? Kun aloin pyöräilemään usein, halusin saada mahdollisimman tarkat tiedot ajopaikan sääolosuhteista.
Ensimmäinen ajatukseni oli rakentaa pieni tee-se-itse sääasema antureineen ja vastaanottaa siitä dataa. Mutta en "keksinyt pyörää uudelleen" ja valitsin varmennetun tiedon lähteeksi säätiedon, jota käytetään siviili-ilmailussa. METAR (Meteorological Aerodrome Report) ja TAF (TAF - Terminal Aerodrome Forecast). Ilmailussa satojen ihmisten elämä riippuu säästä, joten ennusteet ovat mahdollisimman tarkkoja.
Nämä tiedot lähetetään XNUMX/XNUMX äänellä jokaisella modernilla lentokentällä muodossa ATIS (Automaattinen terminaalitietopalvelu) ja VOLMET (ranskasta. vol - lento ja météo - sää). Ensimmäinen antaa tietoa todellisesta säästä lentokentällä ja toinen antaa ennusteen seuraavalle 24-30 tunnille, ei vain lähetyskentällä, vaan myös muilla.
Esimerkki ATIS:n toiminnasta Vnukovon lentokentällä:
Esimerkki siitä, kuinka VOLMET toimii Vnukovon lentokentällä
Radioskanneria tai lähetin-vastaanotinta on hankala kuljettaa mukana joka kerta vastaavalle alueelle, ja halusin luoda Telegramiin botin, jonka avulla saat saman ennusteen napin painalluksella. Tätä varten on ainakin epäkäytännöllistä varata erillistä palvelinta, samoin kuin pyyntöjen lähettäminen kotiisi Raspberrylle.
Siksi päätin käyttää palvelua taustaohjelmana
Taustaohjelman valmistelu
Toiminnon luominen
Ohjauspaneelissa
Kun projekti on luotu, siirry osioon Tehtävät:
Paina painiketta Luo funktio ja anna sille haluttu nimi:
Painamisen jälkeen Luo funktio meillä on esitys luodusta funktiosta:
Ennen kuin aloitat koodin luomisen Pythonissa, sinun on luotava botti Telegramissa. En kuvaile, kuinka tämä tehdään - siellä on yksityiskohtaiset ohjeet
Koodin valmistelu
Valitsin National Oceanic and Atmospheric Administrationin (NOAA) luotettavan tiedon lähteeksi. Tämä tieteellinen virasto päivittää tiedot reaaliajassa palvelimellaan TXT-muodossa.
Linkki METAR-tietojen saamiseksi (huomaa tapaus):
https://tgftp.nws.noaa.gov/data/observations/metar/stations/<код аэропорта по ICAO>.TXT
Minun tapauksessani lähin lentokenttä on Vnukovo, sen ICAO-koodi on UUWW. Luotuun URL-osoitteeseen siirtyminen antaa seuraavan:
2020/08/10 11:30
UUWW 101130Z 31004MPS 9999 SCT048 24/13 Q1014 R01/000070 NOSIG
Ensimmäinen rivi on ennusteen nykyinen aika Greenwichin aikaa. Toinen rivi on yhteenveto todellisesta säästä. Siviili-ilmailun lentäjillä ei ole ongelmia ymmärtää, mitä tämä rivi tarkoittaa, mutta tarvitsemme selityksen:
- [UUWW] — Vnukovo, Moskova (Venäjä — RU);
- [101130Z] — kuukauden 10. päivä, klo 11 GMT;
- [31004MPS] — tuulen suunta 310 astetta, nopeus 4 m/s;
- [9999] — vaakasuuntainen näkyvyys 10 km tai enemmän;
- [SCT048] — hajapilviä/hajapilviä korkeudessa 4800 jalkaa (~1584m);
- [24 / 13] — lämpötila 24°C, kastepiste 13°C;
- [Q1014] — paine (QNH) 1014 hectopascals (750 mm Hg);
- [R01/000070] — adheesiokerroin kaistalla 01 — 0,70;
- [NOSIG] - ilman merkittäviä muutoksia.
Aloitetaan ohjelmakoodin kirjoittaminen. Ensin sinun on tuotava funktiot pyyntö и pytaf:
from urllib import request
import pytaf
Määritä muuttujat ja valmistele dekoodaustoiminto:
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()
Siirrytään TAF:iin (tapaus on myös tärkeä).
https://tgftp.nws.noaa.gov/data/forecasts/taf/stations/<код аэропорта по ICAO>.TXT
Kuten edellisessä esimerkissä, katsotaan Vnukovon lentokentän ennustetta:
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
Kiinnittäkäämme erityisesti huomiota linjoihin TEMPO и BECMG. TEMPO tarkoittaa, että todellinen sää tietyn ajanjakson aikana muuttuu ajoittain. BECMG - sää muuttuu asteittain tietyn ajan kuluessa.
Eli rivi:
TEMPO 1012/1020 -TSRA BKN020CB
Tarkoittaa:
- [1012 / 1020] — 12–20 tuntia (Greenwichin aika);
- [-TSRA] — ukkosmyrsky (TS = ukkosmyrsky), jonka voimakkuus on heikko (miinusmerkki);
- [BKN020CB] - Merkittäviä (BKN = rikki), cumulonimbus (CB = cumulonimbus) pilviä 2000 jalkaa (610 metriä) merenpinnan yläpuolella.
Sääilmiöille on olemassa melko paljon termejä, ja niiden muistaminen on vaikeaa. TAF-pyynnön koodi kirjoitetaan samalla tavalla.
Koodi ladataan pilveen
Jotta ei hukattaisi aikaa, otetaan sähkebottimalli arkistostamme
Koska koodissa pääsemme moduuliin pytaf, sen versio tulee lisätä välittömästi requirements.txt
pytaf~=1.2.1
- Jatketaan editointiin bot/tele_bot.py. Poistamme kaikki tarpeettomat asiat ja lisäämme koodimme.
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)
- Pakkaamme koko hakemiston ZIP-arkistoon ja siirrymme ohjauspaneeliin luotuun toimintoon.
- lehdistö Muokata ja lataa arkisto koodilla.
- Täytä suhteellinen polku tiedostoon tele_bot (laajennus .py ei voida määrittää) ja päätepistefunktio (annetussa esimerkissä tämä on tärkein).
- Luokasta ympäristömuuttujat kirjoittaa muuttuja TAKEN ja anna sille halutun sähkebotin tunnus.
- lehdistö Tallenna ja laajenna, jonka jälkeen siirrymme osioon laukaisee.
- Laitamme kytkimen HTTP-pyyntöpyynnön julkistamiseksi.
Meillä on nyt URL-osoite funktion julkista kutsumista varten. Jäljelle jää vain
/setwebhook <you bot token> <public URL of your function>
Tulos
Jos kaikki on tehty oikein, bottisi alkaa toimia välittömästi ja näyttää viimeisimmän lentosäätiedotuksen suoraan messengerissä.
Tietysti koodia voi parantaa, mutta nykyisessäkin tilassaan riittää, että saa selville tarkimman sään ja ennusteen luotettavasta lähteestä.
Löydät koodin täyden version sivuiltamme
Lähde: will.com