Post

Roon Voice Commands with Siri

Overview

Siri voice control of Roon utilizes a command line interface that issues commands to the Roon Core. The shell command is executed using an SSH Shortcut.

Apple SSH shortcuts can be used to execute commands on systems that allow SSH access. On an iOS device create shortcuts which use the “Run script over SSH” option for Apple Scripting shortcuts. The shortcuts execute a Bash command which is a shell script that executes the Python script with appropriate arguments.

I will describe in detail this method for voice control of Roon using Siri and the setup precedure required.

RoonCommandLine Setup

Voice control of Roon as described in this document requires the use of a command line interface to issue the Roon commands. This is accomplished with the RoonCommandLine package which contains a shell command that acts as a frontend to the Python Roon API.

See the RoonCommandLine website for an overview of this package and documentation on its installation, configuration, and use.

RoonCommandLine Requirements

RoonCommandLine can be installed on either Linux or Mac OS X systems. It requires a Roon Core System reachable on the local network, Bash, Python 3, and the Python Roon API. The Python Roon API will be installed as part of the RoonCommandLine installation process.

Ensure that a Roon Core System is running on the local area network and Python 3 is installed on the Linux or Mac on which you wish to install the RoonCommandLine package. Most modern Linux systems will have Python 3 already installed. A good guide for installing Python 3 on Mac OS X can be found at https://docs.python-guide.org/starting/install3/osx/

RoonCommandLine Installation

RoonCommandLine v2.0.0 and later can be installed on Linux systems using either the Debian packaging format or the Red Hat Package Manager (RPM). Support is also included for installing on Mac OS X. Other systems will require a manual installation described below. The Mac OS X installation procedure may also work under Microsoft’s Windows Subsystem for Linux but it is as yet untested.

Debian Package installation

Many Linux distributions, most notably Ubuntu and its derivatives, use the Debian packaging system.

To tell if a Linux system is Debian based it is usually sufficient to check for the existence of the file /etc/debian_version and/or examine the contents of the file /etc/os-release.

To install on a Debian based Linux system, download the latest Debian format package from the RoonCommandLine Releases.

Install the RoonCommandLine package by executing the command

1
sudo apt install ./RoonCommandLine_<version>-<release>.deb

or

1
sudo dpkg -i ./RoonCommandLine_<version>-<release>.deb

RPM Package installation

Red Hat Linux, SUSE Linux, and their derivatives use the RPM packaging format. RPM based Linux distributions include Fedora, AlmaLinux, CentOS, openSUSE, OpenMandriva, Mandrake Linux, Red Hat Linux, and Oracle Linux.

To install on an RPM based Linux system, download the latest RPM format package from the RoonCommandLine Releases.

Install the RoonCommandLine package by executing the command

1
sudo yum localinstall ./RoonCommandLine_<version>-<release>.rpm

or

1
sudo rpm -i ./RoonCommandLine_<version>-<release>.rpm

Mac OS X installation

RoonCommandLine requires Python 3. See the excellent Hitchhiker’s Guide to Python for step by step instructions to install Python 3 on Mac OS X. If you already have Homebrew installed on your Mac then you can install Python 3 with:

brew install python

Once the Python 3 dependency is met, install RoonCommandLine by cloning the RoonCommandLine repository and executing the Install script:

1
2
3
    git clone `https://github.com/doctorfree/RoonCommandLine.git`
    cd RoonCommandLine
    ./Install

Note: A cleaner installation can be accomplished by executing the Install script as a user with sudo privileges and as the user which will be used to SSH in to the system.

Post installation configuration

Default settings are applied during the installation process. The primary area of post-installation configuration is setting the ZONEGROUPS and DEFAULT values in the file /usr/local/Roon/etc/roon_api.ini. The RoonCommandLine installation attempts to automate this configuration and should have provided a good starting point with default settings in roon_api.ini but you may wish to adjust these.

Zone groupings and defaults

In Roon, you can view your existing zones by visiting Settings->Audio. The names of the enabled audio devices are your zones. You can change the name of a zone by clicking the “pencil” icon next to the name in the Roon audio settings screen.

Modify roon_api.ini with your desired zone groupings and default values. In particular, set the DefaultZone value in the DEFAULT section to a zone that will be available, enabled, and one you wish to use as your primary default fallback zone. The installation picked a DefaultZone for you and you may be satisfied with that automatic setting.

Note, the DefaultZone setting is used when no zone is specified, RoonCommandLine commands all accept a -z zone argument that can be used to specify the zone to be used as well as a -G <group> that can be used to specify the zone grouping to use.

Note also that should you change the name of a Roon audio device in the future then that name change will also need to be reflected in the roon_api.ini groupings.

RoonCommandLine Test

