2024-12-24

SwitchBot API v1.1 で Plug mini の状態を得る

 

 

curl コマンドで得ます。

 

次のシェルスクリプトを SW_stat.sh とでもして、Termux の ~/.termux/tasker ディレクトリに実行権を与えて格納します。

 

ーーーーーーーーーー ここから ーーーーーーーーーー
#!/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}"

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

 

これを ./SW_stat.sh で実行すると下記の結果が得られます。


~/.termux/tasker $ ./SW_stat.sh
{"statusCode":100,"body":{"version":"V2.0-2.0","power":"on","voltage":101.3,"weight":0.1,"electricityOfDay":169,"electricCurrent":3,"deviceId":"<デバイスID>","deviceType":"Plug Mini (JP)","hubDeviceId":"<デバイスID>"},"message":"success"}

~/.termux/tasker $

 

それぞれ次の意味です。

 

"statusCode":100    # ステータスコード:100(正常終了)
"version":"V2.0-2.0"
# バージョン:v2.0
"power":"on"            # 電源状態:オン          
"voltage":101.3 # 電圧:101.3V          
"weight":0.1                # 1日の消費電力(0.1 W)
"electricityOfDay":169 # 1日の使用時間(169 分)
"electricCurrent":3   # 現在の電流(3 A)⇨ 大きすぎる
"deviceId":"
<デバイスID>" # デバイスID
"deviceType":"Plug Mini (JP)"
# デバイスタイプ(Plug Mini (JP))
"hubDeviceId":"<デバイスID>" # Hub デバイスID
"message":"success" # メッセージ:成功

 

SwitchBot アプリのステータスとはなぜかズレがありますので、ちょっといい加減ですねぇ。

アプリの方が実際値なのでしょうか(?)

 


 

 

中身を次のようにし、シェル名を SW_stat2.sh として実行してみます。

 

ーーーーーーーーーー ここから ーーーーーーーーーー
#!/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"))

echo ""
out=`echo ${ret[0]} | sed 's/"//g'`
# get {"off"} or {"on"} & convert to {off} or {on}

echo power:   $out
echo ""
ーーーーーーーーーー ここまで ーーーーーーーーーー

 

~/.termux/tasker $ ./SW_stat2.sh

power:  on

~/.termux/tasker $

 

 

【解  説】

 

curl コマンドは -sS オプションで「進捗状況メーター」と呼ばれる出力を非表示(-s)にしてエラーのみ表示(-S)します

 

curl の実行結果を ret という変数に入れます

jq コマンドでパースして結果の "power" 値を ${ret[0]} として得ます(例では「"on"」)

[0] は jq でパースした 0 番目を指します

例では [1] は voltage (電圧) を示し、[2] が version (バージョン) を示します


sed で整形して「"on"」から「""」を取り除き「on」を抽出し、echo で表示しています(さほど意味はないのですが・・・) 

 

 

 

この仕組みを使えば、power 値を MacroDroid や Tasker で判定することが可能になると考え、応用してみました。

 

一つ新しい次の記事がその応用例です。

 

Tasker の使い方 〜 Termux のシェルを使ったり、その結果を Tasker で判定したり、また Pushbullet とも連携してスマホ間での通知も処理できる 〜

 


 

 

 

 


0 件のコメント: