LoginSignup
15
16

More than 5 years have passed since last update.

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

Last updated at Posted at 2018-05-19

はじめに

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

会社が休みになるボタンを作ってみた [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

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

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

image.png

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

image.png

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

image.png

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

15
16
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
15
16