Det er mange tjenester som gir værinformasjon, men hvilken bør du stole på? Da jeg begynte å sykle ofte, ønsket jeg å ha den mest nøyaktige informasjonen om værforholdene på stedet jeg sykler.
Min første tanke var å bygge en liten DIY værstasjon med sensorer og motta data fra den. Men jeg "oppfant ikke hjulet på nytt" og valgte værinformasjon som brukes i sivil luftfart som en kilde til verifiserte data, nemlig METAR (METeorological Aerodrome Report) og TAF (TAF - Terminal Aerodrome Forecast). I luftfart er livet til hundrevis av mennesker avhengig av været, så prognosene er så nøyaktige som mulig.
Denne informasjonen sendes XNUMX/XNUMX med stemmen på alle moderne flyplasser i skjemaet ATIS (Automatisk terminalinformasjonstjeneste) og VOLMET (fra fransk. vol - fly og météo - vær). Den første gir informasjon om det faktiske været på flyplassen, og den andre gir en prognose for de neste 24-30 timene, ikke bare på kringkastingsflyplassen, men også på andre.
Eksempel på ATIS-operasjon på Vnukovo flyplass:
Et eksempel på hvordan VOLMET fungerer på Vnukovo flyplass
Det er upraktisk å ha med deg en radioskanner eller sender/mottaker hver gang for tilsvarende rekkevidde, og jeg ønsket å lage en bot i Telegram som ved å trykke på en knapp lar deg få den samme prognosen. Det er i det minste upraktisk å tildele en egen server for dette, samt sende forespørsler til ditt hjem Raspberry.
Derfor bestemte jeg meg for å bruke tjenesten som en backend
Forberedelse av backend
Lag en funksjon
I kontrollpanelet
Etter at prosjektet er opprettet, gå til delen funksjoner:
Trykk på knappen Lag en funksjon og gi den ønsket navn:
Etter å ha trykket Lag en funksjon vi vil ha en representasjon av den opprettede funksjonen:
Før du begynner å lage kode i Python, må du lage en bot i Telegram. Jeg vil ikke beskrive hvordan dette gjøres - det er detaljerte instruksjoner
Forbereder koden
Jeg valgte National Oceanic and Atmospheric Administration (NOAA) som en kilde til pålitelige data. Dette vitenskapelige byrået oppdaterer data i sanntid på serveren sin i TXT-format.
Link for å få METAR-data (merk saken):
https://tgftp.nws.noaa.gov/data/observations/metar/stations/<код аэропорта по ICAO>.TXT
I mitt tilfelle er den nærmeste flyplassen Vnukovo, dens ICAO-kode er UUWW. Å gå til den genererte URL-en vil gi følgende:
2020/08/10 11:30
UUWW 101130Z 31004MPS 9999 SCT048 24/13 Q1014 R01/000070 NOSIG
Den første linjen er gjeldende tidspunkt for varselet i Greenwich Mean Time. Den andre linjen er en oppsummering av det faktiske været. Sivile luftfartspiloter vil ikke ha noe problem med å forstå hva denne linjen betyr, men vi trenger en forklaring:
- [UUWW] — Vnukovo, Moskva (Russland — RU);
- [101130Z] — 10. dag i måneden, 11:30 GMT;
- [31004MPS] — vindretning 310 grader, hastighet 4 m/s;
- [9999] — horisontal sikt 10 km eller mer;
- [SCT048] — spredte/spredte skyer på 4800 fot (~1584 m);
- [24 / 13] — temperatur 24°C, duggpunkt 13°C;
- [Q1014] — trykk (QNH) 1014 hektopascal (750 mm Hg);
- [R01/000070] — vedheftskoeffisient på bane 01 — 0,70;
- [NOSIG] - uten vesentlige endringer.
La oss begynne å skrive programkode. Først må du importere funksjoner anmode и pytaf:
from urllib import request
import pytaf
Spesifiser variablene og klargjør dekodingsfunksjonen:
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()
La oss gå videre til TAF (case er også viktig).
https://tgftp.nws.noaa.gov/data/forecasts/taf/stations/<код аэропорта по ICAO>.TXT
Som i forrige eksempel, la oss se på prognosen på Vnukovo flyplass:
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
La oss være spesielt oppmerksomme på linjene TEMPO и BECMG. TEMPO betyr at det faktiske været i den angitte perioden vil endre seg med jevne mellomrom. BECMG - været vil gradvis endre seg innen en spesifisert tidsperiode.
Det vil si linjen:
TEMPO 1012/1020 -TSRA BKN020CB
Vil bety:
- [1012 / 1020] — mellom 12 og 20 timer (Greenwich Mean Time);
- [-TSRA] — tordenvær (TS = tordenvær) med regn (RA = regn) av lav intensitet (minustegn);
- [BKN020CB] - betydelige (BKN = ødelagt), cumulonimbus (CB = cumulonimbus) skyer på 2000 fot (610 meter) over havet.
Det er ganske mange begreper for værfenomener, og det er vanskelig å huske dem. Koden for TAF-forespørselen er skrevet på lignende måte.
Laster opp kode til skyen
For ikke å kaste bort tid, la oss ta en telegrambotmal fra vårt depot
Siden i koden vil vi få tilgang til modulen pytaf, bør versjonen umiddelbart legges til krav.txt
pytaf~=1.2.1
- La oss gå videre til redigering bot/tele_bot.py. Vi fjerner alle unødvendige ting og legger til koden vår.
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 pakker hele katalogen inn i et ZIP-arkiv og går til kontrollpanelet til den opprettede funksjonen.
- Klikk her Rediger og last ned arkivet med koden.
- Fyll inn den relative banen i filen tele_bot (Utvidelse .py kan ikke spesifiseres) og en endepunktsfunksjon (i eksemplet gitt er dette main).
- I avsnitt Miljøvariabler skrive en variabel Token og tilordne den tokenet til ønsket telegrambot.
- Klikk her Lagre og utvide, hvoretter vi går til seksjonen Triggers.
- Vi setter bryteren HTTP-forespørselå gjøre forespørselen offentlig.
Vi har nå en URL for offentlig å kalle funksjonen. Alt som er igjen er
/setwebhook <you bot token> <public URL of your function>
Resultat
Hvis alt er gjort riktig, vil boten din umiddelbart begynne å fungere og vise den siste flyværmeldingen direkte i messengeren.
Selvfølgelig kan koden forbedres, men selv i sin nåværende tilstand er det nok å finne ut det mest nøyaktige været og prognosen fra en pålitelig kilde.
Du finner den fullstendige versjonen av koden i vår
Kilde: www.habr.com