ControlNet Multi-Switch
The first connected ControlNet wins
- input1
- input2
- input3
- input4
- input5
- cn
Here's the ControlNet version of the "just pick whichever one is actually there" switch. ControlNet Multi-Switch takes up to five ControlNet inputs and passes through the first one that isn't empty. No widget to flip, no state to manage - you just leave the inputs you don't want disconnected (or bypass the nodes feeding them), and the switch figures out the rest. It's the automation-friendly cousin of the manual ControlNet switches.
How it works
Straight-line logic, checked in order:
if input1 != None: return input1
elif input2 != None: return input2
elif input3 != None: return input3
# ... input4, input5
else: raise ValueError("no active Input")
The cn output is whatever the first connected input supplied. That's the whole mechanism, and it's where both the power and the trap live.
The trap: because it returns the first non-None slot, anything always-connected and placed early shadows everything after it. The README spells this out for the whole multi-switch family: put the nodes that can be bypassed (your optional choices) in the early slots, and put the always-on fallback last. If you wire your default checkpoint's ControlNet into input1, inputs 2–5 may as well not exist - a never-empty first slot wins every time.
The other edge: if literally nothing is connected, it raises an error rather than returning None. That's arguably a feature - a silent None would let a broken workflow limp along producing garbage; this makes the problem loud.
Why you'd reach for it
Pair it with an "options menu" pattern: several ControlNet branches that can each be bypassed, feeding inputs 1–4, with your safe default in input 5. Bypass a branch and the switch falls through to the next live one. Same trick works for any of the pack's multi-switches (clip, model, latent, string) - this is the ControlNet-flavored version. It's a great fit for shared workflows where you want a few named presets without a pile of manual toggles.
The inputs that matter
- input1 through input5 - all CONTROL_NET, all optional, all checked in order. Only wire what you need; the rest can stay empty.
- The
cnoutput feeds a ControlNet Apply (alongside your conditioning and preprocessed image).
Note the earlier ControlNet articles' lesson applies here too: a ControlNet that came from a Union model needs its type set before this switch sees it - the switch routes, it doesn't configure. And remember the types must actually differ per branch for the switch to be meaningful.
Installing it
Part of the RvTools v2 pack - no model files. ComfyUI Manager → search RvTools → install ComfyUI-RvTools_v2, restart. Or:
cd ComfyUI/custom_nodes
git clone https://github.com/r-vage/ComfyUI-RvTools_v2
Restart and confirm RvTools v2: Version 2.5.x in the console. Extra deps (opencv-python, pilgram, pynvml, piexif) come through Manager automatically.
Troubleshooting
- "Missing Input: Multi ControlNet Switch has no active Input" - that's the all-disconnected error, and it's the number one thing to hit. Check that at least one input is wired or un-bypassed.
- Lower slots never win. If branch 3 never activates no matter what you bypass, you've got a live connection in slot 1 or 2. Reorder so the always-on branch is last.
- Old v1 RvTools references fail in Manager - the original repo was deleted, and the author has since moved development to ComfyUI_Eclipse, the successor pack.
Inputs (5)
| Name | Type | Default | Description |
|---|---|---|---|
| input1opt | CONTROL_NET | — | |
| input2opt | CONTROL_NET | — | |
| input3opt | CONTROL_NET | — | |
| input4opt | CONTROL_NET | — | |
| input5opt | CONTROL_NET | — |
Outputs (1)
| Name | Type | Description |
|---|---|---|
| cn | CONTROL_NET | — |