AWS IoT エンタープライズボタンでSlackに勤怠連絡する

## はじめに
こちらの投稿内容をやってみたかったのでチャレンジしました。

**会社が休みになるボタンを作ってみた [Amazon Dash Button]**
https://qiita.com/diescake/items/d4e1fb2dccc2fd4c92d8

AWS IoT エンタープライズボタンではクリックの情報を取得できます。
クリックのタイプに応じてSlackへの投稿内容を変えてみたいと思います。

## クリックイベント
ボタンをクリックすると以下のようなイベントが発行され、登録したLambda関数が実行されます。

```event.json
{
  "deviceInfo": {
    "deviceId": "G030PMXXXXXXXXXX",
    "type": "button",
    "remainingLife": 99.3,
    "attributes": {
      "projectRegion": "ap-northeast-1",
      "projectName": "sample-project",
      "placementName": "Sample-Placement",
      "deviceTemplateName": "SampleRequest"
    }
  },
  "deviceEvent": {
    "buttonClicked": {
      "clickType": "SINGLE", 
      "reportedTime": "2018-05-17T16:48:33.804Z"
    }
  },
  "placementInfo": {
    "projectName": "Sample-Project",
    "placementName": "Sample-Placement",
    "attributes": {
      "key": "value"
    },
    "devices": {
      "Sample-Request": "G030PMXXXXXXXXXX"
    }
  }
}
```

clickType は
1 click で **SINGLE**
2 click で **DOUBLE**
長押しで **LONG** に変わります。
Lambda側でこの値を参照すれば、ボタンの押し方によって処理を変えることができます。

## 結果イメージ
![image.png](https://qiita-image-store.s3.amazonaws.com/0/125105/31b2f561-47a2-6278-cb2f-82ad6d9b15ea.png)

1 Clickで午前半休
2 Clickで午後半休
長押しで全休 です。
1つのボタンで想定通り3パターン対応できました。
輝くアプリ(APP)の3文字。。。Webhookなので同然なんですけどね。。

## Lambda関数
ひよコードですが、ご容赦ください:hatched_chick:
環境変数で WEBHOOK_URL と USER_NAME を設定します。

```lambda_function.py
import json
import os
import logging

from urllib.request import Request, urlopen
from urllib.error import URLError, HTTPError

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

def lambda_handler(event, context):
    webhook_url = os.environ['WEBHOOK_URL']
    user_name = os.environ['USER_NAME']
    
    click_type = event['deviceEvent']['buttonClicked']['clickType']
    if click_type == "SINGLE":
        oyasumi_type = "午前半休"
    elif click_type == "DOUBLE":
        oyasumi_type = "午後半休"
    elif click_type == "LONG":
        oyasumi_type = "全休"
    
    slack_message = {
        'username': user_name,
        'icon_emoji': ':face_with_thermometer:',
        'text': '本日' + event['placementInfo']['attributes']['reason'] + 'のため、' + oyasumi_type + 'とさせてください。'
    }

    req = Request(webhook_url, json.dumps(slack_message).encode('utf-8'))
    try:
        response = urlopen(req)
        response.read()
        logger.info("Message posted.")
    except HTTPError as e:
        logger.error("Request failed: %d %s", e.code, e.reason)
    except URLError as e:
        logger.error("Server connection failed: %s", e.reason)
```

event['deviceEvent']['buttonClicked']['clickType'] でクリックタイプを
event['placementInfo']['attributes']['reason']でプレイスメント属性に設定した値を取得します。
プレイスメント属性にはAWS IoT 1-Click側でお休みをいただく理由を設定します。
理由を増やすにはボタンを追加購入しないと。。

## テンプレートとプレイスメントの設定
ボタンの登録等、事前準備についてはこちらも参照いただければと思います。

**AWS IoT 1-Click と IoT エンタープライズボタンのセットアップ&動作確認**
https://qiita.com/hayao_k/items/d36d4b2579d0bbbe21a9

新しい AWS IoT 1-Click プロジェクトを作成します。
デバイステンプレートのアクションには上記のLambda関数を指定します。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/125105/0133b52e-2b24-5ae7-b217-eadaf1f94ee4.png)

プレイスメント属性に reason を設定し、プロジェクトを作成します。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/125105/f663ed87-e393-0382-d302-0102a09586c4.png)

新しいプレイスメントの作成で、デバイスを選択してプレイスメントを作成すれば設定完了です。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/125105/7acd802f-767b-2d91-9acb-7a8738c7f447.png)

デバイス管理画面からイベントを参照をすると、実際のクリックタイプを確認することもできます。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/125105/813338e8-4f46-b598-a585-5d18e2e0b542.png)

以上です。
参考になれば幸いです。