読者です 読者をやめる 読者になる 読者になる

shucreamTech

web系エンジニアが意識低く書くブログ

Amazon Dash Button で Hue を操作する

巷で話題の Amazon Dash Button ですが、早速買って遊んでみました。

私が購入したのはSUNTORYの天然水ボタンなのですが、まずは普通にセットアップして天然水を注文して感動しましたね...!!

「オレ、ボタン、オス ミズ、トドク。スゴイ」みたいな、そんな。

(その後追加でネスカフェファブリーズ も買いました)

やっぱ男の子ってボタン押すの好きですから。バスの「降ります」ボタンとか絶対一番に押したかったですもん。大人になった今でもバス乗ったら"ボタンは俺が押す"という気持ちは変わっていません。

IoTボタンとして使えるじゃん

さて、そもそも AWS IoT Button というものがあって、これは約20ドルで色々出来るボタンなわけですが、今回の Amazon Dash Button はそれの機能制限版ということになります。

AWS IoT Button との違いは、予め決められた動作(Amazonで既定の商品を購入する)以外のことが出来ないという点と、そのために500円という超安価で販売されている点です。 なお、この Amazon Dash Button 経由で注文すると初回に500円割り引かれるため、デバイス自体は実質無料ということになります。凄い。

ところが、Amazon Dash Button で予め決められた動作以外のことをさせたくなるのがエンジニアなわけですね。 (多分Amazonとしてもこうやっておもちゃにされることは分かっているでしょう)

もう既に 「Amazon Dash Button で ◯◯やってみた!」系のエントリーがいくつも上がっているのですが、今回はRestAPI経由で操作できる電球 Philips Hue と連携をしてみようと思います。

やること

今まで Hue は公式アプリがそれなりに優秀なため、それに頼ってきました。 しかし、先述の通りRestAPIを経由して操作することも可能なため、

  • 明かりを消すボタン
  • 明かりを点けるボタン

以上2つのボタンを実装・設置してみたいと思います。 枕元に設置して、寝る時にポチッと押せば電気が消えるのは最高です!!

必要なもの

Amazon Dash Button に関しては、どの商品でも構いません。 また、ボタンからのシグナルを拾うために常時動かしておけるサーバーが必要です。 これはまぁなんでも良いのですが、私はRaspberryPi Zero を使うことにしました。 大体どこのご家庭にもあると思います。

セットアップ

さて必要なモジュールを入れたりして設定をしていくんですが、

f:id:shucream0117:20161207010431j:plain:w350

↑この時点でもうワクワク感凄くないですか????最後まで頑張っていきましょう!!

サーバー

先述の通り、 RaspberryPi Zero を使用しますが、RaspberryPi Zero 自体の設定については割愛します。 OSインストール、IP固定、gitインストール、sshログイン あたりまでできれば準備完了だと思います。

node.js をインストール

まずこれ。

$ sudo apt-get autoremove nodejs # 古い node.js を削除
$ sudo apt-get install libpcap-dev

次に、dasher という素晴らしいライブラリがあったのでこれを使ってみます。

一応、行儀よく(?) nodebrew をインストールしておきます。

$ curl -L git.io/nodebrew | perl - setup
$ echo 'export PATH=$HOME/.nodebrew/current/bin:$PATH' >> ~/.bashrc
$ source ~/.bashrc

続いて、node.js の 2016年12月6日時点でのstable v6.9.1 をインストールします。

$ nodebrew install-binary v6.9.1
$ node -v
$ npm -v

sudoで node.js を実行できるように、

$ sudo visudo

で、

# Defaults        secure_path="/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:...
Defaults        env_keep += "PATH"

secure_path の行をコメントアウトして、 env_keep の行を追記しておきます。

$ sudo node -v # ちゃんと動けばオッケー

Hue

ブリッジのIPアドレスを調べる

公式アプリの 設定 → Hueブリッジ → ネットワーク設定 から、DHCP をonにするとブリッジのIPアドレスが表示されます。

API実行ユーザを作成する

APIを実行するためにはユーザの作成が必要なようです。

$ curl -X POST http://{ブリッジのIP}/api \
-H "Accept: application/json" \
-H "Content-type: application/json" \
-d '{"devicetype": "amazon_dash_button"}'

