VRChatでExpression MenuからSwitchBotデバイスを操作するやつ。
V睡用にVRChat内から照明を点滅できたらいいなと思い作成。
V睡用と言いつつSwitchBot APIを叩いているだけなので、SwitchBotでできることであれば大体は可能。
graph LR
A[VRChat Expression Menu]-->|OSC|B["Bun(TypeScript)"]-->|HTTPS|C[SwitchBot API]
- Bunをインストールする
powershell -c "irm bun.sh/install.ps1 | iex"
- 本リポジトリを任意のディレクトリにクローンする
Gitがインストールされていなければインストールするか、右上の<> Code ▼
->Download ZIP
からダウンロードして解凍するgit clone https://github.com/conarin/v-suitch.git
v-suitch
ディレクトリに移動するcd v-suitch
- 依存パッケージをインストールする
bun install
- 環境変数を設定する
cp .env.sample .env # お好きなエディタで編集する
- アバターのExpression Parametersに、任意の名前のパラメータをBool型で追加する
Saved
にチェックを入れる - アバターのExpression Menuに、先ほど追加したパラメータのトグルスイッチを追加する
- アバターをアップロード後、Expression Menuの
オプション
->OSC
へ移動してOSCを有効にする
OSCが既に有効になっている場合は設定をリセット
を押す - 実行する
bun run start
- Expression Menuから照明を点滅できる!
Key | Value |
---|---|
SWITCH_BOT_TOKEN | SwitchBotのトークン。 取得方法は公式サイトを確認。 |
SWITCH_BOT_SECRET | SwitchBotのクライアントシークレット。 取得方法は公式サイトを確認。 |
SLEEP_SCENE_ID | 就寝時(パラメータがtrue のとき)に実行させるシーンのID。シーンIDは .fetchScenes() メソッドで取得可能。 |
WAKE_UP_SCENE_ID | 起床時(パラメータがfalse のとき)に実行させるシーンのID。シーンIDは .fetchScenes() メソッドで取得可能。 |
PARAMETER_NAME | Expression Parametersに設定したパラメータ名。 |
HOST | VRChatを起動しているホスト。 デフォルトは 127.0.0.1 。 |
IN_PORT | OSCの受信ポート(VRChat側の送信ポート)。 デフォルトは 9001 。 |
OUT_PORT | OSCの送信ポート(VRChat側の受信ポート)。 デフォルトは 9000 。 |
import SwitchBot from './switchBot';
const switchBot = new SwitchBot('TOKEN', 'SECRET');
// 物理デバイスと仮想デバイスの一覧を取得する
const devices = await switchBot.fetchDevices();
console.dir(devices, {depth: null});
// 物理デバイスのステータスを取得する
const deviceStatus = await switchBot.fetchDeviceStatus('deviceId');
console.dir(deviceStatus, {depth: null});
// 物理デバイスまたは仮想デバイスに制御コマンドを送信する
const commandResult = await switchBot.sendCommand('deviceId', {
commandType: 'commandType',
parameter: 'parameter',
command: 'command',
});
console.dir(commandResult, {depth: null});
// シーンの一覧を取得する
const scenes = await switchBot.fetchScenes();
console.dir(scenes, {depth: null});
// シーンを実行する
const executionResult = await switchBot.executeScene('sceneId');
console.dir(executionResult, {depth: null});
- OSCが既に有効になっている場合、アバターを更新しても
C:\Users\<UserName>\AppData\LocalLow\VRChat\VRChat\OSC\<userId>\Avatars\<avatarId>.json
ファイルは更新されない。OSCメニューから設定をリセット、または手動で削除して生成し直す必要がある - 稀に
500 Internal Server Error
を返してくるので、その時はやり直す - ワールドを移動すると再実行される仕様のため、パラメータの
Saved
は有効にすることを推奨