Es gibt viele Dienste, die Wetterinformationen bereitstellen, aber welchem sollten Sie vertrauen? Als ich begann, regelmäßig Rad zu fahren, wollte ich möglichst genaue Informationen über die Wetterbedingungen an dem Ort haben, an dem ich fahre.
Mein erster Gedanke war, eine kleine DIY-Wetterstation mit Sensoren zu bauen und Daten davon zu empfangen. Aber ich habe das Rad nicht „neu erfunden“ und Wetterinformationen ausgewählt, die in der Zivilluftfahrt als Quelle für verifizierte Daten verwendet werden, nämlich METAR (METeorologischer Flugplatzbericht) und TAF (TAF – Terminal Aerodrome Forecast). In der Luftfahrt hängt das Leben Hunderter Menschen vom Wetter ab, daher sind die Vorhersagen so genau wie möglich.
Diese Informationen werden rund um die Uhr per Sprache auf jedem modernen Flugplatz in der Form übertragen ATIS (Automatischer Terminalinformationsdienst) und VOLMET (aus dem Französischen. vol - Flug und Wetter - Wetter). Der erste liefert Informationen über das tatsächliche Wetter auf dem Flugplatz und der zweite liefert eine Vorhersage für die nächsten 24 bis 30 Stunden, nicht nur auf dem Sendeflugplatz, sondern auch auf anderen.
Beispiel für den ATIS-Betrieb am Flughafen Wnukowo:
Ein Beispiel dafür, wie VOLMET am Flughafen Wnukowo funktioniert
Es ist umständlich, jedes Mal einen Funkscanner oder Transceiver für die entsprechende Reichweite bei sich zu haben, und ich wollte in Telegram einen Bot erstellen, der es Ihnen auf Knopfdruck ermöglicht, die gleiche Vorhersage zu erhalten. Es ist zumindest unpraktisch, dafür einen separaten Server bereitzustellen und Anfragen an den heimischen Raspberry zu senden.
Daher habe ich mich entschieden, den Dienst als Backend zu nutzen
Backend-Vorbereitung
Erstellen einer Funktion
In der Systemsteuerung
Nachdem das Projekt erstellt wurde, gehen Sie zum Abschnitt Funktionen:
Drücken Sie den Knopf Erstellen Sie eine Funktion und geben Sie ihm den gewünschten Namen:
Nach dem Klicken Erstellen Sie eine Funktion Wir werden eine Darstellung der erstellten Funktion haben:
Bevor Sie mit der Codeerstellung in Python beginnen, müssen Sie einen Bot in Telegram erstellen. Ich werde nicht beschreiben, wie das geht – es gibt detaillierte Anweisungen
Vorbereiten des Codes
Als Quelle zuverlässiger Daten habe ich die National Oceanic and Atmospheric Administration (NOAA) ausgewählt. Diese wissenschaftliche Agentur aktualisiert Daten in Echtzeit auf ihrem Server im TXT-Format.
Link zum Abrufen von METAR-Daten (beachten Sie die Groß-/Kleinschreibung):
https://tgftp.nws.noaa.gov/data/observations/metar/stations/<код аэропорта по ICAO>.TXT
In meinem Fall ist der nächstgelegene Flughafen Wnukowo mit dem ICAO-Code UUWW. Wenn Sie die generierte URL aufrufen, erhalten Sie Folgendes:
2020/08/10 11:30
UUWW 101130Z 31004MPS 9999 SCT048 24/13 Q1014 R01/000070 NOSIG
Die erste Zeile ist die aktuelle Zeit der Vorhersage in Greenwich Mean Time. Die zweite Zeile ist eine Zusammenfassung des tatsächlichen Wetters. Piloten der Zivilluftfahrt werden kein Problem damit haben, die Bedeutung dieser Zeile zu verstehen, aber wir brauchen eine Erklärung:
- [UUWW] — Vnukovo, Moskau (Russland — RU);
- [101130Z] — 10. Tag des Monats, 11:30 Uhr GMT;
- [31004 MPS] — Windrichtung 310 Grad, Geschwindigkeit 4 m/s;
- [9999] — horizontale Sichtweite 10 km oder mehr;
- [SCT048] — vereinzelte/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] — Haftbeiwert auf Spur 01 – 0,70;
- [NOSIG] - ohne wesentliche Änderungen.
Beginnen wir mit dem Schreiben von Programmcode. Zuerst müssen Sie Funktionen importieren Anforderung и Pytaf:
from urllib import request
import pytaf
Geben Sie die Variablen an und bereiten Sie die Dekodierungsfunktion vor:
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 zum TAF (die Groß-/Kleinschreibung ist ebenfalls wichtig).
https://tgftp.nws.noaa.gov/data/forecasts/taf/stations/<код аэропорта по ICAO>.TXT
Schauen wir uns wie im vorherigen Beispiel die Prognose am Flughafen Wnukowo an:
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
Achten wir besonders auf die Linien ZEIT и BECMG. TEMPO bedeutet, dass sich das tatsächliche Wetter während des angegebenen Zeitraums periodisch ändert. BECMG – Das Wetter ändert sich allmählich innerhalb eines bestimmten Zeitraums.
Das heißt, die Zeile:
TEMPO 1012/1020 -TSRA BKN020CB
Bedeutet:
- [1012 / 1020] — zwischen 12 und 20 Stunden (Greenwich Mean Time);
- [-TSRA] — Gewitter (TS = Gewitter) mit Regen (RA = Regen) geringer Intensität (Minuszeichen);
- [BKN020CB] - erhebliche (BKN = gebrochene) Cumulonimbus-Wolken (CB = Cumulonimbus) in 2000 Fuß (610 Metern) Höhe über dem Meeresspiegel.
Es gibt viele Begriffe für Wetterphänomene und es ist schwierig, sich diese zu merken. Der Code für die TAF-Anfrage ist auf ähnliche Weise geschrieben.
Code in die Cloud hochladen
Um keine Zeit zu verschwenden, nehmen wir eine Telegram-Bot-Vorlage aus unserem Repository
Da wir im Code auf das Modul zugreifen Pytaf, dann sollte seine Version sofort hinzugefügt werden requirements.txt
pytaf~=1.2.1
- Kommen wir zur Bearbeitung bot/tele_bot.py. Wir entfernen alle unnötigen Dinge und fügen unseren Code hinzu.
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)
- Wir packen das gesamte Verzeichnis in ein ZIP-Archiv und gehen in der Systemsteuerung auf die erstellte Funktion.
- Klicken Bearbeiten und laden Sie das Archiv mit dem Code herunter.
- Geben Sie den relativen Pfad in die Datei ein tele_bot (Verlängerung .py darf nicht angegeben werden) und eine Endpunktfunktion (im gegebenen Beispiel ist dies Haupt-).
- Im Abschnitt Umgebungsvariablen schreibe eine Variable ZEICHEN und weisen Sie ihm den Token des gewünschten Telegram-Bots zu.
- Klicken Speichern und erweitern, danach gehen wir zum Abschnitt Auslöser.
- Wir legen den Schalter um HTTP-Anfragedie Anfrage öffentlich zu machen.
Wir haben jetzt eine URL zum öffentlichen Aufruf der Funktion. Alles was übrig bleibt ist
/setwebhook <you bot token> <public URL of your function>
Erlebe die Kraft effektiver Ergebnisse
Wenn alles richtig gemacht ist, beginnt Ihr Bot sofort mit der Arbeit und zeigt den neuesten Flugwetterbericht direkt im Messenger an.
Natürlich kann der Code verbessert werden, aber selbst im aktuellen Zustand reicht es aus, das genaueste Wetter und die genaueste Vorhersage von einer vertrauenswürdigen Quelle zu erfahren.
Die Vollversion des Codes finden Sie in unserem
Source: habr.com