Sigfox CallbackとIBM Watson IoT連携 (with Node-RED)

Sigfox Callbackには、Custom Callback以外にAWS IoT、AWS Kinesis、Microsoft Azure Event hub、Microsoft Azure IoT hub、IBM Watson IoT Platformへの連携が用意されていますが、Node-REDを使ってデバイスメッセージを処理したいという方も増えてきましのたで、ここでは、IBM Watson IoT Platformとの連携方法を記載します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/172313/0984db6e-2881-f245-efad-0fbd2cd88b53.png)
大まかな流れは、下記の通りとなります。
1. IBM Watson IoT PlatformでSigfoxクラウド連携用のAPIキーを生成
2. SigfoxクラウドでCallback設定
3. Node-REDでデータ確認

#IBM Watson IoT Platformの設定
##Internet of Things Platformの立ち上げ
"Internet of Things Platform"は、IoTデバイスを簡単に活用できるよう設計されたクラウ ド・ホスティング・フルマネージド・サービスで、IoTデータのデバイスの登録、接続、制御、迅速な可視化、保管などの機能が提供されています。
Sigfoxクラウドとの接続も、このプラットフォームを経由することになります。
ライトユーザーであれば、立ち上げられるアプリケーションなどに制限はありますが、無料で利用可能ですでの、まずは[IBM Cloud（https://cloud.ibm.com/）](https://cloud.ibm.com/)からアカウントを取得してください。

1. [IBM Cloud（https://cloud.ibm.com/）](https://cloud.ibm.com/)を開き、[リソースの作成]ボタンをクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/172313/7db589b1-08f4-e8fc-aed8-0eb215301d30.png)

2. カタログでは、**"Internet of Things Platform"**を選択してください。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/172313/f9d77b4e-96db-3c0d-cd92-c180f7443e11.png)

3. Internet of Things Platformの初期設定では、サービス名（今回はSigfox2Watson）を入力してください。デプロイする地域は、デフォルトのダラスで結構です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/172313/a96b0c56-a802-5c8d-3daa-ecea510503f0.png)

4. リソースが作成されると、下記ページが表示されますので、[起動]ボタンをクリックし、サービスを立ち上げます。なお、作成済みリソースの確認は[こちら](https://cloud.ibm.com/resources)から可能です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/172313/c0628c89-26b6-82db-6c8f-6efb6d233c6b.png)

5. 登録済みのIBM ユーザーIDとパスワードを使って、[サインイン]します。IBMユーザーIDを忘れた方は、こちらの[プロファイル](https://cloud.ibm.com/user)ページで確認できます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/172313/26af4685-956e-210c-09c7-d8593a1a0740.png)

6. サインインすると、右上にご自身のIDが表示されていることに気が付くと思います。クリックすると、BlueMix Freeというメニューが出てきますので、それを選択します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/172313/b5196687-d64b-c1a3-267e-2c2897b2444e.png)

##IBM Watson IoT PlatformでAPIキーを作成
まずは、Sigfoxクラウドと連携するために、Watson IoT Platform側でAPIキーを作成します。

1. 左メニューの[アプリ]を選択後、右上に出てくる[+APIキーの生成]ボタンをクリックしてください。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/172313/d0827a47-447f-73e7-59e4-03bd5bd84834.png)

2. APIキーの生成時に、役割（Role）を聞かれます。"標準アプリケーション"を選んでおいて下しさい。APIキーの生成が完了すると、下図のように**APIキーと認証トークンが表示されますので、両方をコピーしておいてください**。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/172313/1a1621da-bf72-5cb4-21e5-e958ecc393d3.png)

#Sigfoxクラウドの設定
Sigfoxクラウドでは、IBM Watson IoT Platformと連携したいDEVICE TYPEを選択し、左メニューのCALLBACKSから、[New]ボタンをクリックします。複数のCallbackパターンがリスト表示されているので、**"IBM Watson IoT Platform"**を選択します。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/172313/97439121-f08b-69be-396f-f1889178f76e.png)

##Sigfox: Callback設定（Watson IoT Platform）
Watson IoT PlatformとのCallbackで必要な設定は、**API Key**と**Auth Token**です。この2つは、上述のWatson IoT Platformで作成したAPIキー情報からコピー＆ペーストしてください。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/172313/1bd94d2c-90f3-8747-ef77-a5004a23cb2a.png)
あとは、CallbackするJSON bodyを定義します。今回は、デバイスIDと受信時刻、データペイロードを送りますので、下記JSON文を入力してください。

```sigfox_callback.json
{
  "device": "{device}",
  "time": {time},
  "data": "{data}"
}
```
最後に、[OK]ボタンをクリックすると終了です。これで、SigfoxデバイスからのデータがIBM Watson IoT Platformに転送されるようになりました。
Watson IoT Platform側でデバイスメニューを確認します。Sigfoxクラウドで1つのデバイスタイプに対し、複数のデバイスを登録していた場合も、各デバイスからデータが送信され始めると、自動的にWatson IoT Platfrom側のデバイスが追加されます。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/172313/2b95929c-23a7-6fd7-1094-a9298b9b7c2d.png)
また、デバイスの「最近のイベント」を選択すると、SigfoxクラウドからCallbackされたメッセージを確認することができます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/172313/6475b610-6fab-176f-e2ca-99bc86ecf514.png)

#Node-REDで確認
Node-REDで、Sigfoxクラウドから送られたメッセージ（JSON）が本当に転送されてきているかを確認します。

1. [IBM Cloudのカタログ](https://cloud.ibm.com/catalog)に戻り、**"Node-RED"**で検索をかけると"Node-RED App"タイルが表示されますので、そのタイルを選択してください。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/172313/1f5537da-ccee-c552-96fb-333196b554eb.png)

2. [アプリの作成]ボタンをクリックしてください。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/172313/9044f5f8-e26d-8009-f7ce-fce20252d87f.png)

3. アプリの詳細設定を入力する画面になります。
アプリ名は、ユニークでなければいけないので、デフォルトのアプリ名をそのまま使うことをお奨めします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/172313/59fc7981-17de-999f-46fc-195b46403108.png)
Cloudantサービスのリージョンも選択可能です。今回は、すべてダラスで統一しておきます。
[作成]ボタンをクリックしNode-REDアプリを作成します。

4. Node-REDアプリの立ち上げには数分かかるかもしれませんが、無事作成されると、下図のような画面になります。[アプリのデプロイ]ボタンをクリックしてください。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/172313/2e6c2e28-67d7-0c63-1759-ea20b1302b2d.png)

5. アプリのデプロイには、下図のようにIBM Cloud API Keyが必要です。[New +]ボタンをクリックし、新たにキーを作成してください。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/172313/5c368f2a-e9fd-9c75-d220-e043ad5012a2.png)
キーを入力すると、右上の[作成]ボタンが有効になりますので、作成を続けましょう。

6. ツールチェーンの画面に遷移し、Delivery Pipelineの状態が適時変わっていくと思います。成功するまで時間がかかりますので、気長に待ちましょう。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/172313/3b321668-2750-234a-5a8f-1a6e7000d297.png)

7. Delivery Pipelineの状態が"成功"すると、同画面の上部に、下図のように、"アプリURLにアクセス"というリンクが表示されますので、クリックしてください。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/172313/dc9f072a-f088-f471-115e-9e5a25be9b0a.png)

8. アプリURLにアクセスすると、Node-REDの初期設定となりますが、必要な設定は、Node-REDの認証ユーザ設定のみですので、UsernameとPasswordを入力して、[Next]ボタンを押していき、設定を終わらせてください。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/172313/8e2ad35c-6bab-87f8-4b12-6f459b832bf2.png)

9. 下図、Node-RED画面が表示されるので、"Go to your Node-RED flow editor"ボタンをクリックしてください。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/172313/45a674dc-ec00-d0ee-8571-c3ee9ac62fbe.png)

