特級呪物と化したAWS IoT Enterprise Buttonを勤怠ボタンとして活用する

この記事はHRBrain Advent Calendar 2023 9日目の記事です。

https://qiita.com/advent-calendar/2023/hrbrain

## [はじめに](#header1)
初めまして。11月からHRBrainで業務委託として関わっている [yakiniku0220](https://twitter.com/yakiniku040220)です。
12月になり、いよいよ年末感が少しずつ出てきましたね。
年末といえば大掃除ですが、一気にやるのは億劫なので私は週末に細かくやっています。
そこで久々にあるものを発見しました。

　![IMG_0369.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/271450/145e701b-867a-81e7-4b9d-a31c9581d60f.jpeg)

 
そうですAWS IoT Enterprise Buttonです。

HRBrainでは各々がtimesのチャンネルを作っており、そこで作業の開始と終了を投稿しているのですが、毎回打ち込むのは面倒くさいのでアドベントカレンダーのネタとして面白いと思ったのと、実用的にも使えそうだなと思ったので今回記事として作りました。

## [AWS IoT Enterprise Buttonとは](#header2)

AWS IoT Enterprise Button ボタンは、Amazon Dash Button ハードウェアをベースにしたプログラミング可能なボタン。Wi-Fi デバイスは設定が簡単で、特定のデバイス向けのコードを記述することなく、AWS IoT Core、AWS Lambda、Amazon DynamoDB、Amazon SNSなどに連携できるボタンです。

今回はこのAmazon Iot Enterprise Buttonを使って勤怠ボタンを作ります。

## [全体の構成](#header3)
構成はかなりシンプルです。

![attendance.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/271450/38e1c99d-2d0e-f528-d5db-8f57d3c5f23c.png)

処理の流れとしては以下のようになってます。
1. AWS IoT Enterprise Buttonをクリック
1. Lambdaに紐づいたAWS IoT Enterprise Buttonのトリガーが発火。
1. Slackに通知。
    1. シングルクリックした場合
        1.  `仕事始めます`とSlackに通知。
    1.  ダブルクリックした場合
        1.  `仕事終了します`とSlackに通知。

## [Lambdaの設定](#header4)
関数を作成します。
右上にある `関数の作成`をクリックします。

![スクリーンショット 2023-12-04 12.09.21.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/271450/9b8127ca-97d9-baf7-ea93-84e4077f4772.png)

関数を作成します。
今回は一から作成を選択します。
関数名は任意で、ランタイムは `Node.js`の最新版を選択しました。
アーキテクチャは最初から設定されている `x86_64`を選択。
最後に右下にある関数の作成をクリックします。

![スクリーンショット 2023-12-04 12.10.24.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/271450/e89050ad-4289-1658-fd03-7f094941d2a1.png)

## [AWS IoT 1-Clickの設定](#header5)
### [プロジェクトの作成](#header5-1)
まずはプロジェクトを作成します。
AWS IoT 1-ClickのTopにある `プロジェクト作成`をクリックします。

![スクリーンショット 2023-12-04 0.19.50.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/271450/7476e7d0-397e-03b6-58e1-dc8c67569be1.png)

プロジェクト情報の指定をします。
今回は `Attendance_to_slack`というプロジェクト名にします。
説明部分は省いても問題ありません。
![スクリーンショット 2023-12-04 0.26.50.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/271450/c980ef6a-3a7e-b95a-7a8b-5989ad9f5936.png)

プロジェクトのプレイスメントのテンプレート作成。
今回はLambdaを使ってSlackに通知するので、アクションは `Lambda 関数の選択`を指定して、リージョンは `東京`、 `Lambda関数は `Lambda側に作った関数を指定します。
![スクリーンショット 2023-12-04 2.05.25.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/271450/079940d6-fb5a-0ce7-499d-70bb10c2c3b2.png)

これでAWS IoT 1-Clickのプロジェクトの作成は完了です。

### [AWS IoT Enterprise Buttonの登録](#header5-2)
AWS IoT Enterprise Buttonを使用するにはAWS IoT 1-Clickでデバイスを登録させる必要があるので登録します。
ブラウザでもできますがアプリで登録するのが楽なので、今回はアプリで登録していきます。

AWS IoT 1-ClickアプリをダウンロードしたらAWSアカウントでログインします。

<img width="300" alt="IMG_A20BB05EA9E9-1.jpeg" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/271450/a887aa3e-fb72-cedd-c3c3-da06e61214ed.jpeg">

デバイスを登録します。（リージョンはLambdaなどで設定しているリージョンに変えてください。）
登録パターンは2つあります。
- `デバイスIDで登録`
    - カメラを起動してAWS IoT Enterprise Buttonの裏面にあるQRコードを読み取る。
- `登録コードで登録`
    - AWS IoT Enterprise Buttonの登録コードを入力する。

今回は `デバイスIDで登録`で登録してみます。
<img width="400" alt="IMG_0365.PNG" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/271450/4d1bcd65-c1a5-e483-bd81-5f78249545a1.png">

デバイスを登録します。
今回はデバイスをスキャンで登録するので`デバイスIDで登録`を選択して`スキャン`のボタンをクリックします。

<img width="400" alt="IMG_0361.PNG" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/271450/c545de59-d801-22c0-ae5b-2ea1c9f614ca.png">

デバイスが読み込まれると`1個のデバイスが追加されました`と表示されるので、`スキャンの停止`をクリックします。
<img width="400" alt="IMG_3DDE648C803E-1.jpeg" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/271450/b87186de-793c-6d18-ba22-a4ed7b89ca69.jpeg">

追加されると以下の画面のようにデバイス情報が表示されるので、`登録`のボタンをクリックします。

<img width="400" alt="IMG_9458CE2C991D-1.jpeg" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/271450/39e31b19-f4c3-a2db-18cf-97360e2796f2.jpeg">

するとWi-Fiの設定をする画面が表示されるので登録をします。
今回は登録の流れは省きます。

<img width="400" alt="IMG_0363.PNG" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/271450/8dc6e484-8a7b-0246-147d-ef821d6d6276.png">

登録が完了すると設定部分が成功と表示されるようになるので、`次へ`をクリックします。

<img width="400" alt="IMG_860833C0E8A0-1.jpeg" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/271450/7c7f670b-e411-0027-10fb-3a93ec794e14.jpeg">

最後にAWS IoT Enterprise Buttonをクリックすると登録が完了します。

<img width="400" alt="IMG_0367.PNG" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/271450/297816b1-7025-b734-71f7-b6680037fd20.png">

登録が成功するとAWS IoT 1-Clickのデバイス一覧に登録したデバイスが表示されます。

<img alt="スクリーンショット 2023-12-05 5.50.15.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/271450/c1c85b30-832f-0772-2658-209bfdd5a542.png">

この段階だとまだデバイスが無効になっているので有効にする必要があります。
右側の`・・・`をクリックしてデバイスを有効化します。

<img alt="スクリーンショット 2023-12-04 1.59.31.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/271450/396967a1-4886-4f2c-ebce-c8f057276579.png">

## [プレイスメントの作成](#header6)
AWS IoT 1-Clickで作ったプロジェクトに登録したデバイスを紐づける必要があるため、プレイスメントを作成します。

プロジェクト一覧に移動して、作成したプロジェクト名をクリックします。

<img alt="スクリーンショット 2023-12-05 6.03.36.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/271450/61945cc2-7c9f-a4a0-5bbb-38afc6af1b25.png">

プロジェクト詳細画面に遷移したら`プレイスメント`をクリックして、右上にある`プレイスメントの作成`をクリックします。

<img alt="スクリーンショット 2023-12-05 5.55.34.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/271450/57152179-3449-3737-0eb6-86844cbab5f0.png">

プレイスメントを作成します。
プレイスメント名は今回は`Attendance`とします。
`デバイスの選択で`先ほど登録したデバイスが表示されるので選択して右下の`プレイスメントの作成`ボタンをクリックして作成が完了します。

<img alt="スクリーンショット 2023-12-05 6.07.29.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/271450/1be744ae-bed8-8728-5497-1c0b5458b0a9.png">


## [Slackに送信するコード作成](#header7)
今回はNode.jsで書きました。
```js
export const handler = async (event) => {
  // AWS IoT Enterprise Buttonのクリックイベントを取得。 
  const clickType = event.deviceEvent.buttonClicked.clickType;

  let text;
  if (clickType === 'SINGLE') {
    text = "仕事始めます。";
  } else if (clickType === 'DOUBLE') {
    text = "仕事終了します。";
  } else {
    text = '??';
  }

  const data = {
    body: JSON.stringify({ text })
  };

  const headers = {
    'Content-Type': 'application/json; charset=utf-8',
  };

  try {
    const response = await fetch(process.env.WEBHOOK_URL, { method: 'POST', headers, body: data.body });
    console.log(`Message posted to ${text}`);
    return response;
  } catch (error) {
    console.error("Error:", error.message);
    return { statusCode: 500, body: 'Internal Server Error' };
  }
};
```
処理内容はとてもシンプルで、AWS IoT Enterprise Buttonでクリックされたイベントを取得してきて、クリックとダブルクリックでSlackに送信するテキストを変えています。

`process.env.WEBHOOK_URL`は送りたいSlackのチャンネルのWebhook URLを環境変数にセットします。

## [トリガーの追加](#header8)
AWS IoT 1-Clickで登録した端末をトリガーにLambdaの処理を走るようにしたいのでトリガーを追加します。

`トリガーを追加`のボタンをクリックします。

<img alt="スクリーンショット 2023-12-04 0.16.44.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/271450/ca6982fe-c90f-2bf9-d52d-3bf3365e27f2.png">

ソースの選択では`AWS Iot`を選択します。

<img alt="スクリーンショット 2023-12-05 6.11.53.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/271450/ef2991ab-a55d-86ef-c67d-26ed05530ef5.png">

`IoT Button`を選択して`Device Serial Number`には登録したAWS IoT Enterprise Buttonの番号を入力して`追加`を押すとトリガーの設定が完了します。

<img alt="スクリーンショット 2023-12-05 6.15.44.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/271450/6df25ae3-9c41-8782-8c15-b92759f44455.png">


## [実演](#header8)

![output.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/271450/b8b5b9e0-1b8c-c21e-85d2-eb0a6b57e25b.gif)

ちゃんと動作してることが確認できました。

## [まとめ](#header9)
昔試しに買ったAWS IoT Enterprise Buttonがこういうところで役に立つとは思わなかったです。
今回はシンプルなテキストにしましたが、タップした時間帯などを送ったりも出来たりするので色々とカスタマイズすれば実用的なものになると思いました。

## [最後に](#header10)
株式会社HRBrainでは新しいメンバーを募集中です。
興味がある方は下記のリンクから宜しくお願い致します。

https://www.hrbrain.co.jp/recruit