GPSを使ってSwitchBotのロックを解除する方法

 イントロダクション
iOSのショートカット，AWSのlambda，APIGatewayを利用して家の近くに近づくとSwitchBotのロック解除を行うコードを以前作成しており，時間ができたので記事にしてみました．

# イメージ図
![](https://storage.googleapis.com/zenn-user-upload/b9716e7c7e59-20240302.png)

# システム構成図
![](https://storage.googleapis.com/zenn-user-upload/d67bce7cd5da-20240302.png)

# 実装の流れ
## コード作成
こちらを作成しました．
https://github.com/taiseee/switchbot_operation.git
## デプロイ
### lambda関数作成
![](https://storage.googleapis.com/zenn-user-upload/90922720431b-20240302.png)
ランタイムはpython12で基本的に設定はデフォルトで大丈夫です．
### コード追加
![](https://storage.googleapis.com/zenn-user-upload/5d0ff1b5c4ee-20240302.png)
コードソースにapi.pyとswitchbot.pyを追加します． コードの編集を行った際は必ずデプロイを行なって変更を反映させる必要があります．

### ハンドラの設定
![](https://storage.googleapis.com/zenn-user-upload/819a8d62fa49-20240302.png)
次にランタイムの設定の編集を設定し，ハンドラをapi.unlock_handlerに変更してください．
![](https://storage.googleapis.com/zenn-user-upload/516a4e33875f-20240302.png)

### レイヤー追加
また，コード内にlambdaのランタイムではデフォルトにサポートされていないライブラリ(requests)があるのでrequestsが利用できるようlayerも追加していきます．
![](https://storage.googleapis.com/zenn-user-upload/819a8d62fa49-20240302.png)
![](https://storage.googleapis.com/zenn-user-upload/2e49746829f3-20240302.png)

layerは本来ライブラリをzip化してアップロードしないといけないのですが，有志でこのようなものがありました!
https://github.com/keithrozario/Klayers?tab=readme-ov-file#list-of-arns
https://api.klayers.cloud/api/v2/p3.12/layers/latest/ap-northeast-1/html
こちらをarnコピーするだけで簡単にlayerを利用できます！ありがとうございます🙏

動かない場合はCloudWatchでログが確認できます．

これでひとまずlambdaは完成です．

## APIGatewayの作成とlambdaとの連携
### APIGatewayの作成
APIGatewayのAPI作成から新しいAPIを作成します．私はRESTAPIを選択しました． API名を入力したら次へ進みます．
![](https://storage.googleapis.com/zenn-user-upload/05a964985fe4-20240302.png)

### リソースの作成
作成したAPIにリソースを作成してください．
![](https://storage.googleapis.com/zenn-user-upload/ace94b7be9b3-20240302.png)
プロキシ，corsの設定は必要ありません．
![](https://storage.googleapis.com/zenn-user-upload/696191ceaa4d-20240302.png)
### メソッドの作成
次はメソッドの作成です．
メソッドを割り当てたいリソースを選び，メソッドを作成を選択します．
![](https://storage.googleapis.com/zenn-user-upload/5c7bf7e0d89e-20240302.png)

メソッドタイプはPOST，統合タイプはlambda関数としてください．
また，lambdaプロキシ統合にはチェックを入れます．
![](https://storage.googleapis.com/zenn-user-upload/5a0877fa2a41-20240302.png)

lambda関数には先ほど作成した関数を選択してください．
![](https://storage.googleapis.com/zenn-user-upload/649f3793e71d-20240302.png)

### APIのデプロイ
新しいステージを選択し，ステージ名を決めてデプロイを行うことで変更を反映させます．
![](https://storage.googleapis.com/zenn-user-upload/502f02f5427b-20240303.png)

これでAPIGatewayまで終わりました．残りはiOSのショートカットからの呼び出しです．

## ショートカットの設定
### トークン，シークレットの取得
ショートカットからAPIを叩く時にトークン，シークレットが必要となるので，こちらを先に行います．

#### 手順
1. SwitchBotアプリを起動．

2. プロフィール→設定→アプリバージョンへ進む．

3. アプリバージョン(例えば 6.24)を数回（5回~15回）連続タップすると「開発者向けオプション」が出現する．

4. 「開発者向けオプション」をタップして、次の画面でトークン，シークレットの情報を確認．

### デバイスidの取得
同様にデバイスidが必要となるのでこちらも取得します．

#### 手順
1.スマートロックの詳細画面右上の歯車マークをタップ．
2. 最下部の「デバイス情報」をタップ．
3. 表示された「BLE MAC」の値からコロン(:)を除外した文字列(これがデバイスid)を記録

### ショートカットの作成
~の内容を取得というショートカットを使ってAPIを呼びます．方法はPOSTとし，ヘッダにdeviceid，token，secretを設定してください．

<img width="250" src="https://storage.googleapis.com/zenn-user-upload/5b87fd465692-20240303.png">

### オートメーションへの追加
最後にオートメーションへ追加します．

#### 手順
1. オートメーションの右上のプラスボタンをタップ．
2. 到着をタップ．
3. 場所を自宅に設定，すぐに実行にチェックし次へをタップ．
4. 先ほど作成したショートカットを選択．

#### 完了です! お疲れ様でした．