
Es gibt viele Dienste, die Wetterinformationen bereitstellen, aber welchem von ihnen kann man vertrauen? Als ich anfing, hĂ€ufig mit dem Fahrrad zu fahren, wollte ich die genauesten Informationen ĂŒber die Wetterbedingungen an dem Ort, an dem ich fahre, haben.
Der erste Gedanke war, eine kleine DIY-Wetterstation mit Sensoren zu erstellen und die Daten von dort zu erhalten. Aber ich wollte das Rad nicht neu erfinden und wĂ€hlte als Quelle fĂŒr verlĂ€ssliche Daten die Wetterinformationen, die in der zivilen Luftfahrt verwendet werden, nĂ€mlich METAR (METeorological Aerodrome Report) und TAF (TAF â Terminal Aerodrome Forecast). In der Luftfahrt hĂ€ngen die Leben von Hunderten von Menschen von den Wetterbedingungen ab; daher sind die Prognosen so genau wie möglich.
Diese Informationen werden rund um die Uhr in Sprachform an jedem modernen Flughafen in Form von ATIS (Automatic Terminal Information Service) und VOLMET (von französisch vol â Flug und mĂ©tĂ©o â Wetter). Der erste Dienst bietet Informationen ĂŒber das tatsĂ€chliche Wetter am Flughafen, der zweite â Vorhersagen fĂŒr die nĂ€chsten 24-30 Stunden, und zwar nicht nur fĂŒr den Ăbertragungsflughafen, sondern auch fĂŒr andere.
Beispiel fĂŒr die ATIS-Funktion am Flughafen Wnukowo:
Beispiel fĂŒr die VOLMET-Funktion am Flughafen Wnukowo
Jedes Mal einen Radioscanner oder Transceiver auf dem entsprechenden Frequenzband mitzuschleppen, ist unpraktisch, und ich wollte einen Bot in Telegram erstellen, der per Knopfdruck dieselbe Vorhersage ermöglicht. Es wĂ€re nicht sinnvoll, dafĂŒr einen eigenen Server einzurichten, ebenso wenig, wie Anfragen an mein Zuhause-Raspberry Pi zu senden.
Deshalb entschied ich mich, als Backend den Dienst zu nutzen. Die Anzahl der Anfragen wird vernachlĂ€ssigbar gering sein, daher wird dieser Dienst praktisch kostenlos sein (nach meinen Berechnungen wĂŒrden es 22 Rubel fĂŒr 100.000 Anfragen kosten).
Vorbereitung des Backends
Erstellung der Funktion
Im Control Panel öffnen wir die Ansicht Cloud-Plattform und erstellen ein neues Projekt:

Nachdem das Projekt erstellt wurde, gehen wir zum Abschnitt Funktionen:

Wir klicken auf den Button Funktion erstellen und geben ihm den gewĂŒnschten Namen:

Nach dem Klicken auf Funktion erstellen sehen wir die Ansicht der erstellten Funktion:

