ホーム » 「SwitchBot」タグがついた投稿
タグアーカイブ: SwitchBot
Rust 版 switchbot-cli のインストール
Switchbot を使っていて、HomeAssistant などで活用しているけど、スイッチ動作を登録するとき、照明だと、リモコン信号でON/OFFを切り替えるため、点灯状態によっては、ON を押しても照明としては消えたりすることもでてくる。
このため、Homebridge では、電源ボタンではなく、全点灯=ON, 常夜灯=OFF で登録している。こういう細かい制御となるとサーバで管理した方が楽なので、コマンドライン側から Switchbot を使いたい。
Switchbot を扱っていて、調べてみると Rust 版があるらしい。以前 nodejs 版も入れたけど、monit からの google-home-player (nodejs版)の呼び出しで、色々トラブルで動かなかったりするので、Rust 版を試したい。
Rust 版 switchbot-cli をインストール
“cargo install switchbot-cli” でインストールができるというが、エラーでコンパイルに失敗。Rust の最新版が必要みたい。最新版の rustc-1.88, cargo-1.88 などを入れて、rustup コマンドで環境を登録。最終的に switchbot-cli を root でインストール。
((( rustc-1.88 などのインストール ))) $ sudo apt install rustc-1.88 cargo-1.88 rustup ((( rustup に 1.88 使用を明言 ))) $ sudo rustup override set 1.88 ((( root 権限で switchbot-cli をインストール ))) $ sudo cargo install switchbot-cli --root /usr/lib/cargo $ cd /usr/local/bin $ sudo ln -sf /usr/lib/cargo/bin/switchbot .
switchbot-cli の使い方
switchbot コマンドを使ってみる。
((( switchbot-cli に TOKEN, SECRET を登録 )))
$ switchbot
Token> xxxxxx
Secret> xxxx
: 学習リモコン (remote with screen, ID:xxxxx)
2: CO2センサー (MeterPro(CO2), ID:xxxxx)
3: CO2センサー・子供部屋 (MeterPro(CO2), ID:xxxxx)
4: switchbot-hub3 (Hub 3, ID:xxxxx)
:
18: リビングの照明 (Light, ID:xx-xxxxxxxxxxx-xxxxxxxx)
((( 使ってみる )))
$ switchbot xx-xxxxxxxxxxx-xxxxxxxx turnOff # デバイスID で操作。
$ switchbot 18 turnOn # 前述のデバイスの連番 18 でもいいみたい
$ switchbot 18 help
turnOn
every home appliance can be turned on by default
turnOff
every home appliance can be turned off by default
customize/{user-defined button name}
all user-defined buttons must be configured with commandType=customize
brightnessUp
brightness up
brightnessDown
brightness down
customize/{user-defined button name}
all user-defined buttons must be configured with commandType=customize
$ switchbot --alias リビングの照明=xx-xxxxxxxxxxx-xxxxxxxx
$ switchbot リビングの照明 turnOn
$ switchbot --alias switchbot-hub3=xxxxxxxx
$ switchbot switchbot-hub3 status
humidity: 49
version: "V2.0-1.6-1.6"
moveDetected: false
temperature: 19.1
onlineStatus: "online"
lightLevel: 1
$ switchbot switchbot-hub3 status.temperature
19.5
Switchbot 学習リモコンがリセットできない
買った割にあまり活用できていない学習リモコンだけど、Hub mini 側での再学習があったので同期をとろうとするが失敗。
リセットできない
しかたがないので、スマホのアプリ側から一旦削除して再接続させようとリセットピンでのリセットを試みたけど、リセットされず、ONボタン長押しによるスマホアプリとの連携ができない。ファームウェア修復(中央の赤ボタン/kataボタンを押しながらのピンリセット)を試みるけど、赤い壊れたアイコン画面がでて、ファームウェアリセットが始まらない。
うーむ、色々試したけど、うまくいかないのでサポートにメッセージを入れた。前回は対応丁寧だったし。
サポートの説明手順でファームウェア修復
ファームウェア修復だけど、kata+ピンリセットで学習リモコンの画面にファーム修復の画面が出てくると思っていたけど、SwitchBotアプリ側に出てくる…という勘違いポイントが判明。
- SwitchBotアプリ⇒プロフィール⇒ファームウェア修復
- その後、学習リモコン側でKataボタン+ピンリセット
- SwitchBotアプリに、「ファームウェア修復」が表示されるので修復を開始

