はじめに
こんにちは。野良ハックチーム ざっきー と申します。
「Sonos を操作するツールを調べてみた。」で紹介している M5Stack / M5StickC から Sonos を操作する実装に関するメモです。
2019 年 11 月 28 日に開催された「enebular developer Meetup」でデモをやる予定だったのですが、Node-RED の sonospollytts ノードをデモするだけで時間切れでした。。(登壇資料はこちら。)
Sonos とは?
米国サンタバーバラ生まれのワイヤレスホームサウンドシステムです。
https://www.sonos.com/ja-jp/home
Wi-Fi (有線接続も可) でネットワークに接続され、自由な組み合わせが可能なスピーカーシステムです。
UPnP 対応で API が公開されていますので、ハックすることが可能です。
Sonos Labs
やりたかったこと
基本的に Sonos App と呼ばれる公式アプリから操作する必要があるのですが、ちょっとした操作で PC (Mac or Windows) や スマホ (iPhone or Android) を取り出すのは少し面倒です。
単純な操作は物理デバイスで行いたかったため、Sonos Music API を利用して M5Stack / M5StickC から曲の再生 / 一時停止・再開、巻き戻し、先送りの操作や音量調節 (ボリュームアップ / ダウン) を行います。
また、M5Stack / M5StickC はディスプレイを備えているので、選曲中のジャケ写を表示してもいいですね。
実装
少しややこしい状況になっています。
本家 (tmittet さん) の Sonos Arduino ライブラリのメンテナンスが止まっているため、マージされていません。
antonmeyer さんが Arduino ライブラリを fork して Sonos ESP8266 ライブラリを公開されています。
joeybab3 さんが ESP8266 ライブラリを fork して Sonos ESP32 ライブラリと M5Stack サンプルコードを公開されています。
ただ、1 点問題があり、本家で修正された不具合 (音量情報の取得不可) が残ったままになっています。
Fix issue #8 - getVolume returns undefined value
cdietze さんは ESP32 ライブラリ を fork して amazon music album を queue に追加する機能を追加されています。(こちらは上記問題が修正されていました。)
構成
M5Stack / M5StickC と Sonos の間は UPnP で接続する必要があるため、SSDP → SCPD → SOAP の順で通信を行います。
SSDP: Simple Service Discovery Protocol ・・・UPnP に対応したルーターを探す
SCPD: Service Control Point Definition ・・・ルーターからドキュメントを取得する
SOAP: Simple Object Access Protocol ・・・ルーターにポートマッピングを設定する
M5Stack / M5StickC のボタンを押して Sonos を操作するのに加えて、ウェブサーバー機能が付いていますので、PC または スマホのブラウザから M5Stack / M5StickC へアクセスして Sonos を操作することもできます。
導入準備
Arduino IDE を用いて M5Stack / M5StickC へ導入する前提で手順を説明します。
- MicroXPath ライブラリをダウンロードして Arduino ライブラリフォルダ (macOS の場合は /Users/[ユーザー名]/Documents/Arduino/libraries) へ追加します。
- Sonos ESP32 ライブラリをダウンロードして Arduino ライブラリフォルダ (macOS の場合は /Users/[ユーザー名]/Documents/Arduino/libraries) へ追加します。
- Sonos ESP32 ライブラリの src/SonosUPnP.cpp を修正する。(getVolume を return getVolume に変更する。)
プログラム
Arduino IDE で以下のプログラムを開いてコンパイル→書き込みを行います。
- M5Stack 巻き戻し、先送り、音量表示対応版
https://github.com/kitazaki/sonos/blob/master/examples/Sonos_Controller_M5Stack - M5Stack ジャケ写表示対応版 (Amazon Music のみ)
https://github.com/kitazaki/sonos/blob/master/examples/Sonos_Controller_M5Stack_2 - M5StickC 対応版
https://github.com/kitazaki/sonos/tree/master/examples/Sonos_Controller_M5StickC
ジャケ写表示対応
現在は M5Stack、Amazon Music のみに対応しています。
ジャケ写画像を Sonos システムから取得し、一旦 SD カードに保存してから M5Stack のディスプレイに表示しているためです。
理由は画像ファイルサイズが大きい場合、保存するメモリ領域が足りなくなるためです。
Amazon Music で実装・動作検証を行ったのですが、後から Spotify を追加して試したところジャケ写画像の URL (upnp:albumArtURI タグ) の書式が異なることが判明しました。(´•ω•`未実装)
- Amazon Music
/getaa?s=1&u=x%2Dsonosapi%2Dhls%2Dstatic%3Acatalog%252ftracks%252fB07RYVSH4P%252f%253fplaylistAsin%253dB07V3HV4G8%2526playlistType%253dhawkfirePlaylist%3Fsid%3D201%26amp%3Bflags%3D0%26amp%3Bsn%3D1
→http://[Sonos の IP アドレス]:1400 へアクセスして GET リクエストする。 - Spotify
https://i.scdn.co/image/ab67616d0000b27322cc0ac30507cf2208eb08b
→https://i.scdn.co へアクセスして GET リクエストする。
まとめ
先日、SONOS Beam を追加購入し、リビングにも良い音がやってきました。
少しずつ増やして自由に組み合わせられるのが本当に素晴らしいと感じました。
Listen Better!
みなさまにも良き音を!