2018/11/12

SORACOM LTE-M Button 買ってみた!!

SORACOM LTE-M Buttonを買って遊んでみました

単純にボタンを押したらメール送信ならほぼスマホアプリのAWS 1-Clickだけで実現できました

ただ最初はボタンの1回押し、2回押し、長押しを認識してくれるか情報がなかったので、ネットで検索してAWS Enterprise IoT Buttonのサンプルコードを参考にてコードを書き加えてみました

ボタンを押した状態は「clickType」で取得できるみたいです

追加でボタンを押した時間を含めたかったんだけど、「reportTime」に入ってる時間は標準時間なので+9時間して使ってます

本当はボタンの残クリック回数を取得したかったのですが、「remainingLife」は残クリック回数か残日数の小さい方を示しているらしいのでif文で分岐することにしました
当分は残日数の方が表示され続けますね...

メールは確認用に2箇所に送信するためにボタンのイベントに入ってる「to_address」ではなく「clickType」の分岐の中で配列を作り直してます
配列を作り直したので、最後の「ses.send_email」の中の'ToAddresses'には「to_address」を直接入れてます


from __future__ import print_function
import boto3
import json
import logging
import dateutil.parser
from datetime import datetime, timedelta

logger = logging.getLogger()
logger.setLevel(logging.INFO)
ses = boto3.client('ses')

def check_email(email):
    result = ses.get_identity_verification_attributes(Identities=[email])
    attr = result['VerificationAttributes']
    if (email not in attr or attr[email]['VerificationStatus'] != 'Success'):
        logging.info('Verification email sent. Please verify it.')
        ses.verify_email_identity(EmailAddress=email)
        return False
    return True

def lambda_handler(event, context):
    logging.info('Received event: ' + json.dumps(event))

    clicktype = event['deviceEvent']['buttonClicked']['clickType']
    attributes = event['placementInfo']['attributes']
    from_address = attributes['email']
  to_address = attributes['email']

    if not check_email(from_address):
        logging.error('From email is not verified')
        return

    if not check_email(to_address):
        logging.error('To email is not verified')
        return

    dsn = event['deviceInfo']['deviceId']
    remainLife = event['deviceInfo']['remainingLife']
    lifeBatttery = int(remainLife) * 15
    lifeDays = int(remainLife) * 3.65
    if lifeBatttery <= lifeDays:
        life = str(int(round(lifeBatttery,0))) + '回'
    else:
        life = str(int(round(lifeDays,0))) + '日'
    click_type = event['deviceEvent']['buttonClicked']['clickType']
    reportTime = event['deviceEvent']['buttonClicked']['reportedTime']
    ts = datetime.strptime(reportTime[:19], "%Y-%m-%dT%H:%M:%S")
    tdelta = timedelta(hours=9)
    ts += tdelta
    
    if (clicktype == "SINGLE"):
        to_address = []
        to_address.append("test1@example")
        to_address.append("test2@example")
        subject = 'SINGLE'
        body ='SINGLE\n' + str(ts) + '\n' + life
    elif (clicktype == "DOUBLE"):
        to_address = []
        to_address.append("test1@example")
        to_address.append("test2@example")
        subject = 'DOUBLE'
        body ='DOUBLE\n' + str(ts) + '\n' + life
    elif (clicktype == "LONG"):
        to_address = []
        to_address.append("test1@example")
        to_address.append("test2@example")
        subject = 'LONG'
        body ='LONG\n' + str(ts) + '\n' + life
        
    ses.send_email(Source=from_address,
                   Destination={'ToAddresses': to_address},
                   Message={'Subject': {'Data': subject}, 'Body': {'Text': {'Data': body}}})


LONGイベントには何を設定しようかな?