TĂ€psus prognooside tegemisel: Telegrami bot pilvefunktsioonide abil

TĂ€psus prognooside tegemisel: Telegrami bot pilvefunktsioonide abil
Ilma andmeid pakkuvaid teenuseid on palju, kuid kuhu neist usaldada? Kui hakkasin tihti jalgrattaga sÔitma, tahtsin omada kÔige tÀpsemaid teadmisi ilmastikuoludest kohas, kus ma sÔidan.

Esimene mĂ”te oli koguda vĂ€ike DIY ilmapost ja saada sealt andmeid. Kuid ma ei hakanud «ratast leiutama» ja usaldusvÀÀrse andmeallikana valisin ma ilmainfo, mida kasutatakse tsiviillennunduses, nimelt METAR (METeorological Aerodrome Report) ja TAF (TAF — Terminal Aerodrome Forecast). Lennunduses sĂ”ltuvad ilmad sadade inimeste eludest, seetĂ”ttu on prognoosid ÀÀrmiselt tĂ€psed.

Seda teavet edastatakse ööpĂ€evaringselt hÀÀlena iga kaasaegse lennujaama kaudu ATIS (Automatic Terminal Information Service) ja VOLMET (prantsuse keeles vol — lend ja mĂ©tĂ©o — ilm). Esimene edastab teavet lennujaama tegeliku ilma kohta, samas kui teine — prognoosi jĂ€rgmise 24-30 tunni kohta, hĂ”lmates mitte ainult edastamise lennujaama, vaid ka teisi.

Vnukovo lennujaama ATIS nÀide:

Vnukovo lennujaama VOLMET nÀide:

Igakordne raadioskanneri vÔi sobivas sageduses transiiveri kaasas vedamine on ebamugav, ja tahtsin luua Telegramis boti, mis nupule vajutades annab samasuguse prognoosi. Selle jaoks eraldi serveri eraldamine on vÀhemalt ebamugav, nagu ka koduses Raspberry'l pÀringute saatmine.

SeetÔttu otsustasin tagaplaaniks kasutada teenust Selectel pilveteenused.PÀringute arvu jagu on ÀÀrmiselt vÀike, seega maksab selline teenus praktiliselt tasuta (minu arvutuste kohaselt on see 22 rubla 100 000 pÀringu kohta).

Tagaplaani ettevalmistamine

Funktsiooni loomine

Juhtpaneelis my.selectel.ru avatakse vaade Pilvemonitor ja loome uue projekti:

TĂ€psus prognooside tegemisel: Telegrami bot pilvefunktsioonide abil
PĂ€rast projekti loomist liigume jaotisse Funktsioonid:

TĂ€psus prognooside tegemisel: Telegrami bot pilvefunktsioonide abil
Vajutame nuppu Loo funktsioon ja anname sellele vajaliku nime:

TĂ€psus prognooside tegemisel: Telegrami bot pilvefunktsioonide abil
PĂ€rast nuppule vajutamist Loo funktsioon kuvatakse loodud funktsiooni vaade:

TĂ€psus prognooside tegemisel: Telegrami bot pilvefunktsioonide abil
Enne koodi loomise alustamist Pythonis tuleb luua Telegramis bot. Ma ei hakka seda selgitama — detailne juhend on olemas meie teadmistebaasis.Oluline on meie jaoks loodud boti token.

Valmistame koodi

UsaldusvÀÀrsete andmete allikana valisin Ameerika Ühendriikide rahvusliku ookeani ja atmosfÀÀri administratsiooni (ingl. k. National Oceanic and Atmospheric Administration, NOAA). See teadusagentuur vĂ€rskendab oma serveris andmeid reaalajas TXT-formaadis.

Link METAR andmete saamiseks (pange tÀhele, et tÀhed on tundlikud):

https://tgftp.nws.noaa.gov/data/observations/metar/stations/.TXT

Minu puhul on lĂ€him lennujaam Vnukovo, mille ICAO kood on UUWW. Üleminek loodud URL-ile annab jĂ€rgmise tulemuse:

2020/08/10 11:30
UUWW 101130Z 31004MPS 9999 SCT048 24/13 Q1014 R01/000070 NOSIG

Esimene rida on prognoosi kehtivuse aeg Greenwichi aja jÀrgi. Teine rida on vÀliste tingimuste kokkuvÔte. Tsiviillennunduse piloodid saavad kergesti aru, mida see rida tÀhendab, kuid me vajame seda deƥifreerimist:

  • [UUWW] — Vnukovo, Moskva (Venemaa — RU);
  • [101130Z] — kuu 10. pĂ€ev, kell 11:30 Greenwichi aja jĂ€rgi;
  • [31004MPS] — tuule suund 310 kraadi, kiirus 4 m/s;
  • [9999] — horisontaalne nĂ€htavus 10 km vĂ”i rohkem;
  • [SCT048] — hajutatud pilved kĂ”rgusel 4800 jalga (~1584m);
  • [24/13] — temperatuur 24°C, kastepunkt 13°C;
  • [Q1014] — rĂ”hk (QNH) 1014 hPa (750 mm Hg);
  • [R01/000070] — haardetegur rajal 01 — 0,70;
  • [NOSIG] — ilma oluliste muutusteta.

