Install
openclaw skills install roomsoundRoomSound gives your agent the skill to play audio to your speakers. Starting with YouTube to Bluetooth speakers, expanding to local files and other sources.
openclaw skills install roomsoundYou are the RoomSound execution layer for speaker control and audio playback.
When users ask to play audio or switch speakers, resolve intent into these command groups:
bluetoothctl paired-devices, bluetoothctl info <MAC>, wpctl status, pactl list short sinksbluetoothctl devices Connected, bluetoothctl disconnect <MAC>, bluetoothctl connect <MAC>mpv --no-video "<url>" and yt-dlp search/print commandsPrefer natural-language confirmation before disruptive actions (switching active speakers).
On first use, ensure dependencies and speaker aliases are ready:
yt-dlp, mpv, bluetoothctl (and audio tooling from metadata install list).apt: yt-dlp mpv bluez pulseaudio-utils) before continuing.yt-dlp JS runtime for reliability:
yt-dlp --js-runtimes "node:/usr/bin/nodejs" --print "%(title)s | Uploaded: %(upload_date>%Y-%m-%d)s | https://youtu.be/%(id)s" "ytsearch5:tiesto prismatic"mkdir -p ~/.config/yt-dlp && printf '%s\n' '--js-runtimes node:/usr/bin/nodejs' > ~/.config/yt-dlp/configbluetoothctl paired-devicesbluetoothctl info <MAC>wpctl status and/or pactl list short sinkskitchen -> 11:22:33:44:55:66).If alias is ambiguous or unknown, ask a clarifying question before switching.
mpv --no-video "<url>".yt-dlp --print "%(title)s | Duration: %(duration_string)s | Uploaded: %(upload_date>%Y-%m-%d)s | https://youtu.be/%(id)s" "ytsearch5:<query>"yt-dlp and mpv.Error: yt-dlp not found. Install with: sudo apt install yt-dlpError: mpv not found. Install with: sudo apt install mpvmpv --no-video "<url1>" "<url2>" "<url3>" ...yt-dlp -f bestaudio -g "ytsearch1:<item1>" ... yt-dlp -f bestaudio -g "ytsearch1:<itemN>"mpv --no-video "<stream-url1>" "<stream-url2>" ...yt-dlp --print "%(title)s | Duration: %(duration_string)s | Uploaded: %(upload_date>%Y-%m-%d)s | https://youtu.be/%(id)s" "ytsearch1:<query>"yt-dlp -f bestaudio -g "ytsearch1:<query>".mpv --no-video "<stream-url1>" "<stream-url2>" ....mpv command.^([0-9A-Fa-f]{2}:){5}[0-9A-Fa-f]{2}$.bluetoothctl devices Connected (collect connected MACs)bluetoothctl disconnect <CONNECTED_MAC> for each connected device not equal to targetbluetoothctl connect <TARGET_MAC>wpctl set-default <SINK_ID> or pactl set-default-sink <SINK_NAME>.bluetoothctl paired-devicesbluetoothctl info <MAC> for each paired MACwpctl statuspactl list short sinks
Then summarize connected/disconnected status and available sinks.bluetoothctl paired-devices.bluetoothctl info <MAC> and report:
✅ Connected or ❌ Disconnectedbluetoothctl is missing, print install hint for bluez.wpctl exists, parse wpctl status audio subsection.pactl exists, parse sinks in [id] name: description format from pactl list short sinks.`, $, (, ), {, }, |, ;, &, <, >, \, ', ") to prevent command injection. This can be done with tr -d $'\$(){}|;&<>\'"'. MAC addresses must always be validated against ^([0-9A-Fa-f]{2}:){5}[0-9A-Fa-f]{2}$` before use.mpv is missing, rerun dependency initialization from metadata install packages.yt-dlp lists/downloads unexpectedly, use explicit search print format:
yt-dlp --print "%(title)s | Duration: %(duration_string)s | Uploaded: %(upload_date>%Y-%m-%d)s | https://youtu.be/%(id)s" "ytsearch5:<query>"wpctl or pactl as available.For end-user setup, troubleshooting, and examples, direct users to:
QUICK-START-GUIDE.md