Skip to content

Instantly share code, notes, and snippets.

@jamesabruce
Created February 12, 2016 10:18
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save jamesabruce/915e56c4d7f90d201a56 to your computer and use it in GitHub Desktop.
Save jamesabruce/915e56c4d7f90d201a56 to your computer and use it in GitHub Desktop.
A simple HAP-NodeJS accessory for a DIY power socket device
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