Passthrough USB in IncusOS for Zigbee2MQTT (in Home Assistant OS) not working?

And another use case/hurdle here. I’ve cross-posted this to some relevant communities:

I included all details everywhere, so this is quite long, just in case some help. The “Questions” part below is always adjusted for the questions for this community.

Use case

I’ve got a SLZB-Ultima device, which is running multiple chips for Zigbee, Matter etc. Let’s focus on Zigbee first, which I tried to connect via USB to Home Assistant, which is running Zigbee2MQTT as an app (aka in a docker container, but this is shipped as is from Home Assistant as an “app” [formerly called add-on], so I expect no problems.). Home Assistant OS is running as a VM upon IncusOS aka virtualization via Incus, so I forwarded the USB as a device to the VM and then configured it in HA/Zigbee2MQTT “as usual”.

In short the stack is this: Zigbee2MQTT → (Docker/HA app) → Home Assistant OS → Incus → IncusOS

What I did in detail

  1. What most guides miss: On SLZB-Ultima, enable USB mode. Go to /mode (the main page mostly), and enable USB mode, which disables network mode.

  2. Find out the serial number of the USB device, You can do this from another device with tools like lsusb -v or similar.
    Otherwise, the system logs (web interface at /ui/os/logs) also show an USB connect with all needed details. You can then copy the serial.

  3. Then configure a “device” in IncusUI (“Devices” → “Other”). You obviously want to choose USB devices:

    This can be checked/is equivalent to:

    $ incus config show IncusOS:HAOS   
    // ....
    devices:
      custom-device-1:
        attached: "true"
        serial: SLZB-Ultima******
        type: usb
    

    (Yeah, I also wonder why attached is a string type, but hmm?)

  4. Now you can check e.g. with lsusb that the USB devices actually appear. As it exposes two serial interfaces, it’s apparently two “devices”. Or even better, in then log UI of IncusOS, you also see it:

    26. Juni, 17:46:04 localhost kernel: usb 2-6: New USB device found, idVendor=303a, idProduct=4002, bcdDevice= 1.00
    26. Juni, 17:46:04 localhost kernel: usb 2-6: New USB device strings: Mfr=1, Product=2, SerialNumber=3
    26. Juni, 17:46:04 localhost kernel: usb 2-6: Product: SMLIGHT SLZB-Ultima3
    26. Juni, 17:46:04 localhost kernel: usb 2-6: Manufacturer: SMLIGHT
    26. Juni, 17:46:04 localhost kernel: usb 2-6: SerialNumber: SLZB-Ultima****
    
  5. The documentation explains how to then configure it or you can use the onboarding web UI in HomeAssistant.

Thus, I just used the UI this time (also tried with YAML, did not make a difference):

You can also see it’s properly passed to the VM, when checking in the VM:

# lsusb
Bus 001 Device 001: ID 1d6b:0002 Linux 6.18.35-haos xhci-hcd xHCI Host Controller
Bus 002 Device 001: ID 1d6b:0003 Linux 6.18.35-haos xhci-hcd xHCI Host Controller
Bus 001 Device 002: ID 303a:**** SMLIGHT SMLIGHT SLZB-Ultima3

So far, this looks all fine and I’m glad it works so well… but actually, it does not and fails.

Error for #0

If I select it to configure with /dev/ttyACM0, it cannot even connect:

[2026-06-28 17:56:55] info: 	zh:zstack:znp: Skip bootloader for CC2652/CC1352
[2026-06-28 17:57:14] error: 	z2m: Error while starting zigbee-herdsman
[2026-06-28 17:57:14] error: 	z2m: Failed to start zigbee-herdsman
[2026-06-28 17:57:14] error: 	z2m: Check https://www.zigbee2mqtt.io/guide/installation/20_zigbee2mqtt-fails-to-start_crashes-runtime.html for possible solutions
[2026-06-28 17:57:14] error: 	z2m: Exiting...
[2026-06-28 17:57:14] error: 	z2m: Error: Failed to connect to the adapter (Error: SRSP - SYS - ping after 6000ms)
    at ZStackAdapter.start (/app/node_modules/.pnpm/zigbee-herdsman@10.4.0/node_modules/zigbee-herdsman/src/adapter/z-stack/adapter/zStackAdapter.ts:95:27)
    at Controller.start (/app/node_modules/.pnpm/zigbee-herdsman@10.4.0/node_modules/zigbee-herdsman/src/controller/controller.ts:146:29)
    at Zigbee.start (/app/lib/zigbee.ts:70:27)
    at Controller.start (/app/lib/controller.ts:117:29)
    at start (/app/index.js:156:5)

But I also guess this is the wrong device/“port” aka it’s the “Zigbee router” instead of “Zigbee Coordinator” (I guess, or reverse?). So I just checked this for completeness.

Error for #1

If I choose the /dev/ttyACM1 device, I get weird PAN-ID errors:

Onboarding page is available at http://0.0.0.0:8099/
[2026-06-28 17:52:29] info: 	z2m: Logging to console, file (filename: log.log)
[2026-06-28 17:52:29] info: 	z2m: External JS (converters/extensions) is disabled
[2026-06-28 17:52:29] info: 	z2m: Starting Zigbee2MQTT version 2.12.0 (commit #unknown)
[2026-06-28 17:52:29] info: 	z2m: Starting zigbee-herdsman (10.4.0)
[2026-06-28 17:52:29] info: 	zh:zstack:znp: Opening SerialPort with {"path":"/dev/ttyACM1","baudRate":115200,"rtscts":false,"autoOpen":false}
[2026-06-28 17:52:29] info: 	zh:zstack:znp: Serialport opened
[2026-06-28 17:53:30] error: 	z2m: Error while starting zigbee-herdsman
[2026-06-28 17:53:30] error: 	z2m: Failed to start zigbee-herdsman
[2026-06-28 17:53:30] error: 	z2m: Check https://www.zigbee2mqtt.io/guide/installation/20_zigbee2mqtt-fails-to-start_crashes-runtime.html for possible solutions
[2026-06-28 17:53:30] error: 	z2m: Exiting...
[2026-06-28 17:53:30] error: 	z2m: Error: network commissioning timed out - most likely network with the same panId or extendedPanId already exists nearby (Error: AREQ - ZDO - stateChangeInd after 60000ms
    at Object.start (/app/node_modules/.pnpm/zigbee-herdsman@10.4.0/node_modules/zigbee-herdsman/src/utils/waitress.ts:68:23)
    at ZnpAdapterManager.beginCommissioning (/app/node_modules/.pnpm/zigbee-herdsman@10.4.0/node_modules/zigbee-herdsman/src/adapter/z-stack/adapter/manager.ts:376:31)
    at ZnpAdapterManager.start (/app/node_modules/.pnpm/zigbee-herdsman@10.4.0/node_modules/zigbee-herdsman/src/adapter/z-stack/adapter/manager.ts:90:21)
    at ZStackAdapter.start (/app/node_modules/.pnpm/zigbee-herdsman@10.4.0/node_modules/zigbee-herdsman/src/adapter/z-stack/adapter/zStackAdapter.ts:135:16)
    at Controller.start (/app/node_modules/.pnpm/zigbee-herdsman@10.4.0/node_modules/zigbee-herdsman/src/controller/controller.ts:146:29)
    at Zigbee.start (/app/lib/zigbee.ts:70:27)
    at Controller.start (/app/lib/controller.ts:117:29)
    at start (/app/index.js:156:5))
    at ZnpAdapterManager.beginCommissioning (/app/node_modules/.pnpm/zigbee-herdsman@10.4.0/node_modules/zigbee-herdsman/src/adapter/z-stack/adapter/manager.ts:378:23)
    at ZnpAdapterManager.start (/app/node_modules/.pnpm/zigbee-herdsman@10.4.0/node_modules/zigbee-herdsman/src/adapter/z-stack/adapter/manager.ts:90:21)
    at ZStackAdapter.start (/app/node_modules/.pnpm/zigbee-herdsman@10.4.0/node_modules/zigbee-herdsman/src/adapter/z-stack/adapter/zStackAdapter.ts:135:16)
    at Controller.start (/app/node_modules/.pnpm/zigbee-herdsman@10.4.0/node_modules/zigbee-herdsman/src/controller/controller.ts:146:29)
    at Zigbee.start (/app/lib/zigbee.ts:70:27)
    at Controller.start (/app/lib/controller.ts:117:29)
    at start (/app/index.js:156:5)

Note I already tried these buttons to re-generate the IDs (so they should be random):

I found this thread but it also just seems to be about re-generating random IDs.

This is a new Zigbee network, so I do not have nor should need a migration or existing network/pan IDs.
Note I tried around with the SLZB and set the second chip to “Hub mode”, but yeah… just for basic functionality tests, as I want to integrate it into Home Assistant

SLZB configuration

To my knowledge, this should be the correct configuration for the SLZB:

I also have Zigbee network IDs etc. in /zhub/config (Zigbee Hub → Settings), I am unsure whether these need to be in sync with Zigbee2MQTT? (in contrast to all other hub settings, I can access this one page without hub mode being enabled, so this is kinda confusing)

Questions

As for IncusOS, the only question you could likely solve, is whether I have configured this USB forwarding correctly? Or is there anything that could break/be wrong here as this is no “traditional” USB (aka block) device? AFAIK it somehow sends raw bytes?

In the past, I had a “USB disconnect” always appear in the IncusOS system log for that device, but (maybe due to a USB cable switch?) it now works. A good USB-A to USB-C seems to be okay? (I also read in the SLZB docs, that USB-C to USB-C cable are supposed to not work, so yeah… dunno.)

The same docs also state:

DRIVERS for USB/UART converter! SLZB-06/06M uses CP2102 as an USB/UART chip. If your system does not recognize the device, you have to install the drivers. We reccomend to use the drivers from official web page of Silicon Labs CP210x driver page!

Is this a problem for Incus? I obviously cannot just install something on the VM host machine.

I have no dedicated USB card, of course, as this thread suggests. And yes, I would try the option via LAN if everything fails, but I suppose USB should also work and offer much less overhead/latency.

System

SLZB OS: v3.3.1
Zigbee-Coordinator Firmware-Revision: 20250212
Zigbee-Router Firmware-Revision: 20240716
incus 202606230053
Home Assistant v2026.6.4
Home Assistant OS: 18.0

Radio 1 [EFR32MG24] Mode Zigbee coordinator
Radio 2 [CC2674P10] Mode Zigbee router
Connection mode: USB mode

Hmm, everything sounds good here, well, other than the software not actually being able to interact with the coordinator…

Maybe post the content of incus admin os system resources show AFTER the VM is running?
That would hopefully let us see if the host still reports the USB device and whether it’s bound to any driver.

There are a few options I can see for this issue:

  • USB device is somehow being accessed from two places (would likely be failing in an even worse way in the VM)
  • USB device needs a reset of some kind prior to being usable in the VM
  • Something weird going on with the type of USB being passed into the VM (we’ve seen issues in the past when mixing USB 1.0, 1.1, 2.0, 3.0, …)
$ incus admin os system resources show IncusOS:
WARNING: The IncusOS API and configuration is subject to change

cpu:
  architecture: x86_64
  sockets:
  - address_sizes:
      physical_bits: 43
      virtual_bits: 48
    cache:
    - level: 1
      size: 32768
      type: Data
    - level: 1
      size: 65536
      type: Instruction
    - level: 2
      size: 524288
      type: Unified
    - level: 3
      size: 4.194304e+06
      type: Unified
    cores:
    - core: 0
      die: 0
      flags:
      // **snip**
      frequency: 1397
      threads:
      - id: 0
        isolated: false
        numa_node: 0
        online: true
        thread: 0
      - id: 1
        isolated: false
        numa_node: 0
        online: true
        thread: 1
    - core: 1
      die: 0
      flags:
      - fpu
      // **snip**
      frequency: 1396
      threads:
      - id: 2
        isolated: false
        numa_node: 0
        online: true
        thread: 0
      - id: 3
        isolated: false
        numa_node: 0
        online: true
        thread: 1
    frequency: 1396
    frequency_minimum: 1400
    frequency_turbo: 2400
    name: AMD Ryzen Embedded R1505G with Radeon Vega Gfx
    socket: 0
    vendor: AuthenticAMD
  total: 4
gpu:
  cards:
  - numa_node: 0
    pci_address: "0000:03:00.0"
    product: Picasso/Raven 2 [Radeon Vega Series / Radeon Vega Mobile Series]
    product_id: 15d8
    vendor: Advanced Micro Devices, Inc. [AMD/ATI]
    vendor_id: "1002"
  total: 1
load:
  // **snip**
memory:
  hugepages_size: 2.097152e+06
  hugepages_total: 0
  hugepages_used: 0
  nodes:
  - hugepages_total: 0
    hugepages_used: 0
    numa_node: 0
    total: 8.455716864e+09
    used: 5.707251712e+09
  total: 8.455716864e+09
  used: 2.289065984e+09
network:
  cards:
  - driver: r8169
    driver_version: 7.0.13-zabbly+
    numa_node: 0
    pci_address: "0000:02:00.0"
    ports:
    - address: /****/
      auto_negotiation: true
      id: _p843a5b14d65d
      link_detected: true
      link_duplex: full
      link_speed: 1000
      port: 0
      port_type: twisted pair
      protocol: ethernet
      supported_modes:
      - 10baseT/Half
      - 10baseT/Full
      - 100baseT/Half
      - 100baseT/Full
      - 1000baseT/Full
      supported_ports:
      - twisted pair
      - media-independent
      transceiver_type: external
    product: RTL8111/8168/8211/8411 PCI Express Gigabit Ethernet Controller
    product_id: "8168"
    vendor: Realtek Semiconductor Co., Ltd.
    vendor_id: 10ec
  total: 1
pci:
  devices:
  - driver: ""
    driver_version: ""
    iommu_group: 0
    numa_node: 0
    pci_address: "0000:00:00.0"
    product: Raven/Raven2 Root Complex
    product_id: 15d0
    vendor: Advanced Micro Devices, Inc. [AMD]
    vendor_id: "1022"
    vpd: {}
  - driver: ""
    driver_version: ""
    iommu_group: 0
    numa_node: 0
    pci_address: "0000:00:00.2"
    product: Raven/Raven2 IOMMU
    product_id: 15d1
    vendor: Advanced Micro Devices, Inc. [AMD]
    vendor_id: "1022"
    vpd: {}
  - driver: ""
    driver_version: ""
    iommu_group: 0
    numa_node: 0
    pci_address: "0000:00:01.0"
    product: Family 17h (Models 00h-1fh) PCIe Dummy Host Bridge
    product_id: "1452"
    vendor: Advanced Micro Devices, Inc. [AMD]
    vendor_id: "1022"
    vpd: {}
  - driver: pcieport
    driver_version: 7.0.13-zabbly+
    iommu_group: 1
    numa_node: 0
    pci_address: "0000:00:01.2"
    product: Raven/Raven2 PCIe GPP Bridge [6:0]
    product_id: 15d3
    vendor: Advanced Micro Devices, Inc. [AMD]
    vendor_id: "1022"
    vpd: {}
  - driver: pcieport
    driver_version: 7.0.13-zabbly+
    iommu_group: 2
    numa_node: 0
    pci_address: "0000:00:01.4"
    product: Zeppelin Switch Upstream (PCIE SW.US)
    product_id: 145d
    vendor: Advanced Micro Devices, Inc. [AMD]
    vendor_id: "1022"
    vpd: {}
  - driver: ""
    driver_version: ""
    iommu_group: 3
    numa_node: 0
    pci_address: "0000:00:08.0"
    product: Family 17h (Models 00h-1fh) PCIe Dummy Host Bridge
    product_id: "1452"
    vendor: Advanced Micro Devices, Inc. [AMD]
    vendor_id: "1022"
    vpd: {}
  - driver: pcieport
    driver_version: 7.0.13-zabbly+
    iommu_group: 4
    numa_node: 0
    pci_address: "0000:00:08.1"
    product: Raven/Raven2 Internal PCIe GPP Bridge 0 to Bus A
    product_id: 15db
    vendor: Advanced Micro Devices, Inc. [AMD]
    vendor_id: "1022"
    vpd: {}
  - driver: piix4_smbus
    driver_version: 7.0.13-zabbly+
    iommu_group: 5
    numa_node: 0
    pci_address: "0000:00:14.0"
    product: FCH SMBus Controller
    product_id: 790b
    vendor: Advanced Micro Devices, Inc. [AMD]
    vendor_id: "1022"
    vpd: {}
  - driver: ""
    driver_version: ""
    iommu_group: 5
    numa_node: 0
    pci_address: "0000:00:14.3"
    product: FCH LPC Bridge
    product_id: 790e
    vendor: Advanced Micro Devices, Inc. [AMD]
    vendor_id: "1022"
    vpd: {}
  - driver: ""
    driver_version: ""
    iommu_group: 6
    numa_node: 0
    pci_address: "0000:00:18.0"
    product: 'Raven/Raven2 Device 24: Function 0'
    product_id: "15e8"
    vendor: Advanced Micro Devices, Inc. [AMD]
    vendor_id: "1022"
    vpd: {}
  - driver: ""
    driver_version: ""
    iommu_group: 6
    numa_node: 0
    pci_address: "0000:00:18.1"
    product: 'Raven/Raven2 Device 24: Function 1'
    product_id: "15e9"
    vendor: Advanced Micro Devices, Inc. [AMD]
    vendor_id: "1022"
    vpd: {}
  - driver: ""
    driver_version: ""
    iommu_group: 6
    numa_node: 0
    pci_address: "0000:00:18.2"
    product: 'Raven/Raven2 Device 24: Function 2'
    product_id: 15ea
    vendor: Advanced Micro Devices, Inc. [AMD]
    vendor_id: "1022"
    vpd: {}
  - driver: k10temp
    driver_version: 7.0.13-zabbly+
    iommu_group: 6
    numa_node: 0
    pci_address: "0000:00:18.3"
    product: 'Raven/Raven2 Device 24: Function 3'
    product_id: 15eb
    vendor: Advanced Micro Devices, Inc. [AMD]
    vendor_id: "1022"
    vpd: {}
  - driver: ""
    driver_version: ""
    iommu_group: 6
    numa_node: 0
    pci_address: "0000:00:18.4"
    product: 'Raven/Raven2 Device 24: Function 4'
    product_id: 15ec
    vendor: Advanced Micro Devices, Inc. [AMD]
    vendor_id: "1022"
    vpd: {}
  - driver: ""
    driver_version: ""
    iommu_group: 6
    numa_node: 0
    pci_address: "0000:00:18.5"
    product: 'Raven/Raven2 Device 24: Function 5'
    product_id: 15ed
    vendor: Advanced Micro Devices, Inc. [AMD]
    vendor_id: "1022"
    vpd: {}
  - driver: ""
    driver_version: ""
    iommu_group: 6
    numa_node: 0
    pci_address: "0000:00:18.6"
    product: 'Raven/Raven2 Device 24: Function 6'
    product_id: 15ee
    vendor: Advanced Micro Devices, Inc. [AMD]
    vendor_id: "1022"
    vpd: {}
  - driver: ""
    driver_version: ""
    iommu_group: 6
    numa_node: 0
    pci_address: "0000:00:18.7"
    product: 'Raven/Raven2 Device 24: Function 7'
    product_id: 15ef
    vendor: Advanced Micro Devices, Inc. [AMD]
    vendor_id: "1022"
    vpd: {}
  - driver: nvme
    // **snip**
    product: SanDisk /*****/
    // **snip**
  - driver: r8169
    // **snip**
    product: RTL8111/8168/8211/8411 PCI Express Gigabit Ethernet Controller
    // **snip**
    vpd: {}
  - driver: serial
    driver_version: 7.0.13-zabbly+
    iommu_group: 8
    numa_node: 0
    pci_address: "0000:02:00.1"
    product: 'RTL8111xP UART #1'
    product_id: 816a
    vendor: Realtek Semiconductor Co., Ltd.
    vendor_id: 10ec
    vpd: {}
  - driver: serial
    driver_version: 7.0.13-zabbly+
    iommu_group: 8
    numa_node: 0
    pci_address: "0000:02:00.2"
    product: 'RTL8111xP UART #2'
    product_id: 816b
    vendor: Realtek Semiconductor Co., Ltd.
    vendor_id: 10ec
    vpd: {}
  - driver: ""
    driver_version: ""
    iommu_group: 8
    numa_node: 0
    pci_address: "0000:02:00.3"
    product: RTL8111xP IPMI interface
    product_id: 816c
    vendor: Realtek Semiconductor Co., Ltd.
    vendor_id: 10ec
    vpd: {}
  - driver: ehci-pci
    driver_version: 7.0.13-zabbly+
    iommu_group: 8
    numa_node: 0
    pci_address: "0000:02:00.4"
    product: RTL811x EHCI host controller
    product_id: 816d
    vendor: Realtek Semiconductor Co., Ltd.
    vendor_id: 10ec
    vpd: {}
  - driver: ""
    // **snip**
    product: Picasso/Raven 2 [Radeon Vega Series / Radeon Vega Mobile Series]
    // **snip**
  - driver: snd_hda_intel
    // **snip**
    product: Raven/Raven2/Fenghuang HDMI/DP Audio Controller
    // **snip**
  - driver: ccp
    driver_version: 1.1.0
    iommu_group: 10
    numa_node: 0
    pci_address: "0000:03:00.2"
    product: Family 17h (Models 10h-1fh) Platform Security Processor
    product_id: 15df
    vendor: Advanced Micro Devices, Inc. [AMD]
    vendor_id: "1022"
    vpd: {}
  - driver: xhci_hcd
    driver_version: 7.0.13-zabbly+
    iommu_group: 10
    numa_node: 0
    pci_address: "0000:03:00.3"
    product: Raven2 USB 3.1
    product_id: "15e5"
    vendor: Advanced Micro Devices, Inc. [AMD]
    vendor_id: "1022"
    vpd: {}
  - driver: snd_pci_acp3x
    // **snip**
    product: Audio Coprocessor
    // **snip**
  - driver: snd_hda_intel
    // **snip**
    product: Family 17h/19h/1ah HD Audio Controller
    // **snip**
    vpd: {}
  total: 29
serial:
  devices: []
  total: 0
storage:
  disks:
  - block_size: 512
    device: "259:0"
    device_id: nvme-eui./******/
    device_path: pci-/****/
    // **snip**
    partitions:
      // **snip**
    // **snip**
    type: nvme
    // **snip**
  total: 12
system:
  // **snip**
usb:
  devices:
  - bus_address: 2
    device_address: 3
    interfaces:
    - class: Communications
      class_id: 2
      driver: usbfs
      driver_version: 7.0.13-zabbly+
      number: 0
      subclass: Abstract (modem)
      subclass_id: 2
    - class: CDC Data
      class_id: 10
      driver: usbfs
      driver_version: 7.0.13-zabbly+
      number: 1
      subclass: ""
      subclass_id: 0
    - class: Communications
      class_id: 2
      driver: usbfs
      driver_version: 7.0.13-zabbly+
      number: 2
      subclass: Abstract (modem)
      subclass_id: 2
    - class: CDC Data
      class_id: 10
      driver: usbfs
      driver_version: 7.0.13-zabbly+
      number: 3
      subclass: ""
      subclass_id: 0
    product: SMLIGHT SLZB-Ultima3
    product_id: "4002"
    serial: ""
    speed: 12
    vendor: ""
    vendor_id: 303a
  total: 1

You can see the device at the end (surprisingly, it reports no serial there. But in the log it has reported it and this also seems to work for identifying and attaching the device, but yeah… (Or is this expected, because the device is now assigned to the VM?)

Hm yeah, that’s why I was asking and pointing out the vendor’s “driver information” and the weird statement that USB-C to USB-C devices/cables may not work.

In the past on proxmox I had success with passtrough an USB card, maybe you can do the same?

If I remember it right I had to pass trough the PCIe device with vfio

# Lookup ID
lspci -n 

# Set it to vfio - make sure to use the rigth ID here.
sudo driverctl set-override 0000:01:00.0 vfio-pci

Then pass it that device to the VM.

Hmm need to find out how to find these ids etc. or on IncusOS then. Or how to do that in general. Note you cannot run cli commands on IncusOS.

Sorry, I forgot again your on IncusOS.

You’d look for your USB controller in the PCI section of incus admin os system resources show, then set it as a device that shouldn’t be bound to a driver in incus admin os system kernel edit and finally pass it into your VM as a pci device.

But that assumes you have a clean USB controller in its own IOMMU group.
That’s likely if you add an extra PCIe USB card to your machine, but not very likely at all for the built-in USB hubs.