下記記事で 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 は前準備です。
1:WiFi の接続状態を得ます
ウチには WiFi-AP が4個所あり、SwitchBot Plug mini が
接続されている WiFi-AP を判定するためです
%ni_active_wifi_ssid に接続中の WiFi の SSID が得られます
2:%ni_active_wifi_ssid を変数 %R1wifi に入れておきます
3: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"}
4:結果 %stdout(システム変数)を変数 %SWbot に入れておきます
シェルの最後に echo コマンド で標準出力したもの([on] または [off])
が $stdout に入っています
5:変数 %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 件のコメント:
コメントを投稿