Skip to content

Latest commit

 

History

3 Commits

Folders and files

NameName
Last commit message
Last commit date
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

Sennheiser Control

Compatibility: Sennheiser ACCENTUM Plus only. Other headphone models are not currently supported.

An unofficial desktop companion for Sennheiser ACCENTUM Plus headphones. Adjust noise cancellation, let more of the room in with Transparency, or tune the five-band EQ from your Windows system tray.

The app finds your headphones over Bluetooth and lets you choose which pair to connect to. You don't need to look up a Bluetooth address. It follows your Windows light or dark theme and supports Mica and Acrylic backgrounds.

There's also a command-line interface for scripts, diagnostics, and exploring the headphone protocol. The project is still in development. Windows is required for the tray app and the RFCOMM connection used to control the headphones; the Python tools can also be used for development and offline analysis on other platforms.

Installing the Windows app

Download the versioned Sennheiser-Control-Setup-*.exe installer from the project's GitHub Releases page and run it. The installer does not require administrator rights. It lets you choose whether to create a Start Menu shortcut and a desktop shortcut, and adds an uninstaller to Windows. Your settings and EQ presets are kept when the application is removed.

The release build includes its Python backend and does not require Python to be installed on the computer. Bluetooth still needs to be available in Windows, and the headphones must be paired with the PC.

Getting started on Windows

You'll need Python 3.11 or later and a Windows PC with Bluetooth. Pair your ACCENTUM Plus with the PC, turn the headphones on, and close Smart Control on your phone while connecting: competing control connections can interfere with discovery or access.

Open PowerShell in the project folder and install the Python package:

python -m venv .venv-win
.\.venv-win\Scripts\python.exe -m pip install -e .

Then launch the app:

powershell.exe -NoProfile -STA -ExecutionPolicy Bypass -File .\ui\SennheiserControl.ps1

Choose your headphones from the list. The app checks the connection before opening the controls. Click its tray icon to show or hide the panel; use the tray menu to quit.

The launcher finds .venv-win automatically. If you already have a Python environment with the package installed, you can point SENNHEISER_CONTROL_PYTHON at its python.exe instead. The optional -Address argument lets you connect to a specific Bluetooth address directly.

See the Windows UI guide for launch options, appearance settings, and preview modes.

What you can do

  • Adjust active noise cancellation (ANC) and Transparency, and toggle Bass Boost.
  • Create, edit, rename, delete, and apply five-band EQ presets.
  • Read headphone settings from the app or CLI. The app periodically refreshes noise control, Bass Boost, Personal Sound, and EQ state.
  • Inspect Bluetooth Low Energy (BLE) services and record diagnostic data.
  • Analyze Android Bluetooth captures to see the commands exchanged with Smart Control Plus.

The project does not update firmware or provide tools for changing low-level device parameters.

Using the CLI

For the examples below, activate the environment you installed into:

.\.venv-win\Scripts\Activate.ps1

If PowerShell blocks activation, replace python in each command with .\.venv-win\Scripts\python.exe.

CLI operations return JSON, so you can use their output in scripts. Run python -m accentum_control --help to see the available commands, or add --help after a command for its options.

Find and inspect headphones

python -m accentum_control scan --timeout 8
python -m accentum_control inspect DEVICE_ID --out accentum-gatt.json
python -m accentum_control dump DEVICE_ID --out accentum-gatt.json
python -m accentum_control monitor DEVICE_ID --duration 30 --out notifications.json

Replace DEVICE_ID with the address or identifier returned by scan. Discovery looks for both ACCENTUM Plus and LE-ACCENTUM Plus. The inspection commands list GATT services and characteristics, including whether they support reads, writes, or notifications, and can save the results as JSON.

monitor records BLE notifications and indications from its own connection. To capture traffic between your phone and the headphones, you'll need an Android HCI snoop log instead:

python -m accentum_control analyze-hci accentum-hci-actions.btsnoop --out gaia-actions.json

Here, accentum-hci-actions.btsnoop is the capture you supply. The output contains decoded GAIA commands and the direction of each exchange. You can analyze a saved capture without connecting to the headphones or phone.

Read and change settings

Run these commands on Windows with the headphones paired to your PC. Replace BLUETOOTH_ADDRESS with their Windows Bluetooth address.

python -m accentum_control read BLUETOOTH_ADDRESS noise-control
python -m accentum_control read BLUETOOTH_ADDRESS noise-modes
python -m accentum_control read BLUETOOTH_ADDRESS noise-level
python -m accentum_control read BLUETOOTH_ADDRESS bass-boost

python -m accentum_control control BLUETOOTH_ADDRESS noise-control on
python -m accentum_control control BLUETOOTH_ADDRESS noise-level 50
python -m accentum_control control BLUETOOTH_ADDRESS anc-level 100
python -m accentum_control control BLUETOOTH_ADDRESS transparency 50
python -m accentum_control control BLUETOOTH_ADDRESS bass-boost off

read leaves settings unchanged. Both read and control wait for a matching GAIA response and report an error if it doesn't arrive before the timeout.

The three level controls use different scales:

Control Meaning of 0–100
noise-level The whole ANC-to-Transparency slider: 0 is full ANC, 50 is the midpoint, and 100 is full Transparency.
anc-level The ANC half of the slider: 0 is the midpoint and 100 is full ANC.
transparency The Transparency half: 0 is the midpoint and 100 is full Transparency.

control ... noise-mode selects a mode using a 16-bit value; it does not set the slider position. The corresponding read command is named noise-modes.

Save and apply EQ presets

A preset has a name and five integer band values from -60 to 60. These are the raw band values used by the app; their physical units and frequencies have not been confirmed.

{
  "name": "Custom 1",
  "bands": [-25, -8, 0, 10, -18]
}

You can manage presets locally without connecting to the headphones:

python -m accentum_control preset add "My EQ" -25 -8 0 10 -18
python -m accentum_control preset list
python -m accentum_control preset show "My EQ"
python -m accentum_control preset update "My EQ" -20 -5 0 5 8
python -m accentum_control preset rename "My EQ" "Travel"

Apply a saved preset on Windows, or remove it from your local collection:

python -m accentum_control preset apply BLUETOOTH_ADDRESS "Travel"
python -m accentum_control preset delete "Travel"

preset apply accepts either a saved name or a path to a preset JSON file. It sends the five EQ values over one RFCOMM connection and leaves Bass Boost, ANC, Transparency, and Personal Sound unchanged.

Presets are stored in %APPDATA%\Sennheiser Control\presets.json on Windows. On Linux, the default is ~/.config/Sennheiser Control/presets.json, or the equivalent location under XDG_CONFIG_HOME if set. Use --store PATH on a preset command to choose another file. If the default catalog doesn't exist, the app also checks the older accentum-control location.

Development

Backend and experimental UI

The Windows tray app uses a persistent Python backend that exchanges one JSON object per line (JSONL). To run that backend with simulated headphones:

python -m accentum_control server --mock

There is also a separate, experimental Tk interface:

python -m accentum_control gui

For the Windows tray app, use the PowerShell launcher shown in Getting started.

Building the installer

The Windows packaging workflow installs the project, runs the tests, bundles the Python backend with PyInstaller, and creates the installer with Inno Setup. To publish a build without creating a local tag, open Actions → Windows installer → Run workflow, leave Publish the installer as a GitHub Release enabled, and optionally enter a tag such as v0.1.0. The workflow uploads the versioned installer as an artifact and attaches it to the new GitHub Release. Pushing a v* tag runs the same build and publishes it automatically.

The generated installer is a per-user setup program. It installs the packaged backend and UI resources, offers separate Start Menu and desktop shortcut options, and registers an uninstaller. It does not remove settings or EQ presets from the user's profile.

Working in WSL, Linux, or macOS

You can edit the Python code, run tests, manage local presets, and analyze saved captures outside Windows. Create a separate environment for that platform:

python3 -m venv .venv
. .venv/bin/activate
python -m pip install -e .

WSL does not automatically have access to the Windows Bluetooth adapter. When working in WSL, run the tray app and headphone control commands from Windows PowerShell, using a Windows Python environment. Keep the Linux and Windows environments separate even if they share the same project folder.

Finding your way around the code

The Python package lives in src/accentum_control/:

  • core.py exposes the headphone operations; ble.py handles BLE through Bleak.
  • control.py defines control operations; protocol.py encodes and decodes GAIA packets.
  • rfcomm.py handles the Windows RFCOMM connection.
  • eq.py manages EQ presets and their storage.
  • hci.py parses Android BTSnoop captures through HCI ACL, L2CAP, RFCOMM, and GAIA.
  • cli.py provides the command-line interface; backend.py serves the Windows app.
  • app.py contains the experimental Tk interface.

The WPF tray app lives in ui/. Keeping the interfaces separate from the device and protocol code lets the core logic be tested without Bluetooth hardware.

Protocol notes

Captured Smart Control Plus traffic for ACCENTUM Plus uses Classic Bluetooth RFCOMM with GAIA packets and vendor ID 0x0495. BLE is used for discovery and GATT diagnostics; control commands use the RFCOMM connection.

The main commands identified in the capture are:

Command Purpose
0x1A04 Enable or disable noise control.
0x1A00 Select the noise-control mode; the capture includes the value 03 00.
0x1A02 Set the combined ANC/Transparency slider, from 0 to 100.
0x1008 Enable or disable Bass Boost.

The transparency percentage maps onto the right half of that slider: 0% sends 0x32, 50% sends 0x4B, and 100% sends 0x64.

What's next

A portable Windows package is planned so you won't need to set up a Python environment to use the app.

About

An unofficial desktop companion app for Sennheiser ACCENTUM Plus headphones.

Topics

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages