むにえる牧場

毎日むにえるをつくっています

Amazon Dash ButtonでLineに通知が送れるようにしてみた

Amazon Dash Buttonを押してLineに通知が送れるようにします

概要とか作り始めた理由とか

ちょっと流行遅れな気はしますが、Amazonボタンを利用してLineに簡単な通知を送れるようにしてみました。
ちなみに今回はpythonです。

二人暮らしをしているのですが、二人暮らしをしてるとお互いに家事の内容やらなんやらで、連絡を小まめに取らないといけないことがあります。
平日の朝、夕食に向けて炊飯をしてもらうことがあるのですが、
炊飯準備をしたという連絡をもっと楽にできるようにしたい!
と言われたので、Amazon Dash Buttonをポチッと押してLineに通知が飛ぶようにしてみました。

使ったもの

システム製作備忘録

Amazon Dash Button購入

Amazonで500円で購入できます。
今回はポカリスエット柄のボタンを購入!
上からシールとか貼り付けて用途に合わせてデザインしたら良い感じになるかもです。

f:id:jalemy:20180923211749j:plain:w500

Amazon Dash Buttonのセットアップ

iPhoneAndroidAmazonショッピングアプリを利用します。

[アカウントサービス] -> [新しい端末をセットアップ] -> [同意して開始]
-> wifiセットアップして、[次へ]
-> 商品を選択せずに、[×]

最後に商品を選択しないで終わることが重要です。
商品選択してしまうとAmazon Dash Buttonで遊んでるうちにどんどん商品が注文されてしまいます……。

amazon-dash module準備

pipで amazon-dash モジュールを入れます。
~ $ pip3 install amazon-dash
ここでpipのversionが古かったみたいで怒られました。

You are using pip version 10.0.1, however version 18.0 is available.
You should consider upgrading via the 'pip install --upgrade pip' command.

pipのupgradeを実行
~ $ pip install --upgrade pip

Collecting pip

  Downloading https://files.pythonhosted.org/packages/5f/25/e52d3f31441505a5f3af41213346e5b6c221c9e086a166f3703d2ddaf940/pip-18.0-py2.py3-none-any.whl (1.3MB)

    100% |████████████████████████████████| 1.3MB 5.0MB/s 

Installing collected packages: pip

  Found existing installation: pip 10.0.1

    Uninstalling pip-10.0.1:

      Successfully uninstalled pip-10.0.1

Successfully installed pip-18.0

無事upgradeされました。
upgradeしたところで再度pip3 install amazon-dashamazon-dash moduleを入れます。

amazon-dash moduleの設定

module installができたら、
sudo amazon-dash discovery
を実行

~ $ sudo amazon-dash discovery

Welcome to Amazon-dash v1.2.0 using Python 3.7.0

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.

38:f7:3d:b0:6f:90 (Amazon Device)

90:cd:b6:4c:cc:b3

1c:b1:7f:2f:c7:84

a4:5e:60:c6:ff:09

The discovery~~~ の文章が表示されてからAmazon Dash Buttonを押すと、Amazon Dash ButtonMac Addressが表示されます。
今回だと(Amazon Device)とくっついてるのがAmazon Dash ButtonMac Addressですね。
このMac Addressを利用して、ボタンの判別をするのでどこかにメモっておきます。

次いで、amazon-dash.ymlをつくります。
~ $ touch amazon-dash.yml
ここでamazon-dash.ymlにowner権限を付与しておきます。
~ $ sudo chown root amazon-dash.yml

amazon-dash.ymlの内容はこんな感じに

settings:
    delay: 10
devices:
    38:f7:3d:b0:6f:90:
        name: ポカリスエットボタン
        user: jalemy
        cmd: /Users/jalemy/Documents/amazon-dash-hack/line-notify.py

devicesの次行にメモしておいたMac Addressを
nameは好きな名前でいいのですが、Amazon Dash Buttonの柄などで名前つけておくとあとで判別しやすいと思います。
userは自分の名前
cmdに今回通知で利用するpython scriptへのリンクを書きます。

LineにPythonで通知を送れるようにする

続いて、PythonからLineに通知を送れるようにします。
下記のURL先でLineの開発者トークンを発行します。

