Sonos UPnP services and functions - SoCo/SoCo GitHub Wiki

This is a static list of all Sonos UPnP service functions and their signatures, updated as of 2019-10-20. You can use it to find the right function call if the SoCo library does not directly support the action.

This list was compiled using the following code:

from soco.discovery import any_soco
from soco.services import *

player = any_soco()

service_classes = [
    AVTransport,
    ContentDirectory,
    DeviceProperties,
    RenderingControl,
    ZoneGroupTopology,
    AlarmClock,
    SystemProperties,
    MusicServices,
    Queue,
    GroupManagement,
    GroupRenderingControl,
]

for service_class in service_classes:
    service = service_class(player)
    print("## {}".format(service.service_type))
    for action in service.iter_actions():
        print("* `", action, "`")
    print()

AVTransport

  • SetAVTransportURI(InstanceID: ui4, CurrentURI: string, CurrentURIMetaData: string) -> {}
  • SetNextAVTransportURI(InstanceID: ui4, NextURI: string, NextURIMetaData: string) -> {}
  • AddURIToQueue(InstanceID: ui4, EnqueuedURI: string, EnqueuedURIMetaData: string, DesiredFirstTrackNumberEnqueued: ui4, EnqueueAsNext: boolean) -> {FirstTrackNumberEnqueued: ui4, NumTracksAdded: ui4, NewQueueLength: ui4}
  • AddMultipleURIsToQueue(InstanceID: ui4, UpdateID: ui4, NumberOfURIs: ui4, EnqueuedURIs: string, EnqueuedURIsMetaData: string, ContainerURI: string, ContainerMetaData: string, DesiredFirstTrackNumberEnqueued: ui4, EnqueueAsNext: boolean) -> {FirstTrackNumberEnqueued: ui4, NumTracksAdded: ui4, NewQueueLength: ui4, NewUpdateID: ui4}
  • ReorderTracksInQueue(InstanceID: ui4, StartingIndex: ui4, NumberOfTracks: ui4, InsertBefore: ui4, UpdateID: ui4) -> {}
  • RemoveTrackFromQueue(InstanceID: ui4, ObjectID: string, UpdateID: ui4) -> {}
  • RemoveTrackRangeFromQueue(InstanceID: ui4, UpdateID: ui4, StartingIndex: ui4, NumberOfTracks: ui4) -> {NewUpdateID: ui4}
  • RemoveAllTracksFromQueue(InstanceID: ui4) -> {}
  • SaveQueue(InstanceID: ui4, Title: string, ObjectID: string) -> {AssignedObjectID: string}
  • BackupQueue(InstanceID: ui4) -> {}
  • CreateSavedQueue(InstanceID: ui4, Title: string, EnqueuedURI: string, EnqueuedURIMetaData: string) -> {NumTracksAdded: ui4, NewQueueLength: ui4, AssignedObjectID: string, NewUpdateID: ui4}
  • AddURIToSavedQueue(InstanceID: ui4, ObjectID: string, UpdateID: ui4, EnqueuedURI: string, EnqueuedURIMetaData: string, AddAtIndex: ui4) -> {NumTracksAdded: ui4, NewQueueLength: ui4, NewUpdateID: ui4}
  • ReorderTracksInSavedQueue(InstanceID: ui4, ObjectID: string, UpdateID: ui4, TrackList: string, NewPositionList: string) -> {QueueLengthChange: i4, NewQueueLength: ui4, NewUpdateID: ui4}
  • GetMediaInfo(InstanceID: ui4) -> {NrTracks: [0..65535], MediaDuration: string, CurrentURI: string, CurrentURIMetaData: string, NextURI: string, NextURIMetaData: string, PlayMedium: [NONE, NETWORK], RecordMedium: [NONE], WriteStatus: string}
  • GetTransportInfo(InstanceID: ui4) -> {CurrentTransportState: [STOPPED, PLAYING, PAUSED_PLAYBACK, TRANSITIONING], CurrentTransportStatus: string, CurrentSpeed: [1]}
  • GetPositionInfo(InstanceID: ui4) -> {Track: [0..65535], TrackDuration: string, TrackMetaData: string, TrackURI: string, RelTime: string, AbsTime: string, RelCount: i4, AbsCount: i4}
  • GetDeviceCapabilities(InstanceID: ui4) -> {PlayMedia: string, RecMedia: string, RecQualityModes: string}
  • GetTransportSettings(InstanceID: ui4) -> {PlayMode=NORMAL: [NORMAL, REPEAT_ALL, REPEAT_ONE, SHUFFLE_NOREPEAT, SHUFFLE, SHUFFLE_REPEAT_ONE], RecQualityMode: string}
  • GetCrossfadeMode(InstanceID: ui4) -> {CrossfadeMode: boolean}
  • Stop(InstanceID: ui4) -> {}
  • Play(InstanceID: ui4, Speed: [1]) -> {}
  • Pause(InstanceID: ui4) -> {}
  • Seek(InstanceID: ui4, Unit: [TRACK_NR, REL_TIME, TIME_DELTA], Target: string) -> {}
  • Next(InstanceID: ui4) -> {}
  • Previous(InstanceID: ui4) -> {}
  • SetPlayMode(InstanceID: ui4, NewPlayMode=NORMAL: [NORMAL, REPEAT_ALL, REPEAT_ONE, SHUFFLE_NOREPEAT, SHUFFLE, SHUFFLE_REPEAT_ONE]) -> {}
  • SetCrossfadeMode(InstanceID: ui4, CrossfadeMode: boolean) -> {}
  • NotifyDeletedURI(InstanceID: ui4, DeletedURI: string) -> {}
  • GetCurrentTransportActions(InstanceID: ui4) -> {Actions: string}
  • BecomeCoordinatorOfStandaloneGroup(InstanceID: ui4) -> {DelegatedGroupCoordinatorID: string, NewGroupID: string}
  • DelegateGroupCoordinationTo(InstanceID: ui4, NewCoordinator: string, RejoinGroup: boolean) -> {}
  • BecomeGroupCoordinator(InstanceID: ui4, CurrentCoordinator: string, CurrentGroupID: string, OtherMembers: string, TransportSettings: string, CurrentURI: string, CurrentURIMetaData: string, SleepTimerState: string, AlarmState: string, StreamRestartState: string, CurrentQueueTrackList: string) -> {}
  • BecomeGroupCoordinatorAndSource(InstanceID: ui4, CurrentCoordinator: string, CurrentGroupID: string, OtherMembers: string, CurrentURI: string, CurrentURIMetaData: string, SleepTimerState: string, AlarmState: string, StreamRestartState: string, CurrentAVTTrackList: string, CurrentQueueTrackList: string, CurrentSourceState: string, ResumePlayback: boolean) -> {}
  • ChangeCoordinator(InstanceID: ui4, CurrentCoordinator: string, NewCoordinator: string, NewTransportSettings: string, CurrentAVTransportURI: string) -> {}
  • ChangeTransportSettings(InstanceID: ui4, NewTransportSettings: string, CurrentAVTransportURI: string) -> {}
  • ConfigureSleepTimer(InstanceID: ui4, NewSleepTimerDuration: string) -> {}
  • GetRemainingSleepTimerDuration(InstanceID: ui4) -> {RemainingSleepTimerDuration: string, CurrentSleepTimerGeneration: ui4}
  • RunAlarm(InstanceID: ui4, AlarmID: ui4, LoggedStartTime: string, Duration: string, ProgramURI: string, ProgramMetaData: string, PlayMode=NORMAL: [NORMAL, REPEAT_ALL, REPEAT_ONE, SHUFFLE_NOREPEAT, SHUFFLE, SHUFFLE_REPEAT_ONE], Volume: ui2, IncludeLinkedZones: boolean) -> {}
  • StartAutoplay(InstanceID: ui4, ProgramURI: string, ProgramMetaData: string, Volume: ui2, IncludeLinkedZones: boolean, ResetVolumeAfter: boolean) -> {}
  • GetRunningAlarmProperties(InstanceID: ui4) -> {AlarmID: ui4, GroupID: string, LoggedStartTime: string}
  • SnoozeAlarm(InstanceID: ui4, Duration: string) -> {}
  • EndDirectControlSession(InstanceID: ui4) -> {}

