2024-12-17

api.switch-bot.com の "403: forbidden" は回復【2024-12-18 追記】

 

 

 

 

status.switch-bot.com によれば 17日(火)2:45 UTC(11:45 JST) に 403 エラー報告を受け調査中とあり、4:35 UTC(13:35 JST)に回復したとありますが、これほど重大なエラーが、これら「ふたこと」ですまされており、遺憾ですよ。

 

 

一応回復は確認しましたけどなんだかなぁ!?

 

 

昨夕(16日夕 JST)に発生しているのに、今日の午後まで回復にかかっています。

 

 

重大インシデントという意識は SwitchBot にはないのかな?

 

 

 

 

【2024-12-18 追記】

 

我が家の SwitchBot mini B2 は モデル:W2001401 で 12/17 の本障害以降は v1.0 API では動作しなくなっています。

 

 

v1.1 に移行しておいてよかった。

 

障害はどうもこの切り替え時のことと思われます。

 

 

だけど v1.0 のモデルごとのサポート打ち切りはいつからかをホームページで事前に知らせてもらいたいものです。

 

 

思えば 12/16 に v1.0 から v1.1 に移行したのはたまたまだったのですが、虫の知らせのような気がしないでもありません。

 

 

 

 

 

 

 

SwitchBot の api.switch-bot.com が突然 "403: forbidden"

 

 

昨日 12月16日 夕方から "403: forbidden" エラーになり、15時間あれこれ奮闘しましたが一向に回復しません。

 

 

今朝になり「api.switch-bot.com が forbidden」で Google 検索してみると同様事象に見舞われている人たちがいるようです。

 

 

どうやら SwitchBot の api サーバーダウンか、なにか障害が発生しているようです。

 

 

nslookup で api.switch-bot.com を引くと canonical name として api.switchbot.net があります。

 

 

api.switch-bot.com の代わりに api.switchbot.net を使うと やっと OK になりました。

 

 

同様事象で困っている方は api.switchbot.net を使うとエラーにはならないようですが、v1.1 でないとこのアドレスは有効にならないようです。

 

v1.0 では api.switchbot.net は null が返ってきてうまくないようです。

 

 

 

ちょっと困ってしまいますよね。

 

 

ウチでは充電時に「やさしい充電」にするために使っていますが、同様の用途やそれ以外の用途でプログラム制御している人たちはさぞかし困っているでしょう。

 

 

まだ事例は少ないと思われますが、自宅のドアロックをプログラム制御していると使えなくなっていると思います。

 

 

SwitchBot アプリからは問題なくオン・オフ可能なので多くの方々は問題ないと思われます。

 

 

SwitchBot 側でなにか v1.1 絡みのエラー事象が発生しているのではないかと思われます。

 

ちなみに、v1.1 はセキュリティ強化され、追加で「クライアントシークレット t値 nonce sign(SHA-256 を BASE64 でエンコードしたもの)」が必要になったのは、SwitchBot ロックが制御できるようになったためみたいです。

 

 

 

 

なので、この際 v1.1 にしてみるのも手です。

 

 

 


 

 

 

 

2024-12-16

SwitchBot Plug API を V1.0 から V1.1 に

 

 

本日現在、SwitchBot API V1.0 も使用できますが、いずれ V1.1 対応が必要になる可能性がありますので、V1.1 に移行してみました。

 

API の詳細は下記サイトにあります。

 

 https://github.com/OpenWonderLabs/SwitchBotAPI

 

V1.0 では「デバイスID + トークン」だけで利用できましたが、V1.1 はセキュリティ強化され、追加で「クライアントシークレット t値 nonce sign(SHA-256 を BASE64 でエンコードしたもの)」が必要になります。

 

 

V1.0 の「デバイスID + トークン」だけでもかなり強いパスワード相当ですから、V1.1 で追加が本当に必要かは疑問ですが。。。

 

 

 

まず移行に際して必要なパッケージをインストールします。

 

 

Termux で次の2つのパッケージをインストールします。

 

   ・pkg install uuid-utils  # nonce を得るため

   ・pkg install openssl-tool  # sign 値を BASE64 にエンコードするため


 

シェルを作成します。

 

内容は "ー〜ー ここから ー〜ー"、"ー〜ー ここまで ー〜ー" に記載、"turnOff" は SwitchBot Plug の電源供給オフです。

電源供給オンの場合は "turnOn"とします。


