Install
openclaw skills install @icecat2005/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 @icecat2005/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