スマホのバッテリ過充電を防ぎたくて、Google Homeの力を借りてみた

力を借りてみたと言っても、スマホのバッテリが80%充電に達したら、Google Homeに喋らせる、ただそれだけです。

背景
---
毎日スマホやタブレットを何台も充電していますが、充電が終わったのに気づかず過充電のまま放置していることが結構あります。結構というか毎回です。自宅のどこに居ても、充電終了がわかるようにしたいと思いました。

流れ
---
1.Raspberry Pi で簡易Webhook を動かします。
2.Androidスマホに[MacroDroid - デバイス自動化](https://play.google.com/store/apps/details?id=com.arlosoft.macrodroid&hl=ja)をインストールし、「電池>=80%」なら Webhook へ「機種名◯◯」を通知します。
3.Webhookが通知を受けたら、Google Homeへ「◯◯の充電を終えてください。」と喋るよう通知します。

参考：[Qiita - Webhookとは？](https://qiita.com/soarflat/items/ed970f6dc59b2ab76169)

システム構成
---
![battery-notify.png](https://qiita-image-store.s3.amazonaws.com/0/63318/fbbebab8-b8e6-8611-43ef-357f34643879.png)


Raspberry Piの設定
---

1.Raspbian Stretchのパッケージ更新

```shell-session
$ cd
$ sudo apt-get update
$ sudo apt-get upgrade
$ sudo apt-get dist-upgrade
$ lsb_release -a
No LSB modules are available.
Distributor ID:	Raspbian
Description:	Raspbian GNU/Linux 9.3 (stretch)
Release:	9.3
Codename:	stretch
```

2.Node.jsとnpmのインストール

参考：[Qiita - Ubuntuに最新のNode.jsを難なくインストールする](https://qiita.com/seibe/items/36cef7df85fe2cefa3ea)

```shell-session
$ sudo apt-get install nodejs npm
$ sudo npm cache clean
$ sudo npm install n -g
$ sudo n stable
$ sudo ln -sf /usr/local/bin/node /usr/bin/node
$ node -v
v9.4.0
$ sudo apt-get purge nodejs npm
```

3.Node.js+Expressで簡易Webhookを作成

参考：[Qiita - Node.js + Express 4.x + MongoDB(Mongoose)でRESTfulなjsonAPIサーバの作成を丁寧に解説する．+ テストクライアントを用いたAPIテストまで](https://qiita.com/shopetan/items/58a62a366aac4f5faa20)
参考：[初心者のための Node.jsプログラミング入門 - ](http://libro.tuyano.com/index3?id=1162003)
参考：[Qiita - Google Home開発入門 / google-home-notifier解説](https://qiita.com/SatoTakumi/items/c9de7ff27e5b70508066)
参考：[GitHub - noelportugal/google-home-notifier
](https://github.com/noelportugal/google-home-notifier)


```shell-session
$ npm init
$ npm install --save express
$ npm install --save body-parser

$ sudo apt-get install git-core libnss-mdns libavahi-compat-libdnssd-dev
$ npm install --save google-home-notifier
$ cp -p ./node_modules/mdns/lib/browser.js ./node_modules/mdns/lib/browser.js.org
$ vi ./node_modules/mdns/lib/browser.js
$ diff ./node_modules/mdns/lib/browser.js ./node_modules/mdns/lib/browser.js.org
117,122d116
< // Browser.defaultResolverSequence = [
< //   rst.DNSServiceResolve()
< // , 'DNSServiceGetAddrInfo' in dns_sd ? rst.DNSServiceGetAddrInfo() : rst.getaddrinfo()
< // , rst.makeAddressesUnique()
< // ];
< 
124c118,119
<   rst.DNSServiceResolve(), 'DNSServiceGetAddrInfo' in dns_sd ? rst.DNSServiceGetAddrInfo() : rst.getaddrinfo({families:[4]})
---
>   rst.DNSServiceResolve()
> , 'DNSServiceGetAddrInfo' in dns_sd ? rst.DNSServiceGetAddrInfo() : rst.getaddrinfo()
```
(1). mywebhook.js を作成します。

```js:mywebhook.js
// 必要なパッケージの読み込み
var express = require('express');
var app     = express();

const googlehome = require('google-home-notifier')
const language = 'ja';
googlehome.device('Google-Home', language);

// 3000番を指定
var port = process.env.PORT || 3000;

// expressでAPIサーバを使うための準備
var router = express.Router();

router.get('/', function(req, res) {
  var m = req.query.m;

  if ( m ) {
    googlehome.notify(m+'の充電を終えてください。', function(res) {
      console.log(res);
    });
    res.json({ message: 'OK' });
  }
});

// ルーティング登録
app.use('/api', router);

//サーバ起動
app.listen(port);
console.log('listen on port ' + port);
```

(2). mywebhook.js を実行します。

```shell-session
$ node mywebhook.js
listen on port 3000
```

(3). mywebhook.js の動作確認をします。
Raspberry Pi の IPアドレスは 192.168.3.210 とします。

```shell-session
$ curl http://192.168.3.210:3000/api?m=Nexus4
```
Google Home から「Nexus4の充電を終えてください。」と聞こえたら問題ありません。


5.supervisor で mywebhook.js をデーモン化する

```shell-session
$ sudo apt-get install supervisor
$ sudo vi /etc/supervisor/conf.d/mywebhook.conf
```

```shell-session:/etc/supervisor/conf.d/mywebhook.conf
[program:mywebhook]
command=/usr/bin/sudo /usr/bin/node /home/pi/mywebhook.js
numprocs=1
autostart=true
user=pi
```

```shell-session
$ sudo reboot
```

Androidスマホの設定
---
1.[MacroDroid - デバイス自動化](https://play.google.com/store/apps/details?id=com.arlosoft.macrodroid&hl=ja)をインストールします。

2.マクロを作成します。

(1).「トリガー」
電池残量
⦿指定残量への増加／減少時
⦿〜まで増加
80%

(2).「アクション」
Webサイトを開く／HTTPを取得
http://192.168.3.210:3000/api?m=Nexus4
☑HTTP GET (Webブラウザ不使用）

<img src="https://qiita-image-store.s3.amazonaws.com/0/63318/a637905e-86aa-42fd-7f6c-3217a9e6214b.png" width=40%>

最後に
---
これを使って、今も現役で使っている Galaxy Ace や Nexus4 をずっと大切に使っていきたいと思っています(=^・^=)