SwitchBotでWindowsと任意のデバイスの電源を連動させる

SwitchBotでベースステーションの電源をPCに連動させようとしたら意外と情報がなく、嵌まったところも多かったのでnoteにしました。

要約と注意(わかんなくてもいい)

  • ローカルグループポリシーエディターを使用し、ログインとログアウトそれぞれps1ファイルに記述したcurl.exeによりSwitchBot APIを叩きます。

  • Home エディションでは標準でローカルグループポリシーエディターが無効なことに注意します。

  • PowerShellは標準ではps1ファイルの実行ができないことに注意します。

  • curl.exeはMicrosoft独自製作なもののようでいろいろ注意が必要です。


必要なもの

  • 連動させるパソコン

  • SwitchBot プラグミニ 1台(Hubは不要です)

  • スマートフォン(一時的に使用します)

  • 常時接続環境

  • 無線アクセスポイント


手順

認証用トークンとデバイスIDの取得

まずはここを参考にSwitchBot 認証用トークンを取得します。

認証用トークンを取得できたら、スタートメニューを開いてPowerShellを実行します。
PowerShellが開いたら、以下の内容をコピー&ペーストしたのち、認証用トークンを先ほど入手したものに置き換えてEnterキーを押してください。

curl.exe -X GET "https://api.switch-bot.com/v1.0/devices" `
    -H "Authorization: 認証用トークン" `
    -H "Content-Type: application/json; charset: utf8"

うまくいけば、次のような応答が得られます。

{"statusCode":100,"body":{"deviceList":[{"deviceId":"************","deviceName":"プラグミニ","deviceType":"Plug Mini (JP)","enableCloudService":true,"hubDeviceId":""},{"deviceId":"************","deviceName":"温湿度計","deviceType":"Meter","enableCloudService":false,"hubDeviceId":""}],"infraredRemoteList":[]},"message":"success"}

見づらいので整形すると、

{
    "statusCode":100,
    "body":
    {
        "deviceList":
        [
            {
                "deviceId":"************",
                "deviceName":"プラグミニ",
                "deviceType":"Plug Mini (JP)",
                "enableCloudService":true,
                "hubDeviceId":""
            },
            {
                "deviceId":"************",
                "deviceName":"温湿度計",
                "deviceType":"Meter",
                "enableCloudService":false,
                "hubDeviceId":""
            }
        ],
        "infraredRemoteList":[]
    },
    "message":"success"
}

こうなっています。"deviceType"が"Plug Mini (JP)"なデバイスを探し、そのdeviceIdをメモします。


PowerShellスクリプトの作成と配置

デスクトップの適当な場所を右クリックし、新規作成 > 新規 テキストドキュメント とたどり、ここでは例として名前を turnOn.ps1 として作成します。
turnOn.ps1を右クリックし、編集をクリックするとWindows PowerShell ISEが起動します。
そこに以下の内容をコピー&ペースト後、デバイスIDと認証用トークンを先ほど取得したものに置き換えます。
上書き保存し、Windows PowerShell ISEを終了します。

curl.exe -X POST "https://api.switch-bot.com/v1.0/devices/デバイスID/commands" `
    -H "Authorization: 認証用トークン" `
    -H "Content-Type: application/json; charset: utf8" `
    -d '{\"command\":\"turnOn\"}'

保存できたら、turnOn.ps1を以下の場所に移動します。

C:\Windows\System32\GroupPolicy\User\Scripts\Logon

ここまでできたら、同様にturnOff.ps1も作成し、以下の内容と場所で同じ操作を行います。

curl.exe -X POST "https://api.switch-bot.com/v1.0/devices/デバイスID/commands" `
    -H "Authorization: 認証用トークン" `
    -H "Content-Type: application/json; charset: utf8" `
    -d '{\"command\":\"turnOff\"}'
C:\Windows\System32\GroupPolicy\User\Scripts\Logoff


ローカルグループポリシー の編集

Windowsキーを押しながらRキーを押し、gpedit.mscと入力しEnterキーを押します。
※ WindowsのEditionがHomeな場合、ここなどを参考にローカルグループポリシーエディターを有効化してください(自己責任)。

ローカル グループ ポリシー エディターが起動したら、ユーザーの構成 > Windows の設定 > スクリプト(ログオン/ログオフ)とたどります。

まずは、ログオン をダブルクリックします。
開いた画面で PowerShell スクリプト タブに切り替え、[ 追加(D)… ] ボタンをクリックします。

スクリプトの編集 ウィンドウが出現したら、[ 参照(B)… ]ボタンをクリックし、turnOn.ps1を選択します。
スクリプトのパラメーターには、「-ExecutionPolicy Bypass」と入力しOKをクリックし、ログオンのプロパティでもOKをクリックし閉じます。


ここまで操作すればWindowsの起動時(サインイン時)に連動するようになります。
同様に、ログオフ(サインアウト)についても同様の操作を行えば作業は終了です。お疲れさまでした。
作業中のデータを保存し、PCを再起動して確認してください。

あとがき

そもそもこの内容を実践したきっかけは、Windows11でメモリの整合性をオフにしないとVIVE ProのBluetoothドライバが当たらないことでした。ベースステーション2.0であればBLEで電源を管理する手法が報告されていますが、ベースステーション1.0の電源を操作する手法は発見できませんでした。
この手法の特徴を以下に示します。

  • SteamVRに連動して起動する場合に比べ、ベースステーションが立ち上がる時間を待たなくてもいい

  • WIndows 11でメモリの整合性をONにした状態でベースステーションの電源管理が行える

  • Bluetoothドングルを必要としない

  • SwitchBot プラグミニを最低1台必要とする

私のようにベースステーション1.0の電源管理に使用する場合、SwitchBot プラグミニは2台買う必要はありません。1台でいいです。チャンネルbで動作しているベースステーションのACアダプタにSwitchBot プラグミニを接続すれば、チャンネルcのベースステーションは追従してくれます。
(チャンネルAのベースステーションを制御できるかはケーブルを持っていないのでわかりません)
それと、SwitchBot Hubは必要ありません。SwitchBotプラグミニは単体で2.4GHz帯のWi-Fiに接続する機能を持っています。

今回の手法では、パソコンに外部ソフトウェアをインストールせずに電源を制御することが目的でした。そのため、ローカルグループポリシーエディターを用い、スタートアップ/シャットダウンにスクリプトを設定することを試みたのですが……シャットダウン時の実行だけうまくいきません。これは高速スタートアップが原因のようです。高速スタートアップを切れば解決するようですが、便利なものを手放したくなかったためサインイン/サインアウトのタイミングで実行させるように設定しました。

SwitchBotの制御にはAPI v1.0を用いています。実装に時間をかけたくなかったためAPI v1.0を用いましたが、API v1.0は新規デバイスでは採用しない方針のようです。

この記事が気に入ったらサポートをしてみませんか?