https://notify-bot.line.me/ja/

f:id:jalemy:20180923215610j:plain:w500

グループやユーザーに対して1グループ1トークンといった発行になるので、先に通知に利用するグループを作成しておくと良いです。
そして、作成された開発者トークンをメモ

続いて、Lineの通知を行うPython Scriptを作成します。
Scriptの内容はこんな感じ

import requests

line_notify_token = "ここに開発者トークン"
line_notify_api = "https://notify-api.line.me/api/notify"

def notify(text):
    message = "\n" + text
    payload = {"message" : message}
    headers = {"Authorization": "Bearer " + line_notify_token}
    line_notify = requests.post(line_notify_api, data=payload, headers=headers)

notify('炊飯予約できたよ!!!')

このScriptを単体で実行すれば、設定したトークンに対応するグループに炊飯予約できたよ!!!と通知がいきます。

Amazon Dash Buttonを押して、Lineに通知が届くようにする

さて本題のAmazon Dash Buttonとの連携
~ $ sudo amazon-dash run
amazon-dash moduleを走らせます。
が、しかしamazon-dash.ymlの権限周りでエラーが出る。

Welcome to Amazon-dash v1.2.0 using Python 3.7.0

Listening for events. Amazon-dash will execute the events associated with the registered buttons.

[Error] Amazon Dash Exception (SecurityException):

There should be no permissions for other users in the file "/Users/jalemy/Documents/amazon-dash-hack/amazon-dash.yml". Current permissions: root:wheel 511. Removes write permission for others. Run "sudo chmod 660 '/Users/jalemy/Documents/amazon-dash-hack/amazon-dash.yml' && sudo chown root:root '/Users/jalemy/Documents/amazon-dash-hack/amazon-dash.yml'"

エラー文にはchmodで 660 を設定しろと書かれてますが、amazon-dash moduleのgithubを見に行ったら、
Mac OSでは600を設定しろとのこと。 ~ $ sudo chmod 600 amazon-dash.yml
権限の設定をすることによって、amazon-dash moduleを走らせることに成功しました。
しかしAmazon Dash Buttonを押してみたらエラー……

Exception in thread Thread-1:

Traceback (most recent call last):

  File "/usr/local/Cellar/python/3.7.0/Frameworks/Python.framework/Versions/3.7/lib/python3.7/threading.py", line 917, in _bootstrap_inner

    self.run()

  File "/usr/local/Cellar/python/3.7.0/Frameworks/Python.framework/Versions/3.7/lib/python3.7/threading.py", line 865, in run

    self._target(*self._args, **self._kwargs)

  File "/usr/local/lib/python3.7/site-packages/amazon_dash/listener.py", line 84, in execute

    result = self.execute_instance.execute(root_allowed)

  File "/usr/local/lib/python3.7/site-packages/amazon_dash/execute.py", line 167, in execute

    output = execute_cmd(cmd, self.data.get('cwd'))

  File "/usr/local/lib/python3.7/site-packages/amazon_dash/execute.py", line 69, in execute_cmd

    ' '.join(cmd), p.returncode, stderr

amazon_dash.exceptions.ExecuteError: Error running command sudo -s --set-home -u jalemy /usr/bin/env bash -c /Users/jalemy/Documents/amazon-dash-hack/line-notify.py: The error code 126 has returned. Stderr: bash: /Users/jalemy/Documents/amazon-dash-hack/line-notify.py: Permission denied

これはpython scriptの実行権限がないのが原因でした。
実行権限をつけて再びAmazon Dash Buttonをぽち。

Exception in thread Thread-1:

Traceback (most recent call last):

  File "/usr/local/Cellar/python/3.7.0/Frameworks/Python.framework/Versions/3.7/lib/python3.7/threading.py", line 917, in _bootstrap_inner

    self.run()

  File "/usr/local/Cellar/python/3.7.0/Frameworks/Python.framework/Versions/3.7/lib/python3.7/threading.py", line 865, in run

    self._target(*self._args, **self._kwargs)

  File "/usr/local/lib/python3.7/site-packages/amazon_dash/listener.py", line 84, in execute

    result = self.execute_instance.execute(root_allowed)

  File "/usr/local/lib/python3.7/site-packages/amazon_dash/execute.py", line 167, in execute

    output = execute_cmd(cmd, self.data.get('cwd'))

  File "/usr/local/lib/python3.7/site-packages/amazon_dash/execute.py", line 69, in execute_cmd

    ' '.join(cmd), p.returncode, stderr

