ページ

2024-11-26

MacroDroid で任意のシェルを自動実行させる方法

 

 

Android 機を、SwitchBot を使って 90% 充電で自動停止させる

 

上記の記事で「シェルスクリプトで curl を使って叩くやり方は、Android 機種(バージョン?)によりうまくいく機種と、そうでない機種がある」ということで、HTTP POST で代替しました。

 

 

Android 機種(バージョン?)により、使える Linux コマンドが制限されているので、MacroDroid のシェルスクリプトで機能するコマンドもまた限られてしまいます。

 

 

機能しない一例が curl コマンドです。

 

cd / ls / mv / cp などは機能します。

 

 

 

例えば SwitchBot の電源は、Termux を起動して次のような curl コマンドを叩けばオフになります。

 

 

curl -X POST "https://api.switch-bot.com/v1.0/devices/<デバイスID>/commands" \
-H "Content-Type: application/json; charset=utf8" \
-H "Authorization: Bearer <トークン>" \
-d '{"command": "turnOff", "parameter": "default", "commandType": "command"}'

 

Off の部分を On とすると電源オンになります。

 

 

 

残念なことに、このコマンドを MacroDroid のシェルスクリプトに記述しても機能しないのです。

 

"/system/bin/sh: [7]: curl: inaccessible or not found" というエラーになります。

 




Termux では自由にパッケージをインストールできますので curl も機能させられます。

 

 

前記の curl コマンドを Termux で実行するとちゃんと SwitchBot の電源オフ・オンができますが、Android ネイティブの Linux とは異なる空間で動作しており、 MacroDroid のシェルスクリプトには指定しても意味をなしません。


 

Linux コマンドを制限なく、シェルスクリプトとして実行できると MacroDroid の使い方の自由度が上がります。

 



冒頭に紹介の記事と同じことを termux から curl を使って実行するやり方があります。

 

 

シェルスクリプトを Termux: Widget を使って Android のホーム画面にウィジェット化して貼り付けるのです。

 

 

そして貼り付けたウィジェットの名前を指定して MacroDroid の UI画面操作でクリックするのです。

 

 

Termux でのシェルスクリプトの中身は下記です。

 

ーーーーーーーーーー ここから ーーーーーーーーーー

#!/data/data/com.termux/files/usr/bin/bash

curl -X POST "https://api.switch-bot.com/v1.0/devices/<デバイスID>/commands" \
-H "Content-Type: application/json; charset=utf8" \
-H "Authorization: Bearer <トークン>" \
-d '{"command": "turnOff", "parameter": "default", "commandType": "command"}'

ーーーーーーーーーー ここまで ーーーーーーーーーー

 

 

 

ホーム画面に作成したウィジェットは下図の2つです(SW_Off.sh と SW_On.sh)。

 

 


 

 

 

これらのウィジェットをタップすると SwitchBot の電源のオフ・オンができます。

 

 

なので MacroDroid の「UI画面操作」で[ "SW-Off" を含むテキストをクリック]と設定するとホーム画面からタップしたことと等価になります。

 

 

 

充電が => 90% で SwitchBot の電源をオフにして充電を停止させるマクロは下記です。

 



画面操作を伴うので、いったん画面をオフ(ロック)し、次に画面をオンにして自動ログイン。

 

その後ホーム画面を表示して UI画面操作で[「SW_Off」を含むテキストをクリック]して SwitchBot の電源をオフにします。

 

「[1回の繰り返し]を開始:」の部分はロックを解除するための4桁数字の入力を自動で行っています。

 

 

冒頭で紹介の HTTP POST によるやり方の方がシンプルですが、任意のシェルスクリプトを自動実行するやり方の事例として記載しました。

 

 

任意のシェルスクリプトの自動実行は、MacroDroid 使い方の幅が拡がるのではないでしょうか。

 

 

 

 

 

 

 

 

2024-11-20

