4
7

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

IFTTTとRaspberry Piを連携させて、SESAME3の手ぶら解錠を実現する

Last updated at Posted at 2021-07-03

SESAME3のアプリには位置情報を使った「手ぶら解錠」という便利な機能がついていますが、バッテリー消費が激しくて、スマホのバッテリーが一日持たないことも…。
IFTTTのアプリなら、位置情報を常にオンにしておいてもバッテリーの減りはそこまで激しくならないので、これを使えないかと思い、やってみました。
今回は手ぶら解錠だけでなく手ぶら施錠も行えるようにします。

※筆者は初めて使うサービスなどが多いため、間違った説明や、いらない工程があったりするかも。とりあえず正常に動作はしています。

使用したもの

  • iPhone11 Pro iOS14.6
  • SESAME3 API
  • IFTTT
  • Beebotte
  • Raspberry Pi
  • pysesame3
  • Node-RED

全体的な動作

  1. iPhone11が自宅周辺に入る・自宅周辺から出る
  2. IFTTTアプリがwebhooksでJSONデータ送信
  3. BeebotteがRaspberry PiのNode-REDにJSONデータ送信
  4. Node-RED上でJSONデータを処理してexecでSESAME3を動作させるPythonプログラムrun.pyを実行
  5. 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 になります。

(https://kuratsuki.net/2021/06/sesame3-%E3%81%AB%E5%AF%BE%E5%BF%9C%E3%81%97%E3%81%9F-web-api-%E3%81%AE%E4%BD%BF%E3%81%84%E6%96%B9/ より引用)

方法2:Webアプリに2次元コードを読ませる

こちらの方がお手軽です。

※筆者はiPhoneからだとうまくいかなかったので、PCに2次元コードを送信して読み込ませました。

2次元コードはアプリの設定の「このセサミの鍵をシェア」で写真アプリに保存したりできます。
IMG_1059_2.jpg

3. UUIDの確認

UUIDはアプリの設定で確認できます。
IMG_1059.jpeg

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]を変数に格納する処理を書いています。

run.py
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. チャンネルの作成

右上のCreate Newからチャンネルを作成します。
image.png

好きなチャンネル名(今回はraspi_sesame)を入力し、リソース名はsesameとしました。Create channelでチャンネル作成が完了します。
image.png

2. チャンネルのトークンを確認

IFTTTの設定にて使用するトークンを確認しておきます。
トークンは**"token"から始まる赤文字の部分**になります。
image.png

IFTTTの設定

iPhoneの位置情報によるアクションを実行するためにIFTTTを設定していきます。
右上のCreateをクリックしてアプレットを作成しましょう。

1. If Thisの設定

IF This Addをクリックします。
image.png

「Choose a service」でLocationを選択
image.png

「Choose a trigger」でYou enter an areaをクリックして、どの位置に自分が入ったら解錠するかを設定します。
image.png
自宅が円の中心に来るようにすると良いでしょう。
+-をクリックすることで、ある程度円の範囲を広げたり狭めたりできます。誤作動が多い場合は広めにするといいかも。
image.png
Create triggerをクリックすると以下のようにIf Thenの設定が完了します。
image.png

2. Then Thatの設定

同じ要領で、今度はThen Thatを選択。指定したエリアに入ったらどのような動作をするかを選択します。Beebotteと連携させるために、Webhooksを選択します。
image.png

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から入力するときは、"を長押しして入力します。
イメージ.png

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というノードを探します。
image.png

ノードをドラッグアンドドロップで置きます。
image.png

mqtt in ノードを編集

mqtt in ノードをダブルクリックして設定を開き、トピック<Beebotteのチャンネル名>/<Beebotteのリソース名>を入力します。
今回の例ではraspi_sesame/sesame
入力したら、鉛筆マークをクリックします。
image.png

「新規にmqtt-broker ノードの設定を追加」の接続タブにて、以下の通りに設定します。

項目 設定値
サーバ mqtt.beebotte.com
ポート 8883
SSL/TLS接続を使用
image.png

セキュリティタブのユーザ名にBeebotteのチャンネルのトークンを設定します。

項目 設定値
ユーザ名 token:token_xxxxxxxxxxxxxxxx
image.png

右上の更新ボタンをクリックして戻り、下の画像の通りに設定できたら完了をクリックします。
image.png

mqtt inが設定できました。
image.png

2. json ノードを配置

Beebotteから渡されたJSON文字列をオブジェクトに変換するために、左のノード一覧のパーサからjson ノードを持ってきて接続します。
変換するだけなので、特に編集するところはありません。
image.png

3. template ノードを配置

ノード一覧の機能から、template ノードを持ってきて接続します。
image.png

template ノードの編集

IFTTTで設定したJSONのkeynameの値をrun.py実行時の引数とするために、値を取り出して並べます。
template ノードをダブルクリックし、テンプレートの部分を以下の通りに書き換えます。

{{payload.data.key}} {{payload.data.name}}

今回の場合、unlock 解錠する人の名前が出力されます。
image.png

完了ボタンをクリックして編集完了です。

4. exec ノードを配置

Pythonスクリプトを実行するために、ノード一覧の機能からexec ノードを持ってきて接続します。
image.png

exec ノードの編集

exec ノードをダブルクリックし、コマンドpython3 -u /opt/sesame3/run.pyと設定します。
引数のmsg.payloadにチェックが付いているため、先程template ノードで設定した文字列が引数として設定されます。
image.png

完了ボタンをクリックして編集完了です。

5. debug ノードを配置

debugノードを配置することで、エラーが出たり、うまく動かない場合に原因を特定しやすくなります。
ノード一覧の共通からdebug ノードを持ってきて接続します。
ダブルクリックして名前を付けるとわかりやすくなります。
exec ノードの出力は、上から標準出力エラー出力返却コードとなっています。
image.png

6. デプロイ

デプロイすることで、配置したノードが反映され、使える状態となります。
デプロイをクリックすればいよいよ完成です。
image.png

動作確認

IFTTTのIf ThisLocationからButton widgetに変えて、手動で実行することで、IFTTTからの動作がうまく行えているか確認できます。
image.png

Node-REDの右側の虫マークのタブをクリックすることで、デバッグ情報が見られます。うまく動作しているのがわかりますね。
image.png

アプリの履歴にも反映されています。
イメージ (1).png

4
7
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
4
7

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?