Joinのカスタムアクションを活用する
JoinはTaskerと組み合わせることで強力な操作性を発揮します。で、私、通知notificationを用いて強引に時計から親スマホのHotspotのオンオフとかしていたけれど、Joinのカスタムアクション使えばそんなことしなくて良いことに気が付いた。
JoinからTaskerの任意のタスクを起動する方法
https://forum.joaoapps.com/index.php?resources/-arun-any-task-from-anyutoapp.139/
公式に説明動画付きでやり方のヘルプが載っている。英語の上に、Taskerの知識がある程度有ることが前提のようで、Joinから直接コレ読んだときは意味不明で訳わからなかった。だってその時点ではTasker使ってなかったし。なので、私も初心者ですが、わからなかったことヘの追記を箇条書きしておく。
基本的に、何故かは分からないが、この説明の通りにするとJoinのカスタムアクションからTaskerのタスクが実行できる。
- "=:="はTasker構文(?)での区切りを意味する。task=:= なら、初心者的理解は、「task;」か、「task<br>」みたいな感じ。Taskの後に構文的なスペースが挿入されるというか。
- %が頭に付いてる文字列は変数を意味する。
- Autoapps commandを利用するため、Autoappsはインストール必須。Tasker初心者にはAutoapps必須やで。あとAutoToolsプラグインも使ってる。
- Joinのカスタムアクションは、あくまでTaskerへの命令のみを送るのみのもの、だと思う。これからAutomateなどで待ち受けているBroacast intent receiver を叩くことは出来ない、と思う。
- Joinのカスタムアクションに別アプリ、Automateなどからpayloadのような引数をわたすことはたぶん、出来ない。固定のアクションを実行できるだけ。まぁやり方有るのかもしれないが。
- たぶん、やっていることは次の通り。たぶん。
- Autoapps command(中にJoinのカスタムアクションも含まれる)で発行されたコマンドのうち、頭に「task」が付いたものをキャッチする。プロファイル。
- Taskerに登録されているタスクをリストアップする。%taskに格納する。
- 引き渡されたtask=:=の後の文字列と、リストを比較する。%aacomm はたぶんAutoApps Commandのこと。これはAutoApps群(Joinが含まれる)から送られてくるコマンドを格納してる変数。
- この比較を行っているのがAutoTools。%task()をカンマで区切った文字列として見てる。なお、%taskの後ろの()は複数の数の格納を意味するようだ。アレイという意味か?
- %amatchedtexts()は、All Matched Textsのことだと思う。完全一致した文字列を格納してる変数。
- で、%amatchedtexts()に格納されてるうちの1番目?のコマンドを実行する。なんで0じゃないのかは知らぬ。
- と言うことで、2、3、4、5はコマンドが既存のTaskと一致してるか見てるだけ。直接%aacommを実行したらアカンのか?
-
→試したらイケる。確かにこうして既存タスクとの一致を見るのは賢いと思うが、初心者が知りたいのはそんな理解もしていない呪文的なやり方じゃないと思うんだ、、ここらのヘルプの冗長な構造がTaskerの弱点だと思う。そりゃ理解してる人には情報多くて嬉しいなーなるけど。
関連記事と親スマホ側のプロジェクト
Joinを利用してフルAndroidスマウォから親スマホの電話を発信させる、その2 - diablo3cs’s diary
アイデア: 電波の悪い場所で自動的に親スマホのwifiテザリングに切り替える - diablo3cs’s diary
上2つの記事での親スマホのTaskerプロジェクトをまとめたもの。一部、わいの接続確認のために音声出ます。
https://drive.google.com/file/d/1427PtrP3dR3vWr5QvehHViF710X8sXNm/view?usp=drivesdk
Taskerの下側タブからプロジェクトをインポートしてみてください。
プロファイルの説明だけ。タスクはそれに応じたものが付いてます。
- Get notification and Call : ↑記事の、Joinを経由して腕時計から親スマホに電話させるときに使うもの。Joinのカスタムアクションが外部からの変数を自動的に格納出来ないので、通知notificationを利用しているもの。今回は関係なし。
- Get notification Hotspot on : 特定の通知notificationが表示されるとHotspotをオンにして、喋る。↑記事で書いたとおりTaskerの説明ではAndroid10以上で動かない旨があるが、うちはAndroid10でも動いてる。
- Get notification Hotspot off : 特定の通知notificationでHotspot をオフにするだけ。
- AutoApps Command~ : 今回対象の。Autoapps commandが送られると反応するプロファイル。
フルAndroidスマートウォッチ側ですること
- Joinを起動する。
- 左上からナビゲーションバーをの呼び出して、アクションを選択。
- 右下の+から、アクション追加。
- CUSTOMを選択。
- 適当に名前を付ける。
- commandの部分に、頭に"task=:="を付けて、親スマホのタスク名を入れる。下の写真の場合は「Hotspot on」。
- deviceボタンから、送るデバイスを選択する。親スマホのこと。ウチの場合は「Redmi Note 9S」
- その下にあるDONEボタンを押して保存。みえねーが何故か400x400でも押せた。押せないときは、Optimization(またはシステムの最適化)のThird party adapterをオンにすると良い。
- Automateなどから、Joinのカスタムアクションをショートカット起動時させれば、いちいち通知notificationを出さなくても親スマホのHotspotオンオフなどを切り替えられる。ショートカット起動じゃなくて、Taskerプラグイン起動の方が正当か。なお、当然ながらデバイス毎に再設定する必要がある(共有化出来ない)。内部で使っているだろうURIが端末毎に違うためかな?
Joinすごいな。
補足
- AutoAppsで出ている関数のうち、%aapar() はこの場合、=:=の左側なので、先頭の"task"が格納されている。これ、2個目からの"=:="では%aaparに格納できないんかな?
- CUSTOM ACTIONのcommand下側にある「Write Prompt~」は実行時にダイアログで追加のコマンドを求めるもの。実際にはコマンド本文の後にさらに=:=を追加して入力された文字列を追加する。
- 最初の"=:="以降は、%aacomm()に順番で格納されている。
Bluetooth PAN使用時に、特定のアプリで自動でwifi テザリングに切り替える
Bluetooth PANは低消費電力で便利ですが、如何せん遅い。最大速度1Mbps。動画どころが一部のニュースの読み込みすら遅い。
遅いときだけwifiに切り替えたらいいんじゃない?
と言うことで、Automateで実装してみた。
関連記事
Joinを利用してフルAndroidスマウォから親スマホの電話を発信させる、その2 - diablo3cs’s diary
アイデア: 電波の悪い場所で自動的に親スマホのwifiテザリングに切り替える - diablo3cs’s diary
Joinを利用して、フルAndroidスマートウォッチから親スマホを操作する例。今回は二番目の記事で作成した親スマホのHotspotをオンオフする機能を流用します。追加で弄るのはフルAndroidスマウォ側だけ。
やること
- 時計側で特定のアプリ、YouTubeやニコニコ動画やらを開いた場合、wifiをオンにする。
- 同時に通知notificationを発行してJoin経由で親スマホのHotspotをオンにする。
- その後、Bluetooth PANを一時的にオフにする。BT PANが有効の場合、なんでか接続がwifiより優先されるためです。BT PAN有効下ではテザリングに接続出来ない。
- 他のアプリに変わったら元に戻す。
使うもの
フルAndroidスマートウォッチ側
- Automate
- Join
親スマホ側
- Join
- Tasker
今回はAutomate部分のみ書きます。その他については上の記事を参照ください。
作ったもの
Automate for Android ⋅ Auto_wifi_connect_by_app_V0.3
- 実行するとforegroundのアプリが変化するのを待つ。
- 特定のアプリ(今回はYouTube、ニコニコ動画、SmartNews、NHKニュース)がforegroundに来ていれば、wifiをオンにして親スマホにもHotspotがオンになる通知を出す。そしてBT PANを切る。
- 他のアプリがforegroundに来た場合、wifiをオフにして親スマホのHotspotオフ、BT PANを再接続する。
問題点
なんかAmazon Prime Videoは特殊な実装をしているらしく、foregroundで検出が出来なかった。なんでや?
BT PANからwifiへの切り替えには少し時間が掛かり、たまに親スマホ側で失敗してることがある。うーん。まだまだ習作や。
Taskerで丸画面のフルAndroidスマートウォッチの四隅へのクリックを実装する
2021 0315 エッジジェスチャーなしでも動くように変更しました。
暇だったので作ってみた。なお製作に当たっては、エッジジェスチャーとPOP UP WidgetとAutomateの組み合わせでの四隅へのタッチ入力が大活躍した。本末転倒やがな!
使うもの
言わずとしれた、最強のマクロツール。だいたい何でも出来るが、出来るようになるには真面目にマニュアル読む必要がある、と思う。わい新人じゃけん、わからん。有料。
AutoApps - Apps on Google Play
Tasker作者によるプラグイン集。プラグインを購入したかとかの管理もするらしい。入れなきゃならんみたい。コレだけなら無料。初心者必須。
AutoInput - Apps on Google Play
Taskerプラグインの1つ。ユーザー入力関係エミュレーションなどを猛烈に強化するもの。デフォルトのTaskerにはクリック入力のエミュレーションが存在しないのでプラグインに頼る。素人でも簡単操作。200円か、広告付きフリーで使える。7日の試用期間あり。Taskerは神アプリなので御布施してあげてください。
成果物
2021 0315改良版。
https://drive.google.com/file/d/1JdXRbZM7Y8ixbSbWiMcURC-uF22zX-W5/view?usp=drivesdk
Kospet Prime2専用。Tasker起動画面の下端のプロジェクトタブからインポートしてください(ホームマークを長押し)。
内部見れば分かるが、たんに四隅のx,yポイントを指定してクリックしてるだけなので、悲しいことにKospet Prime2の480x480でしかキチンと動作しない。真面目にやるなら画面の幅あたりを取得して割合指定するんだろうけど、これで勘弁してください。なお、私の設定がおかしいのか、違う画面サイズで読み込むと勝手にダイアログ表示領域が拡大縮小する。が、クリックの位置は変わらないので400x400画面などの場合は弄らないとちゃんと動作しない。
※需要があれば400x400版をつくります。
Gesture系アプリと連携した場合
Taskをエッジジェスチャーなどから「from GestureApp」を実行すると、以下のオーバーレイが出現する。(四角い、半透明の)。
それぞれ四隅の矢印は指してる方向の隅をクリック入力する。右上の右から二番目は右上の二番目あたりをクリックする。また左下は長押しで、左下を長押しする。
中央の横列3個はそれぞれ左から
- Empty。このオーバーレイを消去して内部のトグル関数を0にする以外、何もしない。
- Automateへの連携。Broacast Intentを発行して任意のAutomateフローを起動する。指定の仕方は↓。
- これまたAutomateフローへのintent。例として入れてある。
これらは内部を弄らないと動かない。
全然参考にならないAutomateのflow shortcutの構文メモ - diablo3cs’s diary
ボタンを押すと消える。十秒以内にクリックしなくても消える。権限は適当に与えてください。
単独で使用する場合
エッジジェスチャーなしでもTasker(とAutoApps、AutoInput)のみで同じようなことが出来るようにした。タスクから「Setbar」を実行すると、下端の左寄りに半透明のバーが現れる。
このバーの動作は、
- クリックすると↓の四隅への入力他パネルが現れる。
- もう一度クリックすると四隅への(略)パネルが消える。
- 長押しすると5秒間、バーが消えて再度出現する。
- バー右下の×ボタンはタスクの終了。
なお、オーバーレイを使用したので空いてる部分をスワイプすると下のアプリなどを動かせる。また、このバーからパネルを呼び出した場合、消えるまでの時間制限はない。
問題点
最小構成で、TaskerとAutoAppsとAutoInputが必要だが、この場合にバッテリー消耗が増加するかは未確認。確認してるところ。
追記 20210314
も少し確認が要るけど、バッテリー消耗の増加はかなり少ない模様。
Appendix 1
エッジジェスチャーからTaskerのタスクへのリンク方法。
タスクを割り当てたいタブと動作を選ぶ。今回は下エッジ、上にスワイプ&ホールドにする。
割り当てる動作のダイアログが表示される。
下の方に有る、「タスクのショートカット」を選ぶ。
今回は「from GestureApp」を選ぶ。
選ばれたTaskerのタスクが表示される。戻るで完了。
APPENDIX 2
なお、エッジジェスチャーとPOP UP WidgetとAutomateで実装した場合はこんな感じ。
大体同じだが、後から位置や大きさを変えられるのでつぶしは利く。が、各個人での試用になって他の人との共有には向かない。
よい時計を。
全然参考にならないAutomateのflow shortcutの構文メモ
自分用メモ。TaskerのShortcutで作成された記述内容から。Ver 1.25.1では以下の内容がショートカット内に記載されていた。
content://com.llamalab.automate.provider/flows/9/statements/1#Intent;action=com.llamalab.automate.intent.action.START_FLOW;type=vnd.android.cursor.item/vnd.com.llamalab.automate.provider.flow_statement;launchFlags=0x18000000;package=com.llamalab.automate;end
分解すると、
- content://com.llamalab.automate.provider/flows/9/statements/1
- #Intent;
- action=com.llamalab.automate.intent.action.START_FLOW;
- type=vnd.android.cursor.item/vnd.com.llamalab.automate.provider.flow_statement;
- launchFlags=0x18000000;
- package=com.llamalab.automate;
- end
1.が各フローのスタート位置に記載されているFlow URI。この例では9の1ってフローが対象とされている。9ってのは多分、9番目に作成されたフローって意味で作成順か何かで連番。statement/1はフロー内での1番目のBeginning flowブロックて意味だと思われる。この情報はBeginning Flowブロック内にflow URIとして明示されている。
2.はintentの発行を意味する。
3.はintent action。このintentを受け取ることがAutomateは出来るらしい。
4.はMIME Type の記述。
5.はフラグらしいんだが、この0x18000000が何のフラグかは分からなかった。あんまり調べてはいない。
6.はintentを発行する先のパッケージ。明示的intentって奴か。
7.はintent終了を意味する。
何が言いたいか?
1.を変更すれば任意のAutomate flowの呼び出しが可能。やってることはBroadcast intentを発行してAutomateが受けているだけの話。
Taskerで次の記述をすれば問題なく起動できる。
Action
com.llamalab.automate.intent.action.START_FLOW
DATA
content://com.llamalab.automate.provider/flows/9/statements/1
MIME type
vnd.android.cursor.item/vnd.com.llamalab.automate.provider.flow_statement
※無くても多分動く。
EXTRA
launchFlags=0x18000000
※EXTRAのフラグは無くても問題ないはず。
PACKAGE
com.llamalab.automate
もし、flow URIを直接打ち込むのが苦痛でないならば
Ver. 1.26.0においても任意のflow shortcutを作成できる。ただし、Taskerにて記録したあとに、そのTaskをショートカット登録するという三度手間が要る。
とは言え、いざとなればTaskerでパッケージ化して本来ショートカット登録出来ないアプリ(Magic Gesture、あなたなことよ!)でフロー呼び出しするなんておもろいことが出来るかもしれない。
感想
そこまでするならTaskerで実装したら良くないか????
フルAndroidスマートウォッチでの基礎的なAutomateの例
意外と需要があるのかと思って。多分このくらいのフローはコミュニティー探せばもっと良いのが出てきそう。
それぞれのフローはそのままでは動きませぬ。必要なところに自分の親スマホのBluetooth名などを書き込んでください。いちおう、それぞれに説明は付いてる。
何が何でもBluetooth PANを繋ぎにいく
維持でもBT PAN ( Personal Area Network)を繋ぎにいく。ガンガン、ループするからロギングはオフにしてな! でも一応BTがオンかどうかだけは判別する。
https://llamalab.com/automate/community/flows/38841
なお、当然ながら親スマホはBluetooth テザリングが有効である必要があります。
画面がオンのときだけBT PANを繋ぐ
通信し放題ではなくなるので、だいぶバッテリーへの負荷が減る。が、画面オンから通信確立まで若干のタイムラグがある。Android10機だとかなり速いが、それでも画面点灯→即Googleアシスタントとかやると、反応が鈍い。
https://llamalab.com/automate/community/flows/38842
親スマホのBTテザリングをオンにする
何故かMacroDroidが機能充実していて確実に動作する模様。AutomateのBT Tetheringブロックはウチの環境では動かない(権限が無いとかではなく)。わたしは親スマホ起動 → BTテザリングON つーマクロだけMacrodroidにやらせている。
良い時計を!
逆方向WatchDroidによってBluetooth経由でスマホに通知を送る
Watchdroidを利用した簡単な逆方向の操作の仕方。賢くないですが、簡単に出来る。ご参考。頭良い人ならアプリ作ってるレベル。
逆方向WatchDroidとは
通常
逆方向
利点など
- Bluetoothを経由して、時計側の操作で通知を送り、その通知を受けて親スマホのマクロ動作などが出来る。
- LTEまたはBT PANなどを利用している場合にはそちらを介して通知を送った方が賢い。
- 逆方向にもWatchDroidをつないだ場合の消費電力増加はほぼ無い。
SIM経由してJoinで同様な操作をする例はこちら↓。フルAndroidスマートウォッチから親スマホにJoin経由で通知を送り、電話発信をさせています。
Joinを利用してフルAndroidスマウォから親スマホの電話を発信させる、その2 - diablo3cs’s diary
問題点
WatchDroidの動作は、
- 最初に全画面で表示した後、
- 通知notificationを発行して履歴に記録する
この間のインターバルは最短5秒までしか短く出来ない。すなわち、通知notificationを利用する場合は5秒は待たなくてはならない。
対策
Automateを利用してWatchDroidAssistantで全画面表示される通知から、titleとmessageを格納してトースト表示する。それだけのフロー。
Automate for Android ⋅ Get_Messages_via_Watchdroid_Reversal
ようは、このフローを参考に色々マクロを組めばフルAndroidスマートウォッチから親スマホをコントロール出来るということ。
問題点その2
Automateはどうも画面ロック中の動作が怪しく、思った通りに動作しないことが多々ある。Tasker他と組み合わせるか、Taskerで全部実装したほうが良いかも。わたしはTasker初心者なので作れませんが。どーやってTaskerで表示されてる画面のUI elementを取得するんやろ。
追記2021 0318
TaskerではAutoInputのプラグインを使用すれば簡単に通知されたタイトル、テキストを格納できた。Automateはスリープ時の動作が変なので、Taskerで待ち受けした方が賢い。
Taskerでの設定方法は、
- タスク→プラグイン→AutoInput→UI Query
- 設定→Variable Set Upで、実際の画面上のUIを拾うことが出来る。簡単。UI表示したら通知バーからacceptを選ぶ。
- 拾った項目から使うものを選ぶ。Watchdroidなら題名のところとか。
- 変数Variablesを設定する。または%aitexts()を使っても良いのかしら。
- 設定した変数Variablesにタイトルとかが格納される。
Have a nice watch!
ついでに画面がパカッと外れたLEMFO LEMXも解体する
経年劣化で糊が弱くなったのか、LEMXの画面が外れたので、これも解体してみました。
LEMFO LEMX
個人的に使っていて名機だなぁと思ったフルAndroidスマートウォッチは、LEMX、Kospet Primeです。私はLEMXは2018年に購入しており、1年くらいはメインで使ったと思う。ハード的にはRAMが1GBしかなく、常時90%以上を使用するなど苦しかったものの、大画面大容量バッテリーの強さを教えてくれました。
永らく保管していましたが画面が外れてしまい、復旧させるのも何だなぁと思い、ばらしてみました。なお、Kospet Optimusと同じ、公称IP67ですが、防水に対する造りは全然違います。かなりLEMX の方が上です。
解体写真
画面まわり、メインボードまわり、裏蓋側にバラしたところ。バッテリーは900mAh 3.42Wh、それなりに使ったのでガス発生による膨張が見られます。まぁパンパンではないので、まだ寿命は残ってるのかな。造りは裏蓋兼本体容器と画面の2分割構造で、Kospet Primeやらの画面-筒胴-裏蓋の3分割構造とは違います。
残念ながら、低温ポリ液晶と本体容器の間は接着剤で付けられているだけで、防水構造は有りませんでした。ここも防水だったらIP68いけたんちゃうか?
注目すべきは本体容器。左側にスピーカー、右側にPOGOピン接続部、右下にマイクです。12時から2時半にある灰色のものは金属板で、多分アンテナかと。一見してわかるとおり、全部樹脂で固められている。OptimusはPOGOはまんま剥き出しでした。
スピーカーまわり。音を発生させる磁石とコイルの裏側です。
外すと、コーン紙?らしきものが樹脂に固められて残りました。どうもただの紙ではなく、防水紙のようです。トゥルトゥル。
外からスピーカーを見たところ。BCG注射みたいにポツポツした穴が並んでいます。穴のサイズはかなり小さく、同様の構造をしているLEM8以降と比べても小さな穴です。表面張力で水の侵入を防ぐ構造だと思います。私の手持ちの中では一番穴が小さい。
ボタン周り。Kospetは見習ってください、ほんと。擦れる軸周りは金属パーツはめ込みです。この金属の中に、パッキン、バネ、ボタン軸が入ります。
ボタン、外したところ。軸先端に付いてる黒いのがパッキンです。このパッキンがどれだけ有効かは疑問が在りますが、構造自体は簡素ながら耐久性と防水性に一応気を使ったものといえると思います。Optimusとは段違い。まぁまぁコストかかってるで、これ。
見辛くてすいません。カメラカバーはOptimusと同じ構造ですが、防水の役割を果たすと思われる、周囲の黒い部分の面積がだいぶ大きい。多少は防水性高いかも?
感想とか
愛機だったので正直、画面外れたときは悲しかったアル。画面と本体の間に防水構造が無かったので悲観していましたが、中を見るとなかなかどうして。これでIP67なら、いちおう、信じられる。多分画面まわりから浸水するけども。