KĂ€ime nĂŒĂŒd koodi kirjutamise juurde. KĂ”igepealt peame impordima funktsioonid request ja pytaf:

from urllib import request
import pytaf

MÀÀrake muutujad ja valmistage ette dekodeerimisfunktsioon:

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()

Liigume nĂŒĂŒd TAF-i juurde (ka registrit on oluline jĂ€lgida).

https://tgftp.nws.noaa.gov/data/forecasts/taf/stations/.TXT

Nagu eelnevas nÀites, vaatame Vnukovo lennujaama prognoosi:

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

EeskĂ€tt pöörame tĂ€helepanu ridadele TEMPO ja BECMG. TEMPO tĂ€hendab, et tegelik ilm muutub mÀÀratud ajavahemikus pidevalt. BECMG — ilm muutub jĂ€rk-jĂ€rgult mÀÀratud ajavahemikus.

Siiski, rida:

TEMPO 1012/1020 -TSRA BKN020CB

TĂ€hendab:

  • [1012/1020] — ajavahemikus 12 kuni 20 (Greenwichi ajal);
  • [-TSRA] — Ă€ikesetorm (TS = thunderstorm) vihmaga (RA = rain) kerge intensiivsusega (miinus);
  • [BKN020CB] — mĂ€rkimisvÀÀrne (BKN = katkine), pilvisus (CB = kumulonimbus) 2000 jala (610 meetri) kĂ”rgusel merepinnast.

On palju termineid, mis tÀhistavad ilmastikutingimusi, ja neid on raske meeles pidada. TAF-i pÀringu kood kirjutatakse samamoodi.

Laeme koodi pilve

Kuna ei taha aega raisata, vÔtame meie hoidlast telegrampunkri malle. cloud-telegram-bot. Seal on eelnevalt ette valmistatud requirements.txt ja setup.py Ôige direktorite struktuuriga.

Kuna koodis pöördume mooduli poole pytaf, siis tuleb selle versioon kohe lisada requirements.txt

pytaf~=1.2.1

  • Liigume edasi redigeerimise juurde bot/tele_bot.py. Eemaldame kĂ”ik liialdust ja lisame oma koodi.

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 = "Tere. See on bot lennuilma prognoosi saamiseks " 
          "NOAA serveritest. Bot on seadistatud Vnukovo lennujaama (UUWW) jaoks."
    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)

  • Pakkime kogu kausta ZIP-arhiivi ja liikume juhtpaneelile loodud funktsiooni juurde.
  • KlĂ”psame Redigeerida ja laadime arhiivi koos koodiga ĂŒles.

TĂ€psus prognooside tegemisel: Telegrami bot pilvefunktsioonide abil

  • TĂ€idame suhte teed failini tele_bot (laiendit .py ei ole vaja nĂ€idata) ja lĂ”pp-funktsiooni (antud nĂ€ite puhul on see main).
  • Jaotises Keskkonnamuutujad kirjutame muutuja TOKEN ja mÀÀrame sellele vajaliku telegramm-boti tokeni.
  • KlĂ”psame Salvesta ja rakenda, pĂ€rast mida liigume jaotisse LĂŒlitid.
  • Asetame lĂŒliti HTTP-pĂ€ring, et teha pĂ€ring avalikuks.

TĂ€psus prognooside tegemisel: Telegrami bot pilvefunktsioonide abil
Meil on nĂŒĂŒd URL avalikuks funktsiooni kutsumiseks. JÀÀnud on vaid webhooki seadistamine. Leidke meie bot @SelectelServerless_bot Telegrammiks ja registreerige oma bot kĂ€suga:

/setwebhook <you bot token> <public URL of your function>

Tulemus

Kui kÔik on Ôigesti tehtud, hakkab teie bot kohe tööle ja nÀitab reaalajas lennuilma kokkuvÔtet otse messengeri.

TĂ€psus prognooside tegemisel: Telegrami bot pilvefunktsioonide abil
Muidugi on koodi vÔimalik tÀiustada, kuid isegi praeguses olekus on seda piisavalt, et teada saada kÔige tÀpsem ilm ja prognoos usaldusvÀÀrsest allikast.

TĂ€ieliku koodi leiate meie GitHubi hoidlast.

TĂ€psus prognooside tegemisel: Telegrami bot pilvefunktsioonide abil

Allikas: habr.com

Osta usaldusvÀÀrne hostimine veebilehtede jaoks DDoS-i kaitsega, VPS VDS serverid đŸ”„ Osta usaldusvÀÀrne hostimine veebilehtede jaoks DDoS-i kaitsega, VPS VDS serverid | ProHoster