<デバイスID> ですが、SwitchBot アプリで、ホームからデバイスをタップ ⇨ 右上の[設定マーク]をタップ ⇨[デバイス情報]の中の[BLE MAC]アドレス "AA:BB:CC:DD:EE:FF" から ":" を除いたもの "AABBCCDDEEFF" が "デバイスID" です。

 

コピーして以下のシェルに貼り付けます。

 

 
<トークン> <クライアントシークレット> ですが、SwitchBot アプリで、ホームから[プロフィール]⇨[設定]⇨[基本データ]⇨[アプリバージョン]を10回連続タップして現れる[開発者向けオプション]をタップすると表示されます。

 

ともにコピーして以下のシェルに貼り付けます。




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

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"}'

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


そしてこのシェルに chmod で実行権を与えます。

 

Tasker または Macrodroid のアクションで Termux: Tasker プラグインにシェルを設定すれば、例えば 80% まで充電したら電源供給オフにする自動化ができます。

 

 

 

 

 

 

 

2024-12-10

Tasker + Termux: Tasker プラグインで SwitchBot を自動制御する

当記事のシェルスクリプトの curl コマンドは SwitchBot API v1.0 でのものです

 

現在 API は v1.1 になっており、本記事どおりでは正常動作できません

 

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

で説明のシェルスクリプトを使ってください

ーーーーーーーーーー

 

 

MacroDroid + Termux: Tasker プラグインで SwitchBot を自動制御する

 

上記記事では MacroDroid で Termux: Tasker プラグインを使い、シェルを自動で動作させました。

 

MacroDroid は買い切りで 800円ですが、Tasker だと買い切りで 380円です。

 

 

好みや使い勝手の問題もありますので一概にどちらがおすすめということはありません。

 

 

 

今回は MacroDroid よりも安価な Tasker と、Termux: Tasker プラグインで SwitchBot を自動制御するやり方です。

 

冒頭の記事の中で紹介した SW_off.sh シェルを使いますので、シェルの作り方は冒頭の記事を参照ください。

 

 

中身は SwitchBot の電源をオフにする curl コマンドになっています。

 

 

 

1.Tasker を起動してプロファイルを設定します

 

      MacroDroid のトリガーに相当します

 

      設定済みのプロファイルは下記です

      「バッテリー残量」が充電による "=> 90%" をトリガーにしています 



 

     具体的な設定は以下です

 

      ① 右下の をタップします

      ② 次の画面で「CREATE」をタップ




 
 
      ③ 次の画面で「状態」をタップ





 
      ④ 次の画面で「電源」をタップ
 






      ⑤
次の画面で「バッテリー残量」をタップ
 
 

 

      ⑥ 次の画面で

      「これ以上(From)」を 90 (%) にします

      「これに(To)」を 90 (%) にします

      これは "=> 90%" の意味になります
 
 
 
 
      左上の矢印または戻るボタンで戻ります 





2.アクションは次に示すものとなっています

 


      ・Termux: Tasker プラグインでシェルを実行

      ・1秒待機

      ・通知音を鳴らす

      ・ポップアップ表示内容は「90%まで充電完了」

 

 

      ①「新しいタスク  +」をタップします

            タスク名を「SwitchBot off」とでもします

      ② 「プラグイン」⇨「Termux: Tasker」をタップ

 


 

 

      ③ 「設定」の右の をタップ

            Executable~~ 欄に "S" を入力すると下に

            「SW_off.sh」と「SW_on.sh」が現れます

            「SW_off.sh」をタップし、右上の SDカードマークをタップ

 


 

このアクションをテストして SwitchBot の電源がオフになるのを確認しておきます。

 

 

残りのアクション「1秒待機」「通知音を鳴らす」「ポップアップ表示」は以下のように設定します。

 

 

 

3.1秒待機

      「タスク」⇨「待機 / Wait」⇨「1秒」

 

 

4.通知音を鳴らす

      「メディア」⇨「着信音を鳴らす」⇨「アラーム音」を「通知音」に変更

 

 

5.ポップアップ表示

      「アラート」⇨「ポップアップ表示 / Popup」とし、

      タイトルに "-(ハイフン)" を、文字に "充電完了" とします

 

      「タイムアウト」は最大値の "599(秒)" を設定

 

      これはポップアップメッセージがすぐに消えないようにするためです

 

      実際に表示されたポップアップメッセージはタップすると消えます

 

 

 

以上で 90% まで充電すると自動で SwitchBot の電源がオフになり充電停止となります。

 

 

 

 

 

 

 

 

2024-12-07

