天気予報とか気象情報(Weather Company Data)をNode-REDで使ってみる

# はじめに
Node-REDには初めから「Weather Insightsノード」があるので、いまの天気の状態とか、これからの天気予報のデータを扱うアプリを作るのに便利です。例えばスマホ内のカレンダーと連動して、これから行く先の天気を見据えて、傘(Bluetooth付き)の持参を促したり、洋服のコーディネートの相談ができるアプリとか...。

<img width="168" alt="Screen Shot 2016-12-19 at 18.30.10.png" src="https://qiita-image-store.s3.amazonaws.com/0/75507/d5760245-aab2-2846-9768-6294d120601a.png">

使い方の大まかなイメージは、まず緯度経度と言語と単位を設定して...

<img width="679" alt="Screen Shot 2016-12-19 at 18.33.52.png" src="https://qiita-image-store.s3.amazonaws.com/0/75507/31e6c95d-a360-47ab-2573-124b1f4e4484.png">

いまの天気状態(Observation)が知りたいのか？それとも、これからの天気予報(Forecast)を知りたいのか？を選ぶだけ...

<img width="440" alt="Screen Shot 2016-12-19 at 18.35.44.png" src="https://qiita-image-store.s3.amazonaws.com/0/75507/6002cac1-7524-d0ef-7609-035926b71ab3.png">

...だけなのだが、ハマりどころはあって、それは出力結果が msg.forecasts, msg.observation , msg.observations に分かれて出るところ。つまり msg.payloadじゃないから、要注意。

<img width="402" alt="Screen Shot 2016-12-19 at 18.40.55.png" src="https://qiita-image-store.s3.amazonaws.com/0/75507/9fca1491-966c-50bb-751b-583659836f87.png">

もちろんこのノードを使えるようにするには、Weather Company Dataサービスを契約しておかないといけないので後述。

<img width="244" alt="Screen Shot 2016-12-19 at 18.15.28.png" src="https://qiita-image-store.s3.amazonaws.com/0/75507/e371dd6f-0e7f-1553-49ae-4fc898b8c54e.png">

なお、この天気データは、あのiPhone公式「天気」アプリと同じ元データで、データ更新頻度は1時間ごとなので、アプリからの更新頻度も最短1時間ごとにすると良いかも。
<img width="244" alt="Weather.jpeg" src="https://qiita-image-store.s3.amazonaws.com/0/75507/25ae7a61-dcc1-b758-237d-df5273d19af2.jpeg">

## 今回のフローのソースはこちら

```json:flow.json
[{"id":"df71d016.2fe0d","type":"inject","z":"421ff698.b098a8","name":"","topic":"","payload":"","payloadType":"date","repeat":"","crontab":"","once":false,"x":105.5,"y":75,"wires":[["e72fe020.d21ff8"]]},{"id":"7cb23f06.d920a8","type":"debug","z":"421ff698.b098a8","name":"","active":true,"console":"false","complete":"forecasts","x":386.5,"y":198,"wires":[]},{"id":"e72fe020.d21ff8","type":"weather_insights","z":"421ff698.b098a8","name":"","service":"/forecast/daily/10day.json","geocode":"35.681298,139.766247","units":"m","language":"ja-JP","x":244.62600708007812,"y":138.11885356903076,"wires":[["7cb23f06.d920a8","e11251a3.f8b65","33ccfa67.bb131e"]]},{"id":"e11251a3.f8b65","type":"debug","z":"421ff698.b098a8","name":"","active":true,"console":"false","complete":"observation","x":393.5641403198242,"y":244.2085018157959,"wires":[]},{"id":"33ccfa67.bb131e","type":"debug","z":"421ff698.b098a8","name":"","active":true,"console":"false","complete":"observations","x":393.96370697021484,"y":288.8330707550049,"wires":[]}]
```