Termux のホームディレクトリと内部ストレージを、特別なファイラーで操作できるようにする

 

 

Termux を開き、”termux-setup-storage" を実行します。

 


 

 

"storage" ディレクトリの中には dcim/movies/pictures ... がありますが、これらは内部ストレージ "sdcard" の中のディレクトリ(フォルダ)です。

 

"shared" は内部ストレージ "sdcard" のことです。

 

 

 

これらのディレクトリやファイルは、Termux で操作できますが、GUI でも操作できるように特別なファイルマネージャーのショートカットを作成します。

 

 

特別なファイルマネージャーは Android に標準で備わっていますが、隠れていてホーム画面に置くことができず、そのため通常は使うことができません

 

しかし、特別なファイルマネージャーのアクティビティをショートカットにするとホーム画面に配置できますので、GUI で操作できるようになります。




以下のようにしてショートカットを作成します。

 

Shortcut Maker を起動します。

 


 

次の画面になりますのでアクティビティをタッチします。

 

 

 

アプリのアクティビティ覧が表示され、後ろの方に「ファイル」という特別なファイルマネージャーがあります。

 



 

ファイル」のアクティビティの2番目 "com.android.documentsui.files.FilesActivity" をタッチします。

 

次の画面になりますので【ショートカットを作成】をタッチします。

 


 

 

次の画面になりますので【ホーム画面に追加】として、ホーム画面に配置します。

 


 

特別なファイルマネージャーのショートカットがホーム画面に配置されました。

 


 

この「ファイル」ショートカットを開始し、左上の をタッチすると次の画面のように[ >_ Termux 空き容量: 0 B]があります。

 



 

ここをタッチすると画面に "storage" が現れますのでこれを開きます。

 

 

 

一般的なファイルマネージャーである Files by Google や CX File Explorer などでも操作できる、内部ストレージの "dcim"、"downloads"、"movies" などのフォルダーのほか、"shared" というのがあります。

 


 

 

この "shared" を開くと内部ストレージ "sdcard" のフォルダリストが現れます。

 


 

この「ファイル」ショートカットによって、Termux の各ディレクトリやファイルと、内部ストレージ "sdcard" のフォルダやファイルとの間で、コピーや移動が可能になります。

 

Termux でも操作できますが、CUI よりも GUI で操作のほうが楽です。

 

 

 

参考までに、次の画面コピーは Files by Google で内部ストレージを開いたときの画面です。

 

 

 

 

 

私はホーム画面にファイラーを3つ置いています。
 


 

CX File Explorer は Mac のフォルダやファイルをアクセスできる Samba 接続機能を備えており、スマホと Mac 間でファイル交換ができます(Google Drive 経由でも可能ですが)。

 

 

Files by Google はジャンクファイル削除機能があり、ときどきジャンクファイルを消すために使います。

 

 

そして今回紹介した特別なファイルマネージャーで、Termux のホームディレクトリと、Android のフォルダやファイル間の交換に使います。

 

 

 

 

 

 

 

 

 

2024-11-18

Termux で任意のシェルをワンタッチで自動実行するショートカットの作り方

 

【2024-11-19 一部訂正】記事末に記載の MacroDroid の事例を訂正

 

 

例えば SwitchBot スマートプラグの電源を、curl で叩いてオン・オフするシェルを作ったとします。

 

これをショートカットにしてワンタッチで実行できるようにする、というのが主旨です。

 

 

これを可能にするため、コマンド(群)をシェルにして特定のディレクトリに置いておき、このシェルを Termux のショートカットでワンタッチ実行するのです(MacroDroid で設定すれば自動実行化も可能)。

 

使うアプリは次のものです。

 

   ・Termux / Termux:Widget

   ・Shortcut Maker

   ・Shell Script Editor(または Text Editor)

 

 

特定のディレクトリとは、Termux のホームディレクトリの ~/.shortcuts ディレクトリです。

 

ここにシェルを入れておくとショートカット化した Termux を起動すると自動実行されます。

 

実行時にターミナル画面を表示しない場合はシェルを ~/.shortcuts/tasks サブディレクトリに置きます。

 

 

ショートカット化には Termux:Widget を使います。

 

 

 

Shortcut Maker は Android の「ファイル」を操作できるようにするために使います。

 

「ファイル」のアクティビティをショートカット化することで、~/.shortcuts ディレクトリにアクセスすることができますので、作成したシェルを、例えば内部ストレージの Downloads ディレクトリに保存し、これを ~/.shortcuts ディレクトリにコピーまたは移動できるようになります。

 

「ファイル」アプリは Files by Google のことではありません。

 

Android 機はデフォルトでファイル マネージャーがインストールされていません。

ただし、設定アプリに隠されていますが利用可能なファイル マネージャー「ファイル(Files)」があります。

これのショートカットを 1 回クリックするだけでそのファイル マネージャーを開くことができます。

 

 

 

 

「ファイル(Files)」は Android に基本機能として備わっているものの、ホーム画面上には置くことができず、通常は起動することができません。

 

 

アクティビティをショートカット化して初めて操作できるようになり、Android 機の内部ストレージ以外に、Termux のホームディレクトリも操作できるようになります。

 

 

したがってシェルを内部ストレージから Termux のディレクトリにコピーまたは移動ができるようになるのです。

 

図で表すと下図のような関係です(Files が「ファイル」)。

 


 

 

 

さて、UMUDIGI S5 Pro へは Google Play Store から最新版 Termux をインストールできません(インストール対象外機種になっています)。

 

また対象機種であっても Termux は Google Play Store からインストールできますが、Termux:Widget はインストールできません。

 

 

なので、どちらも F-Droid からインストールしますが、その前に F-Droid 自体をインストールします。

 

スマホのブラウザで F-Droid にアクセスしダウンロードします。

 


 

 

ダウンロードした F-Droid.apk をインストールします。

 

インストールしたら F−Droid アプリを開きます。

 



赤く囲んだ検索レンズマークをタッチします。

検索窓に「termux」と入力します。

 


 

「Termux Terminal emulator with packages」をタッチしてインストールします。

 

引き続き「Termux:Widget Launch Termux commands from the homescreen」をインストールします。

 

 

インストールした Termux を起動し、コマンドラインから "pkg upgrade" を実行し、"pkg install curl" で「curl」をインストールします。

 

pkg コマンドは、必要に応じていろいろなパッケージをインストールするときに使います。

 

 


 

 

さて、ここで curl を叩いて SwitchBot の電源オフ・オンをしてみましょう。

 

デバイスIDトークンはモザイクをかけています


 

最初に "turnOff" で SwitchBot のランプが消えて電源オフが確認できます。

 

次に "turnOn" で SwitchBot のランプが点いて電源オンが確認できます。

 

 

ここまでで Termux での curl の動作が確認できました。

 

 

 

 

ーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーー

シェルをワンタッチで自動実行するショートカットを作成していきます

ーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーー

 

必要なものは Termux:Widget のほかに次のものです。

 

Google Play Store からダウンロード・インストールします。

 

   ・Shell Script Editor(または Text Editor)

 



 

   ・Shortcut Maker


 

 

 

 

1.Shell Script Editor で次のような Script を作成します

 

 


 

 

 

SW_Off.sh は SwitchBot を電源オフにするスクリプトです。

 

SW_On.sh は SwitchBot を電源オンにするスクリプトです。

 

作成したら適当なディレクトリに保存します。

 

ここでは内部ストレージの Downloads ディレクトリに保存します。

 

 

 

 

2.「ファイル」のショートカットを作成します

 

Shortcut Maker アプリを起動します。

次の画面になりますので、アクティビティをタッチします。




 

スクロールダウンしていくと後ろの方に「ファイル(Files)」があります。

 


 

右側にある ∨ をタッチすると「ファイル」のアクティビティが5つ表示されます。

 


 

2番目の「com.android.documentsui.files.FilesActivity」をタッチすると次の画面になります。

 


 

 

[ショートカットを作成]をタッチすると画面が次のようになります。



 

 

[ファイル ショートカット]部分を長押ししてホーム画面にドラッグします。

 


 

「ファイル」のショートカットが作成できました。

 

「ファイル(ショートカット)」を開きます。

 


 

Downloads の中身は次のようになっています。

 


 

SW_On.sh がオンにするシェルです。

SW_Off.sh がオフにするシェルです。

 

これらを「コピー」して Termux の ~/.shortcuts/tasks にペーストするため、左上の をタッチして Termux をタッチします。

 

 

 

次のようになります。

 


 

.shortcuts をタッチします。

 


 

tasks をタッチし、2つのファイル(シェルスクリプト)をペーストします。

 


 

Termux:Widget を右クリックして「ウィジェット」をタッチするとつぎの画面になります。

 


 

赤く囲んだ部分をタッチします。

 


 

tasks をタッチします。



 

SW_Off.sh をタッチします。




赤く囲んだ部分を長押ししてホーム画面にドラッグします。

 

 

事前に緑で囲んだアイコンのようにすでにショートカットを作成しています。

 

ショートカット「SW_Off.sh」をタッチすると SwitchBot の電源が切れます。

 

ショートカット「SW_On.sh」をタッチすると SwitchBot の電源が入ります。

 

 

 

 

このショートカットを MacroDroid の UI 画面操作でクリックして SwitchBot の電源をオフにすることができます。

 


トリガー:充電が => 90% になったら以下のアクションを発動

 

アクション:

   ① 画面をオフにする

       ② でロック画面を確実に表示させるためにいったん画面オフ

   ② 画面をオンにする

       ロック画面を表示

   ③「[1回の繰り返し] を開始」部分は次のアクションです

       ・下から上へスワイプして PIN 入力画面にする

       ・4桁の PIN コードを入力する

   ④ ③ でロックが解けたらホーム画面を表示

   ⑤ UI 画面操作で「『SW_Off』を含む部分(ショートカットアイコンのアイコン名の箇所)
       をクリックする」というアクション

       このアクションで SwitchBot の電源がオフになります

   ⑥「充電が完了しました!」という通知をします 

 

 

このマクロによって 90% まで充電したら SwitchBot プラグの電源をオフにして充電を自動停止するということが実行できます。

 

 

少々マニアックなやり方ですが、Termux - Widget によって SwitchBot の電源オフを行う一つのやり方です。

 

 

 

この事例によらず、シェルをワンクリックで実行するというのはアイデア次第でいろいろできそうです。

 

 

 

 

 

 

 

 

 

2024-11-17

Android 機を、SwitchBot を使って 90% 充電で自動停止させる

 

 

Macrodroid を使います。

 

IFTTT を使わないやり方です。


当初はスクリプトで curl で叩こうとしましたが、最新バージョンの Macrodroid で叩いてもエラーになります。

 

 

termux から curl で叩くと SwitchBot の電源がオフになりますから、スクリプト自体は間違っていません(デバイスIDトークンはモザイクをかけています)。

 

実行結果はステータスコード:100 で「成功」となっている

 


turnOff 部分を turnOn とすると SwitchBot の電源がオンになります。

 

 

スクリプトに curl で叩くやり方は、Android 機種(バージョン?)によりうまくいく機種と、そうでない機種があるそうです。

 

手持ち機種は全滅でしたから、MacroDroid も怪しいかも知れません。

 

 

いずれにせよ curl で叩くやり方は諦め、直接に HTTP POST で対応します。


 

 