リクエストボディの devicetype に任意の文字列(10~40文字)を指定し、ブリッジのボタンを押してから 実行します。 なお、ググると古い記事では username パラメータを指定していますが、公式のアナウンス の通り、現在の最新ファームウェアでは username は指定不可となっています。

そしてその username は上記リクエストのレスポンスで払い出されるので、これを控えておきます。

[{"success":{"username":"your_user_name"}}]

ちなみに、ブラウザで http://{ブリッジのIP}/debug/clip.html へアクセスするとAPIのデバッガが表示されます。

試しに /api/{ユーザ名} で GET リクエストを飛ばしてみると、ランプの状態が取得できるのではないでしょうか。

f:id:shucream0117:20161207022742p:plain

こんな感じで。

/api/{ユーザ名}/lights/{電球ID}/state{"on": false} で PUTリクエストを飛ばすと電気が消えますね。

f:id:shucream0117:20161207022802p:plain

API ドキュメント

なお、Hue API のドキュメント はユーザー登録しないと閲覧できないので、おとなしく登録しましょう。

ライブラリ

https://www.developers.meethue.com/tools-and-sdks こちらもユーザ登録をしないと閲覧出来ないのですが、一通りの言語でライブラリが提供されています。

ですが、使いません!!

というのも、今回はシンプルに全ての電球に対して単一の設定を適用できればよいので、素の HueAPI を dasher から叩くので充分でしょう。

Amazon Dash Button

さて肝心のボタンですが、注意点が1つあります。 それは セットアップを完了させないこと です(セットアップが完了してしまうとボタンを押す度に注文が実行されてしまう)。

f:id:shucream0117:20161207025325p:plain:w350

↑この画面で、右上のバツ印を押し、キャンセルします。

f:id:shucream0117:20161207025417p:plain:w350

↑このような状態になれば良いようです。

なお、一度セットアップを完了した後でも初期化が可能なので、まずは一度正規の方法で利用して500円引きの恩恵を受けると良いと思います。

初期化手順については Dash Buttonを無効化する に記載されています。

やる

Dasher

基本的には 本家Dasher の導入手順 そのままです。 が、プロトコルが arp のものしかフックしないようになっているようです。 どうやらボタンのバージョンによっては udp をフックする必要があり、ライブラリ側の対応が待たれます。 このプルリクエスト がマージされれば解決しそうです。 今回はこの方がフォークしている コチラのリポジトリ から clone してくることにします。

$ git clone git@github.com:almcelmon/dasher.git
$ cd dasher
$ npm install

Amazon Dash Button のMACアドレスを調べる

$ script/find_button
Possible dash hardware address detected: 34:d2:70:98:39:13 Manufacturer: unknown Protocol: udp

Manufacturer: unknown が Amazon Dash Buttonです。 (※ ボタンによっては Manufacturer: Amazon Technologies Inc. と出たものもありました)

$ cp config/config.example.json config/config.json
$ vi config/config.json # ←編集する
$ npm install
$ sudo npm run start

config/config.jsonは以下のような感じです。

{"buttons":[
  {
    "name": "消すボタン(ネスカフェ)",
    "address": "88:71:e5:9a:d4:41",
    "method": "PUT",
    "interface": "wlan0",
    "timeout": "60000",
    "protocol": "udp",
    "json": true,
    "url": "http://{HueブリッジのIP}/api/{APIユーザ名}/groups/1/action",
    "body": {"on": false}
  },
  {
    "name": "点けるボタン(天然水)",
    "address": "34:d2:70:98:39:13",
    "method": "PUT",
    "interface": "wlan0",
    "timeout": "60000",
    "protocol": "udp",
    "json": true,
    "url": "http://{HueブリッジのIP}/api/{APIユーザ名}/groups/1/action",
    "body": {"on": true}
  }
]}

動作確認

こんな感じです。 たまにボタン押しても無反応(体感で3〜4割ぐらい)なのがツラいですね。 原因が分かっていないのですが、時間のある時に調べてみます。

今後

単純な消す・点けるだけではなく、もう少し凝った照明設定を一発で呼び出せるようにしてみようと思います。