Home AssistantとAmazon Dash Buttonを連携させる

Amazon Dash Buttonは間違った使い方ができることで有名だが,Amazon Dash ButtonからHome Assistantでアクションをキックできるようにしてみる.

Amazon Dash Buttonのハック

ネットに情報は溢れているため詳しい説明は省略する.
本来のAmazon Dash Buttonはボタンを押すことであらかじめ設定した商品を注文するためのものだが,その過程で発生するパケットをトリガーに利用して, ボタンを押すことで任意の処理を実行させようというもの.

仕組みの概要

Amazon Dash Buttonと連携するComponentは過去に提案されている.
Amazon Dash Component? · Issue #484 · home-assistant/home-assistant

主に以下の理由により却下されている

  • Dash ButtonのためだけにHome Assistantをrootで動かすのは受け入れられない
  • Dash Buttonの代わりにAWS IoTボタンやESP8266を使えば同じようなことが実現できる

このIssueの中ではmaddox/dasherを使うよう提案されているが,いくつかの個人的な理由によりツールを自作した.

  • 検知対象に利用しているARP probeパケットが自分の環境ではほとんどキャプチャできなかった
  • Home Assistant用として使うには設定ファイルが複雑すぎる
  • Node.jsがよくわからない

作成したコードはGithubで公開している.

  • ARP probeの代わりにDHCP Discoverパケットをキャプチャする
  • 設定ファイルに書く内容は,Home Assistantと組み合わせて使用するための最低限の項目に絞っている
  • Python製

仕組みは以下の通り

  1. dash-haサーバでボタン押下を検知
  2. ボタンのMACアドレスに応じて,Home AssistantへREST APIでイベントを発火させる
  3. Home AssistantのAutomationでそのイベントをトリガーにアクションが実行されるようにしておく
  4. ボタンを押すとそのAutomationが実行される

ボタン押下を検知するサーバの用意

ボタン検知を検知するためのサーバを用意し,専用のプログラムを走らせておく.自分はHome Assistantが稼動しているRaspbery Pi 2 Model Bで動かしている. 以下のような感じでインストールする.

sudo apt -y install tcpdump python-scapy
sudo mkdir /srv/dash-ha
cd /srv/dash-ha
sudo wget https://raw.githubusercontent.com/uyorum/play-amazon-dash-button/master/home-assistant/dash-ha.py
sudo chmod +x dash-ha.py

設定ファイルは以下のような内容

$ cat /srv/dash-ha/config.yaml
home_assistant:
  host: 127.0.0.1
  port: 8123
buttons:
  - mac: XX:XX:XX:XX:XX:XX
    event: dash_button_nescafe
  - mac: YY:YY:YY:YY:YY:YY
    event: dash_button_evian

上の例だと,MACアドレスXX:XX:XX:XX:XX:XXのDash Buttonが押されるとHome Assistantでdash_button_nescafeというイベントが発火するようになる.
いちおうHome Assistant側で認証を有効にしていた場合も対応できるようしている.(Githubに上げた設定例を参照)

起動,停止はSystemdで管理する.

$ systemctl cat dash-ha
# /etc/systemd/system/dash-ha.service
[Unit]
Description=Integrate Amazon Dash Button and Home Assistant
After=network.target

[Service]
Type=simple
User=root
ExecStart=/usr/bin/python /srv/dash-ha/dash-ha.py
Restart=always

[Install]
WantedBy=multi-user.target
$ sudo systemctl enable dash-ha
$ sudo systemctl start dash-ha

Home Assitatntの設定

Home Assistant側ではイベントdash_button_nescafeをトリガーとするAutomationを設定しておく.

automation:
  - alias: Toggle ceiling light
    trigger:
      platform: event
      event_type: dash_button_nescafe
    action:
      service: homeassistant.toggle
      entity_id: light.livingroom_ceiling_light

これでボタン押下を検知したらアクションが実行されるようになる.

以上.

関連記事

comments powered by Disqus