スマートライフを考える

この記事は[リンク情報システム](https://www.lis.co.jp/)が主催するイベント「[Tech Connect! Autumn](https://qiita.com/dgkz/items/4c3a449f3168d6c787cf)」のリレー記事です。
「[Tech Connect! Autumn](https://qiita.com/dgkz/items/4c3a449f3168d6c787cf)」は engineer.hanzomon のグループメンバによってリレーされます。
（リンク情報システムのFacebookは[こちらから](https://ja-jp.facebook.com/lis.co.jp/)）

9日目の担当は@rysk001です。

# スマートライフとは？

タイトルで用いた**スマートライフ**は一般に認知された単語ではないです。
スマートホームとほぼ同じことを指してますが
<p>**ITの力を借りて（家に限らず）生活全般をちょっと便利にしよう。**</p>

それくらいの意味合いです。
スマート化は家に限ったものではないと思うので、概念を共有するためにあえて使っています。
~~ほとんどが家絡みですけどね。~~

今回はその考えと実践についてつらつらと書いていきます。


# きっかけ

スマートスピーカーの呪いに囚われているときに考え始めました。

というのも、

>・流行に乗って買ってみたがすぐ飽きてしまった。
>・確かに便利なシーンもあるが、**たまに認識失敗するしリモコン使った方が早くね？**と思う。
>・活用方法が思いつかず、ただのスピーカーになっている。

スマートスピーカーをお持ちのあなた、こんな経験ありません？

いま思うに、うまく活用できない原因はスマートスピーカーの役割を考えていなかったこと。
単体で役に立てればもちろんいいけど
スマートホームとして位置付けを考えると役割は基本的に二つ。

- ユーザから音声による入力を受け付ける
- ユーザに音声で通知する

これに尽きる。

本来はスマート化したいシーンがあってうまく当てはまるときに使えばいいのに
スマートスピーカーをなんとか活用しようとして無駄に使ってしまう。
そしてしっくりこないので、微妙に感じてしまうという呪いです。

面白いことに、「なんとか活用しよう」と思わなくなったら活用法を思いつくようになりました。

# やりたいことの検討

ITの力を借りてスマートに生活したいですよね。
近い未来にはパッケージ化して提供されるようになって自然に生活に組み込まれるんでしょう。
でも現時点においては、楽するために苦労するという矛盾はさておき
自力で工夫して便利さを手に入れる必要があります。
生活の中の「こういうときはこうなってほしい」というシーンがあればスマート化の検討に値します。

例えばトイレを分析してみましょう。
行動を大ざっぱに分解するとこんな感じ。

1. <font color="Red">ライトを付ける</font>
- <font color="Red">扉を開ける</font>
- 入る
- <font color="Red">扉を閉じる</font>
- 致す
- <font color="Red">流す</font>
- 手を洗う
- <font color="Red">扉を開ける</font>
- 出る
- <font color="Red">扉を閉じる</font>
- <font color="Red">ライトを消す</font>

トイレの本質を考えると赤字部分は無駄な行動なので、できるだけ削減したい。
なのでこう考えます。

- ライトを付けたら次に扉を開けるのは明らかなのに、何故自分で開けないといけないのか。
- トイレに入ったら扉を閉じるのは明らかなのに、何故自分で閉めないといけないのか。
- 致したら流すのは明らかのに、何故自分で流さないといけないのか。

それを元にこんな具合に検討していきます。

- ドアの自動化は一般のご家庭には少々厳しいから、ライトの点灯/消灯を自動化しよう。
- 最近のトイレは自動で流す機能があるから、トイレを買い換えよう。

機器などの物理的な条件を揃えるのが一番大変ですが
まずは「何をきっかけとして」「どうなってほしいか」のセットに落とし込むのがスマート化の第一歩。

# スマート化の例

会社から出たら家に帰宅の連絡を入れて欲しいとか。
自宅付近でこれから雨が降りそうなときは通知してほしいとか。
考えると色々と出てきます。

いくつか例を挙げて検討します。


## ハンズフリーでタイマーをかけたい

料理中など手が離せないときでもタイマーを使いたいのでスマート化。
これは**スマートスピーカー**で実現できる。

```vb
If タイマー時間を音声入力したら Then 設定時間後に音で通知
```

タイマー・アラームはスマートスピーカーに向いている。
「短いワードで命令できる」「文章ではなく音のみで結果を受け取れる」
この辺は音声と相性がいい条件かと思います。


## 朝に気温や降水確率、電車の遅延など必要な情報を通知して欲しい

朝の出勤前、ニュースを見れないときにもこの辺の情報が欲しいので。

```vb
If 朝８時になったら Then スマホに「気温」「降水確率」「電車の遅延」の情報を通知する
```

時間を起点としているので、**Raspberry Pi + Node-RED**によるトリガーがいいと思います。
情報取得は**Node-RED**から[Dark Sky](https://darksky.net/forecast/40.7127,-74.0059/us12/en)やら[電車遅延情報のjson](https://rti-giken.jp/fhc/api/train_tetsudo/)を叩く。
好きなタイミングで確認できるように、通知先は**スマホの通知領域(IFTTT)**。


ちなみに、スマート化の例を書いたあとに[Jarvis](https://wired.jp/2016/12/23/mark-zuckerberg-jarvis-ai/)の記事を読むとスケールの差に若干やるせない気分になります。


# 環境整備

スマート化は金をかけた分だけやれることが顕著に増えます。
出費が痛いですが頑張りましょう。
ここでは一例として自分が使っているものを挙げています。

## デバイス

まだスマートロックには手を出していません。

|デバイス|製品|用途|
|:--|:--|:--|
|サーバ|[Raspberry Pi](https://www.raspberrypi.org/)|Node-REDを載せてトリガーやら処理やら出力やら大活躍。|
|スマートスピーカー|[Google Home](https://store.google.com/jp/product/google_home)|音声入力と音声出力、Googleアシスタントによるサービス連携もしてます。|
|スマートライト|[Phillips Hue ライト](https://www2.meethue.com/ja-jp/p/hue-white-ambiance-single-bulb-e26/8718696670804), [Phillips Hue ハブ](https://www2.meethue.com/ja-jp/p/hue-bridge/8718696562260)|ライトのスマート化。色付きライトは家族に不評…。|
|モーションセンサー|[Phillips Hue モーションセンサー](https://www2.meethue.com/ja-jp/p/hue-motion-sensor/8718696769881)|人の位置によるトリガー。玄関やら洗面所に入るとライトを付けられます。|
|スマートリモコン|[Nature Remo](https://nature.global/)|家電操作だけでなく、温度/湿度のセンサーの役割もある。|
|Bluetoothスピーカー||主にGoogle Playの音楽を流す用途。|
|Bravia||テレビと、Chromecast built-inでスマートスピーカーと連携してコンテンツ再生。|
|レコーダ|[nasne](https://www.jp.playstation.com/nasne/)|Web APIで制御できるのと、テレビ(Bravia)と連携できる|
|スマホ||GPSによるトリガー、情報の出力先など。後で出てくるAutomateで頑張るとやれることが増える。|

## 外部サービス

デバイスの連携のため外部サービスを用いています。

|サービス|用途|
|:--|:--|
|[Beebotte](https://beebotte.com/)|MQTTのサービス。Webhookでのメッセージ受信も可能。連携に用いる。|
|[IFTTT](https://ifttt.com/)|各種サービスを連携させるサービス。とにかく必須。|

## ソフトウェア

|ソフトウェア|用途|
|:--|:--|
|[Node-RED](https://nodered.org/)|サーバ上で動作。トリガー、処理、出力などの実装を行う。|
|[Automate](https://llamalab.com/automate/)|スマホアプリ。GUI上でプログラムを作ることができる。|
|[IFTTT](https://ifttt.com/)|スマホアプリ。IFTTTサービスと連携してスマホのプッシュ通知が可能。|

※構築は本記事の範囲外なので、やりたいときはGoogle先生を参照してください。

## 全体像

現時点でのスマートライフ関連のインフラを図にすると、ざっくりこんな感じになります。

<img width="600px" alt="image.png" src="https://qiita-image-store.s3.amazonaws.com/0/286717/3a249147-ad9b-e287-e3c7-b8ff9ef02331.png"/>


# 実装例

**帰宅後にスマホの充電を忘れがちなので、バッテリー状況を通知して欲しい**
スマート化の一例としてこれを説明します。
気付いたら自宅でスマホが文鎮と化してしまっている人にとっては便利。

## トリガーと出力

条件を整理するとこんな感じ。

```vb
If 家にいるときにスマホを充電していない＆残バッテリーが少ない
 Then バッテリー残量を通知する
```

トリガーが複雑なので、**スマホ(Android)に入れた[Autoamte](https://llamalab.com/automate/)**を使います。
結果をスマホに出力しても仕方ないので、**スマートスピーカー**による音声通知が出力先。



## 処理フロー

全体像からこの機能の処理フローを抜き出すとこうなります。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/286717/16f95a56-02ad-94d8-9d5e-9f65092e3aec.png)



## トリガー(Automate)

コードを共有できないのでキャプチャを貼っておきます。
<img width="300px" alt="image.png" src="https://qiita-image-store.s3.amazonaws.com/0/286717/7105e45b-857e-b733-f6b5-168050802dda.png"/>
ソースの流れはこんな感じ。

1. 位置判定によりスマホが自宅から一定範囲内にあるか判定
- 範囲内であれば30分間の位置判定待ちに入る
- 位置を再度判定し、範囲内であれば後続の処理に進む。
- 充電中でなければ後続の処理に進む。充電中なら位置判定待ちに戻る。
- バッテリーが0-40%であれば、Webhookを投げる。それ以外は位置判定待ちに戻る。

帰宅中に自宅のスピーカーを鳴らしてしまうのを避けるため
最初の位置判定ではWebhookを投げないのがポイント。
以降は30分毎に通知が鳴るような動作になります。

## Beebotte

BeebotteにAutomateからのWebhookを受けるためのチャンネルを作っておきます。
作るだけなので特にこれということもないですが、Webhookでバッテリー残量の数値を受け取ります。

<img width="500px" alt="image.png" src="https://qiita-image-store.s3.amazonaws.com/0/286717/c1bde8a7-aebf-425c-3c11-be36973c608d.png"/>

## Node-RED

先ほどのチャンネルをSubscribeしてトリガーとします。
受け取ったバッテリー残量をメッセージに変換し、さらに音声変換してGoogle Homeに通知するという流れ。

<img width="200px" alt="image.png" src="https://qiita-image-store.s3.amazonaws.com/0/286717/67bd7efd-d198-160c-117c-215f81bfcd92.png"/>

1. MQTTによるトリガー
2. 受信した文字列をJSONオブジェクトに変換
3. 受信したJSONのdataキーの値をpayloadに設定 （バッテリー残量のこと）
4. payloadの値を通知用のメッセージに埋め込み
5. Google Homeに流す

ちなみに、Google Homeの操作に[google-home-notifier](https://github.com/noelportugal/google-home-notifier)を使っていますが
音声を[VoiceText](http://voicetext.jp/)に変更すると良い感じになります。
詳細に書くと長いので、ここはまたの機会に。

# さいごに

色々とスマート化を試しましたが、最も良かったのはスマートライトでした。
いままで無駄にライトを付けたり消したりしていたな、という気分になります。

スマート化はやらなくてもなんの問題もないけれど
やってみるとちょっとしたところで恩恵を受けれます。
少しの便利が積み重なると大きな差になるので、是非お試しあれ。