Dasher不要!Raspberry Piにamazon-dashをpip installで宅内IoTボタン化計画

はじめに

Amazon Dashボタンの改造に関する記事をよく見かけます。ただ、その多くはDasherというOSSの使用を想定しているのですが、2019年2月現在、Dasherはメンテナンスが止まっています。

f:id:swytel:20190219170512p:plain
Dasherの使用は非推奨になっていました。のーん...

そこで本家も勧めている、amazon-dashというpythonライブラリをRaspberry Piにpip installすることで、Amazon Dashの宅内IoTボタン化を試みます。さらに、Dashボタンの代表的な活用事例である(?)、ボタンを押すと家族Slackに通知(例:「牛乳買ってきて」)が飛ぶシステムの構築手順も解説します。

必要なもの

  • Raspberry Piが動く環境
  • Amazon Dash 1個〜
  • オプション:Slackのアカウント
  • オプション:IFTTTのアカウント

Raspberry Pi の設定

まず、OSを入れます。手順は次の記事に書きました。本体は、有線なり無線なり、何らかのネットワークモジュールが搭載されたものであれば大丈夫です。OSも、軽量なRaspberry Stretch Liteで十分です。 swytel.hatenablog.com

設定完了後、次に進みます。まずpython3の開発用ライブラリ等や、最新のpip3環境を入れます(Pythonは2.7系も試しましたが、3系の方がうまくいくようでした)

$ sudo apt-get update
$ sudo apt-get upgrade
$ sudo apt-get install python3-dev tcpdump
$ curl -kL https://bootstrap.pypa.io/get-pip.py | sudo python3
$ sudo pip3 install --update pip3

amazon-dashをpip installします。Amazon Dashからの通信を受信するものです。

$ sudo pip3 install amazon-dash
$ sudo python3 -m amazon_dash.install

以上で、Raspberry Pi側の下準備ができました。 ちなみに、2019年2月現在、amazon-dash-1.3.2.tar.gz がインストールされました。

Amazon Dashの設定

iPhoneAndroid等のAmazonショッピングアプリを開き、下記を参考に、設定を進めます。

Amazon.co.jp ヘルプ: スマートフォンでDash Buttonをセットアップする

  1. 「アカウントサービス」> 「バーチャルダッシュとDash Button端末」> 「新しい端末をセットアップ」
  2. 「同意して開始」をタップ
  3. 連携したい Dashボタンを長押し(画面が切り替わるまで)
  4. 自宅のWiFiを選択

ここでストップです。商品の選択画面になったら、下記画像のように「✗」マークを押して終了してください。ここで商品を選択すると、ボタンを押すたびに購入してしまうので...

f:id:swytel:20190219152924j:plainf:id:swytel:20190219153042j:plain
商品は選択せずに終了する
(画像は「参考リンク」にあるmitsuaki1229さんのQiitaから頂きました)

Amazon DashとRaspberry Piを連携する

いよいよ両者を連携する準備ができました。Amazon DashのMACアドレスを調べ、amazon-dashサーバに登録する作業を行います。Raspberry Piのコンソールに戻り

$ sudo amazon-dash discovery

とします。少し待って

Welcome to Amazon-dash v1.3.2 using Python 3.5.3
The discovery command lists the devices that are connected in your network. Each device will only be listed once. After executing this command wait approximately 10 seconds before pressing the Amazon Dash button. After pressing the button, the Mac address of the button will immediately appear on the screen. Remember the address to be able to create the configuration file.

とまで表示されたら、Dashボタンを押します。

xx:xx:xx:xx:xx:xx (Amazon Device)

のようなMACアドレスが表示されたら、控えておきます。なお(Amazon Device)と書いていないMACアドレスが出ても、無視してOKです。Ctrl-Cで終了します。

このMACアドレスamazon-dashサーバに登録します。試しに、ボタンを押したら "Hello World" というファイルを生成するようにしてみましょう(mitsuaki1229さんのQiitaを参考にさせていただきました)

$ sudo vi /etc/amazon-dash.yml
# amazon-dash.yml
# ---------------
settings:
  delay: 10
devices:
  xx:xx:xx:xx:xx:xx:
    name: Hello World
    user: pi
    cmd: echo "Hello World" >> HelloWorld.log
    cwd: /home/pi

amazon-dashサーバを起動します。

$ sudo systemctl start amazon-dash
$ sudo systemctl enable amazon-dash

ボタンを押して

$ cat /home/pi/HelloWorld.log
Hello World

と表示されれば成功です。

Amazonアプリの通知を切る

今のままでは、ボタンを押すたびに、スマホに通知が来てしまうと思います。

f:id:swytel:20190219155504j:plain
通知だらけになってしまう
「アカウントサービス」> 「バーチャルダッシュとDash Button端末」> 「Dash端末の管理」>「通知の設定」と進み、下の方にある「Dash Buttonの通知」をオフにすると、平和になります。

IFTTTやSlackとの連携

Amazon Dashボタンを押すと『牛乳買ってきて』メッセージをSlackに送信する」システムを作ります。名付けて Papa(Mama)zon Primeですかね? IFTTTのWebhookという仕組みを用いて実現します。

まず、次のサイトに行きます。

ifttt.com

画面右上の「Documentation」をクリックします。

f:id:swytel:20190219164657p:plain
Documentationをクリック

"Your key is..." の後に、でっかく表示された認証キーを控えておきます。

f:id:swytel:20190219164720p:plain
IFTTTの認証キー

amazon-dashサーバに登録します。Hello Worldの部分を消し、IFTTTの設定に置き換えます。

$ sudo vi /etc/amazon-dash.yml
# amazon-dash.yml
# ---------------
settings:
  delay: 10
devices:
  xx:xx:xx:xx:xx:xx:
    name: buy_milk
    ifttt: <<さっきの認証キー>>
    event: papazon_prime
    data: {"value1": "牛乳買ってきて"}

サーバを再起動します。

$ sudo systemctl restart amazon-dash

仕上げです。Dashボタン --> raspberry Pi (amazon-dashサーバ) --> IFTTT --> Slackという仕組みを完成させます。

  1. IFTTTの画面に戻り、画面右上から、New Appletを選択
  2. "+this" をクリックし、"Webhooks" > "Receive a web request" を選択
  3. "Event Name" に "papazon_prime" と入力し、"create trigger"
  4. "+that" をクリックし、"Slack" > "Post to channel" を選択
  5. SlackをIFTTTに連携したことがない方は、連携します.連携済の方は、メッセージを投稿したい Channelを選びます
  6. Message欄をいったんすべて消し、"Add Ingredients" > "Value 1" を選択
  7. Titleなどのオプションも削除し、"create action"
  8. "Finish" をクリック

以上でIFTTTとSlackの連携も完了しました。Dashボタンを押して、Slackチャンネルにメッセージが飛んだら完成です!お疲れ様でした。

ちなみに我が家では、この仕組みを応用して、育児記録システムを運用したいと思います。後日、これについても書きたいと思います。

参考リンク

Raspberry Pi 3 Model B+にamazon-dashをインストール - Qiita

Repurposing Amazon Dash buttons to add a line to Google Sheet when pressed | DEM Flyers