最も正確な天気予報:クラウド機能上のテレグラム用ボット



気象情報を提供するサービスはたくさんありますが、どれを信じますか?サイクリングをたくさん始めたとき、自分が乗っている地域の気象条件について最も正確な情報が欲しかったのです。



最初に考えたのは、センサーを備えた小さなDIYウェザーステーションを構築し、そこからデータを受信することでした。しかし、私は車輪を再発明せず、民間航空で使用される気象情報、つまりMETAR(METeorological Aerodrome Report)とTAF(TAF-Terminal Aerodrome Forecast)を検証済みデータのソースとして選択しました。航空業界では、何百人もの人々の生活が天候に依存しているため、予測は可能な限り正確です。



この情報は、ATIS(自動ターミナル情報サービス)およびVOLMET(フランスのvol -flightおよびmétéo -weatherからの形式で、すべての近代的な空港で音声で24時間放送されます。1つ目は空港の実際の天気に関する情報を提供し、2つ目は放送空港だけでなく他の空港での次の24〜30時間の予測を提供します。



Vnukovo空港でのATISの例:




Vnukovo空港でのVOLMETの例




ラジオスキャナーやトランシーバーを毎回対応するバンドに持っていくのは不便で、ボタンを押すだけで同じ予報が得られるボットをテレグラムで作りたかったのです。これに別のサーバーを割り当てることは、少なくとも実用的ではなく、ホームRaspberryへのリクエストを促進します。



そのため、Selectel CloudFunctionsサービスをバックエンドとして使用することにしましたリクエストの数はごくわずかであるため、このサービスの費用は実質的に無料です(私の計算によると、リクエスト10万件あたり22ルーブルになります)。



バックエンドの準備



関数の作成



my.selectel.ru コントロールパネルでCloud Platformビューを開き、新しいプロジェクトを作成します。





プロジェクトが作成されたら、「機能」セクションに移動します





[関数作成]ボタンクリックして、目的の名前を付けます。





[関数の作成]をクリックすると、作成された関数が表示されます。





Pythonコードの作成を開始する前に、Telegramでボットを作成する必要があります。これがどのように行われるかについては説明しません詳細な手順は、ナレッジベースで入手できます私たちにとって重要なのは、作成されたボットのトークンです。



コードを調理する



信頼できるデータのソースとして、National Oceanic and Atmospheric Administration(NOAA)を選択しました。この科学機関は、サーバー上のデータをTXT形式でリアルタイムに更新します。



METARデータを取得するためのリンク(ケースに注意):



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


私の場合、最寄りの空港はVnukovoで、ICAOコードはUUWWです。生成されたURLに移動すると、次のようになります。



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


最初の行は、予測がグリニッジ平均時間によって最新である時間です。2行目は実際の天気の要約です。民間航空パイロットはこの線の意味を簡単に理解できますが、復号化が必要です。



  • [UUWW] -Vnukovo、モスクワ(ロシア-RU);
  • [101130Z] -月の10日、11:30 GMT;
  • [31004MPS] -風向310度、速度4 m / s;
  • [9999] -10km以上の水平方向の可視性。
  • [SCT048] -高度4800フィート(〜1584m)の散乱/散乱雲。
  • [24/13] -温度24°C、露点13°C;
  • [Q1014] -圧力(QNH)1014ヘクトパスカル(750 mm Hg);
  • [R01 / 000070] -レーン01の接着係数-0.70 ;
  • [NOSIG] -重要な変更はありません。


プログラムコードを書き始めましょう。まず、リクエスト関数pytaf関数をインポートする必要があります



from urllib import request
import pytaf


変数を指定し、デコード機能を準備します。



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


TAFに移りましょう(登録も重要です)。



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


前の例のように、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


TEMPOおよびBECMGラインに 特に注意してくださいTEMPOは、指定された期間の実際の天気が定期的に変化することを意味します。BECMG-指定された期間中、天気は徐々に変化します。



つまり、次の行です。



TEMPO 1012/1020 -TSRA BKN020CB


意味します:



  • [1012/1020] -12:00〜20:00(GMT);
  • [-TSRA] -低強度(マイナス記号)の雨(RA =雨)を伴う雷雨(TS =雷雨)。
  • [BKN020CB]海抜2000フィート(610メートル)の重要な(BKN =壊れた)cumulonimbus(CB = cumulonimbus)の雲の覆い。


気象現象には多くの用語があり、覚えにくいです。TAFリクエストのコードも同様の方法で記述されています。



コードをクラウドにアップロードする



時間を無駄にしないために、cloud-telegram-botリポジトリからtelegrambotテンプレートを取得しましょう正しいディレクトリ構造を持つ事前に準備されたrequirements.txtsetup.pyがあります。



コードではpytafモジュールを参照するため、そのバージョンをすぐにrequirements.txtに追加する必要があります。



pytaf~=1.2.1


  • bot /tele_bot.pyの編集に行きましょう不要なものをすべて削除し、コードを追加します。


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)


  • ディレクトリ全体をZIPアーカイブにパックし、コントロールパネルに移動して作成した関数に移動します。
  • .




  • tele_bot ( .py ) - ( main).
  • TOKEN -.
  • , .
  • HTTP-, .




これで、パブリック関数呼び出しのURLができました。Webhook構成するだけです。Telegramでボット@SelectelServerless_botを見つけ、次のコマンドでボットを登録します。



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


結果



すべてが正しく行われると、ボットはすぐに動作を開始し、現在の航空気象レポートをメッセンジャーに表示します。





もちろん、コードは変更できますが、現在の状態でも、信頼できるソースから最も正確な天気と予測を見つけるだけで十分です。



コードの完全版は、GitHubのリポジトリにあります






All Articles