ContentDirectory

  • GetSearchCapabilities() -> {SearchCaps: string}
  • GetSortCapabilities() -> {SortCaps: string}
  • GetSystemUpdateID() -> {Id: ui4}
  • GetAlbumArtistDisplayOption() -> {AlbumArtistDisplayOption: string}
  • GetLastIndexChange() -> {LastIndexChange: string}
  • Browse(ObjectID: string, BrowseFlag: [BrowseMetadata, BrowseDirectChildren], Filter: string, StartingIndex: ui4, RequestedCount: ui4, SortCriteria: string) -> {Result: string, NumberReturned: ui4, TotalMatches: ui4, UpdateID: ui4}
  • FindPrefix(ObjectID: string, Prefix: string) -> {StartingIndex: ui4, UpdateID: ui4}
  • GetAllPrefixLocations(ObjectID: string) -> {TotalPrefixes: ui4, PrefixAndIndexCSV: string, UpdateID: ui4}
  • CreateObject(ContainerID: string, Elements: string) -> {ObjectID: string, Result: string}
  • UpdateObject(ObjectID: string, CurrentTagValue: string, NewTagValue: string) -> {}
  • DestroyObject(ObjectID: string) -> {}
  • RefreshShareIndex(AlbumArtistDisplayOption: string) -> {}
  • RequestResort(SortOrder: string) -> {}
  • GetShareIndexInProgress() -> {IsIndexing: boolean}
  • GetBrowseable() -> {IsBrowseable: boolean}
  • SetBrowseable(Browseable: boolean) -> {}

DeviceProperties

  • SetLEDState(DesiredLEDState: [On, Off]) -> {}
  • GetLEDState() -> {CurrentLEDState: [On, Off]}
  • AddBondedZones(ChannelMapSet: string) -> {}
  • RemoveBondedZones(ChannelMapSet: string, KeepGrouped: boolean) -> {}
  • CreateStereoPair(ChannelMapSet: string) -> {}
  • SeparateStereoPair(ChannelMapSet: string) -> {}
  • SetZoneAttributes(DesiredZoneName: string, DesiredIcon: string, DesiredConfiguration: string) -> {}
  • GetZoneAttributes() -> {CurrentZoneName: string, CurrentIcon: string, CurrentConfiguration: string}
  • GetHouseholdID() -> {CurrentHouseholdID: string}
  • GetZoneInfo() -> {SerialNumber: string, SoftwareVersion: string, DisplaySoftwareVersion: string, HardwareVersion: string, IPAddress: string, MACAddress: string, CopyrightInfo: string, ExtraInfo: string, HTAudioIn: ui4, Flags: ui4}
  • SetAutoplayLinkedZones(IncludeLinkedZones: boolean, Source: string) -> {}
  • GetAutoplayLinkedZones(Source: string) -> {IncludeLinkedZones: boolean}
  • SetAutoplayRoomUUID(RoomUUID: string, Source: string) -> {}
  • GetAutoplayRoomUUID(Source: string) -> {RoomUUID: string}
  • SetAutoplayVolume(Volume: [0..100], Source: string) -> {}
  • GetAutoplayVolume(Source: string) -> {CurrentVolume: [0..100]}
  • ImportSetting(SettingID: [0..65535], SettingURI: string) -> {}
  • SetUseAutoplayVolume(UseVolume: boolean, Source: string) -> {}
  • GetUseAutoplayVolume(Source: string) -> {UseVolume: boolean}
  • AddHTSatellite(HTSatChanMapSet: string) -> {}
  • RemoveHTSatellite(SatRoomUUID: string) -> {}
  • EnterConfigMode(Mode: string, Options: string) -> {State: string}
  • ExitConfigMode(Options: string) -> {}
  • GetButtonState() -> {State: string}
  • SetButtonLockState(DesiredButtonLockState: [On, Off]) -> {}
  • GetButtonLockState() -> {CurrentButtonLockState: [On, Off]}

RenderingControl

  • GetMute(InstanceID: ui4, Channel: [Master, LF, RF, SpeakerOnly]) -> {CurrentMute: boolean}
  • SetMute(InstanceID: ui4, Channel: [Master, LF, RF, SpeakerOnly], DesiredMute: boolean) -> {}
  • ResetBasicEQ(InstanceID: ui4) -> {Bass: [-10..10], Treble: [-10..10], Loudness: boolean, LeftVolume: [0..100], RightVolume: [0..100]}
  • ResetExtEQ(InstanceID: ui4, EQType: string) -> {}
  • GetVolume(InstanceID: ui4, Channel: [Master, LF, RF]) -> {CurrentVolume: [0..100]}
  • SetVolume(InstanceID: ui4, Channel: [Master, LF, RF], DesiredVolume: [0..100]) -> {}
  • SetRelativeVolume(InstanceID: ui4, Channel: [Master, LF, RF], Adjustment: i4) -> {NewVolume: [0..100]}
  • GetVolumeDB(InstanceID: ui4, Channel: [Master, LF, RF]) -> {CurrentVolume: i2}
  • SetVolumeDB(InstanceID: ui4, Channel: [Master, LF, RF], DesiredVolume: i2) -> {}
  • GetVolumeDBRange(InstanceID: ui4, Channel: [Master, LF, RF]) -> {MinValue: i2, MaxValue: i2}
  • GetBass(InstanceID: ui4) -> {CurrentBass: [-10..10]}
  • SetBass(InstanceID: ui4, DesiredBass: [-10..10]) -> {}
  • GetTreble(InstanceID: ui4) -> {CurrentTreble: [-10..10]}
  • SetTreble(InstanceID: ui4, DesiredTreble: [-10..10]) -> {}
  • GetEQ(InstanceID: ui4, EQType: string) -> {CurrentValue: i2}
  • SetEQ(InstanceID: ui4, EQType: string, DesiredValue: i2) -> {}
  • GetLoudness(InstanceID: ui4, Channel: [Master, LF, RF]) -> {CurrentLoudness: boolean}
  • SetLoudness(InstanceID: ui4, Channel: [Master, LF, RF], DesiredLoudness: boolean) -> {}
  • GetSupportsOutputFixed(InstanceID: ui4) -> {CurrentSupportsFixed: boolean}
  • GetOutputFixed(InstanceID: ui4) -> {CurrentFixed: boolean}
  • SetOutputFixed(InstanceID: ui4, DesiredFixed: boolean) -> {}
  • GetHeadphoneConnected(InstanceID: ui4) -> {CurrentHeadphoneConnected: boolean}
  • RampToVolume(InstanceID: ui4, Channel: [Master, LF, RF], RampType: [SLEEP_TIMER_RAMP_TYPE, ALARM_RAMP_TYPE, AUTOPLAY_RAMP_TYPE], DesiredVolume: [0..100], ResetVolumeAfter: boolean, ProgramURI: string) -> {RampTime: ui4}
  • RestoreVolumePriorToRamp(InstanceID: ui4, Channel: [Master, LF, RF]) -> {}
  • SetChannelMap(InstanceID: ui4, ChannelMap: string) -> {}
  • SetRoomCalibrationX(InstanceID: ui4, CalibrationID: string, Coefficients: string, CalibrationMode: string) -> {}
  • GetRoomCalibrationStatus(InstanceID: ui4) -> {RoomCalibrationEnabled: boolean, RoomCalibrationAvailable: boolean}
  • SetRoomCalibrationStatus(InstanceID: ui4, RoomCalibrationEnabled: boolean) -> {}