# Node-REDでの事前セットアップ
## 新規でWeather Company Dataサービス追加の場合
![IMG_0579.PNG](https://qiita-image-store.s3.amazonaws.com/0/75507/63dab4ac-31c0-8b75-97ac-934a141ed65c.png)

Node-REDのCloud Foundryアプリのダッシュボードで、左にある「接続(Connections)」をクリック、次に右にある「新規接続(Connect new)」をクリック。

![IMG_0580.PNG](https://qiita-image-store.s3.amazonaws.com/0/75507/1cdfea34-7c3f-6bd2-7b2b-4e86eb61908e.png)

新しいサービスとして追加するために、フィルター部分にweatherと入力で絞り込みして Weather Company Dataをクリック。

![IMG_0581.PNG](https://qiita-image-store.s3.amazonaws.com/0/75507/1ac337e1-8a76-4886-7b8f-4ffe20be59b8.png)

サービスの契約内容に問題なければ、右下の「作成(Create)」をクリック。

![IMG_0582.PNG](https://qiita-image-store.s3.amazonaws.com/0/75507/9ec0f471-30e0-9591-26e4-3b39932fed35.png)

「再ステージ(Restage)」をクリック。

![IMG_0583.PNG](https://qiita-image-store.s3.amazonaws.com/0/75507/8f37681b-1142-b385-a919-f65b4fd96d12.png)

ダッシュボードに戻ってきて、サービスが追加されていればOK。


## 既にWeather Company Dataサービスがある場合

上記と同じ要領で、ありもののサービスを選んで追加。再ステージ。

# Node-REDでWeather Insightsノードを追加

![IMG_0588.PNG](https://qiita-image-store.s3.amazonaws.com/0/75507/964b2df8-ee72-ced2-27cb-5adb78c8caa6.png)

とりあえず確認のため、定番のInjectノードとDebugノードを追加して、二つを接続。

![IMG_0586.PNG](https://qiita-image-store.s3.amazonaws.com/0/75507/8c110d3b-1e62-0c05-2e66-ae84d1ff401f.png)

左のノード一覧の中にWeather Insightsがあるのだが見つけずらいので、左上のフィルター部分で「wea」と入力してノードをしぼりこみ。さっきのノード間の線の上にドラッグし、点線になったらドロップ。

![IMG_0587.PNG](https://qiita-image-store.s3.amazonaws.com/0/75507/c30c1cd1-bd8b-d693-7b91-c52628366848.png)

こんな感じにInjectノード、Weatherノード、Debugノードがつながる。

<img width="679" alt="Screen Shot 2016-12-19 at 18.33.52.png" src="https://qiita-image-store.s3.amazonaws.com/0/75507/31e6c95d-a360-47ab-2573-124b1f4e4484.png">

Weatherノードを設定。例では天気予報(Forecast)を選び、緯度経度に東京駅の緯度経度を入力して、最後に言語にja-JPと入れると日本語で返ってくる。

今のところ、このサービスでは次の4つの操作を実行できるようになってる。

- 天気予報(48時間分) *（※以前は24時間分だった？）*
- 天気予報(10日間分)
- 現在の気象観測情報
- 現在の気象観測情報＋過去24時間の観測情報

また、次の3つのパラメーターが必要。

- unit: APIレスポンスで返す単位。サポートされている測定単位は、ヤード・ポンド法 (e)、メートル法 (m)、および UKハイブリッド (h) 。日本なら「Metric」
- location: 気象情報の起点となる緯度と経度。例えば、東京駅の場合は「35.681298,139.766247」と指定。
- language: 返されるレスポンスで使用する言語。デフォルトは「en-US」日本語なら「ja-JP」

![IMG_0589.PNG](https://qiita-image-store.s3.amazonaws.com/0/75507/013de3ce-39cb-0e42-5367-5ee1c5d94e75.png)

しかしInjectノードをクリックして結果を見ると、なぜかJSONが返ってこない...

![IMG_0590.PNG](https://qiita-image-store.s3.amazonaws.com/0/75507/9895adcb-1bd8-a415-4fe9-3283709a9a5d.png)

Weatherノードのinfoに詳しくは記載があるが、アウトプットはmsg.forecastsに入っているので、Debugノードを編集する。

![IMG_0591.PNG](https://qiita-image-store.s3.amazonaws.com/0/75507/a587ac5a-0a08-f363-18aa-1f543e10bc72.png)

同じ要領で msg.forecasts, msg.observation , msg.observations を用意、それぞれに合わせた結果が戻ってくる。

<img width="402" alt="Screen Shot 2016-12-19 at 18.40.55.png" src="https://qiita-image-store.s3.amazonaws.com/0/75507/9fca1491-966c-50bb-751b-583659836f87.png">

# 参考
- [マニュアル](https://www.ng.bluemix.net/docs/services/Weather/index.html)
- [Weather Company Data for IBM Bluemix および DBpedia によって動作する、野球をテーマにしたアプリを作成する](https://www.ibm.com/developerworks/jp/cloud/library/cl-bluemix-baseball-app-insights-for-weather-dbpedia-trs/)
- [サンプルWebアプリ](http://insights-for-weather-demo.mybluemix.net)（以下のイメージ）

![IMG_0592.PNG](https://qiita-image-store.s3.amazonaws.com/0/75507/cec35320-81d2-b4dd-835b-86bd78b54990.png)

# iOS, Androidサンプルアプリ
- [Code Starter - Weather スマホ向けサンプルアプリiOS(Swift), Android](https://console.ng.bluemix.net/mobile/getting-started/)

<img width="200" alt="チュートリアル" src="https://mobileblueprintregistry.ng.bluemix.net/registry/api/blueprints/attachments/9cda612f-cc70-3b1d-9388-ff769c2d5e13.png">