修復にはかなり時間がかかった。
んで、SwitchBotアプリと接続させたら、早々にファームウェアV4.6への更新がかかった。修復は10分ほどかかったけど、更新は1分ほどだな。更新前のファームは、V2.4?で大幅な更新だった。動かなくなったのはこれが原因だったのかも。
switchbot-cli のインストール
Switchbot を linux のコマンドラインで制御する nodejs のプログラム switchbot-cli が公開されている。
switchbot-cli
https://github.com/shizuka-na-kazushi/switchbot-cli
インストールも簡単。最初の起動時の token,secret の登録の時に、入力がエコーバックされないので戸惑ったけど。
$ sudo npm install -g switchbot-cli $ switchbot-cli : First please register 'token' and 'secret' obtained by SwitchBot mobile app: token: トークンを入力(エコーバックされない) secret: シークレットを入力(エコーバックされない) $ switchbot-cli device list ------- device list -------- deviceId deviceType deviceName yyyyyyyyyyyy "remote with screen" "学習リモコン" zzzzzzzzzzzz "MeterPro(CO2)" "温湿度計CO2・リビング" : aaaaaaaaaaaa "Hub Mini" "switchbot-hubmini" ------- infrared remote list -------- deviceId deviceType hubDeviceId deviceName bb-bbbbbbbbbbbb-cccccccc "Air Conditioner" aaaaaaaaaaaa "エアコン" bb-bbbbbbbbbbbb-dddddddd "DIY Fan" aaaaaaaaaaaa "扇風機" bb-bbbbbbbbbbbb-eeeeeeee "DIY Light" aaaaaaaaaaaa "リビングの照明" : bb-bbbbbbbbbbbb-ffffffff "TV" aaaaaaaaaaaa "テレビ"
設定は、$HOME/.cache/switchbot-cli/cert.json に保存されている。
使い方
((( 温湿度計CO2 を読み取る )))
$ switchbot-cli device -d zzzzzzzzzzzz status
{
"statusCode": 100,
"body": {
"version": "V1.6",
"temperature": 22.7,
"battery": 100,
"humidity": 57,
"CO2": 859,
"deviceId": "zzzzzzzzzzzz",
"deviceType": "MeterPro(CO2)",
"hubDeviceId": "000000000000"
},
"message": "success"
}
((( 赤外線リモコン経由で TV をつける )))
$ switchbot-cli device -d bb-bbbbbbbbbbbb-ffffffff turnOn
赤外線リモコンで、特定のボタンを操作したいんだけど、現時点のバージョンではできないみたい。
switchbot API の排他処理とリトライ
自宅サーバを更新し、Switchbot の温度監視を munin でグラフ化、その結果を nagios4 で結果のモニタリングをしていたけど、新しいサーバで Unknown の状態が頻発している。旧サーバでの運用時より、発生回数が増えている。
排他処理とリトライの追加
Switchbot API での値の取得だけれど、muninでの値取得とnagios4での値取得の処理と重なるとデータ取得に失敗すると思われるので、flock コマンドで排他処理を追加。これである程度は Unknown が減ったが、それでも Unknown 発生する。
しかたがないので、Switchbot API で 成功ステータス100が取れなかった時は、1秒の間をあけて1度だけリトライするようにした。(当初は0.3秒 sleep にしたけど効果が薄かった) これにより Unknown はかなり減ったけど、まだ失敗することがある。しかしながら、Switchbot API の1日あたりの回数制限もあるし、何度もリトライさせるのはやめておこう。
#!/bin/bash
. "/usr/local/etc/switchbot/token-v11.sh"
function curl_status() {
# flockで排他処理
/usr/bin/flock -x /tmp/switchbot-api.lock \
/usr/bin/curl -s --request GET \
-H "Content-Type: application/json" -H "Authorization: ${token}" \
-H "sign: ${sign}" -H "nonce: ${nonce}" -H "t: ${t}" \
"${url_list_v11_meter}"
}
function device_status() {
url_list_v11_meter="${url_list_v11}/$1/status"
JQ=/usr/bin/jq
json=$(curl_status)
state=$($JQ '.statusCode' <<< "$json" )
# 取得に失敗したら1度だけリトライ
if [ "$state" != "100" ]; then
# リトライ間隔(sleep 0.3 では効果が薄かった)
sleep 1
json=$(curl_status)
fi
$JQ -r '. | (.statusCode|tostring) + " " + (.message|tostring)' <<< "$json"
}
(追記) 0:00 頃に unknown
上記の改良後だけど、2日連続で 0:00 に unknown 状態になる。 Switchbot HUB 自身が、日替わり時に何らかの処理を実行しているんだろうなぁ…
CO2とファンヒータと電気代
うーん、Switchbot CO2センサーのおかげで、ファンヒータ使っててCO2濃度が 5000[ppm] 越えると、エアコンに切り替えてるけど、電気代あがってるなぁ…。灯油を買いに行く頻度は下がってるけどさぁ。

