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は新規デバイスでは採用しない方針のようです。
この記事が気に入ったらサポートをしてみませんか?