Soracom LTE-M ButtonでAlexaに通知させてみた

この記事はSORACOM LTE-M Button powered by AWS Advent Calendar 2018 11日目の記事となります。

せーのでございます。今日はSoracom LTE-M ButtonとAlexaを連携させてみたいと思います。

Soracom LTE-M Buttonとは

クラウドアーキテクチャやIoTソリューションを組んでいると「物理ボタン」のありがたさが身に染みることがあります。つまり、ボタンを押すだけで「ボタンを押した」ということがクラウドに伝わり、そこから自動的に処理が行われる、といったソリューションです。

そこでAWSにて提供がはじまったのが「Amazon Dash Button」「AWS IoT Button」です。

定期的に買う必要のあるもの、例えばストックしているお水だったり、洗剤だったり、カミソリの替刃だったりを、ボタンを押すだけでAmazonに注文できるようにしたのが「Dash Button」、それをアーキテクチャ上開放して、AWS IoTと連携できるようにし、その先はエンジニアが自由に組んで良いですよ、というものが「AWS IoT Button」です。 実際にこのボタンを使ってクラメソでは「ウォーターサーバーの水を発注するボタン」「社内ポータルサイトが謎の原因で重たくなった時に自動的にポータルの載っているEC2を再起動させるボタン」なんかを作ってきました。

と、大変便利なIoT Buttonなのですが、ひとつ難点がありました。それは「Wi-Fiが通ってないと使えない」ということです。
AWS IoT Buttonは手元のWi-Fiを登録させる必要があります。この登録操作が結構めんどいんです。さらに、ちゃんとWi-Fiにつながっているか、は押して見るまでわかりません。つながっていなければ設定をもう一度見直す必要があります。

このSoracom LTE-M Buttonはこの問題を解消しています。ボタンの中にSoracomのSimが入っているので、Wi-Fiの登録は必要ありません。Wi-Fiの通ってない外や遠隔地での使用が期待できます。

Alexaに通知させてみる

それではこのSoracom LTE-M Buttonを使うとどんな事ができるでしょうか。外でも「ボタンを押したことがわかる」ので、通知業務が一番向いていますね。例えばお父さんが家に帰る時、外回りの営業さんが帰社する時、敵のアジトに潜入した時などにそっとボタンを押すわけです。そうすると家で洗濯物しているお母さんや、デスクワークをしているマネージャー、地球防衛軍本部などが通知をもらって次の行動に出られます。

LTE-M Buttonは通知を送る部分のソリューションなので、通知を受ける部分に関しては自由に作ることができます。そこで今回はAlexaの「Notification API」を使って、ボタンを押されたらAlexaに通知が行くようにしてみましょう。

構成図

構成図はこのようになります。Soracom LTE-M ButtonはAWS IoT 1-Clickで簡単に設定できるので、後はAWS IoTからLambdaを叩き、AlexaのNotification APIにCreate Notificationして、Echoから受け取るだけです。シンプルですね。

やってみた

ではやってみましょう。まずは手元にSoracom LTE-M Buttonを用意します。

このボタンをAWS IoTとつなげてみます。マネージメントコンソールからAWS IoT 1-Clickを開きます。

おお、Soracomボタンがサポート対象デバイスとして載ってますね。ここに登録していきましょう。「デバイスを登録」ボタンを押します。

デバイスIDを入れろ、とのことです。Soracom LTE-M ButtonのデバイスIDは裏側のフタを開けた中に書いてあります。

ここにDSNが書いてありますので、まるっと書き写します。ちなみに横のQRコードにも同じDSNが入っているのでここからスキャンしても同じです。

DSNを書いて登録ボタンを押したらボタンをクリックするよう促されます。ここで実機のボタンを一回押してみます。

これでデバイスがAWS IoTに登録されました。次にAWS IoTの設定です。プロジェクトにいき、新規のプロジェクトを作成します。

プロジェクトのプレイスメントを登録する時にボタンのアクションを聞かれますので、先に受け口となるLambdaを作っておきましょう。
Lambdaに行き、新規Functionを作成します。

Lambdaを作ったら先程のAWS IoTのプロジェクト作成画面に戻ります。名前を入れてプロジェクトを作成します。

テンプレートを作成する画面に移ります。

「すべてのボタンタイプ」を選び

テンプレート名を入れ、アクションを「Lambda関数の選択」にします。先程作ったLambdaの関数名を選択します。

これでプロジェクトを作成します。

次にプレイスメントを作成します。

作成、と言っても名前を入力してボタンを選択するだけです。

後は作成ボタンをおせば完成です。

これでボタンとAWS IoT、Lambdaが繋がりました。
ボタンを押すとLambdaにリクエストが飛ぶわけですが、どんな内容なのかを確認するために、とりあえず来た値をすべてログに吐いてみます。console.log()を一行追加します。

この状態でボタンを押し、CloudWatch Logsを見てみます。

デバイスの状態とイベントとしてSINGLE、DOUBLE、長押しなどが取れるようです。ここらへんの仕様はAWS IoT Buttonと変わらない感じですかね。

では次に受け取る側のスキルを作っていきます。Alexaの開発者コンソールからスキルを新規作成し「アクセス権限」をクリックします。

アクセス権限の「通知」をONにします。ちなみに現状ではNotification APIはDeveloper Previewですので、使ってみたい方はAmazonにリクエストしてみてください。

あとは適当にIntentを一つ作り

ビルドすればOKです。つぎに裏側のLambda。先程Lambdaを作ったので忘れがちですが、さっきのLambdaと動き方が違うので、別途新規にLambdaを作ります。こっちのLambdaにはトリガーとしてASKをいれます。

トリガーの設定にスキルIDを書くところがあるので、開発者コンソールの「エンドポイント」からコピーして貼り付けます。

次にLambdaのARNを開発者コンソールに逆に貼り付けます。LambdaのARNは一番上の一番右にあります。

貼り付けたら「エンドポイントの保存」を押して完了です。

最後にLambdaのコードを書いていきます。Alexaの方はいつもどおりなので割愛して、Soracom LTE-M Buttonの方ですが、SINGLEという値を受け取ったらAlexa Notificationのエンドポイント(デフォルトはapi.amazonalexa.com/v2/notifications)に対してJSON形式で、以下のパラメータを流してあげればOKです。

{
  "displayInfo": {
    "content": [
      {
        "locale": "en-US",
        "toast" : {
            "primaryText": "You have received notify from Soracom L.T.E M Button"
        },
        "title": "Soracom L.T.E M Button",
        "bodyItems": [
            {
                "primaryText": "You have received notify from Soracom L.T.E M Button"
            }
        ]
      }
    ]
  },
  "referenceId": "mySkill_referenceId_to_be_provided",
  "expiryTime": "2018-12-31T19:04:33.672Z",
  "spokenInfo": {
    "content": [
    {
      "locale": "en-US",
      "text": "You have just received notification from soracom L.T.E M Button."
    }
    ]
  }
}

ボタンを押して、Alexaが緑色に光れば成功です。

まとめ

いかがでしたでしょうか。ボタンが持ち出せる、というのは色々夢が広がりますね。色々触ってユースケースを考えていきたいと思います。