Sonos smart speaker controller API and command-line tools
This project implements (most of) the Sonos control API in a rust crate. It also provides a simple command-line tool which can be used in scripts.
You likely need a recent rust compiler. If you don't have
rustupinstalled yet, I recommend you do so:
$ curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh
Now you are ready to build/install
$ cargo install --git https://github.com/mlang/ronor
This will copy the binary to
~/.cargo/bin/ronorwhich should be in your
PATHif you are using
You have to register a developer account on integration.sonos.com and create your own integration point. You also need to create your own redirection endpoint on the web. A minimalistic example script is provided in
With your integration information ready, run
ronor initand your client id, secret, and redirection url will be saved to
Now you can authorize ronor to access households belonging to your Sonos user account by running
ronor helpfor a list of available commands.
Sonos has two mechanisms for managing content you often play. Favorites can be thought of as pointers to specific streaming service content. For instance, a radio station, podcast, or a specific artist or album on a registered streaming service. A playlist is a list of several tracks, possibly on different streaming services. There is currently no API to create these, you have to use a Sonos controller like the iOS App to create favorites and playlists.
However, you can query and play favorites and playlists:
$ ronor get-favorites Das Soundportal Radio Freies Radio Salzkammergut Österreich 1 Radio FM4 Radio Helsinki Radio Swiss Classic radiOzora Chill channel SRF 2 Kultur $ ronor load-favorite --play 'Österreich 1' Schlafzimmer $ ronor get-playlists Acid Psybient PsyDub $ ronor load-playlist --shuffle --crossfade --play PsyDub Wohnzimmer
For example, imagine the following household of three players and no grouping.
$ ronor inventory Bad = Bad Wohnzimmer = Wohnzimmer Schlafzimmer = Schlafzimmer
That means, each player is the sole member of a group with the same name.
Now lets make a group of
$ ronor modify-group Schlafzimmer --add Bad Schlafzimmer -> Schlafzimmer + 1 $ ronor inventory Schlafzimmer + 1 = Schlafzimmer + Bad Wohnzimmer = Wohnzimmer
To undo this group, we simply remove
Schlafzimmer + 1again:
$ ronor modify-group 'Schlafzimmer + 1' --remove Bad Schlafzimmer + 1 -> Schlafzimmer $ ronor inventory Bad = Bad Wohnzimmer = Wohnzimmer Schlafzimmer = Schlafzimmer
Notice that you never have to name groups. Sonos will automatically choose a name for a newly created group based on the coordinating player and the number of other members.
For the text-to-speech functionality (
ronor speak) you need
ffmpeginstalled. Simply pipe text to
STDINand it should be spoken by the desired player.
$ echo "Hallo Wohnzimmer"|ronor speak --language de Wohnzimmer
ronor speakcan scrape predefined web resources and speak the extracted text. The following command will speak the current weather forecast for Styria in Austria:
$ ronor speak --scrape wetter.orf.at/steiermark Wohnzimmer
The following scraping sources are predefined:
ronor speakmakes use of transfer.sh for temporary storage and the
loadAudioClipAPI. If you'd like to play already prepared audio clips, use