DGM20 control for Linux: protocol library, CLI and local web UI

Reverse-engineered from Maono Link 4.0.88 (DGM20_OLD.dll) and verified
against a DGM20 (352f:0105, firmware 2.1.2).

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
2026-10-07 22:45:59 -05:00
co-authored by Claude Opus 5.5
commit d239c214b4
14 changed files with 1097 additions and 0 deletions
+78
View File
@@ -0,0 +1,78 @@
# dgm20-linux
Control the **Maono DGM20** USB microphone on Linux. Maono Link only runs on Windows and macOS; this
covers the same settings with a local web page and a command-line tool.
![The control page](docs/screenshot.png)
- Noise cancellation on/off and strength
- Vocal enhancement
- Hear yourself (headphone monitoring)
- Mute, kept in sync with the mic's touch pad
- RGB ring brightness
- Factory reset
Pure Python 3.9+, no dependencies. Nothing leaves your machine: the page is served from localhost
and loads no external fonts or scripts.
> Unofficial. Not affiliated with or endorsed by Maono. Tested on a DGM20 with USB ID
> `352f:0105`, firmware 2.1.2. Newer DGM20 revisions (`352f:0112`) and the DGM20G/DGM20W
> use different firmware and are not supported yet.
## Install
```sh
pipx install git+https://git.reiners.dev/ReinersCloudConsulting/dgm20-linux.git
# or, from a checkout
pipx install .
```
Let your user reach the mic without root, then unplug and replug it:
```sh
sudo cp udev/70-maono-dgm20.rules /etc/udev/rules.d/
sudo udevadm control --reload && sudo udevadm trigger
```
The rule grants access to the logged-in desktop user (`uaccess`) and to the `wheel` group, which
covers ssh sessions. Change the group if your distro uses a different one.
## Use
```sh
dgm20-web --open # control page at http://localhost:8720
dgm20ctl # show settings
dgm20ctl set nc on nc-level 80 enhance off
dgm20ctl watch # print changes made on the mic itself
dgm20ctl factory-reset --yes
```
To keep the page running in the background:
```sh
cp contrib/dgm20-web.service ~/.config/systemd/user/
systemctl --user enable --now dgm20-web
```
`dgm20-web` only listens on localhost. `--host 0.0.0.0` makes it reachable from your network, and
anyone on that network can then change your mic settings, because there is no login.
Input gain and headphone volume are standard USB audio controls. Set them in your desktop's sound
settings, `pavucontrol` or `alsamixer`. The mic does not expose them on its control channel.
## How it works
The settings were found by reading Maono Link's DGM20 plugin. See [PROTOCOL.md](PROTOCOL.md) for
the packet format and register map. `dgm20ctl raw` gives direct register access if you want to
explore.
## Development
```sh
PYTHONPATH=src python3 -m unittest discover -s tests
PYTHONPATH=src python3 -m dgm20.web
```
## License
MIT