Community Solution

Pass a Zigbee USB Dongle Through ZVM to Home Assistant OS

A Home Assistant OS user cannot see a ConBee II dongle in ZVM; community members provide a libvirt XML passthrough method and Zigbee2MQTT verification path.

A Samba share cannot pass a physical Zigbee adapter to HAOS

The original problem concerns a USB serial device, not a folder. A Samba share can expose files to a virtual machine, but it cannot make a ConBee, Sonoff, Nortek, or similar radio appear as guest USB hardware. The working community path attaches the host USB device to the ZVM guest through libvirt.

This remains a command-line workaround rather than a confirmed ZVM USB selector. Back up the virtual machine XML and shut down Home Assistant OS before editing persistent hardware. A malformed XML edit or a missing dongle can prevent the guest from starting, so keep a copy that can restore the previous configuration.

Identify the dongle without copying another user's IDs

Connect to ZimaOS through the supported SSH and privilege path, then run lsusb. Find the dongle's vendor and product pair, such as 1a86:55d4 in the example. Your ConBee, Sonoff, or Nortek IDs will differ.

Unplug and reconnect the dongle once if the list is ambiguous. Vendor and product matching can also be ambiguous when two identical adapters are connected. The libvirt host-device format explains VID/PID matching and more specific USB addressing.

Record the VM's exact libvirt name or UUID with virsh list --all. Do not use an example ID from the thread. Export its current definition with virsh dumpxml VM_NAME before changing it.

Add one hostdev block inside the guest devices section

With the guest powered off, open its definition using virsh edit VM_NAME. Inside the existing <devices> element, add <hostdev mode='subsystem' type='usb' managed='yes'><source><vendor id='0xVID'/><product id='0xPID'/></source></hostdev>, replacing VID and PID with the values from your host.

Add one complete hostdev section per physical device. Do not create a second <devices> wrapper, and do not paste the block after the closing </devices> tag. Save, then inspect the XML again before starting the VM.

Start the guest and check virsh list --all. If it fails, read the first libvirt error. Restore the saved XML rather than stacking more edits. A “device not found” result points back to host enumeration or matching; an XML parse error points to placement or syntax.

Verify the device in HAOS before touching Zigbee2MQTT

In Home Assistant, open Settings → System → Hardware and look for the new USB or serial device. Interface names such as /dev/ttyACM0 can change; when HAOS exposes a /dev/serial/by-id/... entry, use that stable identity in Zigbee2MQTT.

Only after HAOS sees the device should you set the Zigbee2MQTT serial.port. Restart the add-on and inspect its log for a successful adapter connection. If HAOS sees the dongle but Zigbee2MQTT cannot open it, the passthrough step is already working and the failure has moved to adapter type, serial configuration, or add-on access.

Reboot HAOS and then reboot ZimaOS to test persistence. Confirm the same by-id path returns and Zigbee2MQTT reconnects. ZVM resource changes may overwrite manual XML in some versions, so repeat the XML check after changing CPU, memory, disks, or upgrading the platform.

FAQ

Where is the XML file stored?

You do not need to locate a file manually. Use virsh edit VM_NAME to edit the registered domain definition and virsh dumpxml to back it up.

Can multiple USB devices be passed to the same VM?

Yes, the thread shows one hostdev block per device. Each must match the intended hardware without ambiguity.

Why did the USB path change after reboot?

Short device names can change when Linux enumerates hardware. Prefer the HAOS by-id path after passthrough, but re-check XML if the entire device disappears.

The HAOS-specific commands and later XML example are in the ZVM USB sharing discussion.