2024-11-17

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

Switchbot API が v1.1 でしか扱えないため当記事の方法では自動停止化できません

 

SwitchBot API v1.0 に代えて v1.1 を使う 〜 80%/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% で自動停止する機能(いわゆる「いたわり充電」)がありますので、ここで紹介したやり方は不要です。

 

 

 

 

 

 

 

 

 

8 件のコメント:

匿名 さんのコメント...

情報ありがとうございます!
IFTTTが有料となり困っておりました。設定することができました。
ちなみに、バッテリー残量が20%以下になったら、電源onにしたいのですがその場合はどのように設定すればよろしいでしょうか?

bike86-3 さんのコメント...

おはようございます。

20%以下になったら電源オンにするというのは、電源オフと併用して、充電ケーブルを繋ぎっぱなしで運用したいということでしょうか。

20%以下で電源オンは次のようにします。

1.マクロを複製し、複製した方のマクロ名は「充電再開」とでもします。
2.トリガーを設定変更し、「〜まで減少」を選び、スライダーで20%にします。
3.アクションのHTTP リクエストを設定変更し、「コンテントボディ」タグに移動して「{"command": "turnOff", "parameter": "default", "commandType": "command"}」の中の「turnOff」を「turnOn」にし、右上の☑️をタップして反映させます。
4.ダイヤログの中身を「充電を再開」とでもします。
またはこのアクションを削除・無効にします。

以上です。

匿名 さんのコメント...

ご教示いただきありがとうございます。

昨日より、Macrodroidとswitchbotが通信できなくなりました。Macrodroidのシステムログ側では実行できているので、おそらくswitchbot側だと思うのですが、何が原因か分かりますでしょうか?

よろしくお願い致します。

bike86-3 さんのコメント...

こんにちは。

当ブログ「SwitchBot の api.switch-bot.com が突然 "403: forbidden" 」が原因でしょう。

続編記事「api.switch-bot.com の "403: forbidden" は回復【2024-12-18 追記】」で回復していますが、SwitchBot のモデルにより、v1.0 では使えないかも知れません。
その場合は v1.1 への移行が必要です。

「SwitchBot Plug API を V1.0 から V1.1 に」と関連記事記事を閲覧いただければ対応方法が書いてあります。

匿名 さんのコメント...

ご返信ありがとうございます。現在も使えない状態なので、やはり、v1.0はだめかもしれません。

V1.1のやり方を拝見させていただいたのですが、termuxを使わないといけないのでしょうか?使い方も含めて調べたのですが、分からなくて、、、
IT音痴で、申し訳ないのですが、いちからご教示いただけないでしょうか?

bike86-3 さんのコメント...

こんにちは。

できればニックネームでかまいませんので、お名前を記載してください。

v1.1 からはセキュリティが強化されましたので、v1.0 での「デバイスID」と「トークン」だけでは動作しなくなりました。

タイムスタンプと暗号化が必要です。タイムスタンプはUTC での現在時間から5分以内に SwitchBot の API を叩くために必要です。

なので、HTTP POST 方式ではこのタイムスタンプがリアルタイムに設定できないため使えません。

SwitchBot v1.1 の API は curl コマンドを叩くか、Python などでプログラムを組む必要があります。

前者の方が楽なやり方で、当ブログでも記事にしています。

curl コマンドで「タイムスタンプ」と「SwitchBot のクライアントシークレットを暗号化した sign」と、「nonce」を curl コマンドの --header パラメーターで指定するのです。

スマホで SwitchBot を制御する curl コマンドは Termux がで使うのが近道です。

これは仮想的な Linux 環境を構築でき curl コマンドが使えるのです。

また curl コマンドをシェルにして、それを Termux: Tasker プラグインで使えるようにします。

このプラグインを使って、MacroDroid や Tasker でアクションを起こします。

なので、10/18 の記事「Termux で任意のシェルをワンタッチで自動実行するショートカットの作り方 」から、最新記事までよく読んでいただいて、少し学習いただく必要があります。

然るのちに Termux, Termux: Tasker プラグインのインストールと、必要なパッケージをインストールしてください。

VFR800F さんのコメント...

匿名でのコメント失礼いたしました。
Termuxでとりあえず実行しました。
pkg update
pkg upgrade
pkg install curl
pkg install uuid-utils
pkg install openssl-tool
それ以降に入力するのが分からず止まっております。
$のあとに以下の通り入力すればよろしいでしょうか?※デバイスID、トークン、クライアントシークレットはSwitchbotからコピペします。
deviceid=""
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"}'

bike86-3 さんのコメント...

VFR800Fさん、おはようございます。

$ のコマンドライン入力欄に貼り付けてエンターで実行してみてください。

SwitchBot Plug mini の点いていたランプが消えればコマンドは正常です。

そうでない場合はどこか間違っています。

なお、ゼロベースで API v1.1 に対応した自動化までのやり方について一両日中には記事にしますので、もう少し待ってください。

することが少し多いので改めて記事をおこすことにします。

それまでは MacroDroid の HTTP POST アクションを無効にして充電完了の通知でしのいでください。