OpenWhiskでお天気情報をSlack通知

OpenWhiskを使って、お天気情報をSlackに通知します。

<img width="448" alt="snip_20161031002150.png" src="https://qiita-image-store.s3.amazonaws.com/0/60109/aa203ff0-7bd8-97e9-856f-8bd5f619bbc3.png">

お天気情報の取得方式については、以下の記事にて記載しています。

* [コーディング不要！OpenWhiskでお天気情報を取得する](http://qiita.com/rina0521/items/113432bc892c3c29bef5)

今回は、WeatherCompanyで取得したデータをSlackに通知する流れについて記載します。

# Slackのパッケージカタログを使用する

BluemixのOpenWhiskの画面も新しいデザインになりました。可愛いです。

<img width="928" alt="snip_20161223024154.png" src="https://qiita-image-store.s3.amazonaws.com/0/60109/69ec332c-eb50-68a4-17be-f4c540e1c684.png">



Slackを使う場合も、Weather Companyと同一です。アクションの編集画面から、右上の「カタログの表示」を選択します。

<img width="922" alt="snip_20161025222009.png" src="https://qiita-image-store.s3.amazonaws.com/0/60109/e09737ff-69c4-319a-26d0-d859c8f5c023.png">

「SLACK」を選択します。

<img width="726" alt="snip_20161025222036.png" src="https://qiita-image-store.s3.amazonaws.com/0/60109/fe7ff58b-4d65-c20e-6e51-06fd69ab41bf.png">

Slackのパッケージが表示されます。

<img width="924" alt="snip_20161025222114.png" src="https://qiita-image-store.s3.amazonaws.com/0/60109/928a31ec-22fc-266c-5e75-066960eb4b56.png">

サンプル入力を見てみます。Slackに通知するためには、JSONで以下のようなパラメータを入れてあげれば良いようです。

```
{
    "channel": "myChannel",
    "text": "Hello OpenWhisk!",
    "url": "https://hooks.slack.com/services/XYZ/ABCDEFG/12345678",
    "username": "openwhisk"
}
```

中身は、SlackのWebhookのURL、ユーザ名、チャンネル名。そして、通知するテキストです。左側のNEW BIDINGを選択します。

<img width="945" alt="snip_20161223222258.png" src="https://qiita-image-store.s3.amazonaws.com/0/60109/d54aeff2-6d40-22e1-4b1a-4e24f6d51ff9.png">

通知したいslackに合わせてurlとchannelを、そして任意のユーザ名を入力して、構成を保存します。これで、あとは通知するテキストを作るだけです。

# WeatherCompanyで取得した情報をSlack通知用に加工する

前回の記事で、WeatherCompanyで取得したデータは以下のようなものです。

```
{
  "metadata": {
    "latitude": 35.68,
    "status_code": 200,
    "longitude": 139.76,

...(省略)...

  },
  "observation": {
    "dewPt": 1,
    "blunt_phrase": null,
    "pressure_tend": 2,
    "pressure_desc": "Falling",

...(省略)...

    "wx_phrase": null,
    "terse_phrase": null,
    "uv_index": 3
  }
}

```

必要なパラメータを取得して、Slackに、textパラメータに詰め込んであげるコードを少し書きます。
「アクションの作成」を選択します。

<img width="937" alt="snip_20161022171511.png" src="https://qiita-image-store.s3.amazonaws.com/0/60109/6d8963d6-c0df-8bd4-d75b-08bdc2c3fb84.png">

アクションは現在、Swift、Node.js、 Python、Dockerが使えます。今回は、Pythonを選択しました。

<img width="935" alt="snip_20161029203312.png" src="https://qiita-image-store.s3.amazonaws.com/0/60109/ee3d5ee1-fca5-e5bf-7c2e-d2a63eb2185a.png">

コーディングはいつも通り、**頑張りません。**

```weather_to_slack.py
import sys

def main(dict):
    slack = {}
    
    latitude = dict["metadata"]["latitude"]
    longitude = dict["metadata"]["longitude"]
    pressure = dict["observation"]["pressure"]
    temp = dict["observation"]["temp"]
    rh = dict["observation"]["rh"]
    
    message = "temperature:" + str(temp) + "\n" + "Humidity:" + str(rh) + "\n" + "Atomosheric pressure:" + str(pressure)
    
    slack["text"] = message
    return slack

```

WeatherCompanyから受け取ったパラメータが辞書型で受け渡されるので、欲しいパラメータだけ抽出して、slackのtextに詰め込みます。
textは日本語で表示したくて試行錯誤してみたのですが、うまくいかず、仕方なく英語で記載しました。日本語のJSONの受け渡しは可能なのでしょうか？


# シーケンスで、処理の流れを指定して実行

アクションの準備はできました。それぞれのアクションを組み合わせた「シーケンス」を作って、実行してみます。先ほど作成したアクションから、右下「シーケンスにリンク」を選択します。

<img width="954" alt="snip_20161223225348.png" src="https://qiita-image-store.s3.amazonaws.com/0/60109/a694017d-1d9f-8696-b3bb-bd7bd57fd703.png">

先ほど設定したSLACKを選択します。

<img width="954" alt="snip_20161223225422.png" src="https://qiita-image-store.s3.amazonaws.com/0/60109/aae2c26c-f0b7-8b43-b28e-16353bc34ace.png">

左側のBINDは、今回設定したBINDを選択してください。
「シーケンスに追加」をクリックします。

<img width="939" alt="snip_20161223225637.png" src="https://qiita-image-store.s3.amazonaws.com/0/60109/a1cd1816-fd31-1275-393f-4e82d229ded6.png">

今回作ったWeather_to_slackから、Slackパッケージに渡す流れができました！
次は、データ取得元のWeatherCompanyを追加します。右下「拡張」を選択します。

<img width="943" alt="snip_20161223225705.png" src="https://qiita-image-store.s3.amazonaws.com/0/60109/119b5aaf-d36b-aae9-c38e-dac8445a1f29.png">

「WEATHER」を選択します。

<img width="941" alt="snip_20161223225732.png" src="https://qiita-image-store.s3.amazonaws.com/0/60109/bf80134d-3dc8-ae34-1f7a-4e87fa98ec8a.png">

WEATHERも、左側のBINDは前回設定したBINDを選択し、「シーケンスに追加」をクリックします。

<img width="938" alt="snip_20161223225755.png" src="https://qiita-image-store.s3.amazonaws.com/0/60109/e6820a6b-fb10-41eb-a74f-3f6b64703e53.png">

繋がりました！！

<img width="953" alt="snip_20161223225832.png" src="https://qiita-image-store.s3.amazonaws.com/0/60109/8a6d36f3-f883-ff89-f519-ad0dd7611b09.png">

・・・が、アクション実行順が、コレジャナイ。ソコジャナイ。

でも大丈夫です。Weatherのアクションの右上についている矢印をクリックすることで、アクションの実行順を入れ替えることができます。


1. Weatherでお天気情報を取得して
2. 作ったアプリケーションでお天気情報をslackのtextに詰め込む加工をして
3. slackに投げる。

のアクションの流れを変更します。

<img width="958" alt="snip_20161223225906.png" src="https://qiita-image-store.s3.amazonaws.com/0/60109/5f5ded93-9d27-9da1-552a-a935f6d4ace9.png">

正しい順番になりました！
右下の「アクションシーケンスの保存」をクリックし、シーケンスの名前をつけます。

<img width="957" alt="snip_20161223225958.png" src="https://qiita-image-store.s3.amazonaws.com/0/60109/745287be-3618-f241-0ce0-e71c59818caa.png">

保存されました！
作成したシーケンスをクリックし、「このシーケンスを実行」をクリックすると

<img width="955" alt="snip_20161223230045.png" src="https://qiita-image-store.s3.amazonaws.com/0/60109/86aa9ee4-9eff-f7c3-bad0-b57107ab94ce.png">

お天気情報がSlackに通知されます。

<img width="448" alt="snip_20161031002150.png" src="https://qiita-image-store.s3.amazonaws.com/0/60109/4d3aab93-0ceb-07c0-c966-34fabff2e4a6.png">


# おわりに

この検証を行ったときから、Watson系のパッケージカタログが拡張されております。TextToSpeechやSpeechToTextなどもぜひ使ってみて遊んでみようと思います。