Key Features • Installation • Getting Started • Troubleshooting • Credits • License
sudo pip3 install nxbt
Please Note: NXBT needs root privileges to toggle the BlueZ Input plugin. If you're not comfortable running this program as root, you can disable the Input plugin manually, and install NXBT as a regular user.
See the installation guide here.
Note: If you installed NXBT as a non-root user, please omit the use of sudo
from any of the following commands.
The demo is meant to gauge whether or not NXBT is working. To do so, the demo will create a Pro Controller and run through a small loop of commands.
NOTE: If this is your first time connecting to an NXBT emulated controller on the specific host computer, you MUST have the "Change Grip/Order Menu" open on your Nintendo Switch. You can see how to navigate to the "Change Grip/Order Menu" HERE.
To start the demo, run the following command in your terminal:
sudo nxbt demo
If all is working correctly, the controller should connect, navigate to the settings, test the stick calibration, and navigate back to the "Change Grip/Order Menu".
The NXBT webapp provides a web interface that allows for quick creation of a Nintendo Switch controller and use of a keyboard or gamepad to control the Nintendo Switch. This lets anyone who can access the website control a Nintendo Switch with their favourite keyboard or gamepad.
The webapp server can be started with the following command:
sudo nxbt webapp
The above command boots NXBT and an accompanying web server that allows for controller creation and use over your web browser.
The webapp itself will be locally accessible at http://127.0.0.1:8000
or, if you're on the same network as the host computer, http://HOST_COMPUTER_IP:8000. It's also possible to expose your NXBT webapp to the internet, however, you'll need to configure a reverse proxy, which is out of the scope of this readme.
You should see a webpage similar to the following image:
To create and start a Pro Controller, click the Pro controller graphic. If creation/boot is successful, the website will switch to a loading screen. During this time, you should have the Nintendo Switch you wish to connect to powered on and within range of the host computer.
NOTE: If this is your first time connecting to your Nintendo Switch with the specific host computer, make sure you're on the "Change Grip/Order Menu". If you're still unable to connect, try running the demo (in the above section) or refer to the troubleshooting documentation.
Once you've successfully connected to the Nintendo Switch, you should see a webpage similar to below:
Here, you can change your input method, shutdown or restart the controller, and run an NXBT macro.
A few other functions to note:
The TUI (Terminal User Interface) allows for local or remote (SSH/Mosh) terminal sessions to control a Nintendo Switch with a keyboard.
The TUI can be started with:
sudo nxbt tui
NOTE: If this is your first time connecting to your Nintendo Switch with the specific host computer, make sure you're on the "Change Grip/Order Menu". If you're still unable to connect, try running the demo (in the above section) or refer to the troubleshooting documentation.
A loading screen should open and, once connected, the main TUI control screen should load. This should look something like below:
There are two types of NXBT TUI sessions:
Once you've successfully connected to a Nintendo Switch over the "Change Grip/Order Menu", you can reconnect quickly to the same Switch with the following command:
sudo nxbt tui -r
A couple other funcionality notes:
NXBT provides three ways to run macros on your Nintendo Switch:
For the first method, refer to the "Using the Webapp" section for more info.
For info on writing macros, check out the documentation here.
To run a simple, inline macro, you can use the following command:
sudo nxbt macro -c "B 0.1s\n 0.1s"
The above command will press the B button for 0.1 seconds and release all buttons for 0.1 seconds. The -c
flag specifies the commands you would like to run. You'll need to be on the "Change Grip/Order Menu" for the above command to work. If you've already connected to the Switch on the host computer, you can reconnect and run the macro by adding the -r
or --reconnect
flag:
sudo nxbt macro -c "B 0.1s\n 0.1s" -r
Since it can be a little cumbersome typing out a large macro in the terminal, the macro command also supports reading from text files instead!
commands.txt file:
B 0.1s
0.1s
sudo nxbt macro -c "commands.txt" -r
If you want more information on NXBT's CLI arguments:
sudo nxbt -h
Macros are supported with the macro
function in the Python API. All macros are expected as strings (multiline strings are accepted).
Minimal working example:
import nxbt
macro = """
B 0.1s
0.1s
"""
# Start the NXBT service
nx = nxbt.Nxbt()
# Create a Pro Controller and wait for it to connect
controller_index = nx.create_controller(nxbt.PRO_CONTROLLER)
nx.wait_for_connection(controller_index)
# Run a macro on the Pro Controller
nx.macro(controller_index, macro)
The above example uses a blocking macro call, however, multiple macros can be queued (or other actions taken) with the non-blocking syntax. Queued macros are processed in FIFO (First-In-First-Out) order.
# Run a macro on the Pro Controller but don't block.
# In this instance, we record the macro ID so we can keep track of its status later on.
macro_id = nx.macro(controller_index, macro, block=False)
from time import sleep
while macro_id not in nx.state[controller_index]["finished_macros"]:
print("Macro hasn't finished")
sleep(1/10)
print("Macro has finished")
NXBT provides a Python API for use in Python applications or code.
If you're someone that learns by example, check out the demo.py
file located at the root of this project.
For a more in-depth look at all the functionality provided by the API, checkout the nxbt/nxbt.py
file.
For those looking to get started with a few simple examples: Read on!
Creating a Controller and Waiting for it to Connect
import nxbt
# Start the NXBT service
nx = nxbt.Nxbt()
# Create a Pro Controller and wait for it to connect
controller_index = nx.create_controller(nxbt.PRO_CONTROLLER)
nx.wait_for_connection(controller_index)
print("Connected")
Pressing a Button
# Press the B button
# press_buttons defaults to pressing a button for 0.1s and releasing for 0.1s
nx.press_buttons(controller_idx, [nxbt.Buttons.B])
# Pressing the B button for 1.0s instead of 0.1s
nx.press_buttons(controller_idx, [nxbt.Buttons.B], down=1.0)
Tilting a Analog Stick
# Tilt the right stick fully to the left.
# tilt_stick defaults to tilting the stick for 0.1s and releasing for 0.1s
nx.tilt_stick(controller_idx, Sticks.RIGHT_STICK, -100, 0)
# Tilting the stick for 1.0s instead of 0.1s
nx.tilt_stick(controller_idx, Sticks.RIGHT_STICK, -100, 0, tilted=1.0)
Getting the available Bluetooth adapters
# This prints the device paths for each available adapter.
# If a controller is in use, an adapter will be removed from this list.
print(nx.get_available_adapters)
Shutting Down a running Controller
# This frees up the adapter that was in use by this controller
nx.remove_controller(controller_index)
Reconnecting to a Switch
# Get a list of all previously connected Switches and pass it as a reconnect_address argument
controller_index = nx.create_controller(
nxbt.PRO_CONTROLLER,
reconnect_address=nx.get_switch_addresses())
Stopping or Clearing Macros
# Stops/deletes a single macro from a specified controller
nx.stop_macro(controller_index, macro_id)
# Clears all macros from a given controller
nx.clear_macros(controller_index)
# Clears all macros from every created controller
nx.clear_all_macros()
dbus-python
packageThis error can occur due to missing dbus-related libraries on some Linux distributions. To fix this in most cases, libdbus-glib-1-dev
and libdbus-1-dev
need to be installed with your system's package manager. For systems using aptitude for package management (Ubuntu, Debian, etc), installation instructions follow:
sudo apt-get install libdbus-glib-1-dev libdbus-1-dev
This can occasionally occur due to timing sensitivities when transitioning off of the "Change Grip/Order" menu. To avoid disconnections when exiting this menu, please only press A (or B) a single time and wait until the menu has fully exited. If a disconnect still occurs, you should be able to reconnect your controller and use NXBT as normal.
This means that NXBT wasn't able to find a suitable Bluetooth adapter to use for Nintendo Switch controller emulation. Only one controller can be emulated per adapter on the system, so if you've got one Bluetooth adapter available, you'll only be able to emulate one Nintendo Switch controller. The general causes (and solutions) to the above error follows:
This means that another service has already bound itself to the Control and Interrupt ports on the specified Bluetooth adapter. Causes/solutions follow:
A big thank you goes out to all the contributors at the dekuNukem/Nintendo_Switch_Reverse_Engineering repository! Almost all information pertaining to the innerworkings of the Nintendo Switch Controllers comes from the documentation in that repo. Without it, NXBT wouldn't have been possible.
MIT