Created
February 11, 2016 15:56
-
-
Save jamesabruce/72bd250fbcf054acaa25 to your computer and use it in GitHub Desktop.
An accessory for HAP-NodeJS that integrates with Sonos HTTP API server running on localhost
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
var Accessory = require('../').Accessory; | |
var Service = require('../').Service; | |
var Characteristic = require('../').Characteristic; | |
var uuid = require('../').uuid; | |
var request = require('request'); | |
// here's a fake hardware device that we'll expose to HomeKit | |
var FAKELIGHT = { | |
powerOn: false, | |
brightness: 100, // percentage | |
setPowerOn: function(on) { | |
console.log("Turning the light %s!", on ? "on" : "off"); | |
FAKELIGHT.powerOn = on; | |
console.log(on); | |
if(on){ | |
request('http://localhost:5005/master%20bedroom/playlist/romantic', function (error, response, body) { | |
console.log("Sent play request"); | |
}) | |
} | |
else{ | |
request('http://localhost:5005/master%20bedroom/pause', function (error, response, body) { | |
console.log("Sent pause request"); | |
}) | |
} | |
}, | |
setBrightness: function(brightness) { | |
console.log("Setting light brightness to %s", brightness); | |
FAKELIGHT.brightness = brightness; | |
}, | |
identify: function() { | |
console.log("Identify the light!"); | |
} | |
} | |
// Generate a consistent UUID for our light Accessory that will remain the same even when | |
// restarting our server. We use the `uuid.generate` helper function to create a deterministic | |
// UUID based on an arbitrary "namespace" and the word "light". | |
var lightUUID = uuid.generate('hap-nodejs:accessories:romantic'); | |
// This is the Accessory that we'll return to HAP-NodeJS that represents our fake light. | |
var light = exports.accessory = new Accessory('Romantic Playlist', lightUUID); | |
// Add properties for publishing (in case we're using Core.js and not BridgedCore.js) | |
light.username = "FF:FF:FF:FF:FF:FF:A5"; | |
light.pincode = "031-45-154"; | |
// set some basic properties (these values are arbitrary and setting them is optional) | |
light | |
.getService(Service.AccessoryInformation) | |
.setCharacteristic(Characteristic.Manufacturer, "Oltica") | |
.setCharacteristic(Characteristic.Model, "Rev-1") | |
.setCharacteristic(Characteristic.SerialNumber, "A1S2NASF88EW"); | |
// listen for the "identify" event for this Accessory | |
light.on('identify', function(paired, callback) { | |
FAKELIGHT.identify(); | |
callback(); // success | |
}); | |
// Add the actual Lightbulb Service and listen for change events from iOS. | |
// We can see the complete list of Services and Characteristics in `lib/gen/HomeKitTypes.js` | |
light | |
.addService(Service.Lightbulb, "Romantic Playlist") // services exposed to the user should have "names" like "Fake Light" for us | |
.getCharacteristic(Characteristic.On) | |
.on('set', function(value, callback) { | |
FAKELIGHT.setPowerOn(value); | |
callback(); // Our fake Light is synchronous - this value has been successfully set | |
}); | |
// We want to intercept requests for our current power state so we can query the hardware itself instead of | |
// allowing HAP-NodeJS to return the cached Characteristic.value. | |
light | |
.getService(Service.Lightbulb) | |
.getCharacteristic(Characteristic.On) | |
.on('get', function(callback) { | |
// this event is emitted when you ask Siri directly whether your light is on or not. you might query | |
// the light hardware itself to find this out, then call the callback. But if you take longer than a | |
// few seconds to respond, Siri will give up. | |
var err = null; // in case there were any problems | |
if (FAKELIGHT.powerOn) { | |
console.log("Are we on? Yes."); | |
callback(err, true); | |
} | |
else { | |
console.log("Are we on? No."); | |
callback(err, false); | |
} | |
}); | |
// also add an "optional" Characteristic for Brightness | |
light | |
.getService(Service.Lightbulb) | |
.addCharacteristic(Characteristic.Brightness) | |
.on('get', function(callback) { | |
callback(null, FAKELIGHT.brightness); | |
}) | |
.on('set', function(value, callback) { | |
FAKELIGHT.setBrightness(value); | |
callback(); | |
}) |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment