2024-12-30

Tasker の使い方 〜 Termux のシェルを使ったり、その結果を Tasker で判定したり、また Pushbullet とも連携してスマホ間での通知も処理できる 〜

 

下記記事で Termux、Termux: Tasker プラグイン、Termux シェルなどを駆使して「やさしい充電」を実現しました。

 

SwitchBot API v1.0 に代えて v1.1 を使う 〜 80%/90% 充電で自動停止する方法 〜

 

今回は、上記記事で使用したシェルの内容を少し変更します。

 

シェルで実行した curl コマンドの実行結果を Tasker で判定します。

 

やりたいことは次図です。

対象となるスマホは UMIDIGI s5 Pro で、サブスマホです。

 


 

充電完了で SwitchBot plug が電源オフ後、1時間以降に再度電源をオンにする Tasker の設定です。

 

再電源オンは、再充電に備えるためですが、なんで1時間経過後かというと、1時間経ってれば充電ケーブルを抜いているだろう、ということからです。

 

現在「やさしい充電」の対象は UMIDIGI s5 Pro と iPhone SE3 ですので、一方が充電完了しても他方は充電する可能性もありますので。。。

 

OPPO Reno11 A は「やさしい充電」機能がこの機種自体に備わっていますので、SwitchBot plug での制御対象ではありません。

 

 

まずは次のタスクをご覧ください。

 


 

 

タスク番号 1〜5 は前準備です。

 

  WiFi の接続状態を得ます

         ウチには WiFi-AP が4個所あり、SwitchBot Plug mini が
         接続されている WiFi-AP を判定するためです

         %ni_active_wifi_ssid に接続中の WiFi の SSID が得られます

 

   %ni_active_wifi_ssid を変数 %R1wifi に入れておきます

 

   SwitchBot Plug mini がオンかオフかを得るためシェルを実行

         シェル(curl GET)を実行し json をパースして電源の状態 ".body.power" を得ます

         シェルの内容は次のようになっています

 

ーーーーー ここから ーーーーー
#!/data/data/com.termux/files/usr/bin/bash

deviceid="<デバイスID>"
token="<トークン>"
secret="<クライアントシークレット>"
t=$(date +%s%3N)
nonce=$(uuidgen -r)
sign=$(echo -n ${token}${t}${nonce} | openssl dgst -sha256 -hmac ${secret} -binary | base64)

ret=($(curl -sS -X GET   "https://api.switchbot.net/v1.1/devices/${deviceid}/status" \
-H "sign: ${sign}" \
-H "t: ${t}" \
-H "nonce: ${nonce}" \
-H "Content-Type: application/json; charset=utf-8" \
-H "Authorization:  ${token}" \
| jq ".body.power, .body.voltage, .body.version"))

out=`echo ${ret[0]} | sed 's/"//g'`

echo $out
ーーーーー ここまで ーーーーー

            ${ret[0]} の内容(["on"] または ["off"] から ' " ' を除いて [on] または [off] を抽出)

            これを $out に入れて echo コマンドで標準出力します 

 

 

curl の実行結果はファイルへ吐き出すこともでき、この場合は複数の情報を Tasker に戻すことができます。

 

次のようなシェルにすると SW_stat.txt ファイルには curl 実行結果が入ります。


ーーーーー ここから ーーーーー
#!/data/data/com.termux/files/usr/bin/bash

deviceid="<デバイスID>"
token="<トークン>"
secret="<クライアントシークレット>"
t=$(date +%s%3N)
nonce=$(uuidgen -r)
sign=$(echo -n ${token}${t}${nonce} | openssl dgst -sha256 -hmac ${secret} -binary | base64)


curl -sS -X GET "https://api.switchbot.net/v1.1/devices/${deviceid}/status" \
-H "sign: ${sign}" \
-H "t: ${t}" \
-H "nonce: ${nonce}" \
-H "Content-Type: application/json; charset=utf-8" \
-H "Authorization:  ${token}" \
 | cat > ./SW_stat.txt

cat ./SW_stat.txt
echo ""
ーーーーー ここまで ーーーーー
 

SW_stat.txt ファイルの内容は次のような結果になります。

 

{"statusCode":100,"body":{"version":"V2.0-2.0","power":"on","voltage":100.1,"weight":0,"electricityOfDay":808,"electricCurrent":0,"deviceId":"<デバイスID>","deviceType":"Plug Mini (JP)","hubDeviceId":"<デバイスID>"},"message":"success"}

 

 

   結果 %stdout(システム変数)を変数 %SWbot に入れておきます

         シェルの最後に echo コマンド で標準出力したもの([on] または [off])
         が $stdout に入っています

 

   変数 %Times は充電完了時に unix time(秒)を得て +3600(秒)
         を足してあります

         これはあとで1時間経過後を判定するときに使います。



 6〜20 が実際の処理です。

 

スマホの WiFi 接続が SwitchBot Plug と同じ WiFi-AP か?

      no  : stop

▶   yes : %SWbot は on か?

              yes : stop

              no  : 充電完了時から1時間以上経過したか?

                      yes : SW_on.sh 実行 ⇨ stop(SwitchBot plug の電源をオン)

                      no  : 10 分待って ▶ へ戻る



プロファイルは「5:00 〜 19:00 の 30 分ごと」としています。

 

すでにリタイヤしていますので夜間充電はしません。

 

また、寝室は別の WiFi-AP で、そこにスマホがある場合も充電はしません。




さらにメインスマホ(OPPO Reno11 A)を持って外出中は SwitchBot plug の電源はオフにし、帰宅したら再び前記の処理に戻します。



そのため、メインスマホから Pushbullet でサブスマホと連携します。



メインスマホのプロファイルは自宅の WiFi-AP に接続しているか切断状態かの2つをトリガーにしています。



外出時のタスクは次のようになっています。




帰宅時のタスクは次のようになっています。




最初に5秒の待機を行っているのは、WiFi-AP 間をハンドオーバーしたときにメッセージが送信されてしまうのを防止するためです。



サブスマホへは Pushbullet から、次のメッセージを送信します。


   ・宛先:UMIDIGI s5Pro

   ・タイトル:通知

   ・内容:not-home(外出時)

               at-home(帰宅時)



 

サブスマホ側ではプロファイルに Pushbullet のメッセージを受け取ったとき、として

 

   ・外出時のメッセージの場合:SW_off.sh を実行

                                             冒頭のプロファイルをオフ

 

   ・帰宅時のメッセージの場合:冒頭のプロファイルをオン


とします。

 

冒頭のプロファイルは「5:00 〜 19:00 の 30 分ごと」のことです。

 

 


Pushbullet をインストールして2台のスマホで同じアカウントで設定すると、両者の間でメッセージを交換できます。

 

 

また Pushbullet インストールによって Tasker のプラグインになっていますので、プラグインアクションで内容を検査できますし、メッセージ受信時にプロファイルにすることもできます。

 

 

 

おわりに ・・・


・Termux: Tasker プラグインを Tasker から操作できる

   これにより、Termux の様々なコマンドやシェルを連携できる

・Termux を使えることで Tasker 処理に柔軟性が生まれる

・Termux のシェルの中で実行結果を得ることができる

・Termux のシェルの実行結果を Tasker に渡して判定することができる

   シェルの実行結果をシステム変数で受け取ることができ、Tasker のアクション
   で使用できる

   また、ファイルに吐き出すことやそのファイルを読み込むことで Tasker のアクシ
   ョンで使用できる

・WiFi の状態を判定できる

・Unix time(1970年1月1日を起点としてそこからの経過秒数(10桁)や
   ミリ秒(13桁)を得て計算することや判定することができる

・Pushbullet 連携を行って複数デバイス間でメッセージ交換ができる

   デバイスはスマホのほか、PC や Mac ともメッセージ交換できる

   sms を送信し、他方で受信するというやり方に比べて大変便利で通信料無料で利用できる


 

 

MacroDroid でも Pushbullet 連携を含めて Tasker と同様のことができます。 



 

 

 

 

 

0 件のコメント: