Hyper-V, USBIP & Home Assistant
I recently purchased a number of Zigbee 3 bulbs to install around my house, but unfortunately the Philips Hue hub seems to be locked down to only support lights from their preferred manufacturers.
So, I’ve started setting up Home Assistant, installed within a Hyper-V virtual machine. The idea is to eventually replace the Hue hub with a more flexible and less expensive system.
Home Assistant supports loads of Zigbee gateways, so I grabbed a Sonoff Dongle P from Amazon. This is when I found out that Hyper-V doesn’t support pass-through of USB devices from the host to a VM 😢
After a lot of head scratching & failed attempts I finally found a working solution:
- On the Windows Hyper-V host we need a USBIP server to share the USB dongle.
- In the Home Assistant VM, we need a USBIP client docker add-on
Installing USBIP in Windows
Plug the Zigbee dongle into your Hyper-V host
Grab and install the latest release of usbip-win from https://github.com/dorssel/usbipd-win
At a administrator command prompt, type:
usbpid list
Look for the BUSID for the device you want to share, and note it down. In my case I’ll be using “3-9”. Type:
usbipd bind –busid 3-9
If you see no errors, type:
usbipd list
This should confirm the selected device is being shared
Installing Home Assistant USBIP Addon
Fire up your HA control panel and navigate to: Settings -> Addons -> Add-on Store
Next, click the 3 Dots menu in the top right corner and choose Repositories. The “Manage addon repositories” box should appear.
In the “Add” box input:
https://github.com/irakhlin/hassio-addons
then click the “Add” button.
Should now have a new section on the addon page titled “Ilya Rakhlin’s Home Assistant Add-on Repository”, under which you’ll find the “USBIP Mounter”. Click on it to bring up the details, then click “Install”.
You now need to configure the addon to connect to the USB device you’ve shared from the host. The documentation for the addon has a couple of errors in it, but I’ve found the following configuration block works for me:
Replace the IP address with the IP of your Hyper-V host and the bus_id with the bus id you shared earlier and you should be good to go!