Bevor wir mit dem Erstellen des Codes in Python beginnen, mĂŒssen wir einen Bot in Telegram erstellen. Ich werde nicht im Detail beschreiben, wie das geht â eine ausfĂŒhrliche Anleitung gibt es . Wichtig fĂŒr uns ist das Token des erstellten Bots.
Wir bereiten den Code vor
Als Quelle zuverlÀssiger Daten habe ich die National Oceanic and Atmospheric Administration der USA (engl. National Oceanic and Atmospheric Administration, NOAA) gewÀhlt. Diese wissenschaftliche Einrichtung aktualisiert die Daten in Echtzeit auf ihrem Server im TXT-Format.
Link zum Abrufen der METAR-Daten (bitte beachten Sie die GroĂschreibung):
https://tgftp.nws.noaa.gov/data/observations/metar/stations/.TXTIn meinem Fall ist der nÀchste Flughafen Vnukovo, sein ICAO-Code ist UUWW. Der Zugriff auf die erstellte URL ergibt Folgendes:
2020/08/10 11:30
UUWW 101130Z 31004MPS 9999 SCT048 24/13 Q1014 R01/000070 NOSIG
Die erste Zeile ist die GĂŒltigkeitszeit des Prognosen gemÀà Greenwich. Die zweite Zeile ist eine Zusammenfassung des aktuellen Wetters. Die Piloten der zivilen Luftfahrt werden leicht verstehen, was diese Zeile bedeutet, aber wir benötigen eine EntschlĂŒsselung:
- [UUWW] â Vnukovo, Stadt Moskau (Russland â RU);
- [101130Z] â 10. Tag des Monats, 11 Uhr 30 Minuten nach Greenwich;
- [31004MPS] â Windrichtung 310 Grad, Geschwindigkeit 4 m/s;
- [9999] â horizontale Sichtweite 10 km oder mehr;
- [SCT048] â vereinzelte Wolken in 4800 FuĂ (~1584 m);
- [24/13] â Temperatur 24°C, Taupunkt 13°C;
- [Q1014] â Druck (QNH) 1014 Hektopascal (750 mm Hg);
- [R01/000070] â Haftungskoeffizient auf Bahn 01 â 0,70;
- [NOSIG] â ohne wesentliche VerĂ€nderungen.
Beginnen wir mit dem Schreiben des Programmcodes. ZunĂ€chst mĂŒssen wir die Funktionen importieren request und pytaf:
from urllib import request
import pytafVariablen festlegen und die Dekodierungsfunktion vorbereiten:
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()Kommen wir zu TAF (die GroĂschreibung ist ebenfalls wichtig).
https://tgftp.nws.noaa.gov/data/forecasts/taf/stations/.TXTWie im vorherigen Beispiel, lassen Sie uns die Prognose fĂŒr den Flughafen Vnukovo ansehen:
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
Besonders achten wir auf die Zeilen TEMPO und BECMG.TEMPO bedeutet, dass das tatsĂ€chliche Wetter im angegebenen Zeitraum periodisch variieren wird. BECMG â das Wetter wird sich allmĂ€hlich im angegebenen Zeitraum Ă€ndern.
Das heiĂt, die Zeile:
TEMPO 1012/1020 -TSRA BKN020CBWird bedeuten:
- [1012/1020] â im Zeitraum von 12 bis 20 Uhr (nach Greenwich);
- [-TSRA] â Gewitter (TS = thunderstorm) mit Regen (RA = rain) geringer IntensitĂ€t (Minuszeichen);
- [BKN020CB] â signifikante (BKN = broken), kumulonimbus (CB = cumulonimbus) Bewölkung in einer Höhe von 2000 FuĂ (610 Meter) ĂŒber dem Meeresspiegel.
Es gibt viele Begriffe, die WetterphĂ€nomene beschreiben, und es ist schwierig, sie alle zu merken. Der Code fĂŒr die TAF-Anfrage wird Ă€hnlich geschrieben.
Wir laden den Code in die Cloud hoch.
Um keine Zeit zu verschwenden, nehmen wir eine Vorlage fĂŒr den Telegram-Bot aus unserem Repository. . Dort gibt es eine vorab vorbereitete requirements.txt und setup.py mit der korrekten Verzeichnisstruktur.
Da wir im Code auf das Modul pytafz zugreifen werden, sollte die Version sofort hinzugefĂŒgt werden in requirements.txt
pytaf~=1.2.1- Wir gehen zur Bearbeitung von bot/tele_bot.py. Wir entfernen alles ĂberflĂŒssige und ergĂ€nzen unseren Code.
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 = "Hallo. Das ist ein Bot zur Abfrage der Flugwettervorhersage "
"von den NOAA-Servern. Der Bot ist auf den Flughafen Wnukowo (UUWW) eingestellt."
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):
# Daten vom Server abrufen.
code = request.urlopen(URL_METAR).read().decode('utf-8')
# Formatierte Antwort senden.
bot.send_message(message.chat.id, parse_data(code), reply_markup=keyboard)
def get_taf(message):
# Daten vom Server abrufen.
code = request.urlopen(URL_TAF).read().decode('utf-8')
# Formatierte Antwort senden.
bot.send_message(message.chat.id, parse_data(code), reply_markup=keyboard)
def route_command(command, message):
"""
Kommandorouter.
"""
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):
"""
Einstiegspunkt fĂŒr serverlose Umgebungen.
"""
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)
- Wir packen das gesamte Verzeichnis in eine ZIP-Datei und gehen zum Verwaltungsbereich der erstellten Funktion.
- Klicken Sie auf Bearbeiten und laden das Archiv mit dem Code hoch.

- Wir fĂŒllen den relativen Pfad zur Datei aus tele_bot (Erweiterung .py kann weggelassen werden) und die Endpunktfunktion (im gegebenen Beispiel ist dies main).
- Im Abschnitt Umgebungsvariablen wir definieren die Variable TOKEN und weisen ihr den Token des gewĂŒnschten Telegram-Bots zu.
- Klicken Sie auf Speichern und bereitstellen, danach gehen wir zum Abschnitt Trigger.
- Wir aktivieren den Schalter HTTP-Anfrage, um die Anfrage öffentlich zu machen.

Wir haben eine URL fĂŒr den öffentlichen Aufruf der Funktion erstellt. Es bleibt nur noch . Suchen Sie unseren Bot bei Telegram und registrieren Sie Ihren Bot mit dem Befehl:
/setwebhook <you bot token> <public URL of your function>Ergebnis
Wenn alles richtig gemacht wird, beginnt Ihr Bot sofort zu arbeiten und zeigt die aktuellen Luftfahrtwetterdaten direkt im Messenger an.

NatĂŒrlich kann der Code weiterentwickelt werden, jedoch reicht der aktuelle Stand aus, um das genaueste Wetter und die Prognose aus einer vertrauenswĂŒrdigen Quelle zu erfahren.
Die vollstÀndige Version des Codes finden Sie in unserem .
Quelle: habr.com
