【2024-12-22】Termux: Widget の使い方を記事末に追記
【2024-12-21】
エディターを Simple Text Editor からコードエディターである Acode editor に変更
変更理由:
Simple Text Editor にはシェルスクリプトやコード編集時にコード整形機能がないが、Acode editor には自動整形機能があるため
api.switch-bot.com の "403: forbidden" が発生した 12/16 以降、当ブログの関連記事閲覧が急増しています。
おそらく API が v1.1 になり、使えなくなったことが影響していると思われます。
当ブログの記事を時系列で閲覧し、やり方を理解していただくのは大変面倒だと思われますので、ゼロベースでやり方について記事にします。
api.switch-bot.com v1.0 のときは「デバイスID」と「トークン」で制御できましたが、v1.1 はこれらに加えて、セキュリティ強化がなされ、署名認証が必要になりました。
署名認証は「トークン」「Unix time:ミリ秒」「nonce(UUID)」を連携した「署名」を生成し、唯一無二のデバイスからの制御リクエストであることを認証するためです。
※ Unix time は 1970-01-01 から本日現在までの経過ミリ秒です
署名は「クライアントシークレット」を用いて sha256 暗号化を行い base64 エンコードして使います。
さらに制御リクエストの有効時間は 5分とされているようで、署名生成から 5分以内にリクエストしないと無効にされるようです。
これにより「なりすまし」リクエストが極めて困難となり、強固に防御できます。
SwitchBot Plug mini (JP) デバイスはこれほど強固な仕組みは必要ないと思われますが、SwitchBot ロック(ドアロック)デバイスを制御可能にするため v1.1 の署名認証を追加したと思われます。
実際、SwitchBot ロックは v1.1 から制御リクエストができるようになりました。
ですので、すべてのデバイスが署名認証をしない限り制御リクエストできなくなりました。
やり方は次の手順(概要)で行います。
手順(概要)に続いて具体的な手順の詳細があります。
1.SwitchBot アプリをインストールする
・ログインアカウントを作成登録する
・デバイスを新規に登録する
アプリからデバイスの電源オン・オフができるとともに
API v1.1 を利用する際に必要となる次のものが得られます
・デバイスID
・トークン
・クライアントシークレット(Secret Key)
2.F-Droid をインストールする
F-Droid を使って Termux と Termux: Tasker をインストールします
(Google Play Store のものは古いので使わない)
Termux と Termux: Tasker をインストールする理由ですが、curl コマンドで SwitchBot plug の API(api.switch-bot.com API v1.1)を叩くシェルを Termux で作成し、そのシェルを Tasker や Macrodroid で使えるようにするためです
Termux は 仮想的な Linux 環境で、root 権限なしに使えます
Termux: Tasker は Tasker プラグインで、Termux を使って作成したシェルを Tasker や MacroDroid などの自動化ツールで使えるようにするものです
併せてコードエディターの Acode editor もインストールします
必要に応じて Termux: API と Termux: Widget もインストールします
これら2つは SwitchBot plug API を使うのに必ずしも必要ではありませんが、Termux を継続して使うなら入れておいた方がいいでしょう。
3.Android 機に隠されたファイラーを使えるようにする
Termux のディレクトリやファイルは Termux からしか扱えません
また Android 内部ストレージは Termux の termux-setup-storage コマンドにより Termux で扱えるようになりますが、Android 側からは Termux のディレクトリやファイルは扱えません
Android 側から Termux のディレクトリやファイルを扱うには特別なファイラーを使います
Android 機にはドロワーアプリ一覧には現れない特別な、隠れた標準ファイラーがあります
通常は使うことができませんが、アクティビティをショートカット化すればホーム画面に配置できて使えるようになります
ショートカット化されたこのファイラーを使えば、Android の 内部ストレージのディレクトリやファイルと、Termux のディレクトリやファイルの両方を操作(作成・削除・移動・コピーなど)できるようになります
4.コードエディターを使う
Termux 上で vim や nano を使えばコマンドラインからテキストやシェルを作成・編集できますが、コードエディターがあればこれを使って画面上で作成・編集でき、シェルスクリプトやコードが自動整形されます
コードエディターは必須ではありませんが、入れておくと vim や nano でスクリプトを作成・編集することに比べて、CUI ではなく GUI で操作できますから大変重宝します
5.MacroDoroid や Tasker で自動化する
80% 〜 90% 充電したら SwitchBot plug の電源を自動的にオフにして充電を停止させるためです
ーーーーーーーーーーーーーーーーーーーー
それでは具体的にそれぞれの手順を説明します。
1.SwitchBot アプリをインストールする
Google Play Store で SwitchBot を検索し、インストールします。
以下は iPhone での例ですが、Android 機も同じ手順です。
まず Bluetooth をオンにし、WiFi 接続を 2.4GHz にしておく必要があります。
でないと SwitchBot plug mini (JP) との接続ができません。
接続は Bluetooth で本体を探し、次に本体固有のコードを識別して、2.4GHz WiFi で接続する仕組みのようです。
まずはアプリを起動しアカウントを作成します。
メールアドレスを入力して[作成]をタップします。
「プライバシーポリシーと利用規約に同意します」にチェックを入れ[認証コードを送信]をタップします。
作成時に入力したメールアドレスに「認証コード」が送られてきますので、これを入力します。
再度「利用規約」と「プライバシーポリシー」への同意を求められます。
[同意する]をタップします。
パスワードの設定を求められますのでこれを設定し[確認]をタップします。
セキュリティ強化のための 2段階認証方式を採用するかどうかを聞かれます。
設定するには[設定へ]を、設定しない場合は[キャンセル]をタップします。
ニックネーム入力をして、[保存]をタッチすればログインアカウントの登録は完了です。
作成したら「ホーム」タブをタップしてログインします。
赤く囲った部分をタッチしてメールアドレスとパスワードを入力してログインします。
最新版ファームウェアの更新通知がきていればアップデートします。
本記事公開時点:2024−12−19 の最新版は V2.0(2024-08-16 付け)です。
SwitchBot アプリに「SwitchBot plug mini」を新規登録
SwitchBot plug mini (JP) をコンセントに差し込みますが、N極プラグなので N極対応コンセントでないと差し込みできませんので留意してください。
N極とはアース接地された側を指し、幅が他方(非接地側)よりも 2mm ほど広い側です。
壁面コンセントは N極対応されているはずですが、市販のタップ等は N極対応されていないものもありますから注意します。
「ホーム」タブをタップして以下の処理を行います。
① 真ん中の「⊕ デバイスを追加」をタップ、または右上の ⊕ をタップします
② プラグミニ(JP)をタップ
③[次へ]をタップ
④ プラグミニの電源ボタンを 2秒長押しする
(LEDが青く点滅するまで)
⑤[次へ]をタップ
⑥[スタート]ボタンをタップ
⑦ カメラが起動するので QRコードを読み込む
(QRコードは本体横面または同梱のカードに印刷されている)
⑧「コンセント」を[ホームに追加]をタップ
⑨ コンセントの接続場所を選択し[続ける]をタップ
⑩ アプリのホーム画面に「SwitchBot plug mini」が表示されれば完了
▶ デバイスID の取得
デバイスID は SwitchBot アプリから次の手段で得ます。
① ホームから SwitchBot plug mini をタップ
② 右上の歯車タッチし「デバイス情報」をタップ
③ BLE MAC アドレス(AA:BB:CC:DD:EE:FFという形式)の
: を全て削除して繋げたもの "AABBCCDDEEFF" が デバイスID です
"AABBCCDDEEFF" をメモし、Google Keep になどペーストしておきます
▶ トークンとクライアントシークレットの取得
① SwitchBot アプリのホーム画面の「プロフィール」をタップします
② [設定]⇨[基本データ]と進み「アプリバージョン」を 10回ほど連打します
「開発者向けオプション」が出てきます
③「開発者向けオプション」をタップすると、トークンとクライアントシークレットが出ます
右のコピーマークをタップしてコピーし、Google Keep などにペーストしておきます
2.F-Droid をインストールする
F-Droid を使って Termux と Termux: Tasker をインストールします。
(Google Play Store のものは古いので使わない)
併せてあとで使うコードエディター Acode editor をインストールします。
必要に応じて Termux: API と Termux: Widget もインストールします。
スマホのブラウザで F-Droid にアクセスしダウンロードします。
ダウンロードした F-Droid.apk をインストールします。
インストールしたら F−Droid アプリを開きます。
赤く囲んだ検索レンズマークをタップします。
検索窓に「termux」と入力します。
「Termux Terminal emulator with packages」をタップしてインストールします。
すぐ下の「Termux: Tasker Tasker plug-in to run Termux script from Tasker」と「Termux: Widget Launch Termux commands from the homescreen」を同様にインストールします。
併せてコードエディターの Acode editor をインストールします。
コードエディターはなんでもいいのですが、F-Droid 版の Acode editor はコード自動整形機能があり、無料・広告なしです(Google Play Store 版は広告あり、または有料)。
インストールした Termux を起動し、コマンドラインから
$ pkg update # リポジトリの最新化
$ pkg upgrade -y #パッケージの最新化
を実行し、以下のコマンドを実行します。
$ termux-setup-storage # 内部 Storage を扱えるようにする
$ pkg install curl # curl コマンドをインストール
pkg コマンドは、必要に応じていろいろなパッケージをインストールするときに使います。
例えばコマンドラインエディターである vim や nano も
$ pkg install vim nano
としてインストールできます。
今回は UUID / base64 エンコーダー もインストールします。
$ pkg install uuid-utils # nonce を得るため
$ pkg install openssl-tool # sign 値を base64 にエンコードするため
ここまできたら、一度 SwitchBot plug mini (JP) の電源オフを次のコマンド群を実行して確認します。
なお <デバイスID>、<トークン>、<クライアントシークレット> は 1項で得て Google Keep などに保存しておいたものをコピペします。
ーーーーーーーーーー ここから ーーーーーーーーーー
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 -X POST "https://api.switch-bot.com/v1.1/devices/${deviceid}/commands" \
-H "sign: ${sign}" \
-H "t: ${t}" \
-H "nonce: ${nonce}" \
-H "Content-Type: application/json" \
-H "Authorization: ${token}" \
-d '{"command": "turnOff", "parameter": "default", "commandType": "command"}'
"turnOff" は SwitchBot Plug mini (JP) の電源オフ、"turnOn" が電源オンです。
次に Termux の home ディレクトリに .termux ディレクトリを作成し実行権限を与えます。
$ mkdir -m 700 .termux # 先頭に . (ピリオド) を忘れない
Termux の home ディレクトリの配下のディレクトリ構成は次のようになります。
.termux の配下に tasker ディレクトリを作成し、これにも実行権限を与えておきます。
$ mkdir -m 700 tasker
この tasker ディレクトリにシェルスクリプトを配置すると Tasker プラグインでそのシェルを扱えるようになります。
Tasker プラグインは MacroDroid や Tasker のアクションで扱え、作成したシェルを設定するとそのシェルを実行できるようになります。
3.Android 機に隠されたファイラーを使えるようにする
Android の一般的なファイラー「CX File Explorer」や「Files by Google」などでは Termux のディレクトリやファイルは操作できません(見えません)。
Android に基本機能として備わっている「ファイル(Files)」はドロワーアプリ一覧にはなく、ホーム画面上には置くことができず、通常は起動することができません(隠されているファイラー)。
この「ファイル(Files)」は、アクティビティをショートカット化して初めて操作できるようになり、Android 機の内部ストレージ以外に、Termux のホームディレクトリも操作できるようになります。
したがってシェルを内部ストレージから Termux のディレクトリにコピーまたは移動ができるようになるのです。
図で表すと下図のような関係です(Files(ショートカット) が「ファイル」)。
Shortcut Maker を Google Play Store からインストールし、起動します。
次の画面になりますのでアクティビティをタップします。
アプリのアクティビティ覧が表示されます。
検索欄に「ファイル」と入力すると「ファイル」という特別なファイルマネージャーが表示されます。
「ファイル」のアクティビティの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 で操作のほうが楽です。
4.コードエディターを使う
コード自動整形機能がある Acode editor を使います。
Acode editor |
これを使ってシェルスクリプトを作成します。
シェルスクリプトの内容は下記です。
<デバイスID>、<トークン>、<クライアントシークレット> は 1項で得て Google Keep などに保存しておいたものをコピペします。
ーーーーーーーーーー ここから ーーーーーーーーーー
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 -X POST "https://api.switch-bot.com/v1.1/devices/${deviceid}/commands" \
-H "sign: ${sign}" \
-H "t: ${t}" \
-H "nonce: ${nonce}" \
-H "Content-Type: application/json" \
-H "Authorization: ${token}" \
-d '{"command": "turnOff", "parameter": "default", "commandType": "command"}'
"turnOff" は SwitchBot Plug mini (JP) の電源オフ、"turnOn" が電源オンです。
先頭に shebang を記述しておきます。
shebang は次の内容です。
#!/data/data/com.termux/files/usr/bin/bash
これはコマンドを格納したディレクトリを示しており、本例では curl コマンドの場所を示しています。
したがって上記のスクリプトを実行するために設定しますが、なくてもとくに問題はないようです。
作成したら SW_Off.sh という名前にでもして tasker ディレクトリに保存します。
名前は任意ですが .sh を後ろに付加してください。
作成した SW_Off.sh には実行権を与えます。
$ chmod 700 SW_Off.sh
確認します。
$ ls -l
-rwx------ の rwx は 読み(r)書き(w)可能、実行(x)可能を示します。
ちゃんと実行できるかを Termux から確認します。
$ cd ~/.termux/tasker
$ ./SW_Off.sh
下記のようにステータスコードが 100 / "message" : "success" となっていれば正しく実行されたということです。
SwitchBot plug mini(JP) の電源がオフになっているはずです。
5.MacroDoroid や Tasker で自動化する
もう少しです。
MacroDroid(または Tasker)には特別な権限が必要です。
[アプリ情報]⇨[権限]⇨[その他の権限]⇨[Run command in Termux environment]をタップして[許可]します。
Tasker の場合は加えて[アプリが Tasker にユーザー指定のタスクと自身のタスクを実行させることを許可する]もタップして[許可]します。
さて、MacroDroid での設定です。
トリガー:「90% になったら発動する」設定をします
アクション:
[アプリ]⇨[Tasker/Locale プラグイン]⇨[Termux: Tasker]をタップすると
すぐ下に[Termux イベント]が現れますのでこれをタップ
下図画面になりますので 欄に S を入力します。
すると .termux/tasker ディレクトリ内の S* ファイルリストが現れます
SW_Off.sh をタップし、右上の SD カードマークをタップします。
次画面になります。
なにもしないで[OK]をタップします。
その他のアクションを追加し、最終的に下図のようになります。
赤く囲んだ部分が Tasker プラグインで SW_Off.sh を設定した箇所です。
例では 90% まで充電すると Tasker プラグインの仕組みで SW_Off.sh が実行されて SwitchBot plug mini (JP) の電源がオフになります。
Tasker で自動化は次のプロファイル(MacroDroid のトリガーに相当)とタスク(MacroDroid のアクションに相当)で構成しますが、説明は割愛します。
MacroDroid での自動化とほぼ同じことをしています。
タスクの内容は次のとおりですがこれも説明は割愛します。
【2024-12-22】Termux: Widget の使い方
2項で Termux と Termux: Tasker をインストールした際に Termux: Widget もインストールしたと思います。
これを使えばウィジェット化したシェルスクリプトをワンタッチで実行できるようになります。
ウィジェットの作り方
Termux のホームディレクトリの下に .shortcuts ディレクトリを実行権を与えて作成、その配下に tasks ディレクトリを実行権を与えて作成します。
$ cd ~/ # ディレクトリを home にする
$ mkdir -m 700 .shortcuts # .shortcuts ディレクトリ作成
$ cd .shortcuts # ディレクトリを .shortcuts に移す
$ mkdir -m 700 tasks # tasks ディレクトリ作成
作成した tasks ディレクトリに、4項で作成した SW_Off.sh をコピペします。
スマホ画面上の「Termux: Widget アプリ」をロングタッチすると次画面になります。
画面の「ウェジエット」をタッチすると次画面になります。
「>_」部分をロングタッチしてスマホ画面の空いた場所にドラッグすると次画面になります。
「tasks」ディレクトリが表示されますので、タッチすると配下のシェルファイルが表示されます。
「SW_Off.sh」ファイルをタッチすると次画面になります。
再度「>_」部分をロングタッチしてスマホ画面の空いた場所にドラッグします。
ウィジェットが画面上に配置されます。
この部分をタッチすると SW_Off.sh が実行され、SwitchBot plug mini が電源オフされます。
同様に、SW_On.sh もウィジェットにしておくとワンタッチで SwitchBot plug mini を電源オンできます。
13 件のコメント:
早速、まとめていただきありがとうございます。
termuxにて、Switchbotミニプラグの電源オンオフができました。
そこから先の
mkdir -m 700 .termuxを実行しましたが、mkdir: cannot create directory'.termux': File exists
となりまして、先に進むことができません。
何か間違いありますでしょうか?
VFR800F さん、こんにちは。
メッセージからするとすでに .termux ディレクトリができているではありませんか。
pwd コマンドで現在のディレクトリ位置を確認します。
/data/data/com.termux/files/home とかえってきますでしょうか。
ls -la としてみてディレクトリ一覧に .termux がないでしょうか。
ご返信ありがとうございます。
/data/data/com.termux/files/homeと返ってきました。
また、ls −laで実行すると、drwx--- (省略) Dec 19 16:03.termux
termux→taskerへファイル(SW_Off.sh)を保存し
$ chmod 700 SW_Off.shで実行すると、chmod: cannot access 'SW_Off.sh': No such file or directory
となってしまいます。
何が設定で間違えているところはございますでしょうか?
よろしくお願いします。
SwitchBotで充電管理を行っていたため大変助かりました
わかりやすく丁寧な記事をありがとうございました
VFR800F さん、こんばんは。
ディレクトリ位置が home にある場合はコマンドプロンプトが ~ $ になります。
cd .termux として la -l で .termux 配下のディレクトリを見てください。
tasker というディレクトリはありますでしょうか。
あれば cd tasker として ls -l で tasker ディレクトリ内のファイル一覧を確認ください。
おそらくここに SW_Off.sh がないのだと思います。
つまり保存先を間違えていると思います。
19/12/24 18:27 にコメントくださった匿名さん、こんばんは。
お役に立てて嬉しく思います。
なにかありましたら遠慮なくコメントください。
その際、ニックネームでかまいませんのでお名前を記載いただけるとありがたいのですが。
ご教示ありがとうございます。
SW_Off.shの保存先が間違っておりました、、、
〜/.termux/tasker $ ls -lで実行し、
rwx--- (省略) Dec 19 21:27.SW_Off.sh←緑色
とでました。
その後に〜/.termux/tasker $./SW_Off.shで実行すると{"message": "Unauthorized"}となってしまいます。
SW_Off.shのファイルの作り方が悪いかと思うのですが、termuxで直入力したときはswitchbotは動いているのですが、、、
なぜかわかりますでしょうか。
何度も申し訳ございませんが何卒よろしくお願いします
VFR800F さん、おはようございます。
トークンか、シークレットをコピペ間違いと思われます。
ここまで来ているということは、ファイルショートカットの作成と、エディターインストールは済んでいるのですね?
ファイルショートカットを開き左上の ≡ をタップ、一番下に Termux がありますので、これをタップ。
そうすると Termux の home ディレクトリの中身が表示されます。
.termux ⇨ tasker と進むとそこに SW_Off.sh があると思います。
これをタップするとエディターの選択画面が出ますので、Simple Text Editor を選ぶと内容が表示されます。
トークンとシークレットを改めてコピペし直してください。
そして、エディターの右上の︙をタップし、「上書き保存」します。
次に Termux のコマンドプロンプトで ./SW_Off.sh を実行してみてください。
ご教示いただきありがとうございます。
手順通り実施も同じ現象でした。
試しにGoogle keepとSimple Text Editorの内容をそれぞれtermuxにコピペするとGoogle keepは実行されて、Simple Text Editorからコピペしたものだと実行できませんでした。
termux上でGoogle keepとSimple Text Editorでそれぞれ貼り付けた文字などを確認しましたが、同じでした。Google keepから貼り付けたものだけが実行できている状態です。
Google keepからSimple Text Editorへコピペした際に何かしらの見えないテキストなどが貼られているのかで不具合が生じているのかと思っています。
どう対処すればよろしいでしょうか?
ご教示いただきありがとうございます。
手順通り実施も同じ現象でした。
試しにGoogle keepとSimple Text Editorの内容をそれぞれtermuxにコピペするとGoogle keepは実行されて、Simple Text Editorからコピペしたものだと実行できませんでした。
termux上でGoogle keepとSimple Text Editorでそれぞれ貼り付けた文字などを確認しましたが、同じでした。Google keepから貼り付けたものだけが実行できている状態です。
続報
simple text editor→Jota+へアプリを切り替えて実行しましたら、できました!
色々とご教示いただきましてありがとうございました!
VFR800F さん、こんにちは。
ウチでは問題ないので、Simple Text Editor の設定でのコード体系が合っていないと思われます。
右上の︙をタップして「設定」を開きます。
「エンコードの種類」を「UTF-8」にします(多分、ここが違っていると思います)。
「改行コード」は「デフォルト」にします(デフォルトになっていると思いますが)。
これでうまくいくと思います。
Jota+ でもうまくいくのなら構いません。
あとはMacroDroid(または Tasker)での設定で自動化できますね。
よかったです。
ご返信ありがとうございます。
エンコードの種類はUTF-8で、改行コードもデフォルトになってました。
理由がよく分からないですね、、、
とりあえずできたので良かったです。
本当にありがとうございました!
VFR800F さん、おはようございます。
事象の状況がわかりました。
Keep のテキストは Simple Text Editor では .sh 形式には成型されないようです。
jota+ は成型されるので .sh として有効になるようです。
Text エディターはプログラムやシェルに合わせて成型してくれるエディターとそうでないエディターがあり、後者だとテキストをコピペしたときにうまくない場合があるということです。
ご面倒をおかけして申し訳ありませんでした。
Simple Text Editor は無料で軽快で、広告もないのでいいのですが、プログラム成型しないのが今回よくわかりました。
jota+ もよいエディターですが、有料版は少し高いし、無料版は広告が煩わしい。
F−Droid 版に Acode というコードエディターがあり、無料で使えます。
なので、今後はこれを使うことにします。
コメントを投稿