Sync-first
All methods are synchronous. No async runtime, no .await, no executor setup. Just call and go.
use sonos_sdk::prelude::*;
fn main() -> Result<(), SdkError> { let sonos = SonosSystem::new()?; let speaker = sonos.speaker("Kitchen").unwrap();
speaker.play()?; let vol = speaker.volume.fetch()?; println!("Playing at {}%", vol);
Ok(())}Sync-first
All methods are synchronous. No async runtime, no .await, no executor setup. Just call and go.
Three access patterns
get() for cached values, fetch() for live network reads, watch() for reactive event streams.
DOM-like API
Access properties directly on speaker objects. Navigate fluently between speakers and groups.
Zero-config events
Event infrastructure initializes lazily on first watch() call. Automatic firewall fallback to polling.