##IBM Watson IoTのNodeがない！
早速、Node-RED上で、IBM Watson IoTに接続されたデバイスからメッセージ情報を取得しようと思ったところ、左のノード一覧に**IBM IoT in**のノードが見当たりません。
ノードを登録してあげる必要があります。ノードの登録はpackage.jsonに追加して、再ステージングすれば可能です。

1. IBM Cloudに戻り、Node-REDアプリ（ここでは、Node RED ***という名前で作成したアプリ）に戻ります。下記赤枠URL（リポジトリURL）をクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/172313/cf65879d-0862-522c-c8b0-98bad229d4f7.png)

2. Node-REDアプリのリポジトリに遷移しますので、package.jsonを選択し、**Edit**してください。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/172313/b6c2a0bf-40dd-d886-0263-134b088d4c9c.png)

3. 追加するノードは**["node-red-contrib-scx-ibmiotapp"](https://flows.nodered.org/node/node-red-contrib-scx-ibmiotapp)**という名前のノードです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/172313/0fc59769-3db4-bff9-77e8-47b460d2a6fb.png)
ノード追加後、画面下部にある[Commit changes]ボタンをクリックすると、package.jsonへの変更が反映され、再ステージングが始まります。（ステージングは数分かかるので、また気長に待ちましょう）

4. ステージが終了すれば、改めて、Node-REDのURLにアクセスします。すると、下図のように入力・出力カテゴリに[ibmiot in]と[ibmiot out]が追加されています。（ノードの追加は、Node-RED上のパレットの管理メニューからでも可能ですが、IBM Watson IoT関係のノードを追加しようとしても、失敗続きだったので、直接package.jsonを編集しました。）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/172313/680bc6f9-cb41-1756-3812-f80c8467210b.png)

5. ここまでいけば、後は、フローを作成するのみです。下図のように**ibmiot in**ノードと**debug**ノードを配置します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/172313/7468d48c-b2c0-01bd-cb20-8cdf7ec6a10d.png)

6. ibmiot inノードの設定で必要なのは、IBM Watson IoTのAPIキーとトークンです。「IBM Watson IoT PlatformでAPIキーを作成」のところで作ったAPI KeyとAPI Tokenを入力します。Server-Nameは`organization_id.messaging.internetofthings.ibmcloud.com`でいけると思います。organization_idのところは、ご自身の組織IDを入力してください。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/172313/38da8eb3-d98a-f3bf-45e9-fad32cec812a.png)

7. 右上の[デプロイ]ボタンをクリックするとデプロイが始まり、成功後、デバッグビュー![image.png](https://qiita-image-store.s3.amazonaws.com/0/172313/98edf34d-5fac-6b33-10ed-53c9df74f6ee.png)にデバイスメッセージが表示されることが確認できます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/172313/12439352-28cc-b216-deeb-9c1c7f004d43.png)

#まとめ
以前あったIBM Watson IoT Starterというサービスキットがなくなり、IBM Watson IoTとNode-REDを個々に立ち上げる必要がでてきたため、設定がややこしくなってしまいましたが、逆にIBM Watson IoTとNode-REDの関係性について理解できるようになったかと思います。

この仕組みを使うことにより、Node-REDの拡張機能を使って、様々なかたちでSigfox IoTデバイスからのメッセージを表現できるようになるかと思います。下記にサンプルをあげておきます。

- [Sigfox GPSトラッカーをNode-REDでマップ表示](https://qiita.com/ghibi/items/d9571e41117fdd06879d)
- [Sigfox Shield for Arduino (UnaShield)の温度データをNode-REDでグラフ表示](https://qiita.com/ghibi/items/85f48186032296eb9ab7)
- [Connecting Sigfox backend to Watson IoT Platform (IBM Developer Recipes)](https://developer.ibm.com/recipes/tutorials/connecting-sigfox-backend-to-watson-iot-platform/)

[Sigfox Japan KCCS](https://qiita.com/organizations/sigfox)
[Twitter @ghibi](https://twitter.com/ghibi)