From 0605c5ff86dfbfed23fdf67eb2f59de228d20955 Mon Sep 17 00:00:00 2001 From: bezzers Date: Thu, 23 Jul 2015 09:27:58 -0400 Subject: [PATCH] Create Sonos.js --- platforms/Sonos.js | 154 +++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 154 insertions(+) create mode 100644 platforms/Sonos.js diff --git a/platforms/Sonos.js b/platforms/Sonos.js new file mode 100644 index 0000000..47a078a --- /dev/null +++ b/platforms/Sonos.js @@ -0,0 +1,154 @@ +var types = require("HAP-NodeJS/accessories/types.js"); +var sonos = require('sonos'); + +function SonosPlatform(log, config){ + this.log = log; + 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, device, description); + callback([accessory]); + } + }); + }); + } +}; + +function SonosAccessory(log, device, description) { + this.log = log; + this.description = description; + this.name = description["roomName"] + " Sonos"; + this.playVolume = 25; +} + +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.description["roomName"] + " 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; +module.exports.platform = SonosPlatform;