created: 2024-01-30T10:22:57.422Z

風邪をひかないように電気毛布をオン/オフするシェルスクリプト

椅子に電気毛布をかけて作業しているが、これのオンオフを忘れてつけっぱなしになったり、つけるのが億劫で風邪をひいたりしていた。熱中しているといつの間にか寒くなっていてレトリックではなく本当に風邪をひいたりするので SwitchBot のプラグをかましてターミナルで操作できるようにしてみた。

コマンド例

switchbot.sh --command on-and-off --seconds 3600 --device-id C04E3xxxxxx # 電気毛布

リクエスト

Bearer トークンで API が叩けるのでかなりシェルスクリプト向けである。こういうのはやっぱり深圳の会社だといいですね(偏見)。トークンは管理画面から取得できる。

function api_request () {
    local cmd=$1  # turnOn | turnOff
    local device_id=$2
    local url="https://api.switch-bot.com/v1.0/devices/${device_id}/commands"
    local json=$(printf '
        {
            "command":"%s",
            "parameter":"default",
            "commandType":"command"
        }
    ' "$cmd")
    curl -s -X POST -d "$json" "$url" \
        -H "Authorization: $SWITCH_BOT_TOKEN" \
        -H 'Content-Type:application/json' > /dev/null
}

# 呼び出し
api_request turnOn "$device_id"

ちなみにトークンの取得はアプリで、ゲームの裏技みたいな方法で手にいれる。やっぱ深圳の会社はいいですね。

3 アプリバージョン(例えば 6.24)を数回(5 回~15 回)連続タップすると「開発者向けオプション」が出てきます。

4「開発者向けオプション」をタップして、次の画面でトークン情報がございます。

device_id

電源を On/Off する目当てのデバイス ID も API から取得する。

# 一覧を取得
curl -sX GET -H "Authorization:$SWITCH_BOT_TOKEN" https://api.switch-bot.com/v1.0/devices \
  | jq . | tee /tmp/switchbot-devices.json

# 一覧から電気毛布周りのdeviceIdを探す
cat /tmp/switchbot-devices.json \
  | jq '.body.deviceList[] | select(.deviceName | test("電気毛布"))'

sleep

電気毛布は On でも Off でも見た目がかわらないので、つけっぱなしで忘れる。「3 時間後に電源が切れる」みたいなことがやりたかったが、凝ったことをするのが面倒なので sleep で実装したらよくうごいたのでこれで運用している。途中で PC の電源を切ったりしてしまうともちろん動かないので、まだときどき電気毛布はつけっぱなしになっている。

(sleep "$seconds" && api_request turnOff "$device_id")&
アレ何? 大事典
[ad] アレ何? 大事典
佐々木 正孝, 篠崎 晃一 (単行本)