1.はじめに
オートロックのマンションに住んでおり、
「置き配」を指定しても届かないので、休みの日に時間指定したり、営業所留めにしてもらうことが多く、少し面倒です。
この状況を解決するために、自動で配達員さんがオートロックを突破できるような環境を作りました。
具体的には、電話がかかってきたらオートロックが開錠されるように組んでおき、配達員さんには配達時に電話をかけて入ってきていただくという流れです。
2.システムの全体
① 荷物配達員 👨🚀
↓ 電話
② サブスマホ(Android)📱
Macrodroidが着信を検知し、マクロを起動
↓ HTTPリクエスト
③ GAS(Google Apps Script) ☁️
受信したリクエストを元にスクリプトを実行
④-A Sesame Bot 2が扉を解錠 🤖
④-B サブスマホの電話着信をメール通知 📧(任意)
3.用意したもの
項目 | 製品名・サービス名 | 金額(税込) | 備考 |
---|---|---|---|
ハードウェア | Sesame Bot 2 | 2178円(公式) | インターホンの解錠ボタンを押す |
Sesame Hub 3 | 2178円(公式) | sesame Bot2をネットに繋ぐ | |
送料 | 700円くらい | 上記を公式ストアで購入した場合 | |
Android端末 | 3,000円くらい | au端末推奨 | |
サービス | 通信回線(音声SIM) | 0~1000円くらい | povo推奨(0円運用できるので) |
Macrodroid | 800円? | GASを動かすために必要。買い切り | |
合計 | 10000円くらい |
4.環境構築
4.1 SESAMEのAPI関連の情報取得
GASからSESAME Bot2を動かすために以下の情報を取得します。
- APIキー
- デバイスUUID
- デバイスシークレットキー
①SESAME Bizの管理画面にアクセスします。事前にsesameアプリでsesame(bot2,hub3)の初期設定をしておき、アプリと同じメアドでログインして下さい。
②左下の「開発者向け」を押します。
画面中央の「個人で登録済みのデバイス」を押し、「セサミ ボット 2」を選択します。
APIキー、デバイスUUID、デバイスシークレットキーを確認し、メモしておきます。
4.2 GAS(google apps Script)の設定
①スクリプトファイルを新規作成する
googleドライブから[新規]→[その他]→[Google Apps Script]と選択
②外部のJavaScriptを追加する
sesameを操作するための署名生成はよくわかっておらず、
artjombさんのcryptojs-extensionを拝借させていただきます。。。
こちらから以下のファイルを確認し、スクリプトファイルに貼り付けます。(コピペします)
- lib/cryptojs-aes.min.js
- build/cmac.min.js
ファイル右側の+ボタンからスクリプトを選択し、リンク先のコードを貼り付ければOKです。
初期状態で入力されているコードはすべて削除し貼り付けでOKです。
ファイル名は何でもいいようですが、管理の観点から同じファイル名にしておくと良いと思います。
また、ファイルの順序は以下と同様にする必要があるようです。
③メインコードの入力
コード.gsにメインコードを記載していきます。
こちらも内容わかっていませんが、道ばたのノートさんの汎用サンプルコードを拝借させていただきます。
コード.gsに初期状態で入力されているコードはすべて削除し、以下を貼り付けます。
- myKeyには任意の値を入力します。(私は適当な数字を入れました)
- 9行目と16行目(prop.setProperty,analyzeQR)にはそれぞれ上で確認したAPIの情報を記載します。
- 29行目のmain関数の2引数目には、セサミボットにつけた名前(セサミのスマホアプリ上の表示名)を入力します。
3引数目は、セサミアプリ(スマホ側)のsesame bot2の台本番号が対応している(多分)ので、作成した台本の番号に合うように変更してください。
const prop = PropertiesService.getScriptProperties();
const myKey = prop.getProperty('myKey');
const apiKey = prop.getProperty('apiKey');
// プロパティ登録 (*****部分を書き換えて初回のみ実行する。実行後は消してもOK)
function prepare(){
prop.deleteAllProperties();
prop.setProperty('myKey', '*****'); // 任意のキー。自由に設定する
prop.setProperty('apiKey', '*****'); // ダッシュボードで取得したAPIキー
// 事前準備A組は↓に、QRから取得したテキスト全文を入れる
analyzeQR('*****');
//analyzeQR('*****'); // デバイスが複数ある場合、適宜追加
// 事前準備B組は↓に、セサミに付けた名前, UUID, SecretKey の順で入れる
analyzeQR('*****', '*****', '*****');
//analyzeQR('*****', '*****', '*****'); // デバイスが複数ある場合、適宜追加
showProps();
}
//プロパティ確認
function showProps(){
console.log(prop.getProperties());
}
// 動作テスト。成功したら200が返り、セサミが動く
function test() {
main(myKey, "セサミの名前", 1, "GAS");
/*
説明:
"セサミの名前" を実際のセサミの名前に変更する
"GAS" はアプリの通知と履歴に表示される名前。変更可
セサミの名前について補足説明:
将来もしアプリ上でセサミの名前を変更したとしても、このスクリプトの運用に影響はありません
設定を更新する必要はなく、逆に言えば、prepare()実行時点の名前を使い続ける必要があります
新しい名前をGASでも使いたい場合は、新しい情報で再度prepare()を実行します
*/
}
function doPost(e) {
const p = JSON.parse(e.postData.contents);
main(p.myKey, p.deviceName, p.command, p.user);
}
function doGet(e) {
const p = e.parameter;
main(p.myKey, p.deviceName, p.command, p.user);
}
// 施解錠操作
function main(key, device, command, user='ウェブアプリ') {
if(key != myKey) return;
const c = [83, 82, 88][parseInt(command)]; // lock:82,unlock:83,toggle:88
const h = Utilities.base64Encode(user, Utilities.Charset.UTF_8);
const devices = device.split(',');
devices.forEach(function(name) {
const data = JSON.parse(prop.getProperty(name));
const body = {
'cmd': c,
'history': h,
'sign': generateCmacSign(data.secKey)
}
const options = {
headers: {'x-api-key': apiKey},
method: 'POST',
muteHttpExceptions: true,
payload: JSON.stringify(body)
}
const url = `https://app.candyhouse.co/api/sesame2/${data.uuid}/cmd`;
const response = UrlFetchApp.fetch(url, options).getResponseCode();
console.log(response);
});
}
// CMAC認証
function generateCmacSign(secKey) {
const date = Math.floor(Date.now() / 1000);
const dateDate = new DataView(new ArrayBuffer(4));
dateDate.setUint32(0, date, true);
const msg = dateDate.getUint32(0).toString(16).slice(2, 8);
const hex = CryptoJS.enc.Hex.parse;
return CryptoJS.CMAC(hex(secKey), hex(msg)).toString();
}
// QR情報デコード
function analyzeQR(p1, p2, p3){
if(p1 == '' || p1.indexOf('*') == 0) return;
let name;
let data = {};
if(p2){ // デコード済みデータが来てる
name = p1;
data = {'uuid':p2, 'secKey':p3};
}
else{ // 生データが来てる
const ssm = decodeURIComponent(p1)
const params = ssm.slice(ssm.indexOf('?') + 1).split('&');
params.forEach(function(p) {
if (p.indexOf('sk=') == 0){
const sk = p.slice(3);
const uuid = `${hx(sk,83,86)}-${hx(sk,87,88)}-${hx(sk,89,90)}-${hx(sk,91,92)}-${hx(sk,93,98)}`;
data.uuid = uuid.toUpperCase();
data.secKey = hx(sk, 1, 16);
}
else if(p.indexOf('n=') == 0){
name = p.slice(2);
}
});
}
prop.setProperty(name, JSON.stringify(data));
}
// QR情報デコード Core
let hx = (data, start, end) => {
return Utilities.base64Decode(data).slice(start, end + 1)
.map(function(chr){return (chr+256).toString(16).slice(-2)}).join('');
}
④動作確認
GASの画面中央の「実行する関数」から[main]を選択し、実行を押します。
台本どおりにsesame bot2が動けばGAS側の設定は完了です。

