内容
- 複数のSESAME(セサミ)スマートロックを、まとめて制御する手法です。
- スマートフォン(Android/iPhone)やスマートウォッチ(Wear OS by Google(Android Wear)/Apple Watch)から、ウィジェットの1タップで制御できます。
- Google Homeからも声で制御できます。
結果 (2020/6/10 追加)
解錠・施錠の様子を動画におさめました。
動作完了まで約15秒といったところでしょうか。
SESAME 2ロックをまとめて解錠。 pic.twitter.com/DYRHAxJ2LJ
— mm (@noirbreath) June 9, 2020
SESAME 2ロックをまとめて施錠。 pic.twitter.com/Y2V40yWd9D
— mm (@noirbreath) June 9, 2020
背景
スマートロックは外部サービスと連携できてなんぼだよね。最初期から使ってきたQrioだけれど、SESAMEに置き換え予定。
— mm (@noirbreath) 2018年3月28日
もうこの一言に尽きます。
Google Home MiniやNature Rimoで「スマートホーム」を体験し始め、「玄関の鍵も制御できたら」という思いが日増しに強くなっていました。
「OKグーグル、行ってきます」で解錠。帰ってきたら「OKグーグル、ただいま」で施錠。……スマートですよね?
当時、Qrio (SL1)とQrio Hubを設置して、外出先から操作できるようにしていましたが、APIの公開はナシ。Qrioのアプリからしか操作できません。また、わが家は1ドア2ロックなのですが、Qrio側で対応しているものの、シリアルに操作するため待ち時間が長く、不満な点でもありました。
そこで目についたのがSESAME。Wi-Fiアクセスポイントさえ追加すれば、外部からAPIを自由に叩けます。ロック本体とアクセスポイントが1対1なので2組必要と知って「え〜っ」となりましたが、これ裏を返せばQrioのようにシリアルに待たされることなく、パラレルに制御できるということになります。
Qrioの不満点をつぶせる!ということで早速購入。2ロック制御の開発を開始しました。
必要な知識、モノ、サービス
-
Google Apps Script
- SESAME APIを叩くために使用します。
- スクリプトはGoogleドライブに設置します。
- Googleアカウントを持っていれば、無料で使用可能です。
- JavaScriptの知識ゼロの人でも何とかなりました。
-
IFTTT
- スマートフォンのウィジェットや、Google Homeの入力をきっかけに、Google Apps Scriptを叩くために使用します。
- Button widget、Google AssistantとWebhookのサービスを使用します。
- アカウントを取って使える状態にしてください。(手順など、ここでは触れません)
-
SESAME(セサミ)
参考文献
-
SESAME API (Version 1/Version 2) ドキュメント
- 最新のAPIは Version 3 です。
- Version 1/Version 2 は廃止予定とのことなので、いずれ新しいAPIに書き直したいところ。
複数のSESAMEをまとめて制御する
Google Apps Scriptの設置(基本部分)
APIを叩く基本部分を設置します。
手順は以下の通りです。
-
ブラウザで Google Drive にアクセスし、左上の「新規」をタップ。(スマートフォンの場合、ブラウザのPCモードで)
-
表示されたプルダウンメニューをたどって、「Google Apps Script」をタップ。(表示されない場合、その下の「アプリを追加」から追加)
-
プロジェクト名を入力(上段の赤枠)。コード欄(下段の赤枠)に元からある空の関数を削除し、代わりに後述の「コピペするスクリプト」をコピー&ペースト。
-
コピペするスクリプト
// SESAMEのアカウント情報 (設定してください) var mail = '<メールアドレス>'; var pass = '<パスワード>'; // SESAME API の URL var apiUrl = 'https://api.candyhouse.co/v1'; // SESAMEの名前とデバイスIDの保存用 (getSesameIdで設定する) var deviceId = {}; // ログイン認証トークンの取得 // (パスワード変更や30日経過で認証が切れるらしいので、当面は処理の最初に必ず呼び出すようにする) function getAuthToken() { var response = UrlFetchApp.fetch(apiUrl + '/accounts/login', { 'headers': { 'Content-Type' : 'application/json' }, 'method' : 'POST', 'payload': JSON.stringify({ 'email' : mail, 'password': pass }) }); // トークンを抜き出して返す return(JSON.parse(response.getContentText()).authorization); } // アカウントに登録しているSESAMEの名前とデバイスIDの取得&保存 function getSesameId(authToken) { var response = UrlFetchApp.fetch(apiUrl + '/sesames', { 'headers': { 'X-Authorization' : authToken }, 'method' : 'GET' }); // deviceId に保存する var array = JSON.parse(response.getContentText()).sesames; for(var i in array) { deviceId[array[i].nickname] = array[i].device_id; } } // 操作対象のSESAMEの名前と操作内容(lock/unlock)を指定して実行 function controlSesame(authToken, name, control) { // APIを叩く間隔調整 (気になる人はコメントアウトを外して調整してください) //Utilities.sleep(3000); // 3秒待ち var response = UrlFetchApp.fetch(apiUrl + '/sesames/' + deviceId[name] + '/control', { 'headers': { 'X-Authorization': authToken, 'Content-Type' : 'application/json' }, 'muteHttpExceptions': true, 'method' : 'POST', 'payload': JSON.stringify({ 'type' : control }) }); } // メイン処理 function main(events) { // トークンの取得 var authToken = getAuthToken(); // SESAMEの名前とデバイスIDの取得 getSesameId(authToken); // events から操作対象と内容を取り出して実行 for(var i in events) { var name = events[i].name; var control = events[i].type; // name が ALL の場合だけ特別 if(name == 'ALL') { // アカウントに登録しているSESAMEすべてを一括処理 // (1ドア2ロックの2個しか登録していない場合は ALL 指定で) for (var nameAll in deviceId) { controlSesame(authToken, nameAll, control); } } else { // SESAMEの名前を指定して個別に操作 // (例えば玄関と勝手口など、まとめて解錠されたら困るようなところに設置している場合は名前指定で) controlSesame(authToken, name, control); } } } // IFTTTからのPOSTを受ける関数 function doPost(e) { // IFTTTから渡された操作内容を取り出して main に丸投げ var events = JSON.parse(e.postData.contents).events; main(events); }
-
-
スクリプト内にSESAMEのアカウント情報(<メールアドレス>と<パスワード>)を設定し、保存ボタンをタップ。
-
「公開」メニュー内の「ウェブアプリケーションとして導入」をタップ。
-
「アプリケーションにアクセスできるユーザー」プルダウンメニューを「全員(匿名ユーザーを含む)」に変更し、「導入」をタップ。
-
承認の許可を行う。
-
「現在のウェブアプリケーションのURL」をコピーしてどこかにメモしたあと、「OK」をタップ。(このURLが、のちにIFTTTで指定するWebhookのURLになる)
以上で設置完了です。ブラウザは閉じても構いません。
ウィジェットの1タップでSESAMEを制御
あとは、設置したGoogle Apps Scriptをどうやって叩くかだけです。
Webhookが使えるならば何でも構いませんが、ここではIFTTTを使います。
Button widgetを使って、スマートフォン(スマートウォッチ)のウィジェットのタップで操作できるようにします。
まずはスマートフォンの設定
IFTTTアプリで解錠のアプレットを作成します。
-
IFTTTアプリの「My Applets」ボタン、「+」ボタンをタップ。(下記画像の数字の順にタップ【以下同じ】)
-
「this」をタップ後、"Search services"に"bu"まで入力すると候補が絞られるので、「Button widget」をタップ。Select trigger画面で「Button press」をタップ。
-
「that」をタップ後、"Search services"に"web"まで入力すると候補が絞られるので、「Webhooks」をタップ。Select action画面で「Make a web request」をタップ。Complete action画面で各種情報(後述)を入力後、「Create action」をタップ。
-
Complete action画面の入力内容
項目 入力内容 URL Google Apps Scriptの設置手順の最後にコピーした「現在のウェブアプリケーションのURL」 Method POST Content Type application/json Body { "events": [{ "name" : "ALL", "type" : "unlock" }] }
-
項目Bodyにはevents配列が指定できます。
-
events配列の各要素には、nameとtypeが指定できます。役割と指定可能な値は下記の通りです。
ITEM 役割 指定可能な値 name 操作対象のSESAMEを指定する ALL または SESAMEの名前 type 操作内容を指定する unlock または lock -
nameにALLを指定した場合、アカウントに登録しているSESAMEすべてを操作対象とします。
- 1ドア2ロックの2個しか登録していない場合、ALLの指定で問題ありません。
-
nameにSESAMEの名前を指定した場合、指定されたSESAMEのみを操作対象とします。
-
例えば玄関と勝手口など、まとめて解錠されたら困るようなところに設置している場合に使用します。
-
SESAMEの名前「玄関1」と「玄関2」を両方解錠したい場合、次のように指定してください。
{ "events": [{ "name" : "玄関1", "type" : "unlock" }, { "name" : "玄関2", "type" : "unlock" }] }
-
-
-
-
「Edit title」をタップしてタイトルを変更。最後に「Finish」をタップして完了。
施錠のアプレットを作成する場合、上記解錠の手順から、Complete action画面の項目Bodyに指定したunlockをlockに変更するだけです。その他の手順は同じです。(タイトルは変えましょう)
スマートフォンへのウィジェットの設置は、Android/iPhoneそれぞれの作法に従ってください。
-
(だいたいの) Androidは、ホーム画面の空白を長押ししてIFTTTウィジェットを追加する。(Small/Large)
-
(iOS 11の) iPhoneは、ホーム画面を右にスワイプして、一番下の編集ボタンからIFTTTを追加する。
- (表示されているタイトルがこれまでの例と違うのは、堪忍してください)
このウィジェットを1タップすることで、複数のSESAMEをまとめて操作(解錠/施錠)が可能になります。
スマートウォッチから使えるようにするには?
スマートウォッチのIFTTTアプリからも操作可能にします。
-
Wear OS by Google (Android Wear)の場合
-
Apple Watchの場合
Google HomeでSESAMEを制御
先のIFTTTアプレット作成時は、「this」にButton widgetを使いましたが、Google Assistantを使うことでGoogle Homeから声で制御することも可能です。
ここでは、例として「ひらけごま」(解錠)のアプレットを作成します。
-
IFTTTアプリの「My Applets」ボタン、「+」ボタンをタップ。(下記画像の数字の順にタップ【以下同じ】)
-
「this」をタップ後、"Search services"に"goo"まで入力すると候補が絞られるので、「Google Assistant」をタップ。
-
Select trigger画面で「Say a simple phrase」をタップ。Create trigger画面で下図の通り入力後、「Create trigger」をタップ。
-
「that」の設定(Webhook)は、Button widgetを使った解錠アプレットと同じなので、そちらを参照してください。
これで、Google Homeに「OKグーグル、ひらけごま!」と言えば、まとめて解錠してくれるようになります。
最後に
SESAMEの製品自体にはいろいろツッコミどころがありますが、意外といい買い物をしたと思っています。
この記事は、数ヶ月前に作業したものを思い出しながら書きました。どこかに抜けや間違いがあるかもしれません。お気づきの点はご連絡ください。
で、数ヶ月前のことをどうして書く気になったかというと、急遽入院して暇になってしまったから。ベッドの上から動けなくても、Gemini PDAの変態USキーボードと戦いながら(書き終わる頃にやっと慣れた)、楽しく過ごせました。
心残りは、SESAMEの実機が手元にないため、動作の様子を動画に収められなかったことです。これはまた、退院してからの宿題にしたいと思います。
(2020/6/10) 記事の冒頭に動画を追加しました。2年越しの宿題を提出。動画自体は当時撮影していたのですが。きっかけをくださった @naoya-i 様、ありがとうございます。