AWS IoT Enterprise Button を買った

いまさらかもしれないですが AWS IoT Enterprise Buttonを買ってみたので、ちょっといじってみたレポート。

AWS IoT AWS IoT Enterprise Button の登録

かなり簡単に AWS アカウントと AWS IoT エンタープライズボタンを紐づけられた

  1. AppStore から AWS IoT 1-Click というアプリをダウンロード
  2. AWS アカウントにログイン
  3. バーコードをスキャンしデバイス登録
  4. Wifi の設定など

この状態で AWS IoT のマネジメントコンソールをみると以下のように機器が登録された状態になる

AWS IoT 1-Click プロジェクトを作成する

つづいて、マネジメントコンソールから AWS IoT 1-Click プロジェクトを作成できます。ここでは単純にイベント発生時にLambda をフックできるようです。 Email や SMS を送る選択肢がでてきますが、これを選ぶと結局のところ用意された Lambda 関数を叩くようなので、まあ基本的に裏側は Lambda とする作りのようです。

動作テスト

プロジェクトにデバイスプレイスメントを紐づけると、デバイスからのイベントに応じて各種処理が走ります。ためしに IoT ボタンをクリックしてみましょう。なお、私の手元だときちんと IAM ロール作って Lambda に設定してあげないと SMS が届かなかったので、SMS が届かない方はそのあたりを確認してみてください。ちゃんと設定をやってあげると以下のような感じで SMS が無事到達しました。うさぎを注文しました。

デバイスのイベントログに以下のような出力がでました。

// 2018/5/26 15:37:58 シングルクリック 100%
{
  "device": {
    "type": "button",
    "deviceId": "*********",
    "attributes": {
      "projectRegion": "ap-northeast-1",
      "projectName": "Test",
      "placementName": "MyFirstPlacement",
      "deviceTemplateName": "SendEmail"
    }
  },
  "stdEvent": {
    "clickType": "SINGLE",
    "reportedTime": "2018-05-26T06:37:58.510Z",
    "certificateId": "*********",
    "remainingLife": 99.85000000000001,
    "testMode": false
  }
}

// 2018/5/26 15:42:57 ダブルクリック 100%
{
  "device": {
    "type": "button",
    "deviceId": "*********",
    "attributes": {
      "projectRegion": "ap-northeast-1",
      "projectName": "Test",
      "placementName": "MyFirstPlacement",
      "deviceTemplateName": "SendEmail"
    }
  },
  "stdEvent": {
    "clickType": "DOUBLE",
    "reportedTime": "2018-05-26T06:42:57.296Z",
    "certificateId": "*********",
    "remainingLife": 99.8,
    "testMode": false
  }
}

// 2018/5/26 15:43:47 長押しクリック 100%
{
  "device": {
    "type": "button",
    "deviceId": "*********",
    "attributes": {
      "projectRegion": "ap-northeast-1",
      "projectName": "Test",
      "placementName": "MyFirstPlacement",
      "deviceTemplateName": "SendEmail"
    }
  },
  "stdEvent": {
    "clickType": "LONG",
    "reportedTime": "2018-05-26T06:43:47.595Z",
    "certificateId": "*********",
    "remainingLife": 99.75,
    "testMode": false
  }
}

電池(remainingLife)ガンガン減ってくなw という感想を抱きました。シングル/ダブル/長押しの3種類のイベントを検知できるようで。これらの組み合わせで例えば、モールス信号をダッシュボタンで打つと、その内容をテキストに起こして S3 に保存したり Slack に通知したりできそうですね。やっている人いそうだなと思って調べてみたら、まあやっぱりいた。

こちらの記事ではダッシュボタンを3つ用意しているようですが、3種類のイベントを表現できるのでデバイスは1個でも実現できそう。ただすぐ電池切れるでしょうね…。

生成された python のコード

SMS を送る Lambda のコードをちらっとみておく。

from __future__ import print_function

import boto3
import json
import logging

logger = logging.getLogger()
logger.setLevel(logging.INFO)

sns = boto3.client('sns')


def lambda_handler(event, context):
    logger.info('Received event: ' + json.dumps(event))

    attributes = event['placementInfo']['attributes']

    phone_number = attributes['phoneNumber']
    message = attributes['message']

    for key in attributes.keys():
        message = message.replace('{{%s}}' % (key), attributes[key])
    message = message.replace('{{*}}', json.dumps(attributes))

    sns.publish(PhoneNumber=phone_number, Message=message)

    logger.info('SMS has been sent to ' + phone_number)

ちな、Lambda に到達する json イベントメッセージはこんなかんじ

{
    "deviceInfo": {
        "deviceId": "******",
        "type": "button",
        "remainingLife": 99.55,
        "attributes": {
            "projectRegion": "ap-northeast-1",
            "projectName": "Test",
            "placementName": "Placement",
            "deviceTemplateName": "OrderRequest"
        }
    },
    "deviceEvent": {
        "buttonClicked": {
            "clickType": "SINGLE",
            "reportedTime": "2018-05-26T07:15:09.131Z"
        }
    },
    "placementInfo": {
        "projectName": "Test",
        "placementName": "Placement",
        "attributes": {
            "phoneNumber": "******",
            "message": "Is the order a rabbit?",
            "room": "amausa"
        },
        "devices": {
            "OrderRequest": "******"
        }
    }
}

余談

わずか300円でIoTボタンを作る方法 – Qiita という記事が面白かった。IoT エンタープライズボタン、2500円もしたのだけれど、同じようなことを300円で実現している。こちらも試してみたい。

参考資料

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください