Weather Company Data for IBM Bluemixを使って天気予報IoTデバイスを作る

この記事は、[teratail IBM Bluemixアドベントカレンダー](https://teratail.com/Bluemix) 20日目の記事です。 

## Weather Company Data for IBM Bluemix

IBM Bluemixの提供するサービスに、任意地点の天気情報を取得できるAPIがあります。

>このサービスを使用すると、The Weather Company が提供する気象データを IBM Bluemix アプリケーションに統合できます。 地理的位置によって指定するエリアの気象データを取得できます。 このデータを使用して、天候が結果に大きな影響を与えるビジネス上の実際の問題を解決するアプリケーションを作成できます。

しかもこのAPI、<b>1分当り10コールまで無料</b>です。IBMすごい。
<img width="933" alt="スクリーンショット 2016-12-21 1.58.19.png" src="https://qiita-image-store.s3.amazonaws.com/0/38442/1704efe6-c58c-f39b-a579-1f4381836e51.png">
個人利用ならまったく問題ない上限ではないでしょうか。（ありがとうビックブルー・・！🌴🐘）

取得できる天気情報もいくつかパターンがあるのですが、今回は「Daily Forecast」を使ってみたいと思います。
<img width="981" alt="スクリーンショット 2016-12-21 22.46.15.png" src="https://qiita-image-store.s3.amazonaws.com/0/38442/a12d3b63-ab42-d225-4615-6d6d319814a8.png">

## Request URLを叩いてみる
`3-Day Daily Forecast by Geocode`をクリックすると、Request URLを生成するウィンドウが表示されます。
<img width="969" alt="スクリーンショット 2016-12-21 22.39.28.png" src="https://qiita-image-store.s3.amazonaws.com/0/38442/b99a1a6d-15d9-f25f-cfcf-8c84359c50e3.png">

サンプル地点として、東京都目黒区中目黒の緯度経度を入力してみました。
`language`に`ja-JP`を指定すると、返却されるJsonが日本語表記になるので、読みやすくて便利です。

パラメータを入力したら、ページ下部の`Try it out!`ボタンをクリックします。
<img width="498" alt="スクリーンショット 2016-12-21 22.51.14.png" src="https://qiita-image-store.s3.amazonaws.com/0/38442/58518787-1a01-3be5-6e66-097a9b880f5f.png">

Request権限が未認証の場合、ブラウザから認証情報を聞かれますが、スルーして先のページに行くとRequest URLが取得できます。
<img width="994" alt="スクリーンショット 2016-12-21 22.55.57.png" src="https://qiita-image-store.s3.amazonaws.com/0/38442/ed57bc79-10f4-1ca7-847a-e64889e05d10.png">

このRequest URLをブラウザに打っても`401`が返ってきてしまうので、`https://twcservice.au-syd.mybluemix.net/`の部分を以下ページの赤枠部分と差し替えます。
<img width="1301" alt="スクリーンショット 2016-12-21 22.41.54.png" src="https://qiita-image-store.s3.amazonaws.com/0/38442/f7baf2fe-f2f2-2488-11cb-32cfc385abcc.png">

まとめると、ここでのRequest URLは、  
`https://<username>:<password>@twcservice.au-syd.mybluemix.net/api/weather/v1/geocode/35.6441591/139.6984862/forecast/daily/3day.json?language=ja-JP`  
となります。

このURLをブラウザに打ち込んでみると、こんな感じです。
<img width="1054" alt="スクリーンショット 2016-12-21 23.09.11.png" src="https://qiita-image-store.s3.amazonaws.com/0/38442/469b6b95-57a6-3d71-b491-a37d93a01b01.png">

どわーっとJsonが返ってきました。🎉

## 天気予報IoT
というわけで、ここからが本題なのですが、このAPIを使って<b>天気予報をお知らせしてくれるIoTデバイス</b>を試作してみたいと思います。
以下のような簡単な要件です。

- [Johnny-Five](http://johnny-five.io/)からWeather Company Data APIを叩く
- responseされたJsonから今日の天気を判定し、天気によってLEDの点灯状態を変化させる。
 
## Node.js × Weather Company Data
まずはJohnny-Fiveと連携する前に、Node.jsだけでAPIを叩いてみたいと思います。URLのRequestには`node-fetch`を使いました。

```weather.js
var fetch = require("node-fetch");

fetch('https://<username>:<password>@twcservice.au-syd.mybluemix.net/api/weather/v1/geocode/35.6441591/139.6984862/forecast/daily/3day.json?language=ja-JP', {
    method: 'GET'
})
.then(function(res) {
    return res.json();
}).then(function(json) {
    console.log(json);
});
```

レスポンスの様子です。
<img width="1130" alt="スクリーンショット 2016-12-21 22.45.04.png" src="https://qiita-image-store.s3.amazonaws.com/0/38442/8a0bca53-90c3-0399-6cfe-aa589146c412.png">

## Johnny-Five × Weather Company Data
Johnny-Fiveを使って動かすIoTの仕様は以下の通りです。

- Weather Company Data APIで指定した地点の天気予報（e.g. "午後、にわか雨、強い風。 最高気温18～20℃、最低気温15～17℃。"）を取得
- 予報に、
    - "晴"が含まれていたら、緑LEDを点灯
    - "曇"が含まれていたら、白LEDを点灯
    - "雨"が含まれていたら、赤LEDを点灯

```weather.js
var five = require("johnny-five");
var fetch = require("node-fetch");
var board = new five.Board();

board.on("ready", function() {
    this.loop(10000, function() {
        fetch('https://<username>:<password>@twcservice.au-syd.mybluemix.net/api/weather/v1/geocode/35.6441591/139.6984862/forecast/daily/3day.json?language=ja-JP', {
            method: 'GET'
        })
        .then(function(res) {
            return res.json();
        }).then(function(json) {
            var str = json.forecasts[0].narrative;
            console.log(str);
            if (str.match(/晴/)) {
                (new five.Led(11)).on();
            }
            if (str.match(/曇/)) {
                (new five.Led(12)).on();
            }
            if (str.match(/雨/)) {
                (new five.Led(13)).on();
            }
        });
    })
});
```

## 動作確認
実行すると、Terminal上にAPIから返ってきた`narrative`値が表示されました。
「雨と風。 最低気温14℃。」とのこと。
<img width="337" alt="スクリーンショット 2016-12-22 22.30.26.png" src="https://qiita-image-store.s3.amazonaws.com/0/38442/10316bf3-9053-740f-5856-d29337825f93.png">

確かに、現在の中目黒は嵐のような豪雨です・・・☔（2016.12.22 22:00）

LEDも雨を示す赤色が点灯しました。
![IMG_2783.JPG](https://qiita-image-store.s3.amazonaws.com/0/38442/c6108062-8235-0e58-54bf-b1be4e546dcb.jpeg)



## まとめ
天気予報APIって結構ハードル高いイメージあったんですが、Weather Company Dataを使えばBluemixさんがぜんぶやってくれます。最高か。🙏
お天気IoTやっていきましょう!!!🌅🌅🌅

## 参考URL
- Bluemixでお天気情報ゲットだぜ（The Weather Company第１段）  
http://qiita.com/azzeten/items/46155f34fb16e0bd67c7