Det finns många tjänster som ger väderinformation, men vilken ska du lita på? När jag började cykla ofta ville jag ha den mest korrekta informationen om väderförhållandena på den plats där jag cyklar.
Min första tanke var att bygga en liten DIY väderstation med sensorer och ta emot data från den. Men jag "uppfann inte hjulet på nytt" och valde väderinformation som används inom civil luftfart som en källa för verifierad data, nämligen METARs (METeorological Aerodrome Report) och TAF (TAF - Terminal Aerodrome Forecast). Inom flyget är livet för hundratals människor beroende av vädret, så prognoserna är så exakta som möjligt.
Denna information sänds XNUMX/XNUMX med röst på varje modernt flygfält i formen ATIS (Automatisk terminalinformationstjänst) och VOLMET (från franska. vol - flyg och météo - väder). Den första ger information om det faktiska vädret på flygfältet, och den andra ger en prognos för de kommande 24-30 timmarna, inte bara på sändningsflygfältet, utan även på andra.
Exempel på ATIS-drift på Vnukovo flygplats:
Ett exempel på hur VOLMET fungerar på Vnukovo flygplats
Det är obekvämt att bära med sig en radioskanner eller transceiver varje gång för motsvarande räckvidd, och jag ville skapa en bot i Telegram som med ett knapptryck låter dig få samma prognos. Det är åtminstone opraktiskt att tilldela en separat server för detta, samt att skicka förfrågningar till ditt hem Raspberry.
Därför bestämde jag mig för att använda tjänsten som en backend
Backend förberedelse
Skapa en funktion
I Kontrollpanelen
Efter att projektet har skapats, gå till avsnittet funktioner:
Vi trycker på knappen Skapa en funktion och ge det önskat namn:
Efter tryckning Skapa en funktion vi kommer att ha en representation av den skapade funktionen:
Innan du börjar skapa kod i Python måste du skapa en bot i Telegram. Jag kommer inte att beskriva hur detta görs - det finns detaljerade instruktioner
Förbereder koden
Jag valde National Oceanic and Atmospheric Administration (NOAA) som en källa till tillförlitlig data. Denna vetenskapliga byrå uppdaterar data i realtid på sin server i TXT-format.
Länk för att få METAR-data (observera fallet):
https://tgftp.nws.noaa.gov/data/observations/metar/stations/<код аэропорта по ICAO>.TXT
I mitt fall är den närmaste flygplatsen Vnukovo, dess ICAO-kod är UUWW. Om du går till den genererade webbadressen får du följande:
2020/08/10 11:30
UUWW 101130Z 31004MPS 9999 SCT048 24/13 Q1014 R01/000070 NOSIG
Den första raden är den aktuella tiden för prognosen i Greenwich Mean Time. Den andra raden är en sammanfattning av det faktiska vädret. Civilflygpiloter kommer inte att ha några problem att förstå vad denna linje betyder, men vi behöver en förklaring:
- [UUWW] — Vnukovo, Moskva (Ryssland – RU);
- [101130Z] — 10:e dagen i månaden, 11:30 GMT;
- [31004MPS] — vindriktning 310 grader, hastighet 4 m/s;
- [9999] — horisontell sikt 10 km eller mer.
- [SCT048] — Spridda/spridda moln på 4800 fot (~1584 m);
- [24 / 13] — temperatur 24°C, daggpunkt 13°C;
- [Q1014] — tryck (QNH) 1014 hektopascal (750 mm Hg);
- [R01/000070] — vidhäftningskoefficient på bana 01 — 0,70;
- [NOSIG] - utan betydande förändringar.
Låt oss börja skriva programkod. Först måste du importera funktioner begära и pytaf:
from urllib import request
import pytaf
Specificera variablerna och förbered avkodningsfunktionen:
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()
Låt oss gå vidare till TAF (fallet är också viktigt).
https://tgftp.nws.noaa.gov/data/forecasts/taf/stations/<код аэропорта по ICAO>.TXT
Som i föregående exempel, låt oss titta på prognosen på Vnukovo flygplats:
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
Låt oss särskilt uppmärksamma linjerna TEMPO и BECMG. TEMPO innebär att det faktiska vädret under den angivna perioden kommer att ändras med jämna mellanrum. BECMG - vädret kommer gradvis att förändras inom en viss tidsperiod.
Det vill säga raden:
TEMPO 1012/1020 -TSRA BKN020CB
Kommer att betyda:
- [1012 / 1020] — mellan 12 och 20 timmar (Greenwich Mean Time).
- [-TSRA] — åskväder (TS = åskväder) med regn (RA = regn) av låg intensitet (minustecken).
- [BKN020CB] - betydande (BKN = bruten), cumulonimbus (CB = cumulonimbus) moln på 2000 fot (610 meter) över havet.
Det finns ganska många termer för väderfenomen, och det är svårt att komma ihåg dem. Koden för TAF-begäran är skriven på liknande sätt.
Laddar upp kod till molnet
För att inte slösa tid, låt oss ta en telegrambotmall från vårt förråd
Sedan i koden kommer vi att komma åt modulen pytaf, bör dess version omedelbart läggas till requirements.txt
pytaf~=1.2.1
- Låt oss gå vidare till redigering bot/tele_bot.py. Vi tar bort alla onödiga saker och lägger till vår kod.
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)
- Vi packar hela katalogen i ett ZIP-arkiv och går till kontrollpanelen till den skapade funktionen.
- Klick Redigera och ladda ner arkivet med koden.
- Fyll i den relativa sökvägen i filen tele_bot (förlängning .py kanske inte anges) och en slutpunktsfunktion (i exemplet är detta huvudsakliga).
- I avsnitt Miljövariabler skriv en variabel TECKEN och tilldela den token för den önskade telegramboten.
- Klick Spara och expandera, varefter vi går till avsnittet triggers.
- Vi sätter strömbrytaren HTTP-förfråganför att göra begäran offentlig.
Vi har nu en URL för att offentligt anropa funktionen. Allt som är kvar är
/setwebhook <you bot token> <public URL of your function>
Resultat
Om allt görs korrekt kommer din bot omedelbart att börja arbeta och visa den senaste flygväderrapporten direkt i messengern.
Naturligtvis kan koden förbättras, men även i sitt nuvarande tillstånd räcker det för att ta reda på det mest exakta vädret och prognosen från en pålitlig källa.
Du hittar den fullständiga versionen av koden i vår
Källa: will.com