Amazon Dashボタンを使ったIoTデバイス「からあげDashボタン」の作り方

f:id:karaage:20170528094152j:plain:w640

「からあげDashボタン」

 「からあげDashボタン」に関して、先週「はてなニュース」に寄稿させていただきました。詳しくは以下記事を参照下さい。

 ブックマークコメントで、以下の通り宣言した通りちょうど一週間後にこの記事で「からあげDashボタン」の作り方や技術的内容を公開します。

Amazon DashボタンをHackして、妻を助けるためのIoTデバイス「からあげDashボタン」を作ってみました - はてなニュース

1週間後、私のブログに来てください。本当に電波な記事をお見せしますよ

2017/06/06 12:25

 最初に、今回もいつもの通りネット上の偉大なる先人の知見に大いに助けられましたことに感謝いたします。参考にした情報に関しては、本記事の最後でまとめてリンクをしてあります。どの記事も非常に有意義なものなので、興味ある方は全て一読することをお勧めします(私は全部の記事を何度も熟読しました)。

 今回の記事はそれらをまとめて、多少セットアップや使い方が楽になるような工夫をしただけという位置づけです。私が、先人の知見に大いに助けられたように、この記事が誰かにほんの少しでも役立てば嬉しく思います。

 これ以降の記事は以下くらいの読者を想定していますので、ご承知おき下さい。

  • Linux系OSのコマンドラインの操作がある程度できる
  • Raspberry Piを持っている/凄い興味がある

 全く知識ない人とっては、宇宙語しか出て来ませんので、ブラウザバックでお願いします。

「からあげDASHボタン」作り方

必要なもの

Amazon Dashボタン

 Amazon Dashボタンを購入するには、まずAmazon Prime会員になる必要があります。プライム会員になったら、好きなAmazon Dashボタンを買いましょう。

[asin:B01L2WS06U:detail]

Raspberry Pi 3

 Raspberry Pi 3を購入下さい。Raspberry Pi 2でも大丈夫と思います(動作は未確認)。

 周辺器機やセットアップ方法は以下参照下さい

ラベル

 オリジナルのラベルを作りたい場合は購入下さい。好きなものを購入すれば良いのですが、剥がせるものを使うと何度もやり直しできるので良いかなと思います。私は以下のものを使用しました。

その他

 「からあげDashボタン」とルンバを連携させたい場合は、以下記事参照して必要なものを購入してセットアップして下さい。

 家庭菜園の自動ブログ投稿したい場合は、以下記事参照して必要なものを購入してセットアップして下さい

 特に、撮影したい場合は、カメラが必須です。

Amazon Dashボタン設定

 まずはAmazon Dashボタンをセットアップしましょう。Amazonの以下のチュートリアル通りに5まで実施しましょう。

https://www.amazon.co.jp/gp/help/customer/display.html?nodeId=201746340

 6のところで、商品を選択しないように注意下さい。下記のような画面になったら、右上のxをタップしましょう。 f:id:karaage:20170505160700p:plain:w480

 ここでタップしないとボタンを押すたびに商品がどんどん購入されます。

 Amazon Dashボタン自体の設定はこれでOKです。使用したいAmazon Dashボタンに対して、全て設定下さい。

Raspberry Pi基礎設定

からあげDashボタン基本セットアップとテスト

 「からあげDashボタン」のシステムとしては、以下の図のようにAmazon Dashボタンの通知をRaspberry Piで受けて、Raspberry PiからWebサービスやデバイスにコマンドを送信するという流れになっています。 f:id:karaage:20170524014015j:plain:w640

 Raspberry Piで通知を受けてコマンドを送信する部分の仕組みは、以下サイトの内容をほぼそのまま使わせていただきました。

Amazon DashでおとうさんDashボタンをつくる | MUDAなことをしよう。

 具体的には、DasherというソフトでAmazon Dashボタンの通知を受けて、Webサーバ(Bottleという軽量小型なソフトを使っています)を経由してコマンドを発行しています。

 今回は、それらの仕組みをセットアップして使うためのGitHubのリポジトリを作成しました。その名も「karaage-dash-button」

 こちらを使えば、比較的簡単に「からあげDashボタン」を実現できるようになりますので、もし良ければ使用してみて下さい。使い方はREADMEにも書いてあるのですが、ここでも簡単に説明いたします。

 まずは、Raspberry Piの基本的なセットアップを実施します。Raspberry Piのセットアップに関しては、手前味噌になりますが、私が以前に書いた以下の記事を参照下さい。

 次に、Raspberry Piのターミナルで、以下コマンドを実行してリポジトリのclone(コピー)と必要なライブラリをセットアップします。

$ cd
$ git clone https://github.com/karaage0703/karaage-dash-button
$ cd karaage-dash-button
$ ./setup.sh

 セットアップが完了したら、一旦以下コマンドで再起動します。

$ sudo shutdown -r now

 続いて、設定をします。エディタで.configファイルを編集して下さい。

$ vim ~/karaage-dash-button/.config

 中身は以下のようになっています。

[settings]
hosturl = 192.168.xx.xx

[twitter_settings]
consumerKey = 
consumerSecret = 
accessToken = 
accessSecret = 

[slack_settings]
slackURL = https://hooks.slack.com/services/xxx

 まずは、hosturlを設定しましょう。Raspberry Piで以下コマンドを実行してIPアドレスを確認しましょう。

$ ifconfig

 192.168.xx.xxなどと書かれた数字がIPアドレスですので、そのアドレスをhosturlに入力して下さい。他の項目はとりあえず空欄のままでOKです。

 これで最低限の設定は完了しましたのでテストをしてみましょう。

 Raspberry Pi上で以下コマンドを実行します。

$ cd ~/karaage-dash-button
$ python test_dash.py

 続いて、ブラウザを起動しましょう。これはRaspberry Piと同じネットワーク上のPC上のブラウザならどのブラウザでも構いません。もちろんRaspberry Pi上のブラウザでもOKです。今回は同じネットワークにあるMacのSafariを使いました。

 続いて、test_dash.py上で設定しているipアドレスとポート番号にcallします。例えばipアドレスが192.168.10.123、ポート番号が10080だったら、http://192.168.10.123:10080/callというアドレスをブラウザのアドレスバーに以下のように入力します。アドレスの部分には、raspberrypi.localといったホスト名を入れても大丈夫です。 f:id:karaage:20170521124321p:plain:w640

 Raspberry Piで以下のように表示されれば、受け付け側はOKです。

192.168.10.123 - - [21/May/2017 12:48:16] "GET /call HTTP/1.1" 200 19
Test OK

 停止する場合は、Ctrl+Cを押しましょう。ここまででうまくいかない場合は、使用しているipアドレスが自分の環境と合っているか、bottleと呼ばれるWebサーバが正しくインストールされているかなどをチェックして下さい。

 続いては、Amazon Dashボタンの方の設定です。まずは、Amazon DashボタンのMacアドレスを確認します。以下実行してください。

$ cd ~/karaage-dash-button/dasher
$ sudo ./script/find_button

 以下のような表示が出るので、Amazon Dashボタンを押しましょう。高橋名人ばりに16連射する必要はありません

Watching for arp & udp requests on your local network, please try to press your dash now
Dash buttons should appear as manufactured by 'Amazon Technologies Inc.'

 以下のように表示されたらOKです。

Possible dash hardware address detected: b8:27:eb:xx:xx:xx Manufacturer: unknown Protocol: udp

 この場合はb8:27:eb:xx:xx:xxがDashボタンのMACアドレスになります。ここはAmazon Dashボタン固有のアドレスで、全てのAmazon Dashボタンが固有のアドレスを持っています。これをコピーしておきましょう。続いて、config.jsonファイルを作成します。

$ vim ~/karaage-dash-button/dasher/config/config.json

 中身は以下のようにします。addressの箇所にDashボタンのMacアドレス。urlには先ほど調べたRaspberry PiのIPアドレス(もしくはホスト名)を書いてください。

{"buttons":[
  {
    "name": "Karaage Dash Button",
    "address": "b8:27:eb:xx:xx:xx",
    "url": "http://192.168.xx.xx:10080/call",
    "method": "GET"
  }
]}

 では、今度はAmazon Dashボタンを使ってのテストを実施します。最初にtest_dash.pyを起動します。

$ cd ~/karaage-dash-button
$ python test_dash.py

 続けて別のウィンドウで以下コマンド実行して、dasherを起動して下さい。

$ cd ~/karaage-dash-button/dasher
$ sudo npm run start

 これでAmazon Dashボタンをトリガに、先ほどのアドレスにcallすることができます。試しにAmazon Dashボタンを押してみて下さい。うまくいけば、先ほどブラウザでテストしたときと同様にTest OKが表示されるはずです。

 ここでうまくいかない場合は、Amazon DashボタンのMacアドレスが正しく設定されているか等を中心に確認ください。

 これでAmazon Dashボタンと連携してRaspberry Piに様々な動作をさせる基本的なセットアップが完了しました。続いては、用途毎のセットアップ方法と使い方を説明していきます。実施したい内容に合わせて設定下さい。

Twitter連携

 twitterの連携をしたい場合は、あらかじめ以下のサイトでtwitterアプリを登録して、Consumer keyとAccess tokenをゲットする必要があります。携帯電話番号を登録しないといけないのがちょっとハードル高いですね。 https://apps.twitter.com

 続いて.configファイルの[twitter_settings]の項目に上記のアクセスキーの内容を書き込んで下さい。

 後は、以下実行しましょう。ツイートする内容はyakan_dash.pyに書かれているので、中身を直接書き換えて変えて下さい。

$ cd ~/karaage-dash-button
$ python yakan_dash.py

 config/config.jsonファイルは、DashボタンのMacアドレスとyakan_dash.pyで起動するサーバのポート番号(10081)に合わせて設定下さい。

{"buttons":[
  {
    "name": "Karaage Dash Button",
    "address": "b8:27:eb:xx:xx:xx",
    "url": "http://192.168.xx.xx:10081/call",
    "method": "GET"
  }
]}

 続けて別のウィンドウで以下コマンド実行して、dasherを起動して下さい。

$ cd ~/karaage-dash-button/dasher
$ sudo npm run start

 後は、先ほどのテストと同様にDashボタンを押すと、twitterに通知が来るようになります。

Slack連携

 Slack連携に関しては、平さん(id:mana-cat)の記事が非常に参考になりました。

 まずは上記サイトでSlackの登録とIncomingWebHookの設定を行ないWebhook URLを取得しましょう。

 次に、.configファイルの[slack_settings]の項目のslackURL = https://hooks.slack.com/services/xxx を取得したWebhook URLに書き直して下さい。

 後は、twitter連携と同じ要領でconfig.jsonを書き換えてofuro_dash.pydasherを起動してからDashボタンを押すだけです。

ルンバとAmazon Dashボタンの連携

 ルンバの改造は以下記事を参照下さい

 ただ、上記の標準のルンバ用のパッケージでは、ROS経由でルンバに掃除をさせるコマンドを送ることができませんでした。ただ、色々調べたら開発中のものが既に公開されているようだったので、そちらを試して使ってみることにしました。具体的には、以下でセットアップできます。

$ cd ~/catkin_ws/src
$ git clone https://github.com/AutonomyLab/create_autonomy.git 
$ cd create_autonomy.git
$ git checkout -b set_modes origin/set_modes
$ cd ~/create_ws
$ rosdep update  
$ rosdep install --from-paths src -i  
$ catkin build

 このソフトを用いれば、ルンバに搭載しているRaspberry Piで以下のようなコマンドを実行することで、ルンバのクリーンボタンを押すことと同じ操作ができるようになります。

$ rostopic pub /set_clean_mode ca_msgs/CleanMode "mode: 1"

 また、ルンバに搭載してるRaspberry PiのOSはRaspbianでなくUbuntuを使っている関係で、dasherを簡単にインストールすることができませんでした。そこで、ルンバ搭載のRaspberry PiではbottleでWebサーバのみ動かし、dasherは別のRaspberry Piで動かすという構成をとることにしました。

 なので、ルンバ搭載のRaspberry Piではkaraage-dash-buttonのリポジトリにあるセットアップスクリプトは使わず、以下のコマンドでbottleだけインストールします。

$ sudo apt-get install python-pip
$ sudo pip install bottle

 後は、ルンバ側のRaspberry Piで以下実行しましょう。

$ cd ~/karaage-dash-button
$ python roomba_dash.py

 後は、Dashボタンを受ける側のRaspberry Piで以下コマンド実行して、dasherを起動しましょう。

$ cd ~/karaage-dash-button/dasher
$ sudo npm run start

   これで、Dashボタンを押すたびに、ルンバのCleanボタンが押されたときと同じ動作をするようになります。

