Created
February 12, 2016 10:18
-
-
Save jamesabruce/915e56c4d7f90d201a56 to your computer and use it in GitHub Desktop.
A simple HAP-NodeJS accessory for a DIY power socket device
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 mqtt = require('mqtt'); | |
var options = { | |
port: 1883, | |
host: '192.168.1.99', | |
clientId: 'Bedroom plug accessory' | |
}; | |
var client = mqtt.connect(options); | |
console.log("Bedroom plug Connected to MQTT broker"); | |
// 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){ | |
client.publish('bedroomplug', 'on'); | |
} | |
else{ | |
client.publish('bedroomplug', 'off'); | |
} | |
}, | |
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:bedroomplug'); | |
// This is the Accessory that we'll return to HAP-NodeJS that represents our fake light. | |
var light = exports.accessory = new Accessory('Bedroom plug', lightUUID); | |
// Add properties for publishing (in case we're using Core.js and not BridgedCore.js) | |
light.username = "FF:FF:FF:FF:FF:FF:A6"; | |
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, "Bedroom plug") // 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