Skip to main content

eh-fifty

eh-fifty is a Python library for configuring the Astro A50 wireless headset and base station (generation 4).

Use at your own risk. eh-fifty was developed using reverse engineering. If you get into trouble, re-plug your base station and reset your headset by holding down the "game" and "Dolby" buttons together for 15 seconds.

eh-fifty has only been tested on Linux, although it may work on other platforms supported by PyUSB.

Features

  • get/set microphone level
  • get/set microphone EQ preset
  • get/set side tone volume
  • get/set noise gate mode
  • get/set alert volume
  • get/set active EQ preset
  • get/set EQ preset parameters
  • get/set game/voice balance
  • save configuration values
  • get charging status and battery level
  • get headset status
  • get EQ preset name
  • get base station device info
  • get headset device info
  • get base and headset firmware versions
  • update firmware

Example

Retrieve the current battery charge:

from eh_fifty import Device

with Device() as device:
    battery_status = device.get_battery_status()
    print(f"Battery: {battery_status.charge_percent}%")

Resource Management

The Device class supports context management for automatic cleanup:

with Device() as device:
    # use device...
# kernel driver automatically reattached

For long-running applications, you can also manage the lifecycle manually:

device = Device()
try:
    while True:
        status = device.get_headset_status()
        # ...
finally:
    device.close()

Non-root access

Create a udev rule to allow the logged-in user to access the USB device:

echo 'SUBSYSTEM=="usb", ATTR{idVendor}=="9886", ATTR{idProduct}=="002c", TAG+="uaccess"' | \
    sudo tee /etc/udev/rules.d/50-astro-a50.rules

Re-plug your base station to apply the new rule. The file name must sort before systemd's 71-seat.rules. On systems without systemd-logind, use GROUP="plugdev", MODE="0660" instead of TAG+="uaccess" and add your user to the plugdev group.

Protocol Documentation

Requests

The first byte of a request is 0x02.

The second byte of a request is a request type (see below).

An optional request payload may follow, prefixed by the length of the payload in bytes, not including this byte.

Responses

The first byte of a response is 0x02.

The second byte of a response may be either:

  • 0x00 for "no response"
  • 0x01 for "error"
  • 0x02 for "success"

Unless the second byte represents "no response", the third byte of a response is the remaining length of the response measured in bytes, not including this byte.

Saved Values

Sending request type 0x61 will save the active configuration. Saved values can be queried separately from active values. This can be used by applications to implement an operation to revert to a saved configuration. Changes to the active configuration effect immediately; saving changes is not required.

Request Types

Type Description
0x03 get base station device info (USB IDs and firmware build time)
...
0x54 returns headset power and dock status
0x55 get base firmware minor version
...
0x61 save active values
0x62 set value of specified slider
0x63 set EQ preset gain
0x64 set noise gate mode
...
0x67 set active EQ preset
0x68 get value of specified slider
0x69 get EQ preset gain
0x6A get noise gate mode
...
0x6C get active EQ preset
0x6D set EQ preset name
0x6E get EQ preset name
0x6F set EQ preset frequency and bandwidth
0x70 get EQ preset frequency and bandwidth
0x71 set microphone EQ preset
0x72 get balance
0x73 set default balance
0x74 set auto shutoff timeout (ineffective)
0x75 set brightness (ineffective)
0x76 set alert volume
0x77 get default balance
0x78 get auto shutoff timeout
0x79 get brightness
0x7A get alert volume
0x7B get microphone EQ preset
0x7C get battery status
...
0x83 get headset device info (IDs and firmware build time; requires argument 0x01)
...
0xD6 get headset firmware minor version (requires argument 0x0A)
...
0xDA get headset firmware major version (requires argument 0x0A)

Development

uv and just are required.

See just.

Release Process

Bump the version in eh_fifty.py and run the following:

git commit -am "Bump version"
git tag "${VERSION}"
git push --follow-tags
uv build
uv publish dist/eh_fifty-${VERSION}*.{tar.gz,whl}

Metadata

Release files for eh-fifty 0.6.0

For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.

Source distribution (sdist)

Source distribution for eh-fifty 0.6.0
File Size Uploaded
eh_fifty-0.6.0.tar.gz 9.0 kB Details

Built distribution (wheel)

Table of built distributions (wheels) for eh-fifty 0.6.0
File Interpreter ABI Platform
eh_fifty-0.6.0-py3-none-any.whl Python 3 none any Details

Total release size: 18.0 kB

Release files / eh_fifty-0.6.0.tar.gz

Download URL eh_fifty-0.6.0.tar.gz
Size 9.0 kB
Tags Source
SHA-256 checksum
How to use checksums
b93eb0c9612e1bb499ad0876d9f43de60fad374341d6840225624f4b518172a0
BLAKE2b-256 checksum
How to use checksums
4b48b986bf355b3d219a8d8e82f5efe75f61c87600a30f48afc85f73cec84c36
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via uv/0.12.17 {"installer":{"name":"uv","version":"0.12.17","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Ubuntu","version":"26.04","id":"resolute","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":null}

Release files / eh_fifty-0.6.0-py3-none-any.whl

Download URL eh_fifty-0.6.0-py3-none-any.whl
Size 8.9 kB
Tags Python 3
SHA-256 checksum
How to use checksums
67d67969186cce19aca8bf9bab78f888fb17ef01f5abc8f2d4159b11e8d16e4f
BLAKE2b-256 checksum
How to use checksums
a0318c444913bf7c00236e35cb29bad7cfdeffabbd9fc6aaa31771e0ac517e1f
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via uv/0.12.17 {"installer":{"name":"uv","version":"0.12.17","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Ubuntu","version":"26.04","id":"resolute","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":null}

Release history Release notifications | RSS feed

This release

0.6.0 This release

2 release files

0.5.0

2 release files

0.4.0

2 release files

0.3.0

2 release files

0.2.0

2 release files

Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page