家庭菜園の栽培日記自動投稿

 家庭菜園の栽培日記の自動投稿に関しては、以下の「電波ガーデニング」にはてなブログへの投稿機能を付け加えることで実現しました。

 このはてなブログへの投稿機能が意外に曲者で、文章だけなら、はてなブログAPIを使って投稿する以下のようなpythonスクリプトで簡単に投稿できます。

 ただ、写真投稿も一緒となると、APIでは少し難しそうだったので、手軽そうなメールを使っての投稿を試みてみました。投稿用のメールアドレスは、はてなブログの管理画面の詳細設定にある投稿メールアドレスとなります。そのアドレスに画像付きのメールを送れば、はてなブログに画像付きの記事を投稿することができます。

 Raspberry Piからメール送るために、まずはGmailのアプリパスワードを取得します。2段階認証をオンにしないとアプリパスワードを取得できないので注意下さい。取得方法の詳細は以下サイトが参考になりました。

 2段階認証オンにすると、今まで使っていたメーラーなどのアプリのパスワードも、すべてアプリパスワードに変更する必要があるので注意下さい。

 あとは、pythonのスクリプトでメールを投稿するだけです。以下の記事のスクリプトの_user_passに、自身のGmailのアドレスとアプリパスワードを入力して実行したら、無事メールが送れました。

 実は、最初はsmmtp+mailutils(mailコマンド)+uuencodeの組み合わせでメールを送ろうと頑張っていたのですが、送信した画像添付メール、普通のメーラーでは受信できるのですが、画像付きだとはてなブログが投稿をどうしても受け付けてくれなかったので、諦めてpythonスクリプトで送ることにしました。結果的にはシンプルになったので良かったですが…

 Dashボタンとの連携に関しては、twitterやslackとの連携と同様に実施するだけですので、詳細は省略します。

 投稿した画像は以下のような感じです。 f:id:karaage:20170522012102p:plain:w640

 夫婦ブログに投稿しています

自動起動設定

 dasherと自作のpythonスクリプトを使用する必要があります。dasherの自動起動に関しては、以下を参考にしてください。

Running Dasher on a Raspberry Pi at startup · maddox/dasher Wiki · GitHub

 karaage-dash-buttonのリポジトリに自動起動の設定ファイルも用意してありますので、コピーするだけで設定できます。具体的には、以下コマンド実行ください。

$ cd ~/karaage-dash-button
$ sudo cp dasher_initd /etc/init.d/dasher

 以下コマンドで動作確認ができます。

$ sudo /etc/init.d/dasher start

 問題がなければ、以下コマンドで自動起動が設定できます。

$ sudo update-rc.d dasher defaults

 pythonのスクリプトに関しては/etc/rc.localを使用するのがよいでしょう。以下コマンドでファイルを編集します。

$ sudo vim /etc/rc.local

 ファイルのexit 0の前に以下のように、実行したいプログラムのコマンドを追記しましょう。

/usr/bin/python /home/pi/karaage-dash-button/yakan_dash.py &

exit 0

 あとは以下コマンドで再起動すれば、自動的に「からあげDashボタン」が動くようになっているはずです。

 Raspberry Piのプログラムの自動起動に関しては、以下記事でまとめていますので、詳しく知りたい方は参考にしてみてください。

qiita.com

ラベル作成

 ラベルは、以下の記事でテンプレートが公開されているので遠慮なく使用いたしました。

Amazon Dash Buttonを(正しくない方向で)使ってみた - Qiita

 デザインは、Macのプレビューで「けいおんフォント」を使用して作成しました。以下参照下さい。

 あとは、プリンタでシールラベルを印刷して貼るだけです。気をつける点は以下です。

  • 印刷設定は必ず等倍(100%)に
  • ラベルは剥がせるものにすると失敗したときのリカバがしやすいのと使い回しがきく
  • 切るのは結構難しい

まとめ

 「からあげDashボタン」の作り方をまとめてみました。もともとAmazon Dashボタンのハック、ちょろっと雑に試して終わるつもりだったのですが、はてなニュースに寄稿するということになり、寄稿した記事も解説記事もかなりのボリュームの記事となりました。ルンバを動かすところや、メールでのはてなブログへの写真投稿など結構はまるところもあって、普段だったら諦めていたかもしれません(笑)

 他にいくらでも応用考えられると思いますので、興味持った方は是非一部でもチャレンジしてみてください!

関連記事

参考リンク

Amazon DashでおとうさんDashボタンをつくる | MUDAなことをしよう。

Amazon Dash ButtonをただのIoTボタンとして使う - Qiita

Amazon Dash Buttonを(正しくない方向で)使ってみた - Qiita

http://tech-blog.shucream.net/entry/2016/12/07/160819

Amazon Dash Buttonの仕組みとハック - Qiita

http://eng-memo.hatenadiary.com/entry/2016/05/05/211419

Raspberry PiからSSMTPとMailコマンド(mailutils)でメール送信 | るとるのITぶろぐ

Raspberry Piからメールを送信する | ERMINE Corporation

Raspberry PiからSSMTPとMailコマンド(mailutils)でメール送信 | るとるのITぶろぐ