openclaw/skills/bluetooth/SKILL.md
Control Bluetooth devices and audio routing on the Mac Mini. Use when asked about Bluetooth, connecting speakers, headphones, audio output, switching audio, or listing paired devices.
npx skillsauth add Dbochman/dotfiles bluetoothInstall this skill globally with one command. Works with Claude Code, Cursor, and Windsurf.
3 of 9 scanners reported clean
Some scanners were skipped, did not run, or reported a non-clean status. Review each row below.
Control Bluetooth devices and audio routing on the Mac Mini (macOS Tahoe 26.x).
| Name | MAC Address | Type | |------|-------------|------| | Kitchen speaker | DC:E5:5B:C0:91:1A | Audio | | Magic Keyboard with Numeric Keypad | 80:4A:14:76:DA:A6 | Keyboard | | Magic Trackpad 2 | AC:88:FD:EF:5F:7F | Trackpad |
On macOS 26.x, the IOBluetooth API reports wrong power/connection state over SSH. All connect/disconnect operations must run via open /tmp/bt_op.command which launches in the GUI (Aqua) session where IOBluetooth works correctly.
Read operations (list devices, check status, audio switching) work directly over SSH via system_profiler and SwitchAudioSource.
ssh dylans-mac-mini "echo 'connect DC:E5:5B:C0:91:1A' > /tmp/bt_command.txt && rm -f /tmp/bt_result.txt /tmp/bt_exit.txt && open /tmp/bt_op.command && sleep 12 && cat /tmp/bt_exit.txt"
Exit code 0 = success. Wait 12 seconds for the Bluetooth connection to establish.
ssh dylans-mac-mini "echo 'connect DC:E5:5B:C0:91:1A' > /tmp/bt_command.txt && rm -f /tmp/bt_result.txt /tmp/bt_exit.txt && open /tmp/bt_op.command"
sleep 12
ssh dylans-mac-mini "export PATH=/opt/homebrew/bin:\$PATH && SwitchAudioSource -s 'Kitchen speaker' -t output"
ssh dylans-mac-mini "echo 'disconnect DC:E5:5B:C0:91:1A' > /tmp/bt_command.txt && rm -f /tmp/bt_result.txt /tmp/bt_exit.txt && open /tmp/bt_op.command && sleep 12 && cat /tmp/bt_exit.txt"
ssh dylans-mac-mini "export PATH=/opt/homebrew/bin:\$PATH && SwitchAudioSource -s 'Mac mini Speakers' -t output"
ssh dylans-mac-mini "echo 'disconnect DC:E5:5B:C0:91:1A' > /tmp/bt_command.txt && rm -f /tmp/bt_result.txt /tmp/bt_exit.txt && open /tmp/bt_op.command"
ssh dylans-mac-mini "system_profiler SPBluetoothDataType -json" | python3 -c "
import json, sys
data = json.load(sys.stdin)
bt = data.get('SPBluetoothDataType', [{}])[0]
for section in ['device_connected', 'device_not_connected']:
devices = bt.get(section, [])
if isinstance(devices, list):
for group in devices:
if isinstance(group, dict):
for name, props in group.items():
connected = 'Yes' if section == 'device_connected' else 'No'
addr = props.get('device_address', '?')
print(f'{name}: {addr} connected={connected}')
"
ssh dylans-mac-mini "system_profiler SPBluetoothDataType 2>&1 | grep -B2 'Kitchen speaker'"
If it appears under "Connected:" it's connected. Under "Not Connected:" it's not.
These work directly over SSH (no GUI workaround needed).
ssh dylans-mac-mini "export PATH=/opt/homebrew/bin:\$PATH && SwitchAudioSource -a -t output"
ssh dylans-mac-mini "export PATH=/opt/homebrew/bin:\$PATH && SwitchAudioSource -c -t output"
# To Kitchen speaker
ssh dylans-mac-mini "export PATH=/opt/homebrew/bin:\$PATH && SwitchAudioSource -s 'Kitchen speaker' -t output"
# To Mac Mini speakers
ssh dylans-mac-mini "export PATH=/opt/homebrew/bin:\$PATH && SwitchAudioSource -s 'Mac mini Speakers' -t output"
ssh dylans-mac-mini "export PATH=/opt/homebrew/bin:\$PATH && SwitchAudioSource -m toggle"
ssh dylans-mac-mini "export PATH=/opt/homebrew/bin:\$PATH && SwitchAudioSource -m mute"
ssh dylans-mac-mini "export PATH=/opt/homebrew/bin:\$PATH && SwitchAudioSource -m unmute"
ssh dylans-mac-mini "system_profiler SPBluetoothDataType 2>&1 | grep 'State:'"
The /tmp/bt_op.command file is a shell script that:
/tmp/bt_command.txtblueutil --connect or --disconnect with the MAC address/tmp/bt_exit.txtUsing open to launch it ensures it runs in the macOS GUI session where blueutil has proper IOBluetooth API access and TCC (Bluetooth) permission.
open /tmp/bt_op.command pattern instead. Direct SSH calls to blueutil fail on Tahoe because IOBluetooth reports power=0.BLUEUTIL_USE_SYSTEM_PROFILER=1 blueutil --paired or system_profiler SPBluetoothDataType.| Path | Purpose |
|------|---------|
| /tmp/bt_op.command | Reusable GUI-session launcher for blueutil |
| /tmp/bt_command.txt | Input: command + MAC address |
| /tmp/bt_result.txt | Output: command result |
| /tmp/bt_exit.txt | Output: exit code |
| ~/.openclaw/bin/bt_connect | Swift IOBluetooth helper (used by launchd agent) |
| ~/Library/LaunchAgents/com.openclaw.bt-connect.plist | LaunchAgent for Bluetooth ops |
development
Search the web for current information, news, facts, and answers. Use when asked questions about current events, needing to look something up, finding websites, researching topics, or when you need up-to-date information beyond your training data.
development
Summarize any URL, YouTube video, podcast, PDF, or file into concise text. Use when asked to read an article, summarize a link, get the gist of a video or podcast, extract content from a URL, or when you need to understand what a web page or document contains.
development
Play music via Spotify and control Google Home speakers. Use when asked to play music, songs, artists, playlists, podcasts, or control speakers/volume/audio.
testing
Create new OpenClaw skills, modify and improve existing skills, and measure skill performance with evals. Use when users want to create a skill from scratch, update or optimize an existing skill, run evals to test a skill, benchmark skill performance with variance analysis, or optimize a skill's description for better triggering accuracy. Also use when asked to "make a skill", "turn this into a skill", "improve this skill", or "test this skill".