事前に SwitchBot のデバイスID とトークンを得ておきますが他人には漏らさないようにしてください。

 

 

 

 ▶ デバイスID の取得 


デバイスID は SwitchBot アプリから次の手段で得ます。

 

  ① ホームから Switch Plug Mini をタッチ

  ② 右上の歯車タッチし「デバイス情報」をタッチ

  ③ BLE MAC アドレス(AA:BB:CC:DD:EE:FFという形式)の
      : を全て削除して繋げたものがデバイスID です

      AABBCCDDEEFF をメモしておきます

 

 

 

 ▶ トークンの取得 

  ① SwitchBot アプリのホーム画面の「プロフィール」をタッチします

  ② [設定]⇨[基本データ]と進み「アプリバージョン」を連打します

      「開発者向けオプション」が出てきます
 

  ③「開発者向けオプション」をタッチすると、トークン情報が出ます

     右のコピーマークをタッチしてコピーしておきます(トークンのコピー)

 

 

 

 ▶ Macrdroid の設定 

 

完成形は次です。

 

充電が 90%(80% でも 100% でも自由に決められます)に達したら SwitchBot の電源を切断し「充電が完了した」というダイヤログを、通知音を鳴らして表示します。

 

モザイク部分はデバイスID です


 

以下のように設定します。

 

  ① トリガーの設定

      [バッテリー/電源]の中の[バッテリー残量の変化]をタッチします

      [オプション]は[指定残量への増加/減少時]を選択して[OK]します

      [バッテリー残量トリガー]は[〜まで増加]を選択し、スライダーで任意の数値まで
      ずらします

         (例えば 80% とか 90% など)

      [OK]をタッチしてトリガー設定は完了です

 

 

  ② アクションの設定 

      [Web 操作]の中の[HTTPリクエスト]を選びます

 

      (1)[設定]タブの[リクエストメソッド]を[POST]にします

      [URL を入力]欄に[https://api.switch-bot.com/v1.0/devices/<デバイスID>/commands]を入力します

      その他の設定項目は次のようにします

      ・[完了するまで待機]をチェック

      ・[タイムアウト]は 30 を設定(秒)

      ・[HTTPレスポンスを保存しない]をチェック

      これら以外は設定不要です

 

      (2)[クエリーパラメーター]タブに移り[パラメーター名]に[Content-Type: application/json; charset=utf8]を設定

           [値]には 1 を設定し[OK]します

 

      (3)[コンテントボディ]タブに移り[コンテントタイプ(MIMEタイプ)]は[application/json]を選びます

          [コンテントボディ]に[{"command": "turnOff", "parameter": "default", "commandType": "command"}]を入力し[ヘッダーパラメーター]タブに移ります

 

      (4)[パラメータ名]に[Authorization]を入力し、
          [値]に[Bearer <トークン>]を入力・コピーしておいたトークンをペーストします

 

      (5)[右上のマークをタッチして反映させます

 

      (6)[待機1秒]の設定

          [アクション]を ➕️ して

          [マクロ]⇨[次のアクション実行前に待機]をタッチし[1秒]を設定


      (7)[ダイヤログを表示]の設定

           [アクション]を ➕️ して

           [通知]⇨[ダイヤログを表示]をタッチします

           [タイトル]に[充電]を、[ダイヤログのテキストを入力]に
           [が完了した]を設定し[OK]で反映

 


以上です。

 

 

アクションをテストして SwitchBot がオフになり、通知音が鳴り、次のようなダイヤログが表示されるのを確認してください。

 


 

 

SwitchBot がオフにならないときは HTTP POST の内容を間違っていますので、確認ください。  

 

      

Android 向けは UMIDIGI S5 Pro および、TECLAST M40 AIr タブレットで動作させており、90% 充電で自動的に充電オフしています。

 

メインスマホの OPPO Reno11 A は充電 80% で自動停止する機能(いわゆる「いたわり充電」)がありますので、ここで紹介したやり方は不要です。