Help us understand the problem. What is going on with this article?

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

はじめに

2020年2月1日。
とうとう日本でSonosとIKEAのコラボレーションモデルSymfoniskが発売されました!
SymfoniskはBookshelf型とLamp型の2種類がありますが、音と照明の組み合わせに惹かれて
Lamp型を選択しました。

ただ、残念なところが1点あり、上の照明部分と下のSonos部分がバラバラ(連携していない)なのです。

ゴール

Sonosの音楽再生に合わせて照明を変化させます。
Symfonisk_Tradfri_02.png

照明部分の電球ソケット(E17タイプ)

最初、Philips Hueランプを使用して連携させようと考えましたが、電球ソケットがE26タイプではなくE17タイプなので単色しか選択肢がありません。(2020年2月2日時点)
E17タイプでカラー色を選択できるTRÅDFRIトロードフリLED電球を採用することにしました。

TRÅDFRIトロードフリ

Symfonisk(Sonosランプ)の他に以下の機器が追加で必要になります。

連携方法

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

構成

スクリーンショット 2020-02-02 23.14.44.png

プログラム

node-sonosnode-tradfri-clientのライブラリを利用して連携させます。

事前準備①

IKEA Home smartアプリで電球の名前を「Sonos」に変更しておきます。

スクリーンショット 2020-02-02 22.14.24.png

事前準備②

TRÅDFRI/トロードフリ ゲートウェイのSecurity Codeの情報を取得します。
裏面に記載されています。

ライブラリの導入手順

$ 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
...

ソースコードはこちらです。

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! みなさまに良き音を!
Symfonisk_tradfri_10.png

参考にした情報

https://willschenk.com/articles/2019/controlling_ikea_tradfri_with_node/
https://qiita.com/ukiuni@github/items/2c1aa03fedf723c66127

その他の情報源

SONOS Japan User Community

iotlt
IoT縛りの勉強会です。 毎月イベントを実施しているので是非遊びに来てください! 登壇者を中心にQiitaでも情報発信していきます。 https://iotlt.connpass.com
https://iotlt.connpass.com/
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
No comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
ユーザーは見つかりませんでした