IBM CloudのNode-REDを使ってLINEからLチカ

Line Message APIからデバイスを制御しようと思いましたが、webhookをするためにhttpsサーバが必要です。どうしようか困ったのですが、IBM Cloudなら無料枠でNode-REDをhttpsサーバで動かせた上に、とっても簡単だったので、やり方をまとめました。
IBM CloudやLine Message APIの登録は、様々なサイトがありますのでそちらを参照してください。

#システム構成
作ったシステムの概要はこちらです。
Line Message APIから送信されるメッセージをIBM Cloud上のNode-REDで受け取り、Internet of Things platformでゲートウェイに送信します。
ゲートウェイではメッセージを解析して、920MHz無線でマイコンボードに送信して、マイコンボードからNeoPixelを光らせます。このとき、ゲートウェイはメッセージや無線の内容に応じてLineで返信をしました。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/136933/0423ad9e-5b9e-7696-a159-6db2c8f6e7c2.png)

#完成した様子
![image.png](https://qiita-image-store.s3.amazonaws.com/0/136933/1ec088d9-1fc5-1a34-7898-78bb3dd3cd9a.png)
[動画はこちら](https://youtu.be/5k8ly4Fw5-c)

#クラウド(IBM Cloud/ Node-RED)
クラウド側のNode-REDはこれだけです。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/136933/c3ddf3f4-95b9-365d-e339-ad2c60178451.png)

## Functionノードの中身
Functionノードでのポイントは3つ。

1. Lineからはメッセージが配列で送られてくるようなので分割するようにしました。
2. Internet of Things platformではdeviceIDにlineのuserIDを使用したので、userIDをdeviceIDに変更しています。
3. メッセージのテキストの他に、返信用にreplyTokenを付け加えました。

```JavaScript
for (var e of msg.payload.events){
    if(msg)
    node.send({
        deviceId: e.source.userId,
        payload:  {
            msg: e.message.text,
            replyToken: e.replyToken
        }
    });
}
return;
```

#クラウド（Lineの設定)
[ここ](https://developers.line.biz/console/)にログインして「新規プロバイダー作成」からBOTを作ります。
BOTを作成したら、Webhookを利用するにして、Node-REDが動いているURL/callbackをWebhook URLに設定します。
また、今回はBOTのYour user IDをIBM CloudのInternet Of Things PlatformのデバイスIDに使用するため、メモしておきます。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/136933/dfb6df72-fb01-f858-1af3-0af64ff296ba.png)

#クラウド(IBM Cloud/Internet Of Things Platform)
1.この画面の「デバイスの追加」ボタンを押します。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/136933/af065b5d-b084-4bb2-0948-5154d5da83a9.png)

2.デバイスタイプは任意の文字を、デバイスIDにはLineのYour User IDを入力して、「次へ」をクリック

![image.png](https://qiita-image-store.s3.amazonaws.com/0/136933/ede1aa49-26bc-4b6e-3bc6-42673b808d89.png)

3.デバイス情報は必要に応じて情報を入力し、「次へ」をクリック。
4.次の認証トークンも何もせず「次へ」をクリック
5.次の「デバイスの資格情報」は重要な情報があるので、このままにしておいてください。

# ゲートウェイの設定
Raspberry PiにNode-REDをインストールする方法は[こちら](https://nodered.org/docs/hardware/raspberrypi)を参照してください。
インストールが完了したら、ノードを次のように配置します。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/136933/513dc2ce-ae1f-9910-b1d8-b566c4121018.png)


watson IoTノードの設定は次のように設定します。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/136933/512fdab3-4d4a-5f3c-f430-0bb20fc45cea.png)

それぞれのFunctionノードのソースコードです。Lineのアクセストークンは各ページのアクセストークンを入力してください。

```JavaScript:メッセージの解析
switch(msg.payload.msg) {
    case 1:
    case 2:
    case 3:
    case '1':
    case '2':
    case '3':
        return [{
            payload: msg.payload.msg,
            org: msg.payload
            },null];
    default:
        return [null,msg];
}
```

```JavaScript:未対応メッセージの返信

const AccessToken = "lineのアクセストークン";
var newMsg = {
    headers: {'Content-Type': 'application/json; charset=UTF-8',
    'Authorization': 'Bearer ' + AccessToken,
    },
    'payload': {
      'replyToken': msg.payload.replyToken,
        'messages': [{
        'type': 'text',
        'text': 'ごめんね..解らない m(_ _)m',
      }],
    }
}
return newMsg;
```

```JavaScript:無線の結果で返信

const AccessToken = "lineのアクセストークン";
var replyMsg;
if(msg.payload.result === 0) {
    replyMsg = "了解!!"
} else {
    replyMsg = "無線でエラーが出ました"
}

return {
    headers: {'Content-Type': 'application/json; charset=UTF-8',
    'Authorization': 'Bearer ' + AccessToken,
    },
    'payload': {
      'replyToken': msg.org.replyToken,
        'messages': [{
        'type': 'text',
        'text': replyMsg,
      }],
    }
}
```

#デバイス側のプログラム
Lazurite SubGHzでLineから送られてきたメッセージが1,2,3の時にそれぞれの光り方をするプログラムのソースコードです。
[こちら](https://github.com/LAPIS-Lazurite/kirakira/tree/master/%E7%AC%AC50%E5%9B%9E/kirakira)にソースコードを置きました。

急いで書いたので雑になってしまいました。[Lazuriteのブログ](http://www.lapis-semi.com/lazurite-jp/)の方に、もう少し丁寧に記載していきますのでよろしくお願いします！！