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の右側の虫マークのタブをクリックすることで、デバッグ情報が見られます。うまく動作しているのがわかりますね。









