IoT USB Switcher
March 2023
Hacking a COTS USB 3.0 2 to 4 Switcher to allow for device power control and control via a Stream Deck.
Features:
Turn power to peripheral USB devices on and off
Send a button press to the switcher
Closed loop active input sensing
Summary
Bought COTS USB 3.0 2 to 4 Switcher
Removed back flow prevention diodes that allow power from the inputs to the outputs
Connected wires to the Input 1 power supply, output device power, switch button, and active input LEDs.
Assembled a protoboard with headers for a ESP32 Mini, MOSFET, and level shifter.
Connected the switch button and active input LED wires to the level shifter
Connected the Input 1 power supply and the output device power through the MOSFET. ESP32 is fed from the Input 1 power supply.
IoT Integration
The ESP32 runs ESPHome allowing it to easily integrate with my Home Automation. The Home Automation system can then be called from the Steam Deck using the Home Assistant plugin.
ESPHome Configuration
esphome:
name: desk-km-peripheral-switch
friendly_name: Desk K+M Peripheral Switch
esp32:
board: esp32dev
framework:
type: arduino
# Enable logging
logger:
# Enable Home Assistant API
api:
encryption:
key:
ota:
password:
wifi:
ssid: !secret wifi_ssid
password: !secret wifi_password
manual_ip:
static_ip:
gateway:
subnet:
web_server:
port: 80
output:
- platform: gpio
pin: 21
id: switch_inputs
button:
# Button output to change USB master
- platform: output
name: "Switch Inputs"
output: switch_inputs
duration: 500ms
switch:
# Switch output to control supply power
- platform: gpio
pin:
number: 22
inverted: true
id: enable
name: "Enable"
# icon: TODO
binary_sensor:
# GPIO Binary Sensor to detect if Input 1 is active
- platform: gpio
id: input_1_active
pin:
number: 27
mode:
input: true
pulldown: true
name: "Input 1 Active"
device_class: RUNNING
on_state:
then:
- if:
condition:
- binary_sensor.is_on: input_1_active
then:
- text_sensor.template.publish:
id: state
state: "Input 1"
- if:
condition:
and:
- binary_sensor.is_off: input_1_active
- binary_sensor.is_off: input_2_active
then:
- text_sensor.template.publish:
id: state
state: "Off"
# GPIO Binary Sensor to detect if Input 2 is active
- platform: gpio
id: input_2_active
pin:
number: 25
mode:
input: true
pulldown: true
name: "Input 2 Active"
device_class: RUNNING
on_state:
then:
- if:
condition:
- binary_sensor.is_on: input_2_active
then:
- text_sensor.template.publish:
id: state
state: "Input 2"
- if:
condition:
and:
- binary_sensor.is_off: input_1_active
- binary_sensor.is_off: input_2_active
then:
- text_sensor.template.publish:
id: state
state: "Off"
# Create a template text sensor to display the output string
text_sensor:
- platform: template
name: "State"
id: state