LoginSignup
11
5

More than 5 years have passed since last update.

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

Last updated at Posted at 2018-12-17

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

完成した様子

image.png
動画はこちら

クラウド(IBM Cloud/ Node-RED)

クラウド側のNode-REDはこれだけです。
image.png

Functionノードの中身

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

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

ここにログインして「新規プロバイダー作成」からBOTを作ります。
BOTを作成したら、Webhookを利用するにして、Node-REDが動いているURL/callbackをWebhook URLに設定します。
また、今回はBOTのYour user IDをIBM CloudのInternet Of Things PlatformのデバイスIDに使用するため、メモしておきます。

image.png

クラウド(IBM Cloud/Internet Of Things Platform)

1.この画面の「デバイスの追加」ボタンを押します。
image.png

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

image.png

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

ゲートウェイの設定

Raspberry PiにNode-REDをインストールする方法はこちらを参照してください。
インストールが完了したら、ノードを次のように配置します。
image.png

watson IoTノードの設定は次のように設定します。
image.png

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

メッセージの解析
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];
}
未対応メッセージの返信

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;
無線の結果で返信

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の時にそれぞれの光り方をするプログラムのソースコードです。
こちらにソースコードを置きました。

急いで書いたので雑になってしまいました。Lazuriteのブログの方に、もう少し丁寧に記載していきますのでよろしくお願いします!!

11
5
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
11
5