Sonosを操作するツールを調べてみた。

# Sonosとは？
米国サンタバーバラ生まれのワイヤレスホームサウンドシステムです。
https://www.sonos.com/ja-jp/home
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/72479/a578480a-17b0-8266-2721-3ea4e7f70c39.jpeg" width="35%">

# Sonos One？
Alexa / Google両対応の高音質スマートスピーカーです。

# Sonos App？
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/72479/a824fda4-e01e-8fa1-8e8b-f76e8b9d1df5.png" width="100%">

iPhoneアプリとMacデスクトップアプリを試してみました。どちらも迷うことなく利用できました。同じネットワークにつながっていれば、どのデバイスからも操作できるのは良いですね。接続方式にBluetoothではなくWi-Fiを使用している利点ですね。

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/72479/445422e1-2c86-23a8-8cc0-4d081f7698c3.jpeg" width="28%"> <img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/72479/a0b08883-3319-225f-2fed-9834f5dff66a.png" width="67%">

# Sonos公式(開発者向け情報)
Sonos Developer
https://developer.sonos.com/build/
Sonos Labs
https://musicpartners.sonos.com/?q=docs

# Node-REDから操作する
同じネットワークにつながっていればどのデバイスからも操作できるということは、プログラムからも操作できるということです。Node-REDから操作するために「メニュー」→「パレット管理」→「ノードを追加」から「sonos」で検索するといくつかリストアップされます。

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/72479/ca600375-a257-f886-9411-de5eb0dd5f21.png" width="75%">

