diff --git a/accessories/Sonos.js b/accessories/Sonos.js deleted file mode 100644 index 5757b0c..0000000 --- a/accessories/Sonos.js +++ /dev/null @@ -1,146 +0,0 @@ -var types = require("HAP-NodeJS/accessories/types.js"); -var sonos = require('sonos'); - -function SonosAccessory(log, config) { - this.log = log; - this.name = config["name"]; - this.playVolume = config["play_volume"]; - this.device = null; - this.search(); -} - -SonosAccessory.prototype = { - - search: function() { - var that = this; - - sonos.search(function(device) { - that.log("Found device at " + device.host); - - device.deviceDescription(function (err, description) { - - if (description["zoneType"] == '3') { - that.log("Found playable device"); - // device is an instance of sonos.Sonos - that.device = device; - } - - }); - }); - }, - - setPlaying: function(playing) { - - if (!this.device) { - this.log("No device found (yet?)"); - return; - } - - var that = this; - - if (playing) { - this.device.play(function(err, success) { - that.log("Playback attempt with success: " + success); - }); - - if (this.playVolume) { - this.device.setVolume(this.playVolume, function(err, success) { - if (!err) { - that.log("Set volume to " + that.playVolume); - } - else { - that.log("Problem setting volume: " + err); - } - }); - } - } - else { - this.device.stop(function(err, success) { - that.log("Stop attempt with success: " + success); - }); - } - }, - - getServices: function() { - var that = this; - return [{ - sType: types.ACCESSORY_INFORMATION_STYPE, - characteristics: [{ - cType: types.NAME_CTYPE, - onUpdate: null, - perms: ["pr"], - format: "string", - initialValue: this.name, - supportEvents: false, - supportBonjour: false, - manfDescription: "Name of the accessory", - designedMaxLength: 255 - },{ - cType: types.MANUFACTURER_CTYPE, - onUpdate: null, - perms: ["pr"], - format: "string", - initialValue: "Sonos", - supportEvents: false, - supportBonjour: false, - manfDescription: "Manufacturer", - designedMaxLength: 255 - },{ - cType: types.MODEL_CTYPE, - onUpdate: null, - perms: ["pr"], - format: "string", - initialValue: "Rev-1", - supportEvents: false, - supportBonjour: false, - manfDescription: "Model", - designedMaxLength: 255 - },{ - cType: types.SERIAL_NUMBER_CTYPE, - onUpdate: null, - perms: ["pr"], - format: "string", - initialValue: "A1S2NASF88EW", - supportEvents: false, - supportBonjour: false, - manfDescription: "SN", - designedMaxLength: 255 - },{ - cType: types.IDENTIFY_CTYPE, - onUpdate: null, - perms: ["pw"], - format: "bool", - initialValue: false, - supportEvents: false, - supportBonjour: false, - manfDescription: "Identify Accessory", - designedMaxLength: 1 - }] - },{ - sType: types.SWITCH_STYPE, - characteristics: [{ - cType: types.NAME_CTYPE, - onUpdate: null, - perms: ["pr"], - format: "string", - initialValue: "Speakers", - supportEvents: false, - supportBonjour: false, - manfDescription: "Name of service", - designedMaxLength: 255 - },{ - cType: types.POWER_STATE_CTYPE, - onUpdate: function(value) { that.setPlaying(value); }, - perms: ["pw","pr","ev"], - format: "bool", - initialValue: false, - supportEvents: false, - supportBonjour: false, - manfDescription: "Change the playback state of the sonos", - designedMaxLength: 1 - }] - }]; - } -}; - -module.exports.accessory = SonosAccessory; diff --git a/config-sample.json b/config-sample.json index 2c81ce4..d4760e0 100644 --- a/config-sample.json +++ b/config-sample.json @@ -52,6 +52,11 @@ { "platform": "LogitechHarmony", "name": "Living Room Harmony Hub" + }, + { + "platform": "Sonos", + "name": "Sonos", + "play_volume": 25 } ], @@ -70,12 +75,6 @@ "username": "your-liftmaster-username", "password" : "your-liftmaster-password" }, - { - "accessory": "Sonos", - "name": "Speakers", - "description": "This shim supports Sonos devices on the same network as this server. It acts as a simple switch that calls play() or pause() on the Sonos, so it's only useful for pausing and resuming tracks or radio stations that are already in the queue. When 'play_volume' is nonzero, the volume will be reset to that value when it turns the Sonos on.", - "play_volume": 25 - }, { "accessory": "Lockitron", "name": "Front Door", diff --git a/platforms/Sonos.js b/platforms/Sonos.js new file mode 100644 index 0000000..15523c6 --- /dev/null +++ b/platforms/Sonos.js @@ -0,0 +1,159 @@ +var types = require("HAP-NodeJS/accessories/types.js"); +var sonos = require('sonos'); + +function SonosPlatform(log, config){ + this.log = log; + this.config = config; + this.name = config["name"]; + this.playVolume = config["play_volume"]; +} + +SonosPlatform.prototype = { + accessories: function(callback) { + this.log("Fetching Sonos devices."); + var that = this; + + sonos.search(function (device) { + that.log("Found device at " + device.host); + + device.deviceDescription(function (err, description) { + if (description["zoneType"] != '11') { + that.log("Found playable device - " + description["roomName"]); + // device is an instance of sonos.Sonos + var accessory = new SonosAccessory(that.log, that.config, device, description); + callback([accessory]); + } + }); + }); + } +}; + +function SonosAccessory(log, config, device, description) { + this.log = log; + this.config = config; + this.device = device; + this.description = description; + + this.name = this.description["roomName"] + " " + this.config["name"]; + this.serviceName = this.description["roomName"] + " Speakers"; + this.playVolume = this.config["play_volume"]; +} + +SonosAccessory.prototype = { + + setPlaying: function(playing) { + + if (!this.device) { + this.log("No device found (yet?)"); + return; + } + + var that = this; + + if (playing) { + this.device.play(function(err, success) { + that.log("Playback attempt with success: " + success); + }); + + if (this.playVolume) { + this.device.setVolume(this.playVolume, function(err, success) { + if (!err) { + that.log("Set volume to " + that.playVolume); + } + else { + that.log("Problem setting volume: " + err); + } + }); + } + } + else { + this.device.stop(function(err, success) { + that.log("Stop attempt with success: " + success); + }); + } + }, + + getServices: function() { + var that = this; + return [{ + sType: types.ACCESSORY_INFORMATION_STYPE, + characteristics: [{ + cType: types.NAME_CTYPE, + onUpdate: null, + perms: ["pr"], + format: "string", + initialValue: this.name, + supportEvents: false, + supportBonjour: false, + manfDescription: "Name of the accessory", + designedMaxLength: 255 + },{ + cType: types.MANUFACTURER_CTYPE, + onUpdate: null, + perms: ["pr"], + format: "string", + initialValue: "Sonos", + supportEvents: false, + supportBonjour: false, + manfDescription: "Manufacturer", + designedMaxLength: 255 + },{ + cType: types.MODEL_CTYPE, + onUpdate: null, + perms: ["pr"], + format: "string", + initialValue: "Rev-1", + supportEvents: false, + supportBonjour: false, + manfDescription: "Model", + designedMaxLength: 255 + },{ + cType: types.SERIAL_NUMBER_CTYPE, + onUpdate: null, + perms: ["pr"], + format: "string", + initialValue: "A1S2NASF88EW", + supportEvents: false, + supportBonjour: false, + manfDescription: "SN", + designedMaxLength: 255 + },{ + cType: types.IDENTIFY_CTYPE, + onUpdate: null, + perms: ["pw"], + format: "bool", + initialValue: false, + supportEvents: false, + supportBonjour: false, + manfDescription: "Identify Accessory", + designedMaxLength: 1 + }] + },{ + sType: types.SWITCH_STYPE, + characteristics: [{ + cType: types.NAME_CTYPE, + onUpdate: null, + perms: ["pr"], + format: "string", + initialValue: this.serviceName, + supportEvents: false, + supportBonjour: false, + manfDescription: "Name of service", + designedMaxLength: 255 + },{ + cType: types.POWER_STATE_CTYPE, + onUpdate: function(value) { that.setPlaying(value); }, + perms: ["pw","pr","ev"], + format: "bool", + initialValue: false, + supportEvents: false, + supportBonjour: false, + manfDescription: "Change the playback state of the sonos", + designedMaxLength: 1 + }] + }]; + } +}; + +module.exports.accessory = SonosAccessory; +module.exports.platform = SonosPlatform;