ZoneGroupTopology

  • CheckForUpdate(UpdateType: [All, Software], CachedOnly: boolean, Version: string) -> {UpdateItem: string}
  • BeginSoftwareUpdate(UpdateURL: string, Flags: ui4, ExtraOptions: string) -> {}
  • ReportUnresponsiveDevice(DeviceUUID: string, DesiredAction: [Remove, TopologyMonitorProbe, VerifyThenRemoveSystemwide]) -> {}
  • SubmitDiagnostics(IncludeControllers: boolean, Type: string) -> {DiagnosticID: ui4}
  • RegisterMobileDevice(MobileDeviceName: string, MobileDeviceUDN: string, MobileIPAndPort: string) -> {}
  • GetZoneGroupAttributes() -> {CurrentZoneGroupName: string, CurrentZoneGroupID: string, CurrentZonePlayerUUIDsInGroup: string, CurrentMuseHouseholdId: string}
  • GetZoneGroupState() -> {ZoneGroupState: string}

AlarmClock

  • SetFormat(DesiredTimeFormat: string, DesiredDateFormat: string) -> {}
  • GetFormat() -> {CurrentTimeFormat: string, CurrentDateFormat: string}
  • SetTimeZone(Index: i4, AutoAdjustDst: boolean) -> {}
  • GetTimeZone() -> {Index: i4, AutoAdjustDst: boolean}
  • GetTimeZoneAndRule() -> {Index: i4, AutoAdjustDst: boolean, CurrentTimeZone: string}
  • GetTimeZoneRule(Index: i4) -> {TimeZone: string}
  • SetTimeServer(DesiredTimeServer: string) -> {}
  • GetTimeServer() -> {CurrentTimeServer: string}
  • SetTimeNow(DesiredTime: string, TimeZoneForDesiredTime: string) -> {}
  • GetHouseholdTimeAtStamp(TimeStamp: string) -> {HouseholdUTCTime: string}
  • GetTimeNow() -> {CurrentUTCTime: string, CurrentLocalTime: string, CurrentTimeZone: string, CurrentTimeGeneration: ui4}
  • CreateAlarm(StartLocalTime: string, Duration: string, Recurrence: [ONCE, WEEKDAYS, WEEKENDS, DAILY], Enabled: boolean, RoomUUID: string, ProgramURI: string, ProgramMetaData: string, PlayMode=NORMAL: [NORMAL, REPEAT_ALL, SHUFFLE_NOREPEAT, SHUFFLE], Volume: ui2, IncludeLinkedZones: boolean) -> {AssignedID: ui4}
  • UpdateAlarm(ID: ui4, StartLocalTime: string, Duration: string, Recurrence: [ONCE, WEEKDAYS, WEEKENDS, DAILY], Enabled: boolean, RoomUUID: string, ProgramURI: string, ProgramMetaData: string, PlayMode=NORMAL: [NORMAL, REPEAT_ALL, SHUFFLE_NOREPEAT, SHUFFLE], Volume: ui2, IncludeLinkedZones: boolean) -> {}
  • DestroyAlarm(ID: ui4) -> {}
  • ListAlarms() -> {CurrentAlarmList: string, CurrentAlarmListVersion: string}
  • SetDailyIndexRefreshTime(DesiredDailyIndexRefreshTime: string) -> {}
  • GetDailyIndexRefreshTime() -> {CurrentDailyIndexRefreshTime: string}

SystemProperties

  • SetString(VariableName: string, StringValue: string) -> {}
  • GetString(VariableName: string) -> {StringValue: string}
  • Remove(VariableName: string) -> {}
  • GetWebCode(AccountType: ui4) -> {WebCode: string}
  • ProvisionCredentialedTrialAccountX(AccountType: ui4, AccountID: string, AccountPassword: string) -> {IsExpired: boolean, AccountUDN: string}
  • AddAccountX(AccountType: ui4, AccountID: string, AccountPassword: string) -> {AccountUDN: string}
  • AddOAuthAccountX(AccountType: ui4, AccountToken: string, AccountKey: string, OAuthDeviceID: string, AuthorizationCode: string, RedirectURI: string, UserIdHashCode: string) -> {AccountUDN: string, AccountNickname: string}
  • RemoveAccount(AccountType: ui4, AccountID: string) -> {}
  • EditAccountPasswordX(AccountType: ui4, AccountID: string, NewAccountPassword: string) -> {}
  • SetAccountNicknameX(AccountUDN: string, AccountNickname: string) -> {}
  • RefreshAccountCredentialsX(AccountType: ui4, AccountUID: ui4, AccountToken: string, AccountKey: string) -> {}
  • EditAccountMd(AccountType: ui4, AccountID: string, NewAccountMd: string) -> {}
  • EnableRDM(RDMValue: boolean) -> {}
  • GetRDM() -> {RDMValue: boolean}
  • ReplaceAccountX(AccountUDN: string, NewAccountID: string, NewAccountPassword: string, AccountToken: string, AccountKey: string, OAuthDeviceID: string) -> {NewAccountUDN: string}