Once the initial installation and configuration of RoonCommandLine on a system in your local network is accomplished, test the system to verify it can communicate successfully with the Roon Core. Try a simple Roon command like listing the configured Roon zones:

roon -l zones

If zone listing fails then verify your Roon Core is running, reachable, and LOCAL=true in /usr/local/Roon/etc/pyroonconf. Verify the Python Roon API extension is authorized in Roon Settings -> Extensions. To authorize the extension run the command /usr/local/bin/get_core_ip and when prompted, authorize the extension in Roon Settings -> Extensions. Note that the IP address returned for the Roon Core by get_core_ip is correct. If a simple listing of zones with roon -l zones still fails then check the Troubleshooting section of the RoonCommandLine README

After verifying the RoonCommandLine package is successfully communicating with the Roon Core, proceed to the next section.

Apple Siri Setup

To get started with Apple SSH shortcuts first enable SSH access on the system where the RoonCommandLine package was installed. Follow one of the many guides for setting up SSH with Apple Shortcuts. For example, these two guides should get you started:

Verify that Apple Siri is working and responds to queries like “Hey Siri”, “What time is it?”. Verify that SSH Shortcuts are working by creating a shortcut that performs a simple command like ping as described in the guides above. On recent versions of Apple’s iOS the Shortcuts setting for “Allow Running Scripts” is disabled. You may need to enable “Allow Running Scripts” in Shortcuts by visiting Settings -> Shortcuts on your iOS device and enabling “Allow Running Scripts”.

Once Siri and SSH Shortcuts are confirmed to be working, proceed to the next section.

Apple Siri Roon Control Setup

After verifying that Apple Siri is working, SSH Shortcuts are enabled and working, and RoonCommandLine has been installed and configured on a system in the same local area network as your Roon Core, it’s now time to configure Roon Control using Apple Siri.

Open the Shortcuts app on your iOS device. Tap My Shortcuts and All Shortcuts. Tap the + symbol at the top right corner of the app window to create a new shortcut. Tap Add Action then Scripting. Scroll down the list of scripting actions to the Shell category. Tap Run Script Over SSH.

Configuring the Shortcut

This should add the “Run script over SSH” action to the new shortcut. Tap Show More to view and modify the details of the scripting action. Set the Host entry to the IP address of the system on which RoonCommandLine was installed. For example, 10.0.1.55. Set the User entry to the user on the RoonCommandLine system that you want to run the command as. For example, my user’s username is “ronnie”.

Tap SSH Key for Authentication. In the text box that says Script enter the command you wish to execute. To get started, try something simple like roon -r default which plays the default Roon Live Radio station. Now that the details of the scripting action have been set, tap Next in the top right of the New Shortcut window.

NOTE: Some Mac users have reported their SSH Shortcuts do not work unless they are run in a login shell. This is likely due to some Python environment settings in the login shell startup. To run a Shortcut in a login shell preface the command you wish to run with bash -l -c ... and surround the command in quotes. For example, to run the command roon -r default in a login shell, when configuring the Shortcut Script, use the command:

bash -l -c "roon -r default"

Naming the Shortcut

Enter the name of the shortcut. By default, the name of the shortcut will be used as the phrase Siri will recognize to run this shortcut. Choose a shortcut name that both reflects the action it performs and will be easily recognized by Siri. Voice assistants can be picky. For example, using “Roon” in your shortcut name might seem like a good idea since it is performing a Roon action but “Roon” will often be heard as “Rune” and Siri will try to execute the shortcut with “Rune” in its name. For this first shortcut that plays Roon Radio, let’s try the shortcut name “Play Radio”.

Testing the Shortcut

Now we can test voice control of our first shortcut. You should be able to run this shortcut by saying “Hey Siri, Play Radio”. Try it out. After a short delay your Roon Core should play the default Roon Live Radio station in the default Roon playback zone. Make sure that zone is active, available, and the necessary audio device(s) are powered on and ready to play.

Adding the Shortcut to the Home Screen

To test the Shortcut without Siri, add the Shortcut to the iOS device Home Screen. This is an added benefit of using Shortcuts for voice control. In addition to voice control they can be run from the device allowing remote Roon control even in a noisy environment where voice control is unavailable. Testing the Shortcut in this manner allows us to verify the Shortcut works and isolate any problems encountered.

To add the Shortcut to the iOS device Home Screen, tap the three dots in the upper right corner of the shortcut then tap the three dots in the upper right corner of the Shortcut configuration screen. This brings up the “Details” configuration panel for the Shortcut where you can specify the Shortcut name. Tap “Add to Home Screen” and “Add”. An icon for this Shortcut will now be on the iOS device Home Screen and the Shortcut can be run by tapping that icon.

Running the Shortcut from the Home Screen icon enables a test of the Shortcut without using Siri as well as providing the convenience of another quick and easy way to control Roon remotely.