amazon_dash.exceptions.ExecuteError: Error running command sudo -s --set-home -u jalemy /usr/bin/env bash -c /Users/jalemy/Documents/amazon-dash-hack/line-notify.py: The error code 2 has returned. Stderr: import: delegate library support not built-in '' (X11) @ error/import.c/ImportImageCommand/1297.

/Users/jalemy/Documents/amazon-dash-hack/line-notify.py: line 4: syntax error near unexpected token `('

/Users/jalemy/Documents/amazon-dash-hack/line-notify.py: line 4: `def notify():'

エラー内容で調べていたら、Xquartzというものを入れて、imagemagickx11で動くようにオプション付きでinstallしなければいけない様子。
ということで、
brew cask install xquartz
brew install imagemagick --with-x11
この状態で三度Amazon Dash Buttonをぽち。
しかしまだエラーが出ます……エラー内容が変わっているのでよく見る。

Exception in thread Thread-2:

Traceback (most recent call last):

  File "/usr/local/Cellar/python/3.7.0/Frameworks/Python.framework/Versions/3.7/lib/python3.7/threading.py", line 917, in _bootstrap_inner

    self.run()

  File "/usr/local/Cellar/python/3.7.0/Frameworks/Python.framework/Versions/3.7/lib/python3.7/threading.py", line 865, in run

    self._target(*self._args, **self._kwargs)

  File "/usr/local/lib/python3.7/site-packages/amazon_dash/listener.py", line 84, in execute

    result = self.execute_instance.execute(root_allowed)

  File "/usr/local/lib/python3.7/site-packages/amazon_dash/execute.py", line 167, in execute

    output = execute_cmd(cmd, self.data.get('cwd'))

  File "/usr/local/lib/python3.7/site-packages/amazon_dash/execute.py", line 69, in execute_cmd

    ' '.join(cmd), p.returncode, stderr

amazon_dash.exceptions.ExecuteError: Error running command sudo -s --set-home -u jalemy /usr/bin/env bash -c /Users/jalemy/Documents/amazon-dash-hack/line-notify.py: The error code 2 has returned. Stderr: import: unable to grab mouse '': Resource temporarily unavailable @ error/xwindow.c/XSelectWindow/9312.

import: unable to read X window image '': Undefined error: 0 @ error/xwindow.c/XImportImage/4943.

import: unable to read X window image '': Resource temporarily unavailable @ error/xwindow.c/XImportImage/5050.

import:  `requests' @ error/import.c/ImportImageCommand/1288.

/Users/jalemy/Documents/amazon-dash-hack/line-notify.py: line 3: syntax error near unexpected token `('

/Users/jalemy/Documents/amazon-dash-hack/line-notify.py: line 3: `def notify(text):'

エラー内容をよく見てみると、pythonのrequests moduleが正常にimportできていない様子。
調べてみると、Python Scriptがシェルスクリプトと誤認され、このようなエラーが出ることがあるようでした。
回避するために、

#!/usr/bin/env python3

と自分のつくったPython Scriptの先頭行に足して、Python Scriptであることを明示的に示すようにします。

四度目の正直、ここまで準備してAmazon Dash Buttonをぽちっ……
f:id:jalemy:20180923222253j:plain:w500
無事Lineグループに通知が届いて、相手からもお返事をもらうことができました!

まとめ

無事Amazon Dash Buttonを押してLineに通知が送れるようになりました。
今回はMacbookをサーバーとして動かしているので、日常的に使うならばRasberry Piとか準備して24時間体制で動かせるようにした方が良さそうです。
(そのうちやりたい……)

Amazon Dash Button増やして家事ごとにボタンわけても良いですし、Python Scriptをいじってなんか条件分けさせたり機能充実させていくのも楽しそうです。