Amazon Dash Buttonでスマートロックを開けられるようにしたら思ったよりも便利だった / Akeurn Advent Calendar 10日目

この記事はAkerun Advent Calendar10日目の記事です。 数日ぶりにフォトシンスCTOの@kazuphが担当させていただきます。

今回は流行りに乗っかってみましたよ(・∀・)

Akerun Dash Button

f:id:photosynth-inc:20161210074036p:plain

どん!GIMPで作成しました。

Amazon Dash Buttonは、ワンプッシュで紐付けている商品を自動で注文するためのIoTデバイスです。沢山の人たちがHack(良い意味)して遊んでいるので、自分もやってみました。

gigazine.net

押す度にAkerunが追加注文されるものをつくって配った方が良かったのかもしれませんが、今回はAmazon Dash ButtonでAkerunを開けてみました。 Amazon Dash Buttonが直接Akerunにつながって開閉できるようにしているわけではなく、Wi-Fiの認証、鍵の認証をはさみつつネットワーク越しに開閉しています。

仕組みは単純です。

f:id:photosynth-inc:20161210082426p:plain

以下解説です。

Amazon Dash Buttonが押されたことを検知する

サントリー天然水 Dash Button

サントリー天然水 Dash Button

まず最初にAmazon Dash Buttonを最寄りのWi-Fiに接続できるようにしてください。 商品と紐付けると商品が届いてしまうので、一番最後の商品選択だけはやらないでください。

方法は以下の記事が詳しいです。

qiita.com

MACアドレスを拾う方法としては、僕はnode-dash-buttonというライブラリを使いました。

github.com

実行環境はRaspberry Pi 3です。

nodeはxbuildで構築しておりVersionは4.6.2です。

$ git clone https://github.com/tagomoris/xbuild.git
$ xbuild/node-install -f v4.6.2 ~/local/node-v4.6.2 linux-armv7l
$ export PATH=/home/pi/local/node-v4.6.2/bin:$PATH
$ sudo ln -svf /home/pi/local/node-v4.6.2/bin/node /usr/bin/node
※nodeは4系では4.7.0が最新ですが、元々入れていたので今回はこれを使いました

はぁ〜〜〜xbuild便利〜〜〜〜

nodeが入ったら次にnode-dash-buttonをインストールします。

$ sudo apt-get install libpcap-dev
$ cd your_project/
$ npm install -S node-dash-button

libpcapは名前からもわかるようにパケットキャプチャをするためのライブラリです。 node-dash-button内で使用しているようです。

次にAmazon Dash ButtonのMACアドレスを特定します。

$ cd node_modules/node-dash-button
$ sudo node bin/findbutton

この状態でボタンを押すと以下のようにMACアドレスが表示されるはずです。

https://camo.githubusercontent.com/3d35efffb1fd83e942c77ddd8b95c7e186576b7a/687474703a2f2f692e696d6775722e636f6d2f426e676f6b50432e706e67

あとはこのMACアドレスをプログラム中に埋め込むだけです。

var dash_button = require('node-dash-button');
var dash = dash_button("8f:3f:20:33:54:44", null, null, 'all'); //address from step above
dash.on("detected", function (){
    // ここに任意の処理を書く
});

ちなみに実行は自分の場合はsudoをつける必要がありました。

$ sudo node hook.js

簡単ですね!!

Akerunを開ける

方法としては社内限定公開のAPIを叩く方法と荒業としてURL鍵をヘッドレスブラウザから叩く方法があります。 現在公開されているAPIについては、以下のAkerun Developersサイトを御覧ください。

photosynth-inc.github.io

今回は現時点で誰でも使用できるURL鍵を用いた方法を紹介します。

まずヘッドレスブラウザであるphantomjsをインストールします。

github.com

こんな感じでRaspberry Pi用にビルドしたものをダウンロードして使うのが早いです。

wget https://github.com/hamidnazari/raspi-armv7l-phantomjs/raw/master/phantomjs-2.0.0.tar.gz
tar zxfv phantomjs-2.0.0.tar.gz
sudo mv phantomjs /usr/local/bin/

これでphantomjsの準備はできました。

次にURL鍵を用意します。URL鍵とは、Akerun ManagerというAkerunの鍵の管理画面から発行できるURLをブラウザで開くと、そこでAkerunの解錠・施錠ができるというものになります。 使用するためには、Akerun RemoteというAkerunとサーバーをつなぐためのゲートウェイバイスをセットしている必要があります。

Akerun Proを申し込んでもらった場合は、標準でRemoteもついてくるので、是非お試しください。

URL鍵には以下の情報が紐付いています。

  • 開閉したいAkerun(錠)
  • 開閉したいユーザー
  • 開閉したい日時や曜日(例えば平日の業務時間内などに限定できます)
  • URLでブラウザでアクセスしたときに入力するパスワード(推奨)

Amazon Dash Buttonを押せるのは、家やオフィスのWi-Fiにつながる場所だけとなりますが、無条件に開閉してしまうのが怖い場合は、是非時間帯の限定やパスワードを設定してください。

あとはphantomjsで叩くだけです。

var page = require('webpage').create();

page.open('<解錠用URL>', function() {
  page.evaluate(function() {
    document.querySelector("input[name=open]").click();
  });
  window.setTimeout(function() { phantom.exit(); }, 3000);
});

単純にこれを実行するなら、以下の用になります。

$ phantomjs akerun_open.js

このソースコードだとphantomjsという処理系でしか動かないので、nodeで動かす場合には工夫が必要ですが、今回は単純にCLIコマンドとして実行してみました。

function openAkerun() {
  var exec = require('child_process').exec;
  return exec('phantomjs akerun_open.js', function(error, stdout, stderr) {
    console.log('done');
  });
};

var dash_button = require('node-dash-button');
var dash = dash_button("8f:3f:20:33:54:44", null, null, 'all'); //address from step above
dash.on("detected", function (){
    openAkerun();
});

あとはこれを実行しておくことで、解錠できます!

実際にやってみる

f:id:photosynth-inc:20161210093650g:plain

Amazon DashからAkerunの解錠までできました!

実際に会社でしばらく使ったのですが、トイレに行ったあとの帰り道でボタンを押しておくとちょうどいいタイミングで解錠してくれたり、外で押したとしても、社内専用Wi-Fiにつながらない限り実行されないので、すごい安心感がありました。

まとめ

これは便利!

ということで、APIやWebツールなどAkerunをどんどん良くしてくれるエンジニアを募集しています!

www.wantedly.com