Adding More Shortcuts

More complicated commands can be configured. Follow the same procedure as above but replace roon -r default with whatever RoonCommandLine command you like. For example, to configure a shortcut that plays your “Fav Bowie” playlist in the “Living Room” zone, add the following command in the Script text box:

roon -p "Fav Bowie" -z "Living Room"

Rather than creating a new shortcut every time you want to add some new command to your shortcuts, it is possible to duplicate an existing shortcut and then modify it. We can use this to avoid having to enter the IP address, Username, and Authentication type when creating a new shortcut. For example, in the Shortcuts app, press and hold the Play Radio shortcut we created earlier. In the menu that pops up, tap “Duplicate”. A new shortcut should be created named “Play Radio 1”. Tap the three dots (…) in the top right corner of the shortcut which should bring up the newly created shortcut ready for us to configure it.

First, rename the shortcut to something describing the action you will add and will be easily recognized by Siri. To rename the shortcut, tap the three dots (…) in the top right and replace the current name with a new name. For example, replace “Play Radio” with “Play Bowie”. Note that the name of the shortcut does not need to be exactly what the action is, in this case the name of a playlist. It just needs to be descriptive enough to let you know what it does and it needs to be simple enough to allow Siri to recognize it distinctly and without confusion. After renaming the shortcut, Tap Done.

In the Run script over SSH scripting action, tap “Show More”. All of the settings should be correct and need not be modified. The only things we need to modify are the Script text box command to execute and the name of the shortcut. Replace the Script text box command roon -r default with the command to play your favorite Roon playlist in your desired Roon zone. For example, replace roon -r default with roon -p "Fav Bowie" -z "Living Room" Tap Done in the top right.

Now you can play your Roon playlist by saying “Hey Siri, Play Bowie” or whatever you named the shortcut to be.

Troubleshooting Shortcuts

If your Siri command failed to run the shortcut or the shortcut did not result in the desired action, perform some troubleshooting.

Verify Command Line Execution

Start by verifying the command you entered in the Script text box works when executed at the command line. For example, in a terminal window on the system where the SSH commands are being executed and as the user you entered in the Shortcut “User” setting, attempt to run the command at the command line prompt:

roon -p "Fav Bowie" -z "Living Room"

Attempt to run the exact same command you entered in the shortcut Script text box. If it does not succeed as expected then the issue is not in your shortcut or Siri but in the Roon command line setup. See the Troubleshooting section of the RoonCommandLine README to resolve this issue.

Verify SSH Authentication

If it succeeds then move on to verifying SSH authentication is configured properly. In the Shortcut app, tap the three dots in the upper right corner of the shortcut you wish to troubleshoot. Tap “Show More” in the scripting action. Verify that Authentication is set to SSH Key. Just below Authentication you should see SSH Key on a line with “ed25519 Key” or something similar. Tap “ed25519 Key”. Tap Share Public Key and copy it or air drop it or send it to yourself in Messages. Verify that this public key is in the ~/.ssh/authorized_keys file on the system where RoonCommandLine is installed in the home directory of the user you are using to execute the SSH commands. In my example above this was the system with IP address 10.0.1.55 and the user ronnie. In a terminal window, logged in as that user on that system, change directory to ~/.ssh and open the file authorized_keys in a text editor. Verify the copied/air dropped public key is in that file and, if not, add it to the file.

Verify SSH Enabled

The system on which the SSH command is executed (in the example above, 10.0.1.55) must have SSH access enabled. On Linux this means that the ssh service is enabled and active. On MacOS System Preferences -> Sharing -> Remote Login must be enabled and the user(s) executing the Roon commands must be allowed access.

Verify that the SSH service is enabled and active. On Linux a command similar to:

systemctl status sshd

should display the status of the SSH service. On MacOS the command:

sudo systemsetup -getremotelogin

will display whether remote login is on or off. On MacOS it may be necessary to check the “Allow full disk access for remote users” box in the “Remote Login” dialog.

Modify SSH Command

Some systems may require the SSH command to be run in a login shell. To modify the SSH command to run in a login shell preface the command you wish to run with bash -l -c ... and surround the command in quotes. For example, to run the command roon -r default in a login shell, when configuring the Shortcut Script, use the command:

bash -l -c "roon -r default"

One RoonCommandLine user has reported that SSH Shortcuts fail when invoking the roon command but succeed when invoking the appropriate Python script directly. For example:

FAILS: /usr/local/Roon/bin/roon -c playpause -z "HQP4 Dylan"

SUCCEEDS: python3 /usr/local/Roon/api/zone_command.py -c playpause -z "HQP4 Dylan"

No explanation for this behavior has yet been discovered.

References

This post is licensed under CC BY 4.0 by the author.