SORACOM LTE-M ButtonからCisco Webex Teamsへ勤怠連絡する

# はじめに
以前業務でLTE-M、NB-IoT案件に携わっていたことがあり、実際のデバイスを触ってみたくなってSORACOM LTE-M Button powered by AWSを購入してみました。今回は忘年会で飲みすぎた次の日や、子供が熱を出した日、また自分の体調が優れない日等、在宅勤務や休暇を利用する場合に1クリックで連絡する手段を実装します。
SlackやLINEでは既にメッセージ送信を実装されている方がいますが、私の勤務先はコミュニケーションツールとしてCisco Webexを使用していますので、Cisco Webex Teamsでの実装を紹介します。

# Cisco Webex Teamsとは
Cisco Webex Teamsはビデオ会議やチャット、資料共有などのビジネスコミュニケーション機能を有するクラウドサービスです。他のメッセージングサービス同様RESTfulなAPIを備えており、プログラムからユーザの検索やメッセージの送信が可能です。詳しくは以下リンクにて。

[Getting Started with the Webex API](https://developer.webex.com/docs/api/getting-started)

# 前提
- Cisco Webexアカウントを持っている
- SORACOM LTE-M Button powered by AWSを1-clickセットアップ済

# 実装
## 1. Cisco Webex Botを作成し、Spaceに追加する
[こちらの記事](https://qiita.com/thrzn41/items/672870bb8a6ab2ca44b2)を参考にBotを作成、アクセストークンを取得します。その後、Botを勤怠連絡するSpaceに追加します。

## 2. 追加したSpaceのIDを調べる
API Referenceの[List Rooms](https://developer.webex.com/docs/api/v1/rooms/list-rooms)でBotが所属するSpaceのIDを取得します。この時、HeaderのAuthorizationには1で取得したアクセストークンを入力します。

![スクリーンショット 2018-12-02 0.11.36.png](https://qiita-image-store.s3.amazonaws.com/0/134931/11118747-3996-bbee-82af-99b5fc21e857.png)


ResponseセクションのtitleからBotを追加したSpaceを探し、そのSpaceのidを取得します。

![スクリーンショット 2018-12-02 0.16.34.png](https://qiita-image-store.s3.amazonaws.com/0/134931/04e6c859-c58a-39fc-b7d5-23db0fa0de7e.png)

## 3. Lambda関数の準備
今回はPython3.6で以下コードを実装しました。Spaceへのメッセージの送信にはAPI Referenceの[Create a Message](https://developer.webex.com/docs/api/v1/messages/create-a-message)を使います。躓いたポイントとして、lambda関数の実行環境でrequestsパッケージは実装されていなかったため、ローカル環境でパッケージを準備しUpload .zip fileを選択しました。

```python
import os
import json
import requests
import logging

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

def compose_message(clicktype):
    if clicktype == 'SINGLE':
        return u'本日在宅勤務です。'
    elif clicktype == 'DOUBLE':
        return u'本日午前休です。'
    elif clicktype == 'LONG':
        return u'本日お休みです。'
    else:
        return u''

def send_message(msg):
    url = "https://api.ciscospark.com/v1/messages"
    headers = {"Accept": "application/json", "Content-Type": "application/json; charset=utf-8", "Authorization": "Bearer "+ os.environ['ACCESS_TOKEN']}
    payload = {"roomId": os.environ['ROOM_ID'], "text": msg}
    r = requests.post(url, headers=headers, data=json.dumps(payload))
    logger.info('status code: ' + str(r.status_code) + ', body: ' + r.text)

def lambda_handler(event, context):
    logger.info('Received event: ' + json.dumps(event))
    message = compose_message(event['deviceEvent']['buttonClicked']['clickType'])
    send_message(message)
    return
```

ACCESS_TOKENとROOM_IDは1で取得したアクセストークンと2で取得したSpaceのIDをlambdaのEnvironment variablesセクションで与えます。
![スクリーンショット 2018-12-02 0.34.46.png](https://qiita-image-store.s3.amazonaws.com/0/134931/04b57750-caec-4c82-d024-d6c3872c8ab9.png)

## 4. AWS IoT 1-ClickでLambda関数とdevice templateを紐付ける
Device templatesメニューのLambda functionに3で作成したlambda関数を入力、これで完成です。

# 感想
Cisco Webex APIは以前触ったことがありましたので、SORACOM LTE-M Button powered by AWSが届いたその日の夜、デバイス開封から30分ほどで1−clickセットアップが完了し、トータル2時間ほどで実装できました。1-clickでインフラは準備完了、AWSサービスとの連携が思ったよりシンプルなのが気に入りました。LTE-Mがつながる場所であればどこでもセキュアにサービス提供可能ですので、様々なシーンでの応用が考えられそうです。他のサービスも考えてみたいと思います。