LoginSignup
6
2

More than 3 years have passed since last update.

M5Stack / M5StickC で Sonos を操作してみた。

Last updated at Posted at 2019-12-16

はじめに

こんにちは。野良ハックチーム ざっきー と申します。
Sonos を操作するツールを調べてみた。」で紹介している M5Stack / M5StickC から Sonos を操作する実装に関するメモです。
2019 年 11 月 28 日に開催された「enebular developer Meetup」でデモをやる予定だったのですが、Node-RED の sonospollytts ノードをデモするだけで時間切れでした。。(登壇資料はこちら。)

Sonos とは?

米国サンタバーバラ生まれのワイヤレスホームサウンドシステムです。
https://www.sonos.com/ja-jp/home

Wi-Fi (有線接続も可) でネットワークに接続され、自由な組み合わせが可能なスピーカーシステムです。
スクリーンショット 2019-12-12 15.25.12.png

UPnP 対応で API が公開されていますので、ハックすることが可能です。
Sonos Labs
スクリーンショット 2019-12-12 15.25.30.png

やりたかったこと

基本的に Sonos App と呼ばれる公式アプリから操作する必要があるのですが、ちょっとした操作で PC (Mac or Windows) や スマホ (iPhone or Android) を取り出すのは少し面倒です。
スクリーンショット 2019-12-12 15.31.24.png

単純な操作は物理デバイスで行いたかったため、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
スクリーンショット 2019-12-14 15.21.20 2.png
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 を操作することもできます。
スクリーンショット 2019-12-14 20.59.50.png
webcon.png

導入準備

Arduino IDE を用いて M5Stack / M5StickC へ導入する前提で手順を説明します。

  1. MicroXPath ライブラリをダウンロードして Arduino ライブラリフォルダ (macOS の場合は /Users/[ユーザー名]/Documents/Arduino/libraries) へ追加します。
    スクリーンショット 2019-10-22 23.38.41.png

  2. Sonos ESP32 ライブラリをダウンロードして Arduino ライブラリフォルダ (macOS の場合は /Users/[ユーザー名]/Documents/Arduino/libraries) へ追加します。
    スクリーンショット 2019-10-22 23.38.15.png

  3. Sonos ESP32 ライブラリの src/SonosUPnP.cpp を修正する。(getVolume を return getVolume に変更する。)
    スクリーンショット 2019-12-14 16.48.39.png

プログラム

Arduino IDE で以下のプログラムを開いてコンパイル→書き込みを行います。

ジャケ写表示対応

現在は 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!
みなさまにも良き音を!

6
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
6
2