Sonos smart speaker controller API and CLI
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.
How to use
See ronor help
for a list of available commands.
Favorites and Playlists
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
Managing groups
Use the modify-group
subcommand to manage grouping of logical players.
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 Schlafzimmer
(bedroom) and Bad
(Bathroom).
$ ronor modify-group Schlafzimmer --add Bad
Schlafzimmer -> Schlafzimmer + 1
$ ronor inventory
Schlafzimmer + 1 = Schlafzimmer + Bad
Wohnzimmer = Wohnzimmer
To undo this group, we simply remove Bad
from Schlafzimmer + 1
again:
$ 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.
Text to speech
For the text-to-speech functionality (ronor speak
) you need espeak
and ffmpeg
installed. Simply pipe text to STDIN
and it should be spoken by the desired player.
$ echo "Hallo Wohnzimmer"|ronor speak --language de Wohnzimmer
Alternatively, ronor speak
can 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:
- Weather in Austria
- ORF
- ZAMG
- zamg.ac.at/cms/de/wetter/wetter-oesterreich/burgenland
- zamg.ac.at/cms/de/wetter/wetter-oesterreich/kaernten
- zamg.ac.at/cms/de/wetter/wetter-oesterreich/niederoesterreich
- zamg.ac.at/cms/de/wetter/wetter-oesterreich/oberoesterreich
- zamg.ac.at/cms/de/wetter/wetter-oesterreich/salzburg
- zamg.ac.at/cms/de/wetter/wetter-oesterreich/steiermark
- zamg.ac.at/cms/de/wetter/wetter-oesterreich/tirol
- zamg.ac.at/cms/de/wetter/wetter-oesterreich/vorarlberg
- zamg.ac.at/cms/de/wetter/wetter-oesterreich/wien
ronor speak
makes use of transfer.sh for temporary storage and the loadAudioClip
API. If you’d like to play already prepared audio clips, use ronor load-audio-clip
.
Source code
This project is hosted on GitHub.
To obtain a copy of the source code, execute the following command:
git clone https://github.com/mlang/ronor
or if GitHub is offline or my account has vanished, you can also do
git clone https://blind.guru/projects/ronor.git
to retrieve a repostiroy backup.