このページの本文へ

Raspberry Piがしゃべり出す!? Bluemixでリアル天気予報ボット作ってみた

2016年09月30日 09時30分更新

文●Patrick Catanzariti

  • この記事をはてなブックマークに追加
本文印刷
IBM WatsonとRaspberry Piが大好きなPatrickがまたまたおもしろいモノを作りました! 30分ごとに気温や天気予報をぶつぶつと音声でつぶやいてくれるボットです。Raspberry Piユーザーならこの週末にちょっと試してみては…?

IBMのBluemixとRaspberry Piは、驚くべきポテンシャルを持つデバイスを作れる完璧な組み合わせです。Raspberry Piでなにができるのかを、『これは遊べる!Raspberry PiとIBM Watsonで作るIoTに世界のWeb開発者が熱狂』ではRaspberry PiをIBM Bluemix、IBM WatsonにNode-REDで接続する方法を、『いま何度?→WatsonのAPIとラズパイ繋いだらスタバのカップがしゃべり出した』ではIBM Watsonでテキストを音声に変換してRaspberry Piに声を与える方法を、じっくりと紹介してきました。

まだ、これらの記事を読んでいない場合は、まず読んでからこの記事に戻ることをお勧めします! 本記事では、Raspberry Piで地域の天気予報をします。

Raspberry Pi and IBM Bluemix Adventures Part Three

挿絵:SitePoint / PatCat、ロゴマーク著作権:IBMおよびRaspberry Pi財団

この例は以前の記事で構築したものから完全に独立していますが、音声変換機能と同じノードを使用するので用意しておくことをお勧めします。

The Weather CompanyのデータサービスをBluemixに追加する

役立つ気象情報を人びとに届けるため、IBMは事実上The Weather Compnayを買収しました。この買収は、IBM Bluemixから世界中のデータや予測などにアクセスできることを意味しています! そこにはいろいろな情報があります。IBM Bluemixの設定に追加するには、Bluemixサービスページに戻り、検索欄に「weather」と入力して、「Weather Company Data for IBM Bluemix」を検索します。

Finding the weather service in Bluemix

テストに利用できる初期プランは無料です。プランには次の制限があります。

The Weather Companyデータの無料プランは、各Bluemixアカウントごとに、The Weather Companyに最大毎分10回の呼び出し、API呼び出し最大1万までできます。

ポップアップオプションでは、(ほかで使用しているのがスペースならば)スペースを「dev」として、ほかのアプリで再利用できるようサービスを解除したままにし、希望する場合はサービス名を変更して(私はそうしました)、認証情報はそのままで「作成」をクリックします。

Creating our weather service in Bluemix

Node-REDから(あるいはどこからでも)天候データサービスを利用できるように、依頼者であることを証明する認証情報が必要になります。「Service Credentials(サービス認証情報)」ページで、ユーザー名とパスワードの詳細を安全な場所へコピーします。

Copying our weather service credentials

Node-REDの気象データへアクセスする

いま何度?→WatsonのAPIとラズパイ繋いだらスタバのカップがしゃべり出した』と同じフローをチュートリアルに開いてください(ゼロから始める場合、ほとんどのステップに従えばできます。音声変換方法の詳細については記事に戻ってください)。

フローに新しい機能ノードをドラッグします。新しい機能ノードはほかのノードの下に設置します(希望すれば、まったく新しいフローを作成できます)。

Dragging in a new function node

機能に「hourlyWeatherURL」または任意の名前を付けます。そして次のJavaScriptコードを設置します。

msg.url = 'https://twcservice.mybluemix.net:443/api/weather/v1/geocode/{latitude}/{longitude}/forecast/hourly/48hour.json?units=m&language=en-US';
return msg;

カスタマイズの必要がある2つのスポットがあることが分かります。{latitude}{longitude}フィールドに自分の緯度と経度を追加します。自分の街の値がわからない場合は、NASAに見事な緯度と経度のファインダーがあります。私の街シドニーの場合は、次のようになります。

msg.url = 'https://twcservice.mybluemix.net:443/api/weather/v1/geocode/-33.8671417236/151.2071075439/forecast/hourly/48hour.json?units=m&language=en-US';
return msg;

また、摂氏ではなく華氏を好む場合は、変更できるunits変数もあります。units=mはメートル法(摂氏)用で、units=eはヤード・ポンド法(華氏)用です。オーストラリアでは摂氏が使用されているので、units=mを使っています。

すべて入力したら「Done」をクリックします。

Creating our new function

次に、最初のノードに設定したURLを使用している気象データサービスに、HTTPリクエストができるようにします。そのためには「http request」ノードをドラッグしてください。

Dragging a new http request node

設定を開いて次の操作を実行するためにダブルクリックします。

  • 「Use basic authentication(基本認証を使用する)」にチェックマークを入れる(以前にコピーしたユーザ名とパスワードを含めるために必要)
  • 先に「Service Credentials」ページでコピーしたユーザー名とパスワードを追加
  • 戻り値として「a parsed JSON object(解析済みJSONオブジェクト)」を選択(次のノードを通してさらにフィルタリングできるJSONオブジェクトを受け取る方法)
  • 好きな名前を付ける(ここでは「retrieveWeather」とした)
  • 「Done」をクリック!

Setting up our http request node

URLを最初のノードから得るために、「http request」ノードに接続することを忘れてはいけません。

Connecting our http request module to our function

次に「debug」ノードにドラッグし、最後の部分に接続します。これで、動作確認のためにどのようなデータが届いているのかのログを見られます。

Dragging in a debug node and connecting it up

最後に、全プロセスを開始する手段が必要です。「inject」ノードにドラッグし、最初の部分に接続します。

Adding an inject node to the start

これで、テストの準備が整ったので、「Deploy」をクリックします。

Clicking deploy to test it out

フローを実行するために、「timestamp」とラベルのついた「inject」ノードにある小さな四角いボタンをクリックします。すると天候のリクエストが実行され、デバッグタブにデータが表示されます。

Starting to run our flow using the debug node

素晴らしい!これですべて期待どおりに動作するはずです。

返されるmsg.payloadには、今後の予報の配列が含まれています。現時刻を取得するために、配列内の最初の項目を受け取ります。msg.payloadは、全体的に次のような感じです。