MusicServices

  • GetSessionId(ServiceId: ui4, Username: string) -> {SessionId: string}
  • ListAvailableServices() -> {AvailableServiceDescriptorList: string, AvailableServiceTypeList: string, AvailableServiceListVersion: string}

Queue

  • AddURI(QueueID: ui4, UpdateID: ui4, EnqueuedURI: string, EnqueuedURIMetaData: string, DesiredFirstTrackNumberEnqueued: ui4, EnqueueAsNext: boolean) -> {FirstTrackNumberEnqueued: ui4, NumTracksAdded: ui4, NewQueueLength: ui4, NewUpdateID: ui4}
  • AddMultipleURIs(QueueID: ui4, UpdateID: ui4, ContainerURI: string, ContainerMetaData: string, DesiredFirstTrackNumberEnqueued: ui4, EnqueueAsNext: boolean, NumberOfURIs: ui4, EnqueuedURIsAndMetaData: string) -> {FirstTrackNumberEnqueued: ui4, NumTracksAdded: ui4, NewQueueLength: ui4, NewUpdateID: ui4}
  • AttachQueue(QueueOwnerID: string) -> {QueueID: ui4, QueueOwnerContext: string}
  • Backup() -> {}
  • Browse(QueueID: ui4, StartingIndex: ui4, RequestedCount: ui4) -> {Result: string, NumberReturned: ui4, TotalMatches: ui4, UpdateID: ui4}
  • CreateQueue(QueueOwnerID: string, QueueOwnerContext: string, QueuePolicy: string) -> {QueueID: ui4}
  • RemoveAllTracks(QueueID: ui4, UpdateID: ui4) -> {NewUpdateID: ui4}
  • RemoveTrackRange(QueueID: ui4, UpdateID: ui4, StartingIndex: ui4, NumberOfTracks: ui4) -> {NewUpdateID: ui4}
  • ReorderTracks(QueueID: ui4, StartingIndex: ui4, NumberOfTracks: ui4, InsertBefore: ui4, UpdateID: ui4) -> {NewUpdateID: ui4}
  • ReplaceAllTracks(QueueID: ui4, UpdateID: ui4, ContainerURI: string, ContainerMetaData: string, CurrentTrackIndex: ui4, NewCurrentTrackIndices: string, NumberOfURIs: ui4, EnqueuedURIsAndMetaData: string) -> {NewQueueLength: ui4, NewUpdateID: ui4}
  • SaveAsSonosPlaylist(QueueID: ui4, Title: string, ObjectID: string) -> {AssignedObjectID: string}

GroupManagement

  • AddMember(MemberID: string, BootSeq: ui4) -> {CurrentTransportSettings: string, CurrentURI: string, GroupUUIDJoined: string, ResetVolumeAfter: boolean, VolumeAVTransportURI: string}
  • RemoveMember(MemberID: string) -> {}
  • ReportTrackBufferingResult(MemberID: string, ResultCode: i4) -> {}

GroupRenderingControl

  • GetGroupMute(InstanceID: ui4) -> {CurrentMute: boolean}
  • SetGroupMute(InstanceID: ui4, DesiredMute: boolean) -> {}
  • GetGroupVolume(InstanceID: ui4) -> {CurrentVolume: [0..100]}
  • SetGroupVolume(InstanceID: ui4, DesiredVolume: [0..100]) -> {}
  • SetRelativeGroupVolume(InstanceID: ui4, Adjustment: i4) -> {NewVolume: [0..100]}
  • SnapshotGroupVolume(InstanceID: ui4) -> {}
⚠️ **GitHub.com Fallback** ⚠️