はじめに
2020年2月1日。
とうとう日本でSonosとIKEAのコラボレーションモデルSymfoniskが発売されました!
SymfoniskはBookshelf型とLamp型の2種類がありますが、音と照明の組み合わせに惹かれて
Lamp型を選択しました。
ただ、残念なところが1点あり、上の照明部分と下のSonos部分がバラバラ(連携していない)なのです。
ゴール
照明部分の電球ソケット(E17タイプ)
最初、Philips Hueランプを使用して連携させようと考えましたが、電球ソケットがE26タイプではなくE17タイプなので単色しか選択肢がありません。(2020年2月2日時点)
E17タイプでカラー色を選択できるTRÅDFRIトロードフリLED電球を採用することにしました。
TRÅDFRIトロードフリ
Symfonisk(Sonosランプ)の他に以下の機器が追加で必要になります。
- SYMFONISK/シンフォニスク サウンドリモート
- TRÅDFRI/トロードフリ ゲートウェイ
- TRÅDFRI トロードフリ LED電球 E17 600ルーメン, ワイヤレス調光, カラー&ホワイトスペクトラム オパールホワイト
- TRÅDFRI トロードフリ リモコン
連携方法
TRÅDFRI/トロードフリ ゲートウェイは有線LANでネットワークに接続され、LED電球、リモコン、サウンドリモートは無線(zigbee)で接続されています。
Symfonisk(Sonosランプ)は無線(Wi-Fi)で接続されています。
TRÅDFRI/トロードフリ ゲートウェイとは有線LANを介して接続され、CoAPを使用して通信を行います。
構成

プログラム
node-sonosとnode-tradfri-clientのライブラリを利用して連携させます。
事前準備①
IKEA Home smartアプリで電球の名前を「Sonos」に変更しておきます。
事前準備②
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
...
ソースコードはこちらです。
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! みなさまに良き音を!
参考にした情報
https://willschenk.com/articles/2019/controlling_ikea_tradfri_with_node/
https://qiita.com/ukiuni@github/items/2c1aa03fedf723c66127