{
  "metadata": {
    ...
  },
  "forecasts": [
    {
      "class": "fod_long_range_hourly",
      "expire_time_gmt": 1472786395,
      "fcst_valid": 1472785200,
      "fcst_valid_local": "2016-09-02T13:00:00+1000",
      "num": 1,
      "day_ind": "D",
      "temp": 16,
      "dewpt": 14,
      "hi": 16,
      "wc": 16,
      "feels_like": 16,
      "icon_extd": 1200,
      "wxman": "wx2500",
      "icon_code": 12,
      "dow": "Friday",
      "phrase_12char": "Rain",
      "phrase_22char": "Rain",
      "phrase_32char": "Rain",
      "subphrase_pt1": "Rain",
      "subphrase_pt2": "",
      "subphrase_pt3": "",
      "pop": 93,
      "precip_type": "rain",
      "qpf": 0.96,
      "snow_qpf": 0.0,
      "rh": 92,
      "wspd": 8,
      "wdir": 17,
      "wdir_cardinal": "NNE",
      "gust": null,
      "clds": 100,
      "vis": 6.0,
      "mslp": 1006.8,
      "uv_index_raw": 0.83,
      "uv_index": 1,
      "uv_warning": 0,
      "uv_desc": "Low",
      "golf_index": 2,
      "golf_category": "Very Poor",
      "severity": 1
    },
    ... (the next hours go here)

それでは基本的なデバッグログから先へ進み、『いま何度?→WatsonのAPIとラズパイ繋いだらスタバのカップがしゃべり出した』で会得した「話す」能力を使って、Raspberry Piで天気のデータを伝えます。

Piに話し方を思い出させる

Raspberry Piに話をさせるには、記事で紹介したCPUの温度と同じように、チュートリアルの最後の7つのノードをコピーします。ドラッグしてすべてを選択するとコピーできます。そのあとCtrl+C(Windowsの場合)またはCmd+C(Macの場合)を押します。

Selecting and copying the speech nodes from our previous tutorial

Ctrl+ V(Windowsの場合)またはCmd+ V(Macの場合)を使用してそれらを貼り付け、新しい気象フローの下部にきれいに配置します。最初の「Temperature Test」を「Weather Text」に変更し、「retrieveWeather」ノードからの出力を受けられるように接続します。

Renaming the node to Weather Text

「Weather Text」をダブルクリックして、Raspberry Piになにを言わせたいかを設定します。はじめに、次のJavaScriptコードを入力します。

msg.payload = "The current temperature is " + 
              msg.payload.forecasts[0].temp +
              " degrees celsius";
return msg;

このコードは、「現在の温度は摂氏X℃です」と返すように出力を構成したいとRaspberry Piに伝えます(華氏を使用する場合は、ここで変更します)。

さて、Raspberry PiにCPUの温度を伝え続けさせたい場合は特定のステップを省略できますが、個人的には天候の方がよりおもしろく、CPUの温度はこれ以上聞きたくありません。みなさんも私と同じならば、フローの「timestamp」ノードをダブルクリックしてください。リピート設定を解除し「Inject once at start?」のチェックを外します。この方法は、クリックして実行するとフローのみが実行されます。最後に「Done」をクリックします。

Take away the repeat and inject once of our other flow to stop it running

これで、代わりに自動的に実行するための天候フローを設定できます。新しい「timestamp」ノードをダブルクリックし、希望の頻度で繰り返すよう設定します(私は30分ごとを選択しました)。フローを展開する場合にも自動的に実行するように、「Inject once at start?」をクリックします。いつものように、最後に「Done」をクリックします。

Set our other node to repeat every 30 minutes

これらの変更をデプロイすると、現在の気温が音声で見事に自動通知されます。

Deploying our finished version

ほかになにができる?

サービスで利用できるほかのデータには、どんなものがあるのでしょう。IBM BluemixのWeather Compnay Data APIのページで、気象APIが提供できる可能性のあるものすべてが分かります。この例では、「ジオコードによる48時間の毎時予報」のAPIを使用しています。この例をもう少し高度にするには、1時間に雨が降るかどうかなどの気象に関するデータを追加します(その後1時間は配列の第2の値が返されます)。

msg.payload = "The current temperature is " + 
              msg.payload.forecasts[0].temp +
              " degrees celsius. " +
              "There is a " +
              msg.payload.forecasts[1].pop + 
              " percent chance of " +
              msg.payload.forecasts[1].precip_type +
              " in an hour.";
return msg;

さらに進めて、(湿度と風を追加したときに)気温が体感と同じかどうかについての情報を追加することさえできます。APIにはそのためのフィールドがあり、次のようにアクセスできます。

var tempToSay = msg.payload.forecasts[0].temp != msg.payload.forecasts[0].feels_like ? 
        "The current temperature is " + msg.payload.forecasts[0].temp + 
        " degrees celsius, but it will feel more like " + 
        msg.payload.forecasts[0].feels_like + ". " : 
        "The current temperature is " + msg.payload.forecasts[0].temp + 
        " degrees celsius. ";

msg.payload = tempToSay +
              "There is a " +
              msg.payload.forecasts[1].pop + 
              " percent chance of " +
              msg.payload.forecasts[1].precip_type +
              " in an hour.";
return msg;

基本的に上のコードは、msg.payload.forecasts[0].feels_like値がmsg.payload.forecasts[0].temp値と異なる場合はmsg.payload.forecasts[0].feels_like値にのみ言及しています。

最後に

こうして、あらゆる方法で天気予報を伝えられるRaspberry Piを手にしました。風から積雪量まで、もっと多くの情報があります。とてもニッチですが、ゴルフ用の気象条件を表す値すらあります。いま、その能力はみなさんの手の中にあります。BluemixとRaspberry Piを組み合わせてもっと多くの機能を試してみたいなら、決して恐れないでください。Bluemixのプラットホームでさらに多くの可能性を探り続けていく予定です。私自身そのプロセスをとても楽しんでいます。

(原文:Forecasting the Weather with Your Raspberry Pi and Bluemix

[翻訳:柴田理恵/編集:Livit
Image:goodcat / Shutterstock.com

Web Professionalトップへ

WebProfessional 新着記事