I am so glad this is happening — for the hack value itself, but also because a genuinely useful application might result.
I love Sonos, their devices are way ahead of the competition. But their app just plain sucks. What is the most important function of a remote control app? Adjusting volume — and yet the useful range for the volume control occupies less than a percent of the entire touchscreen. It is very difficult to adjust the volume. And Sonos gives you no way to set the useful range, so you often end up blasting your ears with monstrously loud music, because you didn't tap the control just right.
This has been reported to Sonos numerous times and yet we still have to suffer with the crippled volume control.
The volume control is pretty bad, but the insult added to that injury is that it actually used to be better. You used to be able to click anywhere in the range and jump right to that spot on the range.
Further, it is not very granular at all. If you have a playbar, you may have noticed that the difference between mute and the very next volume up from mute is pretty high.
Sonos is not going to fix any of this. They do not care about your complaints about the app. People have been complaining and filing bug reports and pointing out simple UI improvements for years and it does nothing. They have made it clear that they do not care.
I am an early adopter (2005) and own about 12 of these devices and I have been disappointed and dismayed by the UI and the capability of their apps since day one.
> The volume control is pretty bad, but the insult added to that injury is that it actually used to be better. You used to be able to click anywhere in the range and jump right to that spot on the range.
Actually, that solution was horrible for people like myself. I have a player connected to an external amp with no volume control. The amp is big. Which means that the useful volume range on the sonos is up to about 20% (perhaps), at which point the music becomes really loud.
Accidentally tapping the volume slider (and setting the volume to 85%) is a recipe for disaster in that case.
Yes, they work much better — but not when you want to adjust the volume of one particular player in a group. Also, in some cases, the useful range of volume is 5-15% (a zoneplayer connected to an external amp), which is when the jumps using the hardware buttons are just too large.
I just don't get it: volume control is the #1 task for any remote control. If it were up to me, I'd dedicate 25% of screen space to it and tweak it endlessly to get it just right.
The author didn't look very hard. Their API is documented (more or less) at http://musicpartners.sonos.com/. It's more descriptive via language than laying out all end points. Registration is required.
After initial UPnP search, you get a URL for a descriptive xml file. Sonos operates over the SOAP protocol.
If you want your client to be notified of changes, you have to subscribe to each event type with a max of 3600 second timeout, then resubscribe. It's not necessary but the system supports unsubscribing too.
One specific thing you have to hack is this. If you want to switch to a different music service, you have to include the user id used to sign into that service (Pandora, Rdio, etc). This data is returned in a base64 encoded, encrypted blob. There's no way to decrypt it unless you can figure out how to crack the key out of the device.
Fortunately you only need the user id. There's another undocumented endpoint that returns some info that includes all the usernames, just no passwords. But it doesn't match the them to their services. You then have to send requests with all combinations of usernames and services and get the responses. Once these are returned, just store the relationships.
I'm writing this from memory, sorry for the specific details. If anyone is interested, contact me through my email in my profile and I'll get the info from some code I wrote recently.
This is awesome. Submissions like this harken back to the early days of Slashdot and things like the CueCat and Linksys router reverse engineering. I'd love to see more of these hardware+software hacks show up on HN.
Indubitably! These kinds of submissions are the only reason why I return to HN daily and wade through the endless submissions that break the off-topic guidelines [1], and yet get upvoted anyways.
Our long term plan is to make for less wading and more pleasant strolling.
If you (or anyone) notice an excellent-for-HN post that has fallen through the cracks, please let us know at hn@ycombinator.com. We're thinking of starting a search-and-rescue program for the tragically overlooked.
I bought a Play:3 a few months back and was also dissatisfied with the given OS X/iOS apps - I'm currently working on enabling AirPlay support for Sonos devices. (http://stephen.github.io/airsonos/)
Holy crap, this is exactly what I've been looking for! Amazing! I hope you plan to continue with this project for some time - I've always wondered why Sonos doesn't do this themselves!
Thank you! Would love further feedback (stephen at stephenwan.net) if you find yourself having any problems using it. The code is very-much early stage, so there are some issues to squash.
This is awesome. How are you able to do it? The sonos doesn't have native support for it. Lack of airplay and needing a dedicated wireless network was what put me off the sonos.
Thanks! Behind the scenes, I've written an node.js component that's able to talk to OS X/iOS devices (https://github.com/stephen/nodetunes) via AirTunes and stream in raw audio data. From there, AirSonos converts the audio into a "radio" stream that Sonos can understand.
The code is still very much 'alpha-stage' at the moment; functional but not completely consistent yet. I'm planning on doing a writeup with further progress!
Does audio play at all even when the error happens, or completely doesn't work? I've noticed that sometimes it occurs but the streaming still works fine.
"strange error flushing buffer" is emitted from one of the dependencies, the lame encoder - I'm currently looking into the issue..
Would love to diagnose this further, via github or stephen at stephenwan.net.
I was hoping someone was hacking the sonos itself and replacing the software. The hardware looks awesome but the fact that it can't connect to an existing wireless network and that you can't stream live audio to it makes it very limited. I bought one and ended up returning it when I realized I couldn't use it for something basic as sound for a movie on my laptop.
It's not really that novel. When I wrote a Sonos client (2007) there were a few out there already. Getting things working did involve a lot of time in Netmon (nee: Wireshark), and reading UPnP specs.
Yup, that's correct, though the old library in my repo still works and is used by some folks, maintenance of SoCo is handled by a group of very talented and friendly developers under https://github.com/SoCo/SoCo
It looks like the author used SoCo for the Raspberry Pi project mentioned at the bottom of the article.
I created an app using some of nathanborrors work that let's you browse through all of the Sonos Music services (Like Rdio, Spotify, Pandora, iHearRadio, etc). Setup your account, browse through your collections and play them on your system. I should submit a pull request to see if I can get this integrated into this project!
I also have an app on the App Store that turns your Sonos System into a wireless PA system. The current version is a little buggy but an update is coming shortly that makes it
much more stable. You can check it out here:
Coincidentally, I just released a Sonos CLI NPM package over easter [1] that builds on some work done by others [2]. It is targeted primarily at circumventing the Spotify search functionality in the Sonos app, that more often than not times out and fails to give results. I just started using it at the office for quick playback control, and it takes away a lot of the frustration I have with the app.
There are rumours that Sonos are considering opening up their platform to 3rd-party developers. Given they have recently dropped the bridge requirement, and the abundance of AirPlay-compatible speakers (plus WiFi-direct based alternative to Sonos, Panasonic have released one) I think they are perhaps starting to feel the competitive heat. I for one can't wait until Instacast or Downcast can send audio to a Sonos without having to go via an Airport Express as an AirPlay bridge.
In case it's useful to anyone, if you want something that costs $25 instead of a few hundred, Airfoil by RogueAmoeba[1] is great. It's just software: you basically need to leave an iOS/Android device next to your amplifier, and you can stream to it from other devices. I use it for music; AFAIK there would be a lag between image and sound for a video source.
Geo Fencing is where you use the GPS coordinates of a 'virtual area' to determine whether you are 'inside the fence' or outside of it. Think of it as virtual lines in the sand, and whenever your phone determines you've crossed a line, it does something ..
Through reading the context, it means a scheme in which a phone uses its GPS to detect exceeding a specified radius from the house and setting off an alarm. All you need to do is set a position (the house) and an alarm radius (greater than the normal error bounds for GPS) and you will always know if the phone is where it's supposed to be.
This article is the reason I think you're the most badass designer out there. Wireshark + wireframes + Raspberry Pi and thoughtful redesigns? Who else blends all four into such a cool project? You're a real inspiration, so keep it up!
I wish someone would hack Sonos to make its network communication more reliable. Every time you turn it off you have to press the two buttons on top to make it find the bridge again. Several times.
Just configure your DHCP server to always hand them the same adress (static lease). Do you use the built in dhcp of your wifi router? Most of them offer an option to enter a mac address for which you want to assign always the same IP.
Sonos really does not like if components get different IPs after you had them powerless for some time while other components stayed active. I had the same issues you describe until I configured static leases for my sonos components and the smartphones we use to control them.
I love Sonos, their devices are way ahead of the competition. But their app just plain sucks. What is the most important function of a remote control app? Adjusting volume — and yet the useful range for the volume control occupies less than a percent of the entire touchscreen. It is very difficult to adjust the volume. And Sonos gives you no way to set the useful range, so you often end up blasting your ears with monstrously loud music, because you didn't tap the control just right.
This has been reported to Sonos numerous times and yet we still have to suffer with the crippled volume control.
Here is hoping that there will be an alternative.