スマホ ハック＆スマートホーム連携

##<b>■はじめに</b>
Google Home や Amazon Echo、ラズパイなどを組み合わせて色々おうちハックを楽しんでいますが、たまに手持ちのスマホとこれらの機器・スマートホームを連携させたくなる場合があります。
そのような場合いくつかやり方がありますが、うちではスマホ側に Tasker という高機能アプリ(有料)を入れて利用しています。

今回は主に Tasker を使ったスマホ活用や Google Home ・スマホ間の連携についてご紹介したいと思います。

スマホでしか取れない情報などもあるため、スマートホームと連携することで色々楽しめます。

##■<b>全体図</b>
![home-smart.png](https://qiita-image-store.s3.amazonaws.com/0/241735/de575a7c-3603-94a4-93cf-7e590aae3094.png)

##■<b>Tasker について</b>
Tasker は始めて見た人には非常にとっつき難いアプリなのですが、慣れてくると手放せなくなる高機能アプリです。どんなものか一言でいうと「Android 端末を root 化しなくても、端末上でかなり凝ったことが出来る GUI ベースのプログラミング環境」というところで、自分のスマホでもう少しここが何とかなると便利なのに~！というのを解決してくれるツールです。

非常に沢山の機能があり全てを紹介するのは無理なので、リファレンスを貼っておきます。
参考：[日本語版 Tasker ユーザーガイド](http://tasker-userguide.pralin.info/index.php)

※Tasker は GUI ベースなこともあり？コードをテキストベースでは引用できないので、以下でご紹介している Takser のレシピも大まかな関数呼び出しの流れのみに留めています。参考にしながら手入力してください。

##■<b>利用例</b>
ここでは実際に私が使っている利用例と設定内容をいくつかご紹介したいと思います。
Google Home & ラズパイ & スマホ連携のほか Tasker 単体での利用例もあります。

####<b>●LINEメッセージやAmazon配送状況をスマートスピーカーでお知らせ</b>
![home-from-smart.png](https://qiita-image-store.s3.amazonaws.com/0/241735/f714996c-7e37-23f2-c9aa-f6c08e31622a.png)
スマホから自宅のラズパイ＆GoogleHomeに対して通知を送る例です。
具体的には Tasker から IFTTT の WEBHOOK 経由で自宅のラズパイに通知を転送しています。
IFTTT アプリ単体でもラズパイへの通知は可能ですが、スマホ内での処理は Takser のほうが柔軟性があるので Tasker 起点にしています。

家族からの LINE メッセージを GoogleHome で読み上げたり、amazonの荷物の配送状況を GoogleHome で教えてくれたりします。

LINE のメッセージ監視は LINE API の BOT を使うのが一般的ですが、これだと LINE BOT をメッセージを受け取りたい人と同じLINEチャンネルに追加しておかないとメッセージを取得できません。
それよりも Tasker でスマホの LINE アプリからの通知を監視したほうが簡単です。

```tasker設定.[LINEメッセージ監視]
> LINE メッセージ通知で Tasker トリガー
  Event > UI > Notification > LINE
・(if)通知タイトルが対象アカウントか？
・  (HTTP Post)IFTTTのWEBHOOK経由でLINEメッセージ通知
※IFTTTでは受信した通知を自宅ラズパイに向けて転送するWEBHOOKを呼び出します
※通知を受け取ったラズパイは google-home-notifier で Home でメッセージを読み上げます
```
※google-home-notifier [[Link]](https://qiita.com/SatoTakumi/items/c9de7ff27e5b70508066)

```tasker設定.[Amazon荷物の配送状況チェック]
> Amazon アプリからの通知で Tasker トリガー
  Event > UI > Notification > Amazon ショッピング
・(if)通知テキストが荷物配送状況メッセージか？
・  (HTTP Post)IFTTTのWEBHOOK経由で配送状況メッセージを通知
※IFTTTでは受信した通知を自宅ラズパイに向けて転送するWEBHOOKを呼び出します
※通知を受け取ったラズパイはamazonの荷物配送情報を保持していい感じで使います
```

####<b>●スケジュールと連動した機能（目覚まし設定・自動消音など）</b>
![clock.png](https://qiita-image-store.s3.amazonaws.com/0/241735/88de6b4a-2792-65c7-be5b-17d175278cff.png)
Tasker はスマホ内のカレンダーを参照して予定を取得できるので、それを元に色々なことが可能です。
例えば翌朝の予定を自動取得して、朝の支度と通勤時間を加味した適切な時間にスマホの目覚ましを自動設定するとか・・・
日中は会議中かどうかスケジュールで検出して、自動でスマホをマナーモードにしたりなどなど・・・自分の予定を元にスマホが勝手に動いてくれるのでかなり便利です。

参考：[How To Check For Specific Calendar Events Within a Specific Time Frame](https://www.reddit.com/r/tasker/comments/2rhg43/detailed_instructional_how_to_check_for_specific/)

```tasker設定.[スケジュール確認とアラーム追加]
> 深夜に Tasker トリガー
  Time > From 00:01 Till 00:05
  // 祝日は除外 スマホ内カレンダーに日本の祝日データ入れておく（Googleで）
  Not Calender Entry > Any : Google:日本の祝日 
・(testApp)該当カレンダーを取得
・(for)当日午前中までの時間で予定をチェック
・  (testApp)取得したカレンダーを順にチェック
・  (if)会議など業務の予定？
・    (testApp)会議の開始時間を取得
・    (SetAlarm)会議の開始時間 － 通勤時間 － 支度の時間 ＝ 目覚まし設定時間
※カレンダー取得部分は大分省略しています（詳細は上記リンク参照）
```

```tasker設定.[スケジュール確認と消音]
> 10分毎に Tasker トリガー
  Time > Repeat > every 10 min
・(testApp)該当カレンダーから現在~15分後までの予定取得
・(if)会議直前？
・  (Say) 間もなく会議ですと音声でアナウンス
・(if)会議中？
・  (Audio-SilentMode=Vibrate) マナーモードに
・(else)
・  (Audio-SilentMode=off) マナーモード解除
※カレンダー取得部分は大分省略しています（詳細は上記リンク参照）
```

######<b>※ラズパイからの Google カレンダー情報取得について</b>
他にも以下のようにラズパイ上で Google カレンダーから情報取得する方法もあり、うちではこれを使って土日だけでなく祝日を識別してスマートホームの制御を切り替えています。
ただ以下の方法は Google API を叩く手間などがあるので、スマホに目覚まし設定するなどスマホの動作に使いたいだけなら Takser でスケジュール確認したほうが楽だと思います。（スマホ内で完結しているので認証も無く、外出時に通信回線が不安定でも動きますし）

参考：[天気予報情報・Googleカレンダーの予定をpythonで取得する方法 on Raspberry Pi/Mac - karaage. [からあげ]](http://karaage.hatenadiary.jp/entry/2017/09/20/073000)

####<b>●位置情報を元にした機能（乗り過ごし防止など）</b>
![location.png](https://qiita-image-store.s3.amazonaws.com/0/241735/88847daa-d3a1-69b3-a7ce-0f92b29ebc08.png)
Tasker は位置情報を元にした動作設定も可能です。例えば電車移動で目的地周辺でスマホの振動や通知表示、音声通知の設定をしておけば、通勤中に動画視聴やゲームに熱中していても乗り過ごしの防止になります。
他にも自宅近くでスマートロックに通知を投げて玄関の鍵を自動で空けたり、自宅に戻ると自動で WIFI を ON に、Bluetooth を OFF にするとか、単体で似たような機能のアプリはいくつもありますが、Tasker を一つ入れておけば、余計なアプリを追加せず Tasker だけで多くの機能をまとめて実現できるのでメモリ・バッテリ消費なども抑えられます。

また Tasker には GPS 以外にも 周辺 WIFI SSID や携帯基地局情報も直接とれるので色々な情報で位置を特定できます。

```tasker設定.[乗り過ごしアラート]
> 目的の位置に入ったら Tasker トリガー
  Location > 登録地点を選択
・(Flash/Notify) 位置名をスマホ上で通知
```

```tasker設定.[玄関の自動開錠]
> 自宅付近に近づいたら Tasker トリガー
  Location > 自宅エリアを選択
・(HTTP Post)IFTTTのWEBHOOK呼び出し sesame の開錠コマンド発行
```
投稿記事：[スマートロック SESAME の WEB API が便利だった！ - Qiita](https://qiita.com/kt-sz/items/e8ccec02605584e62b53)

```tasker設定.[自宅到着アクション]
> 自宅に到着したら Tasker トリガー
  Location > 自宅エリアを選択
・(if)在宅フラグ変数がOFFなら
・   (Var Set) 在宅フラグ変数 ON
・   (Wifi) Wifi ON して自宅WIFIに接続
・   (BT) 自動で Bluetooth OFF
・   (HTTP Post)IFTTTのWEBHOOK呼び出しラズパイに在宅通知送信
```

```tasker設定.[外出アクション]
> 自宅から一定距離離れたら Tasker トリガー
  Exit Task > Location > 自宅エリアを選択
・(Var Set) 在宅フラグ変数 OFF
・(Wifi) Wifi OFF
・(BT) 自動で Bluetooth ON
・(HTTP Post)IFTTTのWEBHOOK呼び出しラズパイに外出通知
```

####<b>●本体振動を利用した機能</b>
![vibe.png](https://qiita-image-store.s3.amazonaws.com/0/241735/e711f327-f4b0-b770-2aa4-d119ef3100e7.png)
Tasker はスマホ本体の動きも検出できるので、例えばスマホを縦に強く振ると画面の明るさをMAXにしたり（明るさ自動切り替えはバッテリを消費するので使っていないので）、横に振ると自動で玄関のカギを空けたりなど・・スマホをいろいろなパターンで動かすだけで画面を触らずに色々な機能を呼び出せます。

```tasker設定.[振動したら画面明るさ切り替え]
> 設定した振動パターンで Tasker トリガー
  Event > Sensor > Shake > 任意のパターン
・(if) 画面切り替え変数チェック ON なら明るい状態
・  (Display Bright) 暗くする
・  (Var Set) 画面切り替え変数 OFF
・(else)
・  (Display Bright) 明るくする
・  (Var Set) 画面切り替え変数 ON
※変数でチェックではなくて確かシステム変数で画面の明るさも取れたはずです
```

```tasker設定.[スマホを裏返すとマナーモード]
> スマホを裏返したら Tasker トリガー
  State > Sensor > Orientation > Face Down
・  (Audio-SilentMode=Vibrate) マナーモードに
```

####<b>●その他</b>
その他もろもろ

```tasker設定.[BTイアホン接続で音楽アプリ起動再生]
> 登録済みの Bluetooth イアホン接続されたら Tasker トリガー
  State > Net > BT Connected > 任意の BT デバイス
・(APP) 音楽アプリ起動
・(xxx Volume) 音量を音楽再生用に設定
・(Media Controls) 再生開始
```

```tasker設定.[夜、音楽再生中に寝てしまっても自動停止]
> 夜など希望時間で Tasker トリガー
  Time > From 01:00 Till 01:05
・(Media Controls) 再生停止
```

```tasker設定.[バッテリが一定以下で充電アナウンス]
> バッテリ残量が一定以下になったら Tasker トリガー
  State > Power > Battery Level > 任意の残量
・(Say) 充電するように音声でアナウンス
```

```tasker設定.[充電ケーブル抜き差しで予定と天気アナウンス]
> 充電ケーブル抜き差しで Tasker トリガー
  State > Power > Source = any
> (if) 朝？もしくは夜？
    (Perform Task)上記のカレンダー情報取得コードを呼び出し
>   (HTTP get) http://weather.yahoo.co.jp/weather/jp/13/4410.html から今日の天気を取得
>   (Say) 今後の予定と天気を音声でアナウンス
```
参考：[Taskerで天気予報を取得しKLWPで表示する](http://kumanoth.hatenablog.jp/entry/2015/07/06/232932)


##■<b>最後に</b>
数年前(GoogleHome登場前)は この Tasker と AutoVoice&AutoCast&IRKIT の組合せで、現在の Google Home&Chromecast&黒豆くらいのポテンシャルのあるスマートホーム環境が作れたのですが、今となってはスマートスピーカーのほうが使いやすいですね。 でも Tasker はここで紹介したスマホ連携や外出時のスマホ自動制御などでまだまだ現役活躍中のとてもお勧めのアプリです☆（有料です！）

<blockquote class="twitter-tweet" data-lang="ja"><p lang="ja" dir="ltr">(大昔に作った) Tasker で Google Home もどき DEMO <a href="https://t.co/dBVxXlELO7">pic.twitter.com/dBVxXlELO7</a></p>&mdash; ktsz (@ededken) <a href="https://twitter.com/ededken/status/1055357281695461376?ref_src=twsrc%5Etfw">2018年10月25日</a></blockquote>
<script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>

##<b>※投稿記事一覧</b>
他にも 自分で「おうちハック」した内容を以下に投稿しているので、よろしければ合わせてご覧ください☆

・GoogleHome/AmazonEcho とラズパイでやった事・やりたい事一覧[[LINK]](https://qiita.com/kt-sz/items/86536aff99d80c1cd464)
・Google Home でちょっと未来風のスマート TV を作ってみたよ☆[[LINK]](https://qiita.com/kt-sz/items/0362d5fe3e9a3e478245)
・黒豆 (Broadlink RM Mini 3) の IR 信号解析してみたよ♪ [[LINK]](https://qiita.com/kt-sz/items/1c36a7b22a58359a8e6f)
・スマートロック SESAME の WEB API が便利だった！[[LINK]](https://qiita.com/kt-sz/items/e8ccec02605584e62b53)
・Amazon Echo の沢山ある面白スキルを気軽に遊ぶ方法[[LINK]](https://qiita.com/kt-sz/items/0d01e763d540ddea5816)
・LINEを「ラズパイのターミナル化＆スマートホームのフロントエンド化(ChatOps風)」してみた♪[[LINK]](https://qiita.com/kt-sz/items/9adcb02a3b3a6cf3dd7b)
・LINE と Firebase とラズパイを繋いでみたよ☆[[LINK]](https://qiita.com/kt-sz/items/c008084300a978516153)
・GoogleHome と Chromecast でキーワード＆画像＆Wikipedia検索～TV表示[[LINK]](https://qiita.com/kt-sz/items/9edea18c4f0f5e8cf631)
・スマホ ハック＆スマートホーム連携 [[LINK]](https://qiita.com/kt-sz/items/9e23bd5969f0024b17f8)
・ラズパイとサーモセンサーで自宅のガスコンロ監視（火の用心） [[LINK]](https://qiita.com/kt-sz/items/471f469cc89d2bac0c76)
・トニー・スタークの家にありそうなスマート・テーブル（笑） [[LINK]](https://qiita.com/kt-sz/items/13cb71214604081dbf7c)