SESAME3のアプリには位置情報を使った「手ぶら解錠」という便利な機能がついていますが、バッテリー消費が激しくて、スマホのバッテリーが一日持たないことも…。
IFTTTのアプリなら、位置情報を常にオンにしておいてもバッテリーの減りはそこまで激しくならないので、これを使えないかと思い、やってみました。
今回は手ぶら解錠だけでなく手ぶら施錠も行えるようにします。
※筆者は初めて使うサービスなどが多いため、間違った説明や、いらない工程があったりするかも。とりあえず正常に動作はしています。
使用したもの
- iPhone11 Pro iOS14.6
- SESAME3 API
- IFTTT
- Beebotte
- Raspberry Pi
- pysesame3
- Node-RED
全体的な動作
- iPhone11が自宅周辺に入る・自宅周辺から出る
- IFTTTアプリがwebhooksでJSONデータ送信
- BeebotteがRaspberry PiのNode-REDにJSONデータ送信
- Node-RED上でJSONデータを処理してexecでSESAME3を動作させるPythonプログラム
run.py
を実行 - SESAME3が解錠・施錠される。
IFTTT -> Beebotte -> Node-RED -> run.py
SESAME3のAPI KEYとSecret KEY、UUIDの取得
1. API KEYの取得
https://dash.candyhouse.co/login からログインして、ダッシュボードでAPI KEYの確認が可能です。
(参考:https://doc.candyhouse.co/ja/SesameAPI)
2. Secret KEYの取得
セサミ3アプリの設定で確認できる2次元コードを使用して取得します。
方法1:2次元コードから自前で取得
iPhone の場合は「ショートカット」アプリで新規ショートカットを作成し、「書類」の「QR/バーコードをスキャン」と「Quick Lookで表示」を追加し、「QR/バーコード」を「テキストとして」にしておくとQRコードの中身をテキストのまま得られます。
sk=
の値をコピーしておいて、Base64 decode した文字列の1-17文字が secret key になります。
方法2:Webアプリに2次元コードを読ませる
こちらの方がお手軽です。
※筆者はiPhoneからだとうまくいかなかったので、PCに2次元コードを送信して読み込ませました。
2次元コードはアプリの設定の「このセサミの鍵をシェア」で写真アプリに保存したりできます。
3. UUIDの確認
pysesame3を使用してPythonスクリプトを作成
pysesame3はSESAME3を解錠・施錠などするために必要な非公式Pythonライブラリです。
1. pysesame3のインストール
pip install pysesame3
でインストール
(参考:https://pypi.org/project/pysesame3/)
2. 解錠と施錠を行うPythonスクリプトを作成
今回のスクリプトの実行では、IFTTTから送られたJSONデータの値を引数とし、解錠と施錠の動作を分けたり、実行する人の名前をログに残すようにします。そのため、sys.argv[1]
sys.argv[2]
を変数に格納する処理を書いています。
import sys
from pysesame3.auth import WebAPIAuth
from pysesame3.lock import CHSesame2
# ロックかアンロックの引数を格納
lock_param = sys.argv[1]
# ロック解除した人の名前の引数を格納
people_name = sys.argv[2]
# API KEY
auth = WebAPIAuth(apikey="<API KEY>")
# UUID
your_key_uuid = "<SESAME3のUUID>"
# Seacret KEY
your_key_secret = "<Seacret KEY>"
device = CHSesame2(
authenticator=auth,
device_uuid=your_key_uuid,
secret_key=your_key_secret,
)
# 解錠処理
if lock_param == "unlock":
status = device.unlock(history_tag="帰宅: "+people_name)
elif lock_param == "lock":
status = device.lock(history_tag="外出: "+people_name)
else:
status = False
# ステータス出力
if status == True:
print("Success!")
sys.exit(0)
else:
print("Error!", file=sys.stderr)
sys.exit(1)
今回は/opt/sesame3/
にrun.py
として保存しました。
python3 /opt/sesame3/run.py unlock nanashi
で動作確認できると思います。
動作すると解錠され、SESAME3のアプリの履歴に「帰宅:nanashi」と表示されます。
Beebotteの設定
1. チャンネルの作成
好きなチャンネル名(今回はraspi_sesame
)を入力し、リソース名はsesame
としました。Create channel
でチャンネル作成が完了します。
2. チャンネルのトークンを確認
IFTTTの設定にて使用するトークンを確認しておきます。
トークンは**"token"から始まる赤文字の部分**になります。
IFTTTの設定
iPhoneの位置情報によるアクションを実行するためにIFTTTを設定していきます。
右上のCreate
をクリックしてアプレットを作成しましょう。
1. If Thisの設定
「Choose a service」でLocation
を選択
「Choose a trigger」でYou enter an area
をクリックして、どの位置に自分が入ったら解錠するかを設定します。
自宅が円の中心に来るようにすると良いでしょう。
+
と-
をクリックすることで、ある程度円の範囲を広げたり狭めたりできます。誤作動が多い場合は広めにするといいかも。
Create trigger
をクリックすると以下のようにIf Thenの設定が完了します。
2. Then Thatの設定
同じ要領で、今度はThen That
を選択。指定したエリアに入ったらどのような動作をするかを選択します。Beebotteと連携させるために、Webhooks
を選択します。
WebhooksのURL
URLは
https://api.beebotte.com/v1/data/publish/<チャンネル名>/<リソース名>?token=<トークン>
となります。
チャンネル名、リソース名、トークンはBeebotteで設定・確認したものを使用します。
今回の例だと
https://api.beebotte.com/v1/data/publish/raspi_sesame/sesame?token=token_xxxxxxxxxxxxxxxxx
となります。
WebhooksのMethod
POST
を選択
WebhooksのContent-Type
application/json
を選択
webhooksのbody
bodyにはJSON形式でデータを記述します。
{"data":{"key":"unlock", "name":"解錠する人の名前"}}
※iPhoneのIFTTTアプリから設定を行う場合、キーボードからそのまま"
を入力すると、左斜のダブルクォーテーションになってしまい、正常に動作しません。iPhoneから入力するときは、"
を長押しして入力します。
3. 手ぶら施錠の場合
手ぶら施錠を設定したい場合は、If This Addの設定でYou exit an area
を選択し、bodyのJSONデータは
{"data":{"key":"lock", "name":"施錠する人の名前"}}
とします。
Node-REDのインストールと起動
Raspberry Piで実行する : Node-RED日本ユーザ会を参考に設定していきます。
1. Node-REDのインストール
以下のコマンドを実行してNode.js、npm、Node-REDをインストールします。
bash <(curl -sL https://raw.githubusercontent.com/node-red/linux-installers/master/deb/update-nodejs-and-nodered)
(https://nodered.jp/docs/getting-started/raspberrypi から引用)
### 2. Node-REDがRaspberry Pi起動時に自動的に起動するようにする
> ~~~
sudo systemctl enable nodered.service
(https://nodered.jp/docs/getting-started/raspberrypi から引用)
エディタを開く
http://<Raspberry PiのIPアドレス>:1880
でブラウザからエディタを開くことができます。
Node-REDのエディタで手ぶら解錠のフローを作成する
1. mqtt inノードを配置
ノード一覧のネットワークからmqtt in
というノードを探します。
mqtt in ノードを編集
mqtt in ノードをダブルクリックして設定を開き、トピックに<Beebotteのチャンネル名>/<Beebotteのリソース名>
を入力します。
今回の例ではraspi_sesame/sesame
入力したら、鉛筆マーク
をクリックします。
「新規にmqtt-broker ノードの設定を追加」の接続タブにて、以下の通りに設定します。
項目 | 設定値 |
---|---|
サーバ | mqtt.beebotte.com |
ポート | 8883 |
SSL/TLS接続を使用 | ○ |
セキュリティタブのユーザ名にBeebotteのチャンネルのトークンを設定します。
項目 | 設定値 |
---|---|
ユーザ名 | token:token_xxxxxxxxxxxxxxxx |
右上の更新
ボタンをクリックして戻り、下の画像の通りに設定できたら完了をクリックします。
2. json ノードを配置
Beebotteから渡されたJSON文字列をオブジェクトに変換するために、左のノード一覧のパーサからjson ノード
を持ってきて接続します。
変換するだけなので、特に編集するところはありません。
3. template ノードを配置
ノード一覧の機能から、template ノード
を持ってきて接続します。
template ノードの編集
IFTTTで設定したJSONのkey
とname
の値をrun.py
実行時の引数とするために、値を取り出して並べます。
template ノードをダブルクリックし、テンプレートの部分を以下の通りに書き換えます。
{{payload.data.key}} {{payload.data.name}}
完了
ボタンをクリックして編集完了です。
4. exec ノードを配置
Pythonスクリプトを実行するために、ノード一覧の機能からexec ノード
を持ってきて接続します。
exec ノードの編集
exec ノードをダブルクリックし、コマンドをpython3 -u /opt/sesame3/run.py
と設定します。
引数のmsg.payloadにチェックが付いているため、先程template ノード
で設定した文字列が引数として設定されます。
完了
ボタンをクリックして編集完了です。
5. debug ノードを配置
debugノードを配置することで、エラーが出たり、うまく動かない場合に原因を特定しやすくなります。
ノード一覧の共通からdebug ノード
を持ってきて接続します。
ダブルクリックして名前を付けるとわかりやすくなります。
exec ノード
の出力は、上から標準出力
、エラー出力
、返却コード
となっています。
6. デプロイ
デプロイすることで、配置したノードが反映され、使える状態となります。
デプロイ
をクリックすればいよいよ完成です。
動作確認
IFTTTのIf ThisをLocation
からButton widget
に変えて、手動で実行することで、IFTTTからの動作がうまく行えているか確認できます。
Node-REDの右側の虫マークのタブをクリックすることで、デバッグ情報が見られます。うまく動作しているのがわかりますね。