MacroDroid + Termux: Tasker プラグインで SwitchBot を自動制御する

当記事のシェルスクリプトの curl コマンドは SwitchBot API v1.0 でのものです

 

現在 API は v1.1 になっており、本記事どおりでは正常動作できません

 

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

で説明のシェルスクリプトを使ってください

ーーーーーーーーーー

 

 

これまで HTTP POST や、Termux: Widget で SwitchBot を制御して、スマホの充電が 80% または 90% になったら自動で電源オフにするように対応してきました。

 

自動化は MacroDroid を使っています。

 

 

SwitchBot に挿し込んだ USB 電源アダプターの電源供給を自動で断つことにより、スマホの充電サイクルを「やさしい充電」にするためです。

 

 

Sharp や OPPO 機の中には 80% 充電状態で自動的にダイレクト給電に切り替えて「やさしい充電」にしてくれる機種がありますが、そうでない機種を同様に「やさしい充電」にしたいわけです。

 

 

 

 

 HTTP POST 方式 

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

 

マクロは下記ですが、詳細は当該記事を参照ください。

 

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

 

curl コマンドがスクリプト実行では機能しないため、HTTP POST で代替しています。


  ※ curl が機能しないのは機種のよるか、Root 化して Android ネイティブ Linux で curl をインストールするかが必要と思われる

 

 

 

 

 Termux: Widget 方式 

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

 

マクロは下記ですが、詳細は当該記事を参照ください。

 

[1回の繰り返し]を開始 部分はロック解除処理をしています 

 

 

ホーム画面に配置した Termux: Widget をクリックするため、いったん画面をオフ(ロック)、再度画面をオンにしロック画面を解除、然る後にホーム画面上の Widget をクリックすることで SwitchBot の電源をオフにしています。  

 

 

 

 

 Termux: Tasker プラグイン方式 

 

今回は Termux: Tasker プラグインで行うやり方で、マクロは下記です。

 

赤く囲んで示したのが Termux: Tasker プラグインを使って SW_off.sh というシェルを実行するようにした箇所です。

 


 

 

 

SW_off.sh の中身は、下図のようになっていて curl で SwitchBot の電源をオフにするコマンドが記述されています。 

 

 

このときの curl は Termux で動作していますので、Android のネイティブ Linux のそれとは異なります。

 

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

 

 

それでは具体的なやり方を説明します。

 

事前作業:Termux を使って必要なパッケージをインストールしておきます。

 

   pkg update

   pkg upgrade

   pkg install curl  nano  vim

   termux-setup-storage



MacroDroid と Tasker の権限に[Run command in Termux environment]の許可をしておきます。

 

 

1.F-Droid の Termux: Tasker plug-in をインストールします

      「好ましくない機能」とありますが気にしません




2.Termux で、ディレクトリ ".termux" 配下に "tasker" ディレクトリを作成し、".termux" と "tasker" に実行権を与えます

 



3."tasker" の中に "SW_off.sh" ファイルを作成し、実行権を与えます

 

 

4.SW_off.sh に下記を書き込みます

      エディター(または nano、vim)を使って書き込みます

 

デバイスIDトークン は SwitchBot アプリの設定から抽出します

 

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"}'

 

 

"turnOff" が電源オフの指示になります

"turnOn" 電源オンの指示になります

 

 

5.MacroDroid の設定をします

 

アクション:「アプリ」⇨「Tasker/Locale プラグイン」をタップし「Termux: Tasker」をタップすると「Termux イベント」が現れます

 

これをタップします

 

次の画面で「Executable ~~」欄に「S」を入力すると SW_off.sh が現れます

 


 

 "SW_off.sh" をタップします

 


 
  

右上の sozai.cman.jp からのSD カードアイコン マークをタップし、反映させます

 

次の画面になりますが、なにもせずに「OK」とします

 


 

次の画面に戻ります

 


 

 

この段階でアクションを試して SwitchBot の電源オフを確認しておきます

 

うまく電源オフになれば問題ありませんが、そうでない場合は最初から確認ください 

 

 

 

トリガー:「バッテリー残量の変化」で >= 80% とします

 

ほかのアクションを追加設定します(説明は割愛)

 

 


 

マクロのタイトルを記入し右下のチェックマークで保存します



 

 

以上でマクロの設定は完了です。

 

 

このやり方はほかのシェルやコマンド(群)を記述可能なので自由度が高く、HTTP POST 方式や Widget 方式に比して大変優れています。

 

 

さらに Python プログラムにも対応可能です。