- node-red-contrib-sonos  
https://www.npmjs.com/package/node-red-contrib-sonos  
→最近、queue functionが更新されていますが、他のほとんどは2年以上更新されていません。  
　node-sonos (https://github.com/bencevans/node-sonos) を利用しています。
- node-red-contrib-better-sonos  
https://www.npmjs.com/package/node-red-contrib-better-sonos  
→1年以上更新されていません。
- node-red-contrib-sonos-plus  
https://www.npmjs.com/package/node-red-contrib-sonos-plus  
→node-red-contrib-better-sonosが1年以上更新されていないので、コードを利用して新しくパッケージを作成したとのことです。
- node-red-contrib-sonos-http-api  
https://www.npmjs.com/package/node-red-contrib-sonos-http-api  
→HTTP APIブリッジツール。  
　Sonosと同じネットワークにいなくてもHTTP API経由でSonosを操作できるのが特徴です。  
　別途、node-sonos-http-api (https://github.com/jishi/node-sonos-http-api) が必要です。
- node-red-contrib-sonospollytts  
https://www.npmjs.com/package/node-red-contrib-sonospollytts  
→Amazon Polly(テキスト読み上げサービス)を利用してSonosから音声を再生します。

## node-red-contrib-better-sonos
サンプルフローが掲載されているので、「メニュー」→「読み込み」→「クリップボード」から貼り付けます。Dashboard機能を利用しているので、ブラウザから操作します。
https://proknx.com/nodered/sound-ui-sonos/

<img width="75%" alt="2019-10-05 23.45.54.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/72479/0bc89bcb-af32-4cda-f516-b11f1074b0f5.png">
<img width="38%" alt="2019-10-05 23.45.12.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/72479/2d2e83f2-c54f-3b2d-88e7-319c79baf92a.png">


## node-red-contrib-sonos-plus
WiKiのページにサンプルフローが掲載されているので、「メニュー」→「読み込み」→「クリップボード」から貼り付けて試してみると理解し易いです。

https://github.com/hklages/node-red-contrib-sonos-plus/wiki/A.-Nodes-and-Commands
<img width="1673" alt="2019-10-05 9.49.17.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/72479/2a36a1c3-1863-cd63-cc43-ec7d42d4088f.png">

https://github.com/hklages/node-red-contrib-sonos-plus/wiki/B.-How-To-and-Examples
<img width="1680" alt="2019-10-05 22.05.33.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/72479/53c812a2-1ed3-9ae6-69f7-2379a949d81e.png">

Config Nodeの設定は新規に追加する際にSonosのSerial NumberとIPアドレスの情報が必要ですが、虫眼鏡ボタンを押して暫く待つと、同じネットワーク内に存在するSonosをディスカバリーしてくれるので、目的のSonos情報を選択します。
<img width="483" alt="2019-10-05 9.01.35.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/72479/be4cb684-b3d9-2c4f-1c4a-b5b7e1588e1e.png">

https://github.com/hklages/node-red-contrib-sonos-plus/wiki/C.-SONOS-Concept
現在再生している音楽を一時中断して割り込み再生できるNotificationの機能が面白いと思いました。

## node-red-contrib-sonospollytts
https://aws.amazon.com/jp/polly/
AWSアカウントでログインし、IAM Management ConsoleでAmazonPollyFullAccessポリシーを適用したユーザーを登録します。登録した際に作成されるアクセスキーとシークレットキーをsonospollyttyノードのプロパティで設定します。Pollyの日本語音声は女性(Mizuki)と男性(Takumi)から選べますが、ノードのプロパティで選択できるのは女性(Mizuki)のみでした。

<img width="1466" alt="2019-10-05 21.26.37.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/72479/4a445433-f496-8bc6-e5ce-e5119662368d.png">
<img width="50%" alt="2019-10-05 21.34.56.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/72479/12a0cb63-3b6c-d672-cb7b-82c24486f05c.png">

# コマンドラインツール
- node-sonos - node.jsモジュール  
https://github.com/bencevans/node-sonos
- sonos-cli - node.jsモジュール  
https://github.com/bencevans/sonos-cli
- Sonos HTTP API - シンプルなHTTP APIを提供  
https://github.com/jishi/node-sonos-http-api
- SoCo(Sonos Controller) - Pythonライブラリ  
http://python-soco.com/  
https://github.com/labero/SoCo-Tk

# その他のツール
IoTでおなじみのMQTT経由でSonosをコントロールするブリッジツールやブラウザからSonosをコントロールするツールもありました。

- sonos2mqtt  
https://github.com/svrooij/sonos2mqtt  
→node-sonosを利用している
- sonos-web  
https://github.com/Villarrealized/sonos-web  
→node-sonosを利用している
- zenmusic  
SlackからSonosを操作するツール  
https://github.com/htilly/zenmusic
- gladys-sonos  
Gladys (open-source home assistant)のSonosプラグイン  
https://github.com/GladysAssistant/gladys-sonos

## sonos2mqtt

```sh
# sonos2mqttモジュールのインストール
$ npm install -g sonos2mqtt

# 起動
# 例. mqtt://<ユーザー名>:<パスワード>@broker.shiftr.io
$ sonos2mqtt -v debug -u <MQTTブローカーサーバ>
```

https://github.com/svrooij/sonos2mqtt#usage
使用方法はトピックで制御する仕様のようです。(メッセージペイロードは空でOK)
<img width="1333" alt="2019-10-05 23.10.54.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/72479/18bd7d19-4639-6bc3-2abe-e0bb0ab80517.png">

## sonos-web

```sh
# sonos-web-cliモジュールのインストール
$ npm install -g sonos-web-cli

# インストール(インストール後に起動される)
$ sonos-web install
Installing Sonos Web
✔ downloading installation files
✔ installing front-end dependencies
✔ build front-end application
✔ install back-end dependencies
✔ cleaning up installation files
✔ Starting Sonos Web

success Open a web browser on this computer to http://localhost:5050 to start!
You can access Sonos Web network-wide by going to http://192.168.13.4:5050

# 起動
$ sonos-web start
✔ Starting Sonos Web

success Open a web browser on this computer to http://localhost:5050 to start!
You can access Sonos Web network-wide by going to http://192.168.13.4:5050

# 停止
$ sonos-web stop
✔ Stopping Sonos Web
```

ブラウザから http://localhost:5050 へアクセスします。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/72479/0554ba6d-1632-c981-6dbb-b38460cdcbef.png" width="75%">

# Arduino から Sonos を操作するライブラリ

- ESP8266 用ライブラリ
https://github.com/antonmeyer/sonos

- ESP8266 用ライブラリをフォークした ESP32 用ライブラリ、M5Stack 用サンプルコード
https://github.com/joeybab3/sonos
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/72479/64c70a2d-246d-27e6-03ab-30ee655d798b.png" width="30%">
ジャケ写表示対応 ( https://github.com/kitazaki/sonos/blob/master/examples/Sonos_Controller_M5Stack_2 )
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/72479/4d13aaf4-1b93-3471-b008-165251bd9f6f.jpeg" width="30%">
M5StickC 対応 ( https://github.com/kitazaki/sonos/tree/master/examples/Sonos_Controller_M5StickC )
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/72479/66dbc2b3-b7e4-1a50-8d67-d7c19e77767c.jpeg" width="30%">

- Wemos D1 mini(ESP8266)からMQTT経由(node-redを使用)でSonosを操作する事例
https://github.com/ebartz/esp8266-rfid-sonos

# まとめ
Sonosとの音楽ライフがさらに充実すれば幸いです。