| name | sonos-operations |
| description | Execute any Sonos API operation dynamically with automatic discovery, parameter parsing, and direct SOAP execution. Use when users want to test operations on speakers, debug device behavior, or execute any UPnP operation without requiring code changes. Operations are discovered automatically from the sonos-api crate. |
Sonos Operations
Execute any operation from the sonos-api crate dynamically with automatic discovery, parameter handling, and direct execution. No code changes required when new operations are added - operations are discovered automatically from the Rust source.
Quick Start
Execute Any Operation:
python .claude/skills/sonos-operations/scripts/execute_operation.py <operation> <ip> [-p param=value]
python .claude/skills/sonos-operations/scripts/execute_operation.py Play 192.168.1.100
python .claude/skills/sonos-operations/scripts/execute_operation.py GetVolume 192.168.1.100 -p channel=Master
python .claude/skills/sonos-operations/scripts/execute_operation.py SetVolume 192.168.1.100 -p desired_volume=50
List Available Operations:
python .claude/skills/sonos-operations/scripts/execute_operation.py --list
python .claude/skills/sonos-operations/scripts/discover_operations.py --service AVTransport
Get Operation Details:
python .claude/skills/sonos-operations/scripts/execute_operation.py --info SetVolume
python .claude/skills/sonos-operations/scripts/discover_operations.py --operation Play
How It Works
This skill uses dynamic discovery to find all operations defined in the sonos-api crate and executes them via direct SOAP calls:
- Discovery: Parses Rust macro definitions (
define_upnp_operation!, define_operation_with_response!) to extract operation metadata
- Execution: Constructs SOAP envelopes directly in Python and sends HTTP requests to Sonos devices
- Zero maintenance: New operations added to sonos-api are automatically available - no skill updates needed
Usage Patterns
By Natural Language Request
When a user asks to run an operation, use this workflow:
-
Discover the operation (if needed):
python .claude/skills/sonos-operations/scripts/execute_operation.py --info <operation_name>
-
Find devices (if IP not provided):
python .claude/skills/sonos-operations/scripts/discover_devices.py
-
Execute the operation:
python .claude/skills/sonos-operations/scripts/execute_operation.py <operation> <ip> [-p key=value ...]
Common Execution Examples
python .claude/skills/sonos-operations/scripts/execute_operation.py Play 192.168.1.100
python .claude/skills/sonos-operations/scripts/execute_operation.py Pause 192.168.1.100
python .claude/skills/sonos-operations/scripts/execute_operation.py Stop 192.168.1.100
python .claude/skills/sonos-operations/scripts/execute_operation.py Next 192.168.1.100
python .claude/skills/sonos-operations/scripts/execute_operation.py Previous 192.168.1.100
python .claude/skills/sonos-operations/scripts/execute_operation.py GetVolume 192.168.1.100 -p channel=Master
python .claude/skills/sonos-operations/scripts/execute_operation.py SetVolume 192.168.1.100 -p desired_volume=50 -p channel=Master
python .claude/skills/sonos-operations/scripts/execute_operation.py GetTransportInfo 192.168.1.100
python .claude/skills/sonos-operations/scripts/execute_operation.py GetPositionInfo 192.168.1.100
python .claude/skills/sonos-operations/scripts/execute_operation.py GetMediaInfo 192.168.1.100
python .claude/skills/sonos-operations/scripts/execute_operation.py Seek 192.168.1.100 -p unit=REL_TIME -p target=00:02:30
python .claude/skills/sonos-operations/scripts/execute_operation.py Seek 192.168.1.100 -p unit=TRACK_NR -p target=5
JSON Output for Parsing
Add --json for machine-readable output:
python .claude/skills/sonos-operations/scripts/execute_operation.py GetVolume 192.168.1.100 --json
Parameter Handling
Common Defaults
Most operations automatically use sensible defaults:
instance_id: 0 (always added automatically)
channel: "Master" (for volume operations - must be specified)
speed: "1" (for Play operation - must be specified)
Parameter Syntax
-p key=value
-p volume=50
-p crossfade=true
-p channel=Master
Finding Required Parameters
python .claude/skills/sonos-operations/scripts/execute_operation.py --info SetVolume
Output:
Operation: SetVolumeOperation
Action: SetVolume
Service: RenderingControl
Parameters:
* instance_id: u32 (default: 0)
* channel: String
* desired_volume: u8
Operation Discovery
List All Operations
python .claude/skills/sonos-operations/scripts/execute_operation.py --list
Filter by Service
python .claude/skills/sonos-operations/scripts/discover_operations.py --service AVTransport
python .claude/skills/sonos-operations/scripts/discover_operations.py --service RenderingControl
python .claude/skills/sonos-operations/scripts/discover_operations.py --service ZoneGroupTopology
Search Operations
python .claude/skills/sonos-operations/scripts/discover_operations.py --grep volume
python .claude/skills/sonos-operations/scripts/discover_operations.py --grep transport
python .claude/skills/sonos-operations/scripts/discover_operations.py --grep queue
Get Full Operation Details
python .claude/skills/sonos-operations/scripts/discover_operations.py --operation SetVolume
python .claude/skills/sonos-operations/scripts/discover_operations.py --operation SetVolume --json
Device Discovery
Find Devices on Network
python .claude/skills/sonos-operations/scripts/discover_devices.py
This discovers Sonos devices and saves them to discovered_devices.json.
Manual IP Entry
If device discovery fails, the user can provide an IP address directly:
python .claude/skills/sonos-operations/scripts/execute_operation.py GetVolume 192.168.1.100 -p channel=Master
Error Handling
The script provides detailed error information:
$ python execute_operation.py SetVolume 192.168.1.100
Operation failed: Required parameter 'channel' not provided
$ python execute_operation.py UnknownOp 192.168.1.100
Operation failed: Operation 'UnknownOp' not found. Available: ...
$ python execute_operation.py Play 192.168.1.1
Operation failed: Network error: [Errno 60] Operation timed out
$ python execute_operation.py Play 192.168.1.100
Operation failed: Transition not available
Error code: 701
Testing New Operations
When implementing new operations in sonos-api:
- Implement the operation using
define_upnp_operation! or define_operation_with_response! macro
- Run discovery to verify it's detected:
python .claude/skills/sonos-operations/scripts/discover_operations.py --operation YourNewOperation
- Test execution:
python .claude/skills/sonos-operations/scripts/execute_operation.py YourNewOperation 192.168.1.100 -p param=value
No changes to this skill are needed - new operations are automatically available!
Reference Files
- discover_operations.py: Parses Rust source to extract all operation metadata
- execute_operation.py: Executes operations via direct SOAP calls
- discover_devices.py: Discovers Sonos devices on the network
- references/operation_patterns.md: Common parameter patterns and UPnP values
- references/services_guide.md: Service-specific documentation
Architecture
User Request
|
v
discover_operations.py <-- Parses Rust macros to find operations
|
v
execute_operation.py <-- Constructs SOAP, sends HTTP request
|
v
Sonos Device (HTTP/SOAP) <-- Direct communication, no Rust compilation
|
v
Response Parsing <-- Extract values from XML response
This design ensures:
- No Rust compilation at runtime
- Automatic support for new operations
- Fast execution with minimal dependencies
- Easy debugging with verbose/JSON output modes