SYMFONISK(Sonosランプ)とTRADFRIライトを連携させてみた。

# はじめに
2020年2月1日。
とうとう日本でSonosとIKEAのコラボレーションモデルSymfoniskが発売されました！
SymfoniskはBookshelf型とLamp型の2種類がありますが、音と照明の組み合わせに惹かれて
Lamp型を選択しました。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/72479/13e4b4fd-523c-a651-2d6c-61ac47ad50bb.jpeg" width="50%">

ただ、残念なところが1点あり、上の照明部分と下のSonos部分がバラバラ(連携していない)なのです。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/72479/d23a2c70-4b5b-04b4-d51a-ae53dd309028.jpeg" width="50%">

## ゴール
Sonosの音楽再生に合わせて照明を変化させます。
<img width="100%" alt="Symfonisk_Tradfri_02.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/72479/ee30a733-95ac-c22c-1972-52c2b86cf618.png">

### 照明部分の電球ソケット(E17タイプ)
最初、<A HREF="https://www2.meethue.com/ja-jp">Philips Hue</A>ランプを使用して連携させようと考えましたが、電球ソケットがE26タイプではなくE17タイプなので単色しか選択肢がありません。(2020年2月2日時点)
E17タイプでカラー色を選択できる<A HREF="https://www.ikea.com/jp/ja/catalog/products/50411570/">TRÅDFRIトロードフリLED電球</A>を採用することにしました。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/72479/07eda88e-7257-c6d3-a1db-011948ec609d.jpeg" width="50%"> <img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/72479/df842611-af82-3b22-12a7-9876bcfaa862.jpeg" width="31%">

### TRÅDFRIトロードフリ
Symfonisk(Sonosランプ)の他に以下の機器が追加で必要になります。

- <A HREF="https://www.ikea.com/jp/ja/catalog/products/40370481/">SYMFONISK/シンフォニスク サウンドリモート</A>  
- <A HREF="https://www.ikea.com/jp/ja/catalog/products/50337815/">TRÅDFRI/トロードフリ ゲートウェイ</A>  
- <A HREF="https://www.ikea.com/jp/ja/catalog/products/50411570/">TRÅDFRI トロードフリ LED電球 E17 600ルーメン, ワイヤレス調光, カラー＆ホワイトスペクトラム オパールホワイト</A>  
- <A HREF="https://www.ikea.com/jp/ja/catalog/products/40443128/">TRÅDFRI トロードフリ リモコン</A>

# 連携方法
TRÅDFRI/トロードフリ ゲートウェイは有線LANでネットワークに接続され、LED電球、リモコン、サウンドリモートは無線(zigbee)で接続されています。
Symfonisk(Sonosランプ)は無線(Wi-Fi)で接続されています。
TRÅDFRI/トロードフリ ゲートウェイとは有線LANを介して接続され、<A HREF="Constrained Application Protocol ">CoAP</A>を使用して通信を行います。

### 構成
<img width="75%" alt="スクリーンショット 2020-02-02 23.14.44.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/72479/3e67a007-7f5b-a493-9d44-68a3a5dfcb39.png">

# プログラム
<A HREF="https://github.com/bencevans/node-sonos">node-sonos</A>と<A HREF="https://github.com/AlCalzone/node-tradfri-client">node-tradfri-client</A>のライブラリを利用して連携させます。

### 事前準備①
<A HREF="https://www.ikea.com/jp/ja/customer-service/about-our-products/app-gateway/index.html">IKEA Home smartアプリ</A>で電球の名前を「Sonos」に変更しておきます。  
<img width="25%" alt="スクリーンショット 2020-02-02 22.14.24.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/72479/761d4d2f-8230-9155-c99b-4c67aeebc3a7.png">
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/72479/519fdf00-b536-1ecd-484b-7eda057351d8.png" width="35%"> <img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/72479/d66625c4-3eb8-c3e4-806a-5ccecfb3ade5.png" width="35%">

### 事前準備②
TRÅDFRI/トロードフリ ゲートウェイのSecurity Codeの情報を取得します。
裏面に記載されています。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/72479/ab23e307-f0a7-5e4d-ad44-524bd0cfc439.png" width="50%">

### ライブラリの導入手順

```bash
$ mkdir ikea
$ cd ikea
$ npm init -y
$ npm install sonos
$ yarn add node-tradfri-client delay conf
$ git clone https://github.com/wschenk/tradfri-cli
$ cp tradfri-cli/*.js ./

# ソースコードを貼り付け
$ vi sonos.js

# 環境変数にTRÅDFRI/トロードフリ ゲートウェイのSecurity Codeを設定
$ export IKEASECURITY=[Security Code]

# プログラムを実行
$ node sonos.js

# 実行例
$ node sonos.js 
Device: 192.168.0.100
Device: 192.168.0.101
Title:  ヴァイオリン協奏曲 第3番 ト長調 K.216: 第2楽章: Adagio
Looking up IKEA Tradfri gateway on your network
Connecting to TRADFRI-Gateway-xxxxxxxxxxxx.local
Securely connecting to gateway
Title:  ブラームス: ヴァイオリンとピアノのためのソナタ 第3番 ニ短調 作品108 I. 
Looking up IKEA Tradfri gateway on your network
Connecting to TRADFRI-Gateway-xxxxxxxxxxxx.local
Securely connecting to gateway
...
```

ソースコードは<A HREF="https://github.com/kitazaki/Symfonisk_Tradfri/blob/master/sonos.js">こちら</A>です。

```javascript:sonos.js
const connection = require( './connection' );
const devices    = require( './devices' );
const delay      = require( 'delay' );
var title = null;

const Sonos = require('sonos')
const NAME = "Sonos";

Sonos.DeviceDiscovery((device) => {
  console.log("Device:", device.host)

  const speaker = new Sonos.Sonos(device.host, device.port)

  speaker.on('CurrentTrack', (track) => {
    if (title != track.title) {
      console.log("Title: ", track.title)
      title = track.title
      light();
    }
  })
})

async function light() {
  const tradfri = await connection.getConnection();
  tradfri.observeDevices();
  await delay( 1000 );

  let currentDevice = null;
  let accessory = null;

  currentDevice = devices.findDevice( tradfri, NAME );

  if( currentDevice == null ) {
    console.log( "Unable to find device", NAME );
    console.log( tradfri.devices );
    process.exit(1);
  }

  switch( currentDevice.type ) {
    case 2: //light
      accessory = currentDevice.lightList[0];
      accessory.client = tradfri;
      break;
  }

  accessory.turnOn();
  accessory.setBrightness("10");
  // color => efd275 f5faf6 f1e0b5 6c83ba c984bb d9337c da5d41 e78834 ebb63e 
  accessory.setColor("efd275");
  await delay(1000);
  accessory.setColor("f5faf6");
  await delay(1000);
  accessory.setColor("f1e0b5");
  await delay(1000);
  accessory.setColor("6c83ba");
  await delay(1000);
  accessory.setColor("c984bb");
  await delay(1000);
  accessory.setColor("d9337c");
  await delay(1000);
  accessory.setColor("da5d41");
  await delay(1000);
  accessory.setColor("e78834");
  await delay(1000);
  accessory.setColor("ebb63e");
  await delay(1000);
  accessory.setBrightness("0");
  await delay(1000);
  await tradfri.destroy();
//  process.exit(0);

}
```

# まとめ
再生している曲が変わるとランプが灯ります。
Listen Better! みなさまに良き音を！
<A HREF="https://youtu.be/Xwwjd3imZSA"><img width="75%" alt="Symfonisk_tradfri_10.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/72479/236efb08-2644-25ee-1f35-38eaeb47a9d7.png"></A>

### 参考にした情報
https://willschenk.com/articles/2019/controlling_ikea_tradfri_with_node/
https://qiita.com/ukiuni@github/items/2c1aa03fedf723c66127

### その他の情報源
<A HREF="https://sonos-com.amebaownd.com/">SONOS Japan User Community</A>