ブレーカーからの異音
ブレーカーからジジジといった異音がする。
ブレーカからの異音の原因
調べてみると、消費電力が契約電力ギリギリの状態が続くとときにブレーカが鳴るらしい。自宅では、停電の可能性を事前に知るためにUPSの機能で電圧をモニタリングしているけど、自宅全体で電力消費が増えていると電圧が低下することから、確認するとかなり電圧が落ちているなぁ。
試しに94[V]まで落ちた状態(ジジジの音がする)で、自室のエアコンを切ったら 98[V]まで電圧が復帰。ジジジの異音も止まってる。電力契約容量をを増やせばいいのだろうけど、電気代あがるしなぁ。

CO2を制限するかエアコンを制限するか
先日、SwitchbotのCO2センサー付き温湿度計を導入してCO2の値をモニタリングしているけど、ストーブを使うとCO2が8000[ppm]までふえるけど、8000[ppm]は頭痛やめまいがでるかもといったレベルの空気環境。だから、エアコンを使う機会が増えてるけど、電力消費に影響も出てくるわけだよね。
Switchbot Requests reached the daily limit
一昨日から朝になるとSwitchbotの情報が取れなくなっている。
Requests reached the daily limit
確認すると、アクセス数の上限制限になっているようで、以下のような結果が返ってきている。nagios4 で switchbot の動作状況をモニタリングしているけど、まずは message 欄が、nagios の LOG に残るように若干プログラムを修正。
さて、アクセス回数どうやって減らすかな。
{
"statusCode": 190,
"body": {},
"message": "Requests reached the daily limit"
}
Gemini に聞いてみたら、munin には graph_period というのがあるらしいな。Gemini の回答は、graph_period の後に 秒数を指定すればいいような説明をしてくれるが、実際に graph_period で検索しても “graph_period second” とか “graph_period minute” 都下の説明しかでてこない。
munin fetch は最終値取得ではない
そのほかの原因としては、munin を動かすだけでなく、異常検知の nagios や homebridge 経由で温湿度などを google home などでも参照できるようにしているのが原因と疑う。nagios で munin で取得した値を参照するためには、munin に fetch コマンドを発行していたけど、fetch で最終値を読み取るのではなく、fetch により munin のプラグインを起動しているらしい(大きな勘違い)ので、request回数を減らすのには意味がなかったのに気づく。
しかたがないので、munin のプラグインで最終値をファイルに保存する処理を加え、nagios のプラグインでは、保存した値を読み出すように機能を変更した。
この勘違いのおかげで homebridge & google-home の温湿度参照で munin のプラグインを何度も起動することになっていたのが敗因だな。
アクセス回数制限のカウンタリセットのタイミング
回数制限でデータが取れなくなった状態が復帰した時間は 09:00 ということからすると、制限のカウンタがリセットされるのは、GMT 0:00 なのかな。







