Any ControlNet Switch
One ControlNet input, several models, zero selector
- control_net_1
- control_net
Any ControlNet Switch returns the first connected CONTROL_NET input, chosen by slot order, and feeds it to the control_net output. If you run several ControlNet models - canny here, depth there, pose for people shots - you know the friction: each one is its own loader, and swapping which one steers the sampler means re-wiring the controlnet socket. This node gives you several loaders and one consumer, switched by mute instead of by hand.
It's the fallback-switch pattern the community knows from rgthree's Any Switch, typed to CONTROL_NET. And it pairs naturally with the way ControlNet actually works in ComfyUI: the control model meets the conditioning, not the pixels - so a switch on the model wire is exactly the right place to decide which "style of steering" a branch uses.
How it works
Start with control_net_1; each new ControlNet source you connect grows another slot. At execution it collects every connected input that isn't None and returns the lowest-numbered live one. The None skip is the switching mechanism: mute or bypass the loader feeding control_net_1 and it delivers None, gets skipped, and control_net_2 wins without touching a control. Leave everything unconnected and the node raises "no inputs connected" rather than silently dropping the control.
Where you'd use it
- Canny vs. depth vs. pose. Three loaders, one Apply ControlNet, mute the one you're not using.
- ControlNet vs. T2I-Adapter. Two steering approaches into the same downstream node.
- Fallback routing. Preferred control first, fallback second.
Install
ComfyUI Manager → search "Tojioo Passthrough" → install, or:
cd ComfyUI/custom_nodes
git clone https://github.com/Tojioo/tojioo_passthrough.git
Restart ComfyUI. No models or pip dependencies - the pack is lean Python plus a bundled frontend, on the Comfy Registry under publisher tojioo. (The ControlNet models themselves are a separate download from their own repos, as always.)
Common issues
Slot order rules: a live control_net_1 always beats control_net_2, so a "wrong" control model means the earlier slot is muted, bypassed, or unwired - and muting is your switch. Two practical notes. This node selects the model only; the preprocessor, weight, and start/end settings stay on your Apply ControlNet node, which is fine - that's where they belong. And when a ControlNet swap looks like it did nothing, it's usually a strength or conditioning issue downstream, not the switch: the node itself just routes a model object, and a muted branch being treated as "missing" is by design.
Inputs (1)
| Name | Type | Default | Description |
|---|---|---|---|
| control_net_1opt | CONTROL_NET | — |
Outputs (1)
| Name | Type | Description |
|---|---|---|
| control_net | CONTROL_NET | — |