Skip to content
Python library for interfacing with Sony's Songpal devices
Branch: master
Clone or download
rytilahti Remove leftover usage of requests lib (#45)
The initial request for supported APIs was done with requests inside
a coroutine, this should have been converted to use aiohttp long ago.
Latest commit 0443de6 Feb 17, 2019
Type Name Latest commit message Commit time
Failed to load latest commit information.
devinfos Added SRS-X77 devinfo (#39) Jan 25, 2019
songpal Remove leftover usage of requests lib (#45) Feb 17, 2019
.gitignore prettyprint method names for list_all, add .gitignore Mar 13, 2018
.isort.cfg Code formating fixes (#28) Sep 15, 2018
.pre-commit-config.yaml add pre-commit-config for black Dec 28, 2018
.travis.yml Update changelog and bump version to 0.10 (#44) Feb 17, 2019
LICENSE Create LICENSE Dec 10, 2017
README.rst Initial support for zone control (#42) Feb 17, 2019
requirements.txt convert discovery to use async_upnp_client (#35) Dec 10, 2018 add click7.0 requirement Feb 10, 2019
tox.ini Code formating fixes (#28) Sep 15, 2018



PyPI version

Python 3 implementation of SongPal protocol as used by Sony's soundbar and potentially other devices.


This project is currently at its alpha stage and all contributions, whether reporting about devices working with this or creating pull requests to implement missing functionality are more than welcome!

Supported devices

The library has been tested for now with following devices:

  • HT-XT3
  • HT-NT5
  • HT-MT500
  • HT-ZF9
  • SRS-X77, SRS-X88
  • STR-DN1060, STR-DN1070, STR-DN1080


If no one has contributed a devinfo from your device (see devinfos/ directory), please feel free to contribute one by typing songpal dump-devinfo <filename> and creating a pull request on this repository. This information can later be useful for extending the support for those devices.


Sony's Supported devices page lists devices, which will probably also work with this library.

If you have a device which is not listed above, please create a pull request or an issue on github!

Getting started


The easiest way for installing this project is by using pypi inside a virtualenv.

$ pip install python-songpal

Locating the endpoint

To communicate with the device you need to locate its endpoint URL. The easiest way to do is to execute the discover command:

$ songpal discover

Discovering for 3 seconds
Found HT-XT3 - BAR-2015
* API version: 1.0
* Endpoint:
* Services:
  - Service: guide
  - Service: system
  - Service: audio
  - Service: avContent

This will run a UPnP discovery to find out responsive devices implementing the ScalarWebAPI.


If you are running the command on another network than the device is residing, you will need to locate the endpoint with some other means.

The endpoint can be defined with --endpoint option, or alternatively SONGPAL_ENDPOINT environment variable can be set.

General Usage

The accompanied songpal tool can be used to control your device. All available commands can be listed with --help and more help on each command can be obtained by passing it to the sub-command, e.g., songpal power --help. Most interesting commands are most likely power, output, volume, and sound.

Generally speaking invoking a command without any parameters will display some relevant information like settings or active output.

For debugging -d (--debug) can be passed -- also multiple times for increased verbosity -- for protocol-level information.

Some of the commands can be used to adjust settings related to that functionality, usually by passing the target and its wanted value as parameters to the command.

$ songpal bluetooth mode off

On commands which are not mainly used for settings, such as power, require explicit set sub-command for changing the settings.


Refer to help of the specific command to find the correct format.

TODO: Make the CLI consistent on this.


$ songpal status

will display some basic information about the device, such as whether it is powered on and what are its volume settings.

Power Control

power command can be used to both turning the device on and off, and change its power settings.

$ songpal power

$ songpal power settings

$ songpal power

$ songpal power set quickStartMode on


For turning on the device the quick boot has to be activated; a patch for adding wake-on-lan support to allow starting the device without quick boot are welcome.


The device seems to report sometimes its status to be off even when that is not the case (may be related to quick boot mode being 'on').

Please enable it and restart the device fully before reporting a bug related to this.

Volume Control

$ songpal volume [-- output 'output title'] [<value>|mute|unmute]

$ songpal volume 20

$ songpal volume +5

$ songpal volume -10

$ songpal volume --output 'Zone 2'

$ songpal volume --output 'Main Zone' 15

Sound Settings

Your device may support various sound-related settings, such as night mode or adjusting the subwoofer volume.

$ songpal sound

$ songpal sound nightMode off

$ songpal sound subwooferLevel 4

Zone Control

$ songpal zone

  * Main Zone (uri: extOutput:zone?zone=1) (active)
  * Zone 2 (uri: extOutput:zone?zone=2) (active)
  * Zone 3 (uri: extOutput:zone?zone=3)
  * HDMI Zone (uri: extOutput:zone?zone=4)

$ songpal zone 'Main Zone'

Activating Main Zone (uri: extOutput:zone?zone=1) (active)

$ songpal zone 'Zone 2' true

Activating Zone 2 (uri: extOutput:zone?zone=2) (active)

$ songpal zone 'Zone 2' false

Deactivating Zone 2 (uri: extOutput:zone?zone=2) (active)

Input Control

without zones: .. code-block:

$ songpal input
      * HDMI1 (uri: extInput:hdmi?port=1)
      * HDMI2 (uri: extInput:hdmi?port=2) (active)
      * HDMI3 (uri: extInput:hdmi?port=3)

$ songpal input HDMI1

with zones: .. code-block:

$ songpal input

  * SOURCE (uri: extInput:source)
    - extOutput:zone?zone=2
    - extOutput:zone?zone=3
    - extOutput:zone?zone=4
  * GAME (uri: extInput:game) (active)
    - extOutput:zone?zone=1
    - extOutput:zone?zone=4
  * SAT/CATV (uri: extInput:sat-catv)
    - extOutput:zone?zone=1
    - extOutput:zone?zone=2
    - extOutput:zone?zone=3
    - extOutput:zone?zone=4
  * VIDEO 1 (uri: extInput:video?port=1)
    - extOutput:zone?zone=1
    - extOutput:zone?zone=2
    - extOutput:zone?zone=3
    - extOutput:zone?zone=4
  * VIDEO 2 (uri: extInput:video?port=2)
    - extOutput:zone?zone=1
    - extOutput:zone?zone=4
  * TV (uri: extInput:tv)
    - extOutput:zone?zone=1
  * SA-CD/CD (uri: extInput:sacd-cd)
    - extOutput:zone?zone=1
    - extOutput:zone?zone=2
    - extOutput:zone?zone=3
    - extOutput:zone?zone=4
  * Bluetooth Audio (uri: extInput:btAudio)
    - extOutput:zone?zone=1
    - extOutput:zone?zone=2
    - extOutput:zone?zone=3

$ songpal input 'VIDEO 1'

$ songpal input 'SOURCE' --output 'Zone 2'

Device Settings

To list available settings, use settings command.

$ songpal settings

Do note that some settings (e.g. bluetooth settings) are not listed in the global settings tree, but have to be separatedly accessed using the bluetooth command.


Setting global settings directly via the CLI is not currently supported, but can potentially be accessed via their respective commands: bluetooth, sound, power.

Patches improving this are welcome!

Executing custom commands

For experimenting it can be useful to execute arbitrary commands against the endpoint. You can access the available methods by calling songpal list-all.

command can be used for that as follows:

$ songpal command system getSystemInformation

Notification support

The protocol supports subscribing to notifications on subsystem basis. Executing songpal notifications without any parameters will list available notifications.

Every notification can be listened to separately, or alternatively all notifications from a single subsystem can be subscribed to.

$ songpal notifications --listen-all avContent


Reporting bugs or supported devices

When reporting bugs or informing about supported device not listed above, please consider attaching the output of songpal dump-devinfo with your report.

API information

Audio Control API describes the API this project (currently partially) implements.

The Camera Remote API is also similar to this, and may also be useful for developers.

Home Assistant support

Home Assistant supports devices using this library directly since 0.65:

You can’t perform that action at this time.