Valve Index Base Station power management

I managed to get a Valve Index a few weeks ago (which has been great), but the reliability of SteamVR could be a lot better. Especially with the base station power management feature, where it only puts the lasers on standby by default, which causes it to emit a high-pitch whine as the motors are still moving.

Turning on the proper standby power management feature only sometimes works, and often SteamVR won't successfully wake or put base stations on standby, which I've tried to work around by restarting, forcing a discover and connection retry, all of which are extremely annoying to deal with.

There are tools on Github that allow management of these, namely https://github.com/nouser2013/lighthouse-v2-manager (Python/Windows) and https://github.com/jeroen1602/lighthouse_pm (Android, potentially works on iOS), however both seemed like more effort than it was worth.

Looking at the code in lighthouse-v2-manager, specifically https://github.com/nouser2013/lighthouse-v2-manager/blob/master/lighthouse-v2-manager.py#L146, it reveals that it's a simple BLE characteristic write to turn them on and off. Why this appears to be such a difficult thing to do for SteamVR, I'll never know.

I attempted to hack something together in Node with noble as it seemed like the most mature BLE library for the languages I'm familiar with, however I ran into some low-level looking errors so I gave up.

I used to have some TI Sensortags (very nifty devices) and I remembered their iOS app allowed BLE scanning and basic control.

Using the app, I was able to:

  • See my base stations as indicated by LHB-XXXXXXX
  • Tap on it to reveal the menu, and tap Service Explorer
  • Tap the service indicated by UUID 00001523-1212-efde-1523-785feabcd124
  • Tap the characteristic as indicated by 00001525-1212-efde-1523-785feabcd124 (the first part of the UUID is 1525 rather than 1523)
  • You can query its current value with Read characteristic. 0x00 means off, 0x01 means on
  • You can set the power state with Write w/response characteristic. Sending 0x00 will turn it off, and 0x01 will turn it on

This is obviously not a great solution, but considering I don't have to get either of those tools working or build my own, this will have to do until SteamVR can write a byte to their own BLE devices.