⑤アプリ化
GAS画面右上の[デプロイ]から[新しいデプロイ]を押し、ウェブアプリ化します。
ウェブアプリ化されたらURLはメモしておきます。
4.3 Androidスマホ側(Macrodroid)の設定
- 適当なAndroidスマホを用意し音声SIMを刺しておきます。電話が鳴れば良いので、回線は何でも良いです。
auのスマホがあるなら0円運用可能なpovoがおすすめです(私はSH-01Kとirumoの500円プランを使ってます) - スマホにMacrodroidをインストール(有料版にしないと無料期間後にマクロが動かなくなるので、すべての設定が終わったら有料版にすることをおすすめします)
①マクロの設定
Macrodroid上で設定したマクロの全体図は以下になります。
■トリガー
- 電話の着信時
■アクション
- HTTPリクエスト(GASのウェブアプリを実行します)
- メールを送る(gmailなどから任意のメアドにメール送信可能です。)

アクションの設定画面には、前の章の⑤で取得したURLを記載します。
アクションの設定画面のコンタクトボディには、前の章の③の29行目(main関数)と同様の内容を記載します。
メールのアクションには[call_number]を入れておけば、かかってきた電話番号がメールに入力されます。
最後に、マクロ設定を保存し、[アクションを試す]を実行します。
問題なく動作すれば、環境設定は完了です。
5.配達員さんへの周知
Amazonのこちらのページに記載があるように、置き配時に配達員さんに追加でメッセージを設定することが可能です。
私は以下のように指示しています。
6.注意点
APIリクエスト上限は、無料版は3,000回/月のようです。
使いすぎにはご注意ください。
https://biz.candyhouse.co/settings
7.最後に
以上です。オートロックを突破されるリスクを考慮のうえで参考にしていただければと思います。
8. 参考にした記事
[1]:道ばたのノート: 【SESAME】 GAS から Web API を利用するサンプル
[2];SESAME3をWEB API経由で操作する #Python - Qiita
[3];知恵袋