A previsione meteorologica più precisa: bot per Telegram nantu à e funzioni di nuvola

A previsione meteorologica più precisa: bot per Telegram nantu à e funzioni di nuvola
Ci hè una mansa di servizii chì furnisce l'infurmazioni climatichi, ma quale duvete fidà? Quandu aghju cuminciatu à andà in bicicletta à spessu, vulia avè l'infurmazioni più precise nantu à e cundizioni climatichi in u locu induve cavalcà.

U mo primu pensamentu era di custruisce una piccula stazione meteorologica DIY cù sensori è riceve dati da ellu. Ma ùn aghju micca "reinventatu a rota" è hà sceltu l'infurmazioni climatichi chì sò utilizati in l'aviazione civile cum'è fonte di dati verificati, vale à dì. METAR (Rapportu di l'Aerodromu Meteorologicu) è impiegu (TAF - Previsioni di l'Aerodromu Terminal). In l'aviazione, a vita di centinaie di persone dipende da u clima, cusì e previsioni sò più precise pussibule.

Questa informazione hè trasmessa 24/7 per voce in ogni campu d'aviazione mudernu in a forma ATIS (Serviziu d'infurmazione di u terminal automaticu) è VOLMET (da u francese. vol - volu è météo - tempu). U primu furnisce infurmazioni nantu à u tempu attuale in l'aeròdromu, è u sicondu furnisce una previsione per l'ora di 24-30, micca solu in u campu d'aviazione, ma ancu in altri.

Esempiu di operazione ATIS à l'aeroportu di Vnukovo:

Un esempiu di cumu travaglia VOLMET in l'aeroportu di Vnukovo

Hè sconveniente per portà un scanner di radiu o un transceiver cun voi ogni volta per a gamma currispondente, è vulia creà un bot in Telegram chì, à u clicu di un buttone, vi permette di ottene a stessa previsione. Hè almenu impraticabile di assignà un servitore separatu per questu, è ancu di mandà dumande à a vostra casa Raspberry.

Dunque, aghju decisu di utilizà u serviziu cum'è backend Funzioni di Selectel Cloud. U numaru di richieste serà insignificante, cusì un tali serviziu serà praticamente liberu (sicondu i mo calculi, serà 22 rubles per 100 000 richieste).

Preparazione backend

Crià una Funzione

In u pannellu di cuntrollu my.selectel.ru apre a vista piattaforma cloud è crea un novu prughjettu:

A previsione meteorologica più precisa: bot per Telegram nantu à e funzioni di nuvola
Dopu chì u prugettu hè creatu, andate à a rùbbrica Funzioni:

A previsione meteorologica più precisa: bot per Telegram nantu à e funzioni di nuvola
Pulsà u buttone Crea una funzione è dà u nome desideratu:

A previsione meteorologica più precisa: bot per Telegram nantu à e funzioni di nuvola
Dopu avè pressatu Crea una funzione averemu una rapprisintazioni di a funzione creata:

A previsione meteorologica più precisa: bot per Telegram nantu à e funzioni di nuvola
Prima di inizià a creazione di codice in Python, avete bisognu di creà un bot in Telegram. Ùn descriveraghju micca cumu hè fattu questu - ci sò struzzioni detallati in a nostra basa di cunniscenza. A cosa principal per noi hè u token di u bot creatu.

Preparazione di u codice

Aghju sceltu l'Amministrazione Naziunale di l'Oceanu è l'Atmosferica (NOAA) cum'è una fonte di dati affidabili. Questa agenza scientifica aghjurnà e dati in tempu reale nantu à u so servitore in formatu TXT.

Link per uttene dati METAR (nota u casu):

https://tgftp.nws.noaa.gov/data/observations/metar/stations/<код аэропорта по ICAO>.TXT

In u mo casu, l'aeroportu più vicinu hè Vnukovo, u so codice ICAO hè UUWW. Andendu à l'URL generatu darà i seguenti:

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

