２Weekコンタクトの取り替え忘れ防止システム（AmazonDashButton->RaspberryPi->IFTTT->Googleカレンダー）

# はじめに

巷で人気の[AmazonDashButton](https://www.amazon.co.jp/Amazon-Dash-Button-%E3%83%80%E3%83%83%E3%82%B7%E3%83%A5-%E3%83%9C%E3%82%BF%E3%83%B3/b/ref=sd_allcat_dash_button_cons?ie=UTF8&node=4752863051)でのIoT。思いついたのがこれ。

**「2Weekコンタクトの取り替え忘れ防止システム」**

|![contact-dash.png](https://qiita-image-store.s3.amazonaws.com/0/203949/286f6fae-074e-850b-9785-889d27dacc8f.png)|
|:-:|

2Weekコンタクトを使っている人は分かると思いますが、いつ取り替えたをよく忘れます。
毎日とか毎週なら忘れにくいんですが隔週ってのがイカン。これを防止するために、

1. コンタクトを取り替える
2. AmazonDashButtonを押す
3. RaspberryPiで受信
4. IFTTTのWebHooksサービスで
5. Googleカレンダーに登録
6. 2週間後
7. Googleカレンダーから通知
8. あー、今日はコンタクト取り替えの日だ！
9. 1.へ

という流れ。
結局、このいうシステムは 1. と 5. が思い付くかどうかです。
で、色々、 1. を考えました。

- 植物の水やり
- 薬の服用
- 掃除

要は、数日間隔で作業が発生するものの場所にAmazonDashButtonを設置。
 # なにか良い案があれば教えてください

# ハード
- AmazonDashButton(evian)
- RaspberryPi
- Windows10(母艦)

# ソフト
- raspbian

# 手順
大まかな流れは以下です。#追って細かく？やります。

1. AmazonDashButton のセットアップ
2. RaspberryPi のセットアップ
3. IFTTT の作成
4. node-dash-button のインストール
5. AmazonDashButton のMACアドレスの取得
6. 発射！

どれも沢山情報がありますので検索してみてください。以下、簡単ですが説明です。

## AmazonDashButton のセットアップ
すでに詳しく書かれている方の記事がありますのでそちらを参照ください。
tokio-takedaさん：
[Amazon Dash Button でおうちハックしようその1 セットアップ編：簡単6ステップ](https://qiita.com/tokio-takeda/items/02bae474f8f20f35a02c)
上記中にもありますが、絶対に**「商品選択画面まできたら、何も選択せずにキャンセル」**してください。
私のiPhoneの場合には途中Bluetoothを使うことを聞かれたのでONでやりました。

## RaspberryPi のセットアップ
raspbianのインストールは色々なサイトにありますのでそちらを参照ください。
私の場合は、2017-09-07-raspbian-stretch を使用しました。
以前[こちら](https://qiita.com/nori-dev-akg/items/a8361e728a66a8c3bdba)に、記述しましたのでご参考ください。

## IFTTT の作成
みなさん IFTTT をご存知でしょうか？
私は何に使えば良いか分からず、スルーしておりました。
このシステムを作る際も Google Calendar API を使うつもりでした。
「AmazonDashButton RaspberryPi」でググっていたときにIFTTTの文字が入り「あーこういう時に簡単に使えるなｗ」と思いました。
IFTTT をこれから始める方は、簡単ですので一度サンプルを作成してみた方が良いと思います。スマホからもできますから。
私も今回が初めてだったので、IFTTT のサインアップから始めました。
Googleアカウントで良いということで、ラズパイ用にの新規にGoogleアカウントを作成しました。
普段使っているGoogleアカウントを使うには抵抗があったもで。

まずは、IFTTTにサインインしたら、「My Applets」をクリック。

|![キャプチャ.PNG](https://qiita-image-store.s3.amazonaws.com/0/203949/c2af5c23-2ded-13f5-6c5b-95ed3a40a607.png)|
|:-:|

次に、画面左上の「New Applet」をクリック。

|![キャプチャ2.PNG](https://qiita-image-store.s3.amazonaws.com/0/203949/b14fee22-f993-999e-0414-0f9a65a78895.png)|
|:-:|

次に、「＋this」をクリック。

|![キャプチャ3.PNG](https://qiita-image-store.s3.amazonaws.com/0/203949/dadb0da7-5679-f53c-9054-0316c6c2b025.png)|
|:-:|

次に、「webhook」と入力して出てきた「Webhooks」サービスをクリック。

|![キャプチャ4.PNG](https://qiita-image-store.s3.amazonaws.com/0/203949/1eaf0fba-55ce-1b3e-65d4-08e172f46991.png)|
|:-:|

次に、「Receive a web request」をクリック。

|![キャプチャ5.PNG](https://qiita-image-store.s3.amazonaws.com/0/203949/5a7ea396-6d4a-fb2a-bec5-ceecffb435ef.png)|
|:-:|

次に、EventName に 「Contactlens」(なんでも可)と入力して、「Create Trigger」をクリック。
**EventName は、あとで使いますからメモしておいてください**


|![キャプチャ6.PNG](https://qiita-image-store.s3.amazonaws.com/0/203949/6ceb5a35-0ee4-144b-9cec-8fa930aa7d00.png)|
|:-:|

次に、「＋that」をクリック

|![キャプチャ7.PNG](https://qiita-image-store.s3.amazonaws.com/0/203949/1e3cea85-8ee8-75e0-1e92-113f1a842d03.png)|
|:-:|

次に、「google」と入力して「Google Calendar」をクリック。

|![キャプチャ8.PNG](https://qiita-image-store.s3.amazonaws.com/0/203949/6e526ff7-2272-5b4f-a3cc-ae70466cab0e.png)|
|:-:|

次に、Choose action で「Quick add event」をクリック。

|![キャプチャ9.PNG](https://qiita-image-store.s3.amazonaws.com/0/203949/c34d95fb-35cb-3f62-9430-122307bf1068.png)|
|:-:|

次に、Complete action fields の Quick add text を編集します。内容をクリックすると編集モードになるので
「{{Value1}} コンタクト取替」と入力して「Create action」をクリック。
 #「Add ingredient」をクリックすると {{Value1}} を入れる選択BOXがでます。

|![キャプチャ10.PNG](https://qiita-image-store.s3.amazonaws.com/0/203949/4b2184b5-40d5-2a95-bb7f-d6cc1fd66273.png)|
|:-:|

次に、「Finish」で終了です。

| ![キャプチャ11.PNG](https://qiita-image-store.s3.amazonaws.com/0/203949/e1d449a3-c44f-9f1f-304d-dc4d9488109d.png) |
|:-:|

これで IFTTT の設定は完了です。

次に、YourKey というものを確認します。
My Applets の中に作成した Applet があるのでそれをクリックして、下記の黄色い部分をクリックしてください。

|![キャプチャ12.PNG](https://qiita-image-store.s3.amazonaws.com/0/203949/d2a53ff1-3bad-870a-84a8-18b810554618.png)|
|:-:|

次に、下記のような画面になるので「Documentation」をクリック。

|![キャプチャ13.PNG](https://qiita-image-store.s3.amazonaws.com/0/203949/eb58622e-11bb-4b44-163f-13a5a16f1239.png)|
|:-:|

次に、下記のような画面になるので **Your key is: をメモしてください。**

|![キャプチャ14.PNG](https://qiita-image-store.s3.amazonaws.com/0/203949/c4da8a7f-370d-2dc4-a35d-e9534ce5d05e.png)|
|:-:|

次は、node-dash-button です。

## node-dash-button のインストール
[node-dash-button](https://github.com/hortinstein/node-dash-button) とは：
AmazonDashButtonが押された時の通信を見張り、それをキッカケに何かをさせようとするもです。
なのでLAN内に常時駆動しているサーバが必要になります。 

すでにRaspberryPiで遊んでいる方の環境ですと、ほとんど必要なものはインストール済だと思います。

```
$ sudo apt-get install libpcap-dev
$ sudo apt-get install npm

$ npm install node-dash-button
```
node-dash-button のインストールは以上です。


## AmazonDashButton のMACアドレスの取得
ここからがハッキングに入ります。AmazonDashButton のMACアドレスを調べます。
先程インストールした node-dash-button に調査用のモジュールが含まれます。
それを起動しておいて AmazonDashButton を押すとMACアドレスが表示されます。

```
$ cd node_modules/node-dash-button
$ node bin/findbutton
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.'
Possible dash hardware address detected: XX:XX:XX:XX:XX:XX Manufacturer: Amazon Technologies Inc. Protocol: udp
```

「XX:XX:XX:XX:XX:XX」の部分が MACアドレスです。これをメモ。

## node-dash-button の実行スクリプト
次に、上記の MACアドレス「XX:XX:XX:XX:XX:XX」が来たら、IFTTT へ繋ぐスクリプトです。

package.json はこんな感じ

```json:package.json
{
  "name": "cantact-dash",
  "version": "1.0.0",
  "description": "",
  "main": "index.js",
  "scripts": {
    "start": "node index.js"
  },
  "author": "",
  "license": "ISC",
  "dependencies": {
    "node-dash-button": "^0.6.1"
  }
}
```

実行スクリプトはこんな感じ

```js:index.js
var dashButton = require('node-dash-button');
var request = require('request');

var macAddr = 'XX:XX:XX:XX:XX:XX';
var iface = 'wlan0'; // null/eth0/en0 のいずれか
var timeout = '5000';
var protocol = 'udp'; // null/udp/arp のいずれか
var yourKey = 'Yourkey';  // メモしたYourKey
var eventName = 'EventName '; // メモした EventName 

var dash = dashButton(macAddr, iface, timeout, protocol);

//ヘッダーを定義
var headers = {
  'Content-Type':'application/json'
}

//オプションを定義
var options = {
  url: 'https://maker.ifttt.com/trigger/' + eventName + '/with/key/' + yourKey,
  method: 'POST',
  headers: headers,
  json: true,
  form: {"value1": ""}
}

dash.on('detected', () => {
  var now = new Date();
  now.setDate(now.getDate()+14);  // 2週間後
  now.setHours(now.getHours()-9); // 時差が9時間発生するので -9

  options.form.value1 = now.getFullYear() + '/' + (now.getMonth()+1) + '/' + now.getDate() + ' ' + 
                        now.getHours() + '00-' + now.getHours()+ '00';
 
  // リクエスト送信
  request(options, function (error, response, body) {
    console.log('send:' + options.form.value1);
  });
});

```
結果はこんな感じ

```
$ sudo npm run start

> contact-dash@1.0.0 start /home/pi/contact-dash
> node index.js

send:2017/10/17 1400-1400
```

|![contact-dash3.png](https://qiita-image-store.s3.amazonaws.com/0/203949/d8979bab-bcfd-b906-9e2c-e154362a7863.png)|
|:-:|


もしエラーや受信できないときは、スクリプト中の 'protocol' と 'iface' の組み合わせを変えてみてください。
私の環境では上述でした。

それでは、良い ラズパイ & ADB ライフを。