はじめに
AWS IoT エンタープライズボタンが一般販売され、個人用に1つポチりました。
どんな使用方法があるかを検討している中で、「とりあえずラズパイにMQTTで何かしらのメッセージをPublishしてみるか」ということで試してみました。
AWS IoT エンタープライズボタンって?
要するに「AmazonDashButtonのエンタープライズバージョン」です。
簡単な設定を行うだけで、Lambda関数をコールしたり、SMSを送信したりすることができます。
おそらく、ボタン本体の中に証明書などを持っていて、紐づけたAWSアカウントのAWSIoTにリクエストを送信するような仕組みになっているのかなーと思ってます。
ちなみに今回はLambda関数をコールします。
やること
至って簡単です。
- ボタン押す
 - Lambdaがコールされる
 - ラズパイがSubってるトピックにメッセージをPubる
 - 以上!
 
ラズパイの設定
この記事を参考にして、MQTTを扱えるようにしてください。
SORACOMでAWSIoTにメッセージをBeamする
ラズパイ側はトピック名 demodemo/# でSubっておいてください。
Lambda関数のデプロイ
ランタイムは Node.js 8.10
最低限必要な権限は、 AWSIoTのPublish iot:Publish
ソースコードはこんな感じです。
const AWS = require("aws-sdk");
const iotData = new AWS.IotData({
 endpoint: "aclhlxe7k1bjt.iot.ap-northeast-1.amazonaws.com"
});
const TOPIC_NAME = "beamdemo/IoTbutton";
exports.handler = async (event) => {
  console.log(JSON.stringify(event));
  
  try {
    const clickType = event["deviceEvent"]["buttonClicked"]["clickType"]
    const params = {
      topic: TOPIC_NAME,
      payload: JSON.stringify({ "message": `Button Clicked ${clickType}` }),
      qos: 0
    };
    await iotData.publish(params).promise();
    console.log("Success!!");
    return null;
  } catch (err) {
    console.error(err);
    throw err;
  }
};
Eventにボタンをクリックした回数などが含まれているので、どのようなボタンのクリック方法をしたのかをメッセージとして、 トピック名 demodemo/IoTButton にPublishしています。
// message例
{"message":"Button Clicked SINGLE"}
{"message":"Button Clicked DOUBLE"}
{"message":"Button Clicked LONG"}
SINGLE=ボタンを1回押す、DOUBLE=ボタンを2回押す、LONG=ボタンを1.5~6秒未満長押しする、といった感じで取れます。
AWS IoT エンタープライズボタンの設定
まず「AWS IoT 1-Click」というスマホアプリからWiFiの設定を行ってください。
画面の通りに進めていけばボタンがWiFi経由でインターネットに出ていくことが可能になります。
その後、AWSコンソール画面に戻り、アカウントとボタンの紐づけ、ボタンをクリックされたあとのイベントの設定を行っていきます。
ボタンを登録する
↑この画面になったらボタンを押してください
これでボタンとAWSアカウントが紐付きました。
ボタンを有効化する
ボタンが有効になりました。
プロジェクト / プレイスメントの作成
これでボタンをクリックしたときにLambda関数がコールされるようになりました。
確認
ラズパイでトピック名 demodemo/# をSubります。
$ mosquitto_sub -h beam.soracom.io -t demodemo/#
この状態でボタンをクリックします。
無事メッセージが届きました!
さいごに
AWS IoT エンタープライズボタンの登場で、かなり簡単にIoT(っぽいこと)に触れることができるようになりました。
Lambda関数をキックできるので、実質かなり応用が効きますし夢がかなり広がります。
また、Lambda関数以外にもSMSやEmailを送信することができます。
ただボタンに寿命がある(リクエストを送信できるのが約2000回)ので、実際にプロダクションレベルで使用する際には、ボタンの交換などについても考慮しなければいけないです。
簡単に試すことができるので、いろんな利用方法を考えて試していこうと思います。
ではまた!