A prima linea hè l'ora attuale di a previsione in Greenwich Mean Time. A seconda linea hè un riassuntu di u clima attuale. I piloti di l'aviazione civile ùn anu micca prublemi à capisce ciò chì significa sta linea, ma avemu bisognu di una spiegazione:

  • [UUWW] - Vnukovo, Mosca (Russia - RU);
  • [101130Z] - 10th ghjornu di u mese, 11:30 am GMT;
  • [31004MPS] - direzzione di u ventu 310 gradi, vitezza 4 m/s;
  • [9999] - visibilità horizontale 10 km o più;
  • [SCT048] - nuvuli spargugliati / spargugliati à 4800 piedi (~1584m);
  • [24 / 13] - temperatura 24 ° C, puntu di rugiada 13 ° C;
  • [Q1014] - pressione (QNH) 1014 hectopascals (750 mm Hg);
  • [R01/000070] - coefficient d'aderenza nantu à a strada 01 - 0,70;
  • [NOSIG] - senza cambiamenti significativu.

Accuminciamu à scrive u codice di u prugramma. Prima vi tocca à impurtà funzioni dumanda и pytaf:

from urllib import request
import pytaf

Specificate e variàbili è preparanu a funzione di decodificazione:

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

Passemu à TAF (u casu hè ancu impurtante).

https://tgftp.nws.noaa.gov/data/forecasts/taf/stations/<код аэропорта по ICAO>.TXT

Cum'è in l'esempiu precedente, fighjemu a previsione in l'aeroportu di Vnukovo:

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

Fighjemu in particulare attente à e linee TEMPO и BECMG. TEMPO significa chì u tempu attuale durante u periodu specificatu cambierà periodicamente. BECMG - u clima cambierà gradualmente in un periudu di tempu.

Hè, a linea:

TEMPO 1012/1020 -TSRA BKN020CB

Vulerà dì:

  • [1012 / 1020] - trà 12 è 20 ore (Greenwich Mean Time);
  • [-TSRA] - tempesta (TS = tempesta) cù piova (RA = pioggia) di intensità bassa (signu minus);
  • [BKN020CB] - nuvole significative (BKN = rotte), cumulonimbus (CB = cumulonimbus) à 2000 piedi (610 metri) sopra u livellu di u mari.

Ci sò assai termini per i fenomeni climatichi, è ricurdà di elli hè difficiule. U codice per a dumanda TAF hè scrittu in modu simili.

Caricà u codice à u nuvulu

Per ùn perde u tempu, pigliamu un mudellu di telegram bot da u nostru repository nuvola-telegram-bot. Ci hè un pre-preparatu esigenze.txt и setup.py cù a struttura di cartulare curretta.

Siccomu in u codice seremu accede à u modulu pytaf, allura a so versione deve esse aghjuntu immediatamente esigenze.txt

pytaf~=1.2.1

  • Passemu à l'edità bot/tele_bot.py. Sguassemu tutte e cose inutili è aghjunghje u nostru codice.

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)

  • Imballemu tuttu u cartulare in un archiviu ZIP è andemu à u pannellu di cuntrollu à a funzione creata.
  • Pulsà Edit è scaricate l'archiviu cù u codice.

A previsione meteorologica più precisa: bot per Telegram nantu à e funzioni di nuvola

  • Inserite a strada relativa in u schedariu tele_bot (estensione francese py pò micca esse specificatu) è una funzione endpoint (in l'esempiu datu questu hè principale).
  • rùbbrica Variabili di l'ambiente scrive una variabile TOKEN è assignà u token di u bot telegramma desideratu.
  • Pulsà Salvà è espansione, dopu chì andemu à a rùbbrica triggers.
  • Mettimu u switch dumanda HTTPper fà a dumanda publica.

A previsione meteorologica più precisa: bot per Telegram nantu à e funzioni di nuvola
Avemu avà un URL per chjamà publicamente a funzione. Tuttu ciò chì resta hè cunfigurà webhook. Truvate u nostru bot @SelectelServerless_bot in Telegram è registrate u vostru bot cù u cumandimu:

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

risultatu

Se tuttu hè fattu bè, u vostru bot principia immediatamente à travaglià è mostra l'ultimu rapportu climaticu di l'aviazione direttamente in u messenger.

A previsione meteorologica più precisa: bot per Telegram nantu à e funzioni di nuvola
Di sicuru, u codice pò esse migliuratu, ma ancu in u so statu attuale hè abbastanza per sapè u tempu più precisu è a previsione da una fonte di fiducia.

Truverete a versione completa di u codice in u nostru repository nantu à GitHub.

A previsione meteorologica più precisa: bot per Telegram nantu à e funzioni di nuvola

Source: www.habr.com

Add a comment