Controlling Roon from the iOS Notification Center as a widget (Using Workflow App)

Hi all,
Using the now-free (Apple bought it) Workflow app for iOS, the Roon API and Node.js, my 16 year old son managed to hack together a remote to control Roon (play/pause, next and previous track, muting and pause across all zones) from iOS’s Notification Center - as a widget, controllable from the lock screen. It’s pretty much lag-free and a lot quicker than unlocking and starting the Roon app for such simple commands. Take a look at his GitHub repo. and tell me what you think: https://github.com/varunrandery/roon-remote. It can also be used as a standalone server to handle HTTP GET requests from a different source (i.e. not the Workflow app).

Put any questions, suggestions or bugs (preferably as Git issues) here.

14 Likes

Thank you for this!

Congratulations to your son!

It would be nice to be able to select the zone :smiley:

In the workflow, you should see a list of zones to select from before you can do anything.

Are you seeing this?

1 Like

And after you select a Zone (Phantom - for example in my case) you should see this -

1 Like

Thanks. Hope you find it useful.

1 Like

Really cool :smile:

How do I see the server’s node.js ip address to use with workflow?

Thanks

Got it working… Thanks a lot for this.

I’m not sure what I do wrong, but my node is running, and shows up in my iPad under extensions. (iPhone does not have extentions added yet).
Can anyone post a pic of how the workflow setup shall be ?

Also is the URL shall of cause be the same computer at the node ?
If I past that url into a browser i get “Cannot GET /”

The error I get in wideget is “Workflow could not open the ap for the url scheme “ip adress:3000” The app may not be installed on this device”

I’m using W10 creators edition. Roon is on a SonicTransporter i5. The core is Roon V218, and so is everything else.
The Alarm Clock 0.30 is running and working as well. so it’s probably the workflow setup that is wrong.

This is what my Workflow looks like:


In the first text box, you should enter the IP address of your Node server, followed by the port. For example, in my setup, my IP address is 10.0.1.38, and my port is 3000. So in the text box, I enter 10.0.1.38:3000.
Let me know if that works for you.

I HThanks.
No, did not work. I’ve done exactly that. Just with the my IP.
It seems to stop on the last action. (Get contents of URL).

Edit found the error. (I wrote “server” did not take from menu).

Now new error:

{“outputs”:[{“can_group_with_output_ids”:[],“display_name”:“HQPlayer”,“zone_id”:“1601e30feba010c8977ea09681f7982e53e6”,“output_id”:“1701e30feba010c8977ea09681f7982e53e6”}],“is_seek_allowed”:false,“is_previous_allowed”:false,“is_play_allowed”:false,“zone_id”:“1601e30feba010c8977ea09681f7982e53e6”,“is_next_allowed”:true,“display_name”:“HQPlayer”,“is_pause_allowed”:false,“state”:“stopped”,“settings”:{“shuffle”:false,“auto_radio”:true,“loop”:“disabled”}}

Which seems to blame HQPlayer ?

So I switch sone with same result:

{“outputs”:[{“volume”:{“max”:100,“min”:0,“value”:55,“step”:1,“type”:“number”,“is_muted”:false},“can_group_with_output_ids”:[“1701a649604fbbf30f98af50fdc6734078a7”,“170148f08eb53e88b35a244cf8b477e344e7”,“1701e28fefb67c06a9ed4e2078bd8793728d”,“17019ac30dfcb6527bf8ca2613108895b722”],“display_name”:“Radio Terasse”,“zone_id”:“1601e28fefb67c06a9ed4e2078bd8793728d”,“output_id”:“1701e28fefb67c06a9ed4e2078bd8793728d”}],“is_seek_allowed”:false,“is_previous_allowed”:false,“is_play_allowed”:false,“zone_id”:“1601e28fefb67c06a9ed4e2078bd8793728d”,“is_next_allowed”:true,“display_name”:“Radio Terasse”,“is_pause_allowed”:false,“state”:“stopped”,“settings”:{“shuffle”:false,“auto_radio”:true,“loop”:“disabled”}}

So maybe not HQPlayer at all. (This is a Squeezebox Radio).

Hi,

Am I correct in assuming you’re attempting to write the Workflow manually? What’s happening is that the first GET request is to populate the zone list, so if you’re only using the first four steps in the Workflow (as in the screenshot I posted, which is incomplete), all you’re seeing is raw information about the zone. I would recommend importing the Workflow in full, and using it as is (with the server address changed, of course). Here’s the link (view on your iOS device): https://workflow.is/workflows/7bf76714e84a4030a1af292fe40cf02b

Let me know how you get on with that.

Thanks. That was a lot better :grinning:

Still, my workflow is opening in the workflow app, and not in the wideget, as shown in a post earlier.

So I guess there is a trick to make it stay in the widget world ?

Hi,

I’m glad that you’ve managed to get it working. Is it kicking you into the Workflow app when you start it from the Notification Center widget? That’s very odd, does your widget look something like this before you start?

Yes.

I guess my widget looks like yours.

Update.
I changed from a computer that was wireless connected to my HTPC.
So now we have a different issue. Se picture. It can’t find my Zones.

Suggestion ?

EDIT.
It’s working. Just to start it inside Extention :grinning:

EDIT

Very cool little tool!

I got this working on a zone named “Living” with a single endpoint however in a separate zone named “Bar” which is a group containing “Dining Room” and “Kitchen” it does not respond to commands. In the workflow widget it is listed as “Dining Room + 1”, perhaps this is part of the issue? Is it a know issue with the Roon API perhaps? I tried via http commands and I can get living working but not “Bar”, “Dining Room + Kitchen” or “Dining Room + 1”. Any thoughts?

Thanks for the development gone into this - it’s nice not having to carry around a remote/phone/tablet and be able control music playback from my watch.
Would you be interested in adding your extension to the Roon Extension Manager project? Details of that here Roon Extension Manager v0.7.1

@Jan_Koudijs - is there any reason this would not qualify?

Thanks! That’s interesting, I haven’t really experimented much with grouped zones. I have a feeling it’s a problem with my implementation, I might be explicitly looking for single zones, where grouped zones get excluded. I’m not sure whether there is a distinction or not, but I’ll try and take a look and get back to you. If you think you might be able to tinker with it yourself, feel free to submit a pull request.