💡

AWS LambdaからSwitchBotを操作する

2022/01/23に公開約2,000字

新しいSwitchBotを購入したので、APIを通じてLambdaから操作できるようにしてみた。

https://github.com/OpenWonderLabs/SwitchBotAPI

SwitchBotアプリ

  • SwitchBot本体をマイホームに登録する
  • プロフィール>設定アプリバージョンを連続タップして開発者向けオプションを表示する
  • アクセストークンを取得してメモしておく(後で使う)

curlコマンドで登録してあるデバイスのID確認できる(これも後で使う)

curl -X GET -H "Authorization: {取得したアクセストークン}" https://api.switch-bot.com/v1.0/devices

Serverless Framework

環境を作成する。
今回はpythonを使う。

$ sls create --template aws-python3

環境変数を追加する。
ここでさっき取得したアクセストークンとデバイスIDを入力する。

serverless.yml
service: python-switchbot-sls

frameworkVersion: '2'

provider:
  name: aws
  runtime: python3.8
  region: ap-northeast-1
  environment:
    ACCESS_TOKEN: xxxxxxxxxx
    DEVICE_ID: xxxxxxxxxx

functions:
  turn_on:
    handler: handler.turn_on
  turn_off:
    handler: handler.turn_off

コードをささっと書く。

handler.py
import os
import json
import requests

ACCESS_TOKEN = os.environ.get('ACCESS_TOKEN')
DEVICE_ID = os.environ.get('DEVICE_ID')

API_BASE_URL = 'https://api.switch-bot.com'


def turn_on(event, context):
  command = 'turnOn'
  headers = {
    'Content-Type': 'application/json; charset: utf8',
    'Authorization': ACCESS_TOKEN
  }
  url = API_BASE_URL + '/v1.0/devices/' + DEVICE_ID + '/commands'
  body = {
    'command': command,
    'parameter': 'default',
    'commandType': 'command'
  }
  data = json.dumps(body)
  res = requests.post(url, data=data, headers=headers)
  print(res)


def turn_off(event, context):
  command = 'turnOff'
  headers = {
    'Content-Type': 'application/json; charset: utf8',
    'Authorization': ACCESS_TOKEN
  }
  url = API_BASE_URL + '/v1.0/devices/' + DEVICE_ID + '/commands'
  body = {
    'command': command,
    'parameter': 'default',
    'commandType': 'command'
  }
  data = json.dumps(body)
  res = requests.post(url, data=data, headers=headers)
  print(res)

外部モジュールのrequestsをローカルにインストールする

$ pip install requests -t

Lambdaにデプロイする

$ sls deploy

テストで確認

# ON
$ sls invoke -f turn_on
# OFF
$ sls invoke -f turn_off

SwitchBotが動けば成功!

Discussion

ログインするとコメントできます