Skip to content
NicholasWMPublic

About

Open source Linux control for the EMEET SmartCam S600L webcam: ring light, image controls, live preview, CLI and MCP server

Topics

Resources

Stars

0 stars

Watchers

0 watching

Forks

Repository files navigation

emeetctl

Website and downloads: https://nicholaswm.github.io/emeetctl/

Open source Linux control for the EMEET SmartCam S600L webcam (USB 328f:00ef): the ring light (RGB + fill light), the image controls and the microphones (the camera's built-in one and any other USB mic on the desk, e.g. a Blue Yeti Nano), with a GUI, a CLI and an MCP server so AI agents can drive the camera too.

The vendor app (EMEET Studio) only exists for Windows and macOS. The light protocol was reverse engineered from a passive USB capture of EMEET Studio 2.0.4 (firmware 1.0.19), with no decompilation; see Protocol.

Not affiliated with or endorsed by EMEET. "EMEET" is used only to name the supported hardware. The UI and messages are in Brazilian Portuguese for now.

What it does

GUI CLI MCP
Fill light on/off ✔ emeetctl on/off fill set_light_power
RGB ring on/off ✔ emeetctl on/off rgb set_light_power
Modes: cool, warm, balanced, ambient, rainbow ✔ emeetctl mode … / rainbow set_light_mode
Any RGB color (the vendor app has 6 presets) ✔ emeetctl color ff0000 set_light_color
Light brightness ✔ emeetctl brightness 40 set_light_brightness
Image: brightness, contrast, saturation, hue, gamma, gain, sharpness, white balance, exposure, focus, zoom, anti-flicker, backlight ✔ emeetctl image list/get/set/reset list_image_controls, set_image_control, reset_image_controls
Microphones (camera mic, Yeti Nano, any USB mic): gain, mute, live level meter, make it the default input, who is recording from it ✔ emeetctl mic [-d nano] list/status/gain/mute/unmute/default/level list_microphones, get_mic_status, set_mic_gain, set_mic_mute, set_mic_default
Clean microphone: a new input " (limpo)" with WebRTC noise suppression, high-pass and speaker echo cancellation, as a user service (no PipeWire restart) ✔ emeetctl mic -d nano clean on --default / off set_clean_mic
Headphone output of the mic (Yeti Nano): volume, mute ✔ emeetctl mic -d nano headphones -12 set_headphones
Recording to a file: video (camera + any mic, MP4/MKV/WebM) or audio only (WAV/FLAC/MP3/Opus/M4A). With the virtual camera on, it records from a free output, so Meet and the preview keep working ✔ emeetctl record -f mkv -m limpo start_recording, stop_recording, get_recording
Recording the PC: what the computer plays (call, video) and the mic in separate tracks (MKA), plus the whole screen with --video (MKV, NVENC on NVIDIA, x264 otherwise). X11 only for the screen ✔ emeetctl pc / emeetctl pc --video start_pc_recording, stop_recording
Local transcription (Whisper via whisper-ctranslate2, GPU with CPU fallback): each track on its own, interleaved by time with the track name (Microfone / Sistema), .txt + .srt next to the file ✔ emeetctl transcribe file.mka (automatic after emeetctl pc) transcribe_recording
Live camera preview (MJPEG 1280×720, YUYV fallback; released when paused) ✔
Device info (serial, firmware) ✔ emeetctl info get_status

Firmware update is deliberately not supported. The vendor HID channel may carry firmware commands, so emeetctl refuses to send any opcode that was not observed in the capture.

Install

Requires Rust 1.81+ and the ALSA headers (sudo apt install libasound2-dev). The microphone status and meter use PipeWire (pw-dump, pw-record, wpctl); gain and mute work with plain ALSA. Recording needs ffmpeg (sudo apt install ffmpeg); transcription needs whisper-ctranslate2 (uv tool install whisper-ctranslate2).

cargo install --path crates/emeetctl-cli   # emeetctl
cargo install --path crates/emeetctl-gui   # emeetctl-gui
cargo install --path crates/emeetctl-mcp   # emeetctl-mcp

The light uses /dev/hidrawN, which is root-only by default. Install the udev rule once:

sudo cp udev/70-emeetctl.rules /etc/udev/rules.d/
sudo udevadm control --reload
sudo udevadm trigger --subsystem-match=hidraw --action=change

The image controls use /dev/videoN and work for users in the video group (or the logged-in seat).

Optional launcher: cp emeetctl.desktop ~/.local/share/applications/.

CLI

emeetctl status                    # light state
emeetctl color 123456              # any color; puts the ring in fixed-color mode
emeetctl rainbow
emeetctl mode warm                 # cool | warm | balanced | ambient
emeetctl brightness 30             # % of the current mode's range (--raw 0xNN for the raw value)
emeetctl off rgb                   # rgb (ring) | fill (whole fill light)
emeetctl image list
emeetctl image set focus_automatic_continuous off
emeetctl image set focus_absolute 420
emeetctl image set zoom_absolute 200
emeetctl image reset
emeetctl mic list                  # USB microphones (camera = s600l, Yeti Nano = nano)
emeetctl mic -d s600l gain 13      # microphone gain in dB; without -d, the system default input
emeetctl mic level                 # live level meter (Ctrl+C to stop)
emeetctl record                    # MP4 in ~/Videos until Ctrl+C (camera + default input)
emeetctl record -f opus -m nano --seconds 60   # audio only, from the Yeti Nano, 1 minute
emeetctl record -f webm -m nenhum -o demo.webm # video without sound
emeetctl pc                        # PC audio (system + mic) to ~/Music, transcribed on Ctrl+C
emeetctl pc --video --lang en      # plus the screen, to ~/Videos; English speech
emeetctl transcribe call.mka --model medium   # transcribe an existing recording
emeetctl --json status             # machine-readable output

MCP server

emeetctl-mcp speaks MCP over stdio. Example for Claude Code:

claude mcp add emeetctl -- emeetctl-mcp

Tools: get_status, set_light_power, set_light_color, set_light_mode, set_light_brightness, list_image_controls, set_image_control, reset_image_controls, list_microphones, get_mic_status, set_mic_gain, set_mic_mute, set_mic_default, set_headphones, set_clean_mic, start_recording, start_pc_recording, stop_recording, get_recording, transcribe_recording (mic tools take an optional device). Each call opens the device, acts and closes it, so the camera can be unplugged between calls.

Protocol

32-byte HID reports on the vendor interface (interface 4, interrupt OUT 0x01 / IN 0x84):

09 02 02 OP LL LL LL LL <data> 00…   LL = data length (u16 big-endian, repeated). No checksum.
op meaning data
00 / 01 power set / get ff 0X 00 00 fill light · 03 01 01 01 / 03 00 00 00 RGB ring
02 / 03 ring color set / get 00 RR GG BB
04 / 05 brightness set / get MM BB (MM = mode; rainbow uses the ambient key 03)
06 / 07 mode set / get 00 MM with 0 cool, 1 warm, 2 balanced, 3 ambient, 4 rainbow

Every SET is acknowledged with a single 20 byte. The camera also pushes state frames on its own when the mode changes, so replies are matched by opcode.

Brightness ranges seen in the vendor slider: ambient/rainbow 0x14–0xff, cool 0x37–0x64. Warm and balanced were not measured (assumed equal to cool).

Camera quirks

  • Digital zoom only applies in MJPEG below 1080p. Measured frame by frame: zoom works in MJPEG 2560×1440, 1280×960, 1280×720, 1024×576, 960×720, 800×600, 640×480 and 640×360, and is ignored in MJPEG 1920×1080, 3840×2160 and every YUYV mode (EMEET's FAQ also says the field of view is fixed in 4K and 1080p). If zoom "does nothing", check the resolution/format your video app is using.
  • Switching the ring to a color or mode may turn the fill light flag on by itself.

Not mapped yet

The UVC Extension Unit {46394292-0cd0-4ae3-8783-3133f9eaaa3b} (10 controls) is still unknown. Candidates from public docs: image flip/mirror, factory reset, microphone noise reduction, boot light behaviour. Contributions with USB captures are welcome.

Blue Yeti Nano (b58e:0005): only the standard USB audio controls are used (mic gain 0–33 dB, headphone volume, mutes). Polar pattern and monitor mix live on a vendor HID report that is not mapped yet (capture plan in notes/capture-yeti-nano.md). The front mute button is invisible to the host: the mic just sends zeros, so the level meter warns on digital silence.

Layout

crates/emeetctl-core   device discovery (sysfs), HID light protocol, V4L2 controls, mics, recording
crates/emeetctl-cli    `emeetctl`
crates/emeetctl-gui    `emeetctl-gui` (egui)
crates/emeetctl-mcp    `emeetctl-mcp` (MCP over stdio)
udev/                  hidraw permission rule

License

MIT OR Apache-2.0.

About

Open source Linux control for the EMEET SmartCam S600L webcam: ring light, image controls, live preview, CLI and MCP server

Topics

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages