
Er zijn genoeg diensten die informatie over het weer bieden, maar aan welke moet je geloven? Toen ik vaker op de fiets stapte, wilde ik de meest nauwkeurige informatie over de weersomstandigheden op de plekken waar ik fiets.
De eerste gedachte was om een kleine DIY-weerstations met sensoren te bouwen en de gegevens daarvan te ontvangen. Maar ik wilde niet het wiel opnieuw uitvinden en koos ervoor om gebruik te maken van de weersinformatie die in de burgerluchtvaart wordt gebruikt, namelijk METAR (METeorological Aerodrome Report) en TAF (TAF — Terminal Aerodrome Forecast). In de luchtvaart hangt het leven van honderden mensen af van het weer, dus zijn de voorspellingen zo nauwkeurig mogelijk.
Deze informatie wordt 24/7 via de stem op elke moderne luchthaven uitgezonden in de vorm van ATIS (Automatic Terminal Information Service) en VOLMET (van het Frans vol — vlucht en météo — weer). De eerste geeft informatie over het actuele weer op de luchthaven, terwijl de tweede een voorspelling voor de komende 24-30 uur biedt, niet alleen voor de luchthaven van uitzending, maar ook voor andere.
Voorbeeld van ATIS-werking op de luchthaven Vnukovo:
Voorbeeld van VOLMET-werking op de luchthaven Vnukovo
Het is onpraktisch om elke keer een radioscanner of transceiver van het juiste bereik mee te nemen, en ik wilde een bot in Telegram maken dat met een druk op de knop dezelfde voorspelling kan geven. Het is niet zinvol om hiervoor een aparte server te reserveren, net zoals het sturen van verzoeken naar een thuis-Raspberry.
Daarom besloot ik om de service te gebruiken: . Het aantal verzoeken zal verwaarloosbaar klein zijn, dus zo'n service zal in feite gratis zijn (volgens mijn berekeningen kost het 22 roebel voor 100.000 verzoeken).
Voorbereiding van de backend
Creëren van de functie
Ga in het controlepaneel naar open de weergave Cloudplatform en maak een nieuw project aan:

Nadat het project is aangemaakt, gaan we naar de sectie Functies:

Klik op de knop Maak functie aan en geef het de gewenste naam:

Na het klikken op Maak functie aan zullen we een weergave van de gemaakte functie zien:

Voordat we beginnen met het schrijven van de code in Python, moet er een bot in Telegram worden gemaakt. Ik zal niet beschrijven hoe dit werkt — er is een gedetailleerde instructie in . Het belangrijkste voor ons is de token van de gemaakte bot.
We bereiden de code voor
Als bron van betrouwbare gegevens heb ik de Nationale Oceanische en Atmosferische Administratie van de VS (eng. National Oceanic and Atmospheric Administration, NOAA) gekozen. Dit wetenschappelijke agentschap vernieuwt in realtime de gegevens op zijn server in TXT-formaat.
Link voor het verkrijgen van METAR-gegevens (let op hoofdletters):
https://tgftp.nws.noaa.gov/data/observations/metar/stations/.TXTIn mijn geval is de dichtstbijzijnde luchthaven Vnukovo, de ICAO-code is UUWW. Toegang tot de gevormde URL levert het volgende op:
2020/08/10 11:30
UUWW 101130Z 31004MPS 9999 SCT048 24/13 Q1014 R01/000070 NOSIG
De eerste regel is de geldigheidstijd van de voorspelling in GMT. De tweede regel geeft een samenvatting van het actuele weer. Piloten van de burgerluchtvaart begrijpen gemakkelijk wat deze regel betekent, maar we hebben een uitleg nodig:
- [UUWW] — Vnukovo, stad Moskou (Rusland — RU);
- [101130Z] — de 10e dag van de maand, 11 uur en 30 minuten in GMT;
- [31004MPS] — windrichting 310 graden, snelheid 4 m/s;
- [9999] — horizontale zichtbaarheid 10 km of meer;
- [SCT048] — verspreide/bewolking op een hoogte van 4800 voet (~1584m);
- [24/13] — temperatuur 24°C, dauwpunt 13°C;
- [Q1014] — druk (QNH) 1014 hectopascal (750 mm Hg);
- [R01/000070] — grip coefficient op baan 01 — 0,70;
- [NOSIG] — zonder significante veranderingen.
Laten we beginnen met het schrijven van de programma code. Eerst moeten we enkele functies importeren request en pytaf:
from urllib import request
import pytafGeef de variabelen op en bereid de decodeerfunctie voor:
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()Laten we overgaan naar TAF (hoofdletters zijn ook belangrijk).
https://tgftp.nws.noaa.gov/data/forecasts/taf/stations/.TXTZoals in het vorige voorbeeld, laten we de voorspelling op de luchthaven Vnukovo bekijken:
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
Laten we vooral letten op de regels TEMPO en BECMG. TEMPO betekent dat het actuele weer in de aangegeven periode regelmatig zal veranderen. BECMG betekent dat het weer geleidelijk zal veranderen in de aangegeven periode.
Dat is, de regel:
TEMPO 1012/1020 -TSRA BKN020CBBetekent:
- [1012/1020] — in de periode van 12 tot 20 uur (in GMT);
- [-TSRA] — onweersbui (TS = thunderstorm) met lichte regen (RA = rain) (minteken);
- [BKN020CB] — significante (BKN = broken), cumulonimbus (CB) bewolking op een hoogte van 2000 voet (610 meter) boven zeeniveau.
Er zijn veel termen die weersverschijnselen aanduiden, en het is moeilijk om ze allemaal te onthouden. De code voor het aanvragen van TAF wordt op dezelfde manier geschreven.
We uploaden de code naar de cloud.
Om geen tijd te verspillen, nemen we de sjabloon van de Telegram-bot uit onze repository. . Hier is een vooraf voorbereid requirements.txt en setup.py met een correcte mappenstructuur.
Aangezien we in de code naar de module gaan verwijzen, pytafmoet we de versie onmiddellijk toevoegen in requirements.txt
pytaf~=1.2.1- We gaan over naar het bewerken van bot/tele_bot.py. We verwijderen alles wat overbodig is en voegen onze code toe.
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. Dit is een bot voor het verkrijgen van een luchtvaart weersvoorspelling "
"van NOAA-servers. De bot is ingesteld op luchthaven Vnukovo (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):
# Verkrijg info van de server.
code = request.urlopen(URL_METAR).read().decode('utf-8')
# Stuur een geformatiseerd antwoord.
bot.send_message(message.chat.id, parse_data(code), reply_markup=keyboard)
def get_taf(message):
# Verkrijg info van de server.
code = request.urlopen(URL_TAF).read().decode('utf-8')
# Stuur een geformatiseerd antwoord.
bot.send_message(message.chat.id, parse_data(code), reply_markup=keyboard)
def route_command(command, message):
"""
Opdracht 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):
"""
Toegangspunt voor serverloze omgeving.
"""
print(f'Ontvangen: "{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 op "{message.text}"')
route_command(message.text.lower(), message)
- We verpakken de hele directory in een ZIP-archief en gaan naar het controlepaneel voor de aangemaakte functie.
- Klik op Bewerken en uploaden het archief met de code.

- Vul het relatieve pad in van het bestand tele_bot (de extensie .py hoeft niet te worden aangegeven) en de endpoint-functie (in het gegeven voorbeeld is dit main).
- In de sectie Omgevingsvariabelen we schrijven de variabele TOKEN en wijzen haar de token toe van de benodigde Telegram-bot.
- Klik op Opslaan en implementeren, waarna we naar de sectie gaan Triggers.
- We zetten de schakelaar HTTP-verzoek, zodat we het verzoek openbaar maken.

We now have a URL for the public call of the function. It just remains to . Find our bot in Telegram and register your bot with the command:
/setwebhook <you bot token> <public URL of your function>Resultaat
If everything is done correctly, your bot will start working immediately and display the current aviation weather summary right in the messenger.

Of course, the code can be refined, but even in its current state, it is enough to get the most accurate weather and forecast from a trusted source.
You will find the full version of the code in our .
Bron: habr.com
