Sympapaのスマートホーム日記

スマートなんとかはスマートじゃない方法でつくられている

Home Assistant: Androidタブレットで家のコントロールパネルを作る(2) [ TaskerとTaskerプラグインの導入]

Sympapaです。
AndroidタブレットにHome AssistantのフロントエンドUI:Lovelace UIを表示させ家のコントロールパネル的なものを作りました。前回は全体の構想と”Fully Kiosk Blowser”の導入について書いています。
せっかくなのでAPIが公開されていなかったりHome Assistantのインテグレーションが無いスマートホームバイスをHome Assistantと連携するために、スマートホームバイスのアプリを介して連携させる構想です。
具体的な例として我が家の東芝製の洗濯機はIoT対応なのですがAPIは公開されていません。そこで洗濯機のアプリの通知によって洗濯機の状態をHome Assistantから取得したり、Home Assistantから呼び出したら洗濯機のアプリを開いて状態を表示する画面を自動的に表示させたいと思っています。
そのためにはアプリの通知をトリガーにしてアクションを発動したり、アプリの操作を自動で実行する必要があります。
自動化にはAndroidの定番自動化アプリ:Taskerを使用しますが、今回の記事では通知を監視してトリガーにしたり通知の操作ができるTaskerプラグインと、タップ操作やテキスト入力出来るTaskerプラグインの導入について書いていこうと思います。

■自動化アプリ: Taskerとは


いわずと知れたAndroidの自動化定番アプリです。有料ですが買い切りの500円(くらい)です。
GUIAndroid端末の設定を変えるタスクを作成したり、Android端末の状態をトリガーにしてタスクを発動させたりできます。
状況に合わせて端末の設定を自動的に変えるのがメインの使い方だと思いますが、その気になれば自分でUIを作って表示させたり豊富なプラグインを使って機能を拡張出来るのでかなり色々な事が出来ます。私はAndroid派なんですが、このアプリがあるからAndroidを使い続けていると言っても過言ではありません(笑)
play.google.com

■導入したTaskerプラグイン

-Notification listener

通知を読み取ってTaskerのタスク発動のトリガーにしたり、通知をタップしたり通知を削除したり通知にまつわる色々なことができるTaskerプラグインです。
既にNest Doorbellの呼び出しボタンが押された時に映像を自動的に表示させるのに使用しています。
Tasker純正プラグインである"Auto Notification"を使用してもいいと思うのですが細かく設定できる分ごちゃごちゃしているので、シンプルな"Notification listener"を選択しました。
play.google.com


-Auto input
f:id:sympapa:20211218123733p:plain
タップ操作やテキストのコピー/貼り付けなどの操作を自動化出来るプラグインです。
また、ジェスチャやキー入力を監視してトリガーにすることもできます。
同じ機能を持っていてシンプルな"Touch Task"というプラグインもあるのですが、家のコントロールパネルとして使用しているAndroidタブレット"Huawei MediaPad m5 Lite 8"では、1日くらい稼働させていると"Touch Task"も"Auto Input"もユーザー補助サービスが見かけ上動いているのに停止してしまう問題が起きます。電池の最適化などを無効にしても改善されません。Huawei端末以外でもこの問題が起きることは少なくは無いようで"Auto input"にはユーザー補助サービスを必要な時だけオンにするオプションがあり、このオプションを使えばこの問題は起きなくなります。
但しこれを有効にするにはadbを使ってAuto inputにWRITE_SECURE_SETTINGSの権限を与えなくてはいけません。(Rootは不要)
手順は以下のとおりですがadbの準備と使い方は世の中にたくさん情報があるので割愛します。
1)PCでadbを準備する。
2)端末の開発者オプションを有効にし、USBデバッグをオンにする。
3)端末をPCとUSBで繋ぎ、コマンドラインから下記のコマンドを叩く。

adb shell pm grant com.joaomgcd.autoinput android.permission.WRITE_SECURE_SETTINGS

4)Auto Inputを使ってアクションを作る際にAdvanceオプションからManage Accessibility Serviceを押し、アクション発動前後にユーザー補助サービスのオンオフをするかを選択する。Enable just for this actionを選べばアクションの前にオンしてアクションの後にオフになるが、Auto Inputを使ったアクションを連続で実行するようなタスクを組む時は最初のアクションにEnable Before Actionを設定し最後のアクションにDisable After Actionを設定しておけば良いでしょう。
play.google.com

■Home AssistantとTaskerのやりとりを考える

-TaskerからHome Assistantのスクリプトを呼び出す
TaskerからHome Assistantのスクリプトを実行する簡単な方法として"Home Assistant Plugin for Tasker"がありますが、稼働して1日くらい経つとどうやらうまくスクリプト(サービス)を呼び出せなくなる問題が発生します。俺環かもしれませんが端末2台で同じ挙動でした。
そこで素直にHome AssistantのWebhookを使うことにしました。Home AssistantではURLを叩いたのをオートメーションのトリガーとしてスクリプトを発動できます。オートメーションのトリガーをWebhookにしてwebhook IDを指定してやり、"https://myhass.com/api/webhook/指定したwebhook_ID"にhをPOSTすればオートメーションが発動します。

TaskerでHttpリクエストを送るタスクを作るのはとっても簡単です。
Net>HTTP Requestアクションを使ってPOSTできます。

-Home AssistantからTaskerのタスクを呼び出す
当たり前にありそうな感じがするのですがTaskerのタスクをhttpで呼び出す方法が見つかりません。
サーバーを介して呼び出すプラグインなら見つかりましたが得体が知れないサーバーを介するのもアレなので、Home Assistantアプリの通知を利用することにしました。
Home Assistantアプリがインストールされた端末に対して、Home Assistantから任意の通知を送ることが出来ます。
この通知を”Notification listener”でキャッチしてTaskerのタスクを発動させるようにしました。

■まとめ

これで家のコントロールパネルとして使っているタブレットで、通知をトリガーにしてTaskerのタスクが発動できるようになり、自動でタップなどの操作も出来るようになりました。
また、Home AssistantからTaskerのタスクを発動させることもTaskerからHome Assistantのスクリプトを発動させることも可能になりました。
次回はHome Assistantと洗濯機アプリとの連携について書きたいと思います。

では。