{"id":15566842,"url":"https://github.com/tdryer/eh-fifty","last_synced_at":"2025-04-14T06:47:07.654Z","repository":{"id":65165091,"uuid":"583542618","full_name":"tdryer/eh-fifty","owner":"tdryer","description":"Python library for configuring the Astro A50 wireless headset and base station (generation 4)","archived":false,"fork":false,"pushed_at":"2023-02-26T02:18:35.000Z","size":40,"stargazers_count":4,"open_issues_count":0,"forks_count":0,"subscribers_count":3,"default_branch":"master","last_synced_at":"2025-03-27T20:38:51.926Z","etag":null,"topics":["python","pyusb","usb"],"latest_commit_sha":null,"homepage":"","language":"Python","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/tdryer.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE.txt","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null}},"created_at":"2022-12-30T05:00:53.000Z","updated_at":"2024-05-26T15:56:30.000Z","dependencies_parsed_at":"2024-10-15T07:50:27.436Z","dependency_job_id":null,"html_url":"https://github.com/tdryer/eh-fifty","commit_stats":{"total_commits":20,"total_committers":1,"mean_commits":20.0,"dds":0.0,"last_synced_commit":"55f49dbf6807ec0058f04f455926773e7aac6a1f"},"previous_names":[],"tags_count":2,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/tdryer%2Feh-fifty","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/tdryer%2Feh-fifty/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/tdryer%2Feh-fifty/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/tdryer%2Feh-fifty/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/tdryer","download_url":"https://codeload.github.com/tdryer/eh-fifty/tar.gz/refs/heads/master","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":248647252,"owners_count":21139081,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["python","pyusb","usb"],"created_at":"2024-10-02T17:07:28.261Z","updated_at":"2025-04-14T06:47:07.630Z","avatar_url":"https://github.com/tdryer.png","language":"Python","funding_links":[],"categories":[],"sub_categories":[],"readme":"# eh-fifty\n\neh-fifty is a Python library for configuring the [Astro A50 wireless headset\nand base station (generation 4)][astro-a50].\n\n**Use at your own risk.** eh-fifty was developed using reverse engineering. If\nyou get into trouble, re-plug your base station and reset your headset by\nholding down the \"game\" and \"Dolby\" buttons together for 15 seconds.\n\neh-fifty has only been tested on Linux, although it may work on other platforms\nsupported by [PyUSB][pyusb].\n\n[astro-a50]: https://www.astrogaming.com/en-ca/products/headsets/a50-gen-4.html\n[pyusb]: https://github.com/pyusb/pyusb\n\n## Features\n\n* [X] get/set microphone level\n* [X] get/set microphone EQ preset\n* [X] get/set side tone volume\n* [X] get/set noise gate mode\n* [X] get/set alert volume\n* [X] get/set active EQ preset\n* [X] get/set EQ preset parameters\n* [X] get/set game/voice balance\n* [X] save configuration values\n* [X] get charging status and battery level\n* [X] get headset status\n* [X] get EQ preset name\n* [ ] update firmware\n\n## Example\n\nRetrieve the current battery charge:\n\n    from eh_fifty import Device\n    device = Device()\n    battery_status = device.get_battery_status()\n    print(f\"Battery: {battery_status.charge_percent}%\")\n\n## Non-root access\n\nCreate a udev rule to allow non-root users to access the USB device:\n\n    echo 'SUBSYSTEM==\"usb\", ATTR{idVendor}==\"9886\", ATTR{idProduct}==\"002c\", MODE:=\"0666\"' | \\\n        sudo tee /etc/udev/rules.d/50-astro-a50.rules\n\nRe-plug your base station to apply the new rule.\n\n## Protocol Documentation\n\n### Requests\n\nThe first byte of a request is `0x02`.\n\nThe second byte of a request is a request type (see below).\n\nAn optional request payload may follow, prefixed by the length of the payload\nin bytes, not including this byte.\n\n### Responses\n\nThe first byte of a response is `0x02`.\n\nThe second byte of a response may be either:\n\n* `0x00` for \"no response\"\n* `0x01` for \"error\"\n* `0x02` for \"success\"\n\nUnless the second byte represents \"no response\", the third byte of a response\nis the remaining length of the response measured in bytes, not including this\nbyte.\n\n### Saved Values\n\nSending request type `0x61` will save the active configuration. Saved values\ncan be queried separately from active values. This can be used by applications\nto implement an operation to revert to a saved configuration. Changes to the\nactive configuration effect immediately; saving changes is not required.\n\n### Request Types\n\nType | Description\n-----|----------------------------------------------------------------------\n0x03 | unknown\n...  |\n0x54 | returns headset power and dock status\n0x55 | unknown\n...  |\n0x61 | save active values\n0x62 | set value of specified slider\n0x63 | set EQ preset gain\n0x64 | set noise gate mode\n...  |\n0x67 | set active EQ preset\n0x68 | get value of specified slider\n0x69 | get EQ preset gain\n0x6A | get noise gate mode\n...  |\n0x6C | get active EQ preset\n0x6D | set EQ preset name\n0x6E | get EQ preset name\n0x6F | set EQ preset frequency and bandwidth\n0x70 | get EQ preset frequency and bandwidth\n0x71 | set microphone EQ preset\n0x72 | get balance\n0x73 | set default balance\n0x74 | set auto shutoff timeout (ineffective)\n0x75 | set brightness (ineffective)\n0x76 | set alert volume\n0x77 | get default balance\n0x78 | get auto shutoff timeout\n0x79 | get brightness\n0x7A | get alert volume\n0x7B | get microphone EQ preset\n0x7C | get battery status\n...  |\n0x83 | unknown (returns \"slave timeout\" error)\n...  |\n0xDA | unknown\n...  |\n0xD6 | unknown\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Ftdryer%2Feh-fifty","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Ftdryer%2Feh-fifty","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Ftdryer%2Feh-fifty/lists"}