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側でこの値を参照すれば、ボタンの押し方によって処理を変えることができます。

結果イメージ

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

Lambda関数

ひよコードですが、ご容赦ください
環境変数で 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関数を指定します。

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

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

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

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