Skip to content

Instantly share code, notes, and snippets.

What would you like to do?
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: '',
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
powerOn: false,
brightness: 100, // percentage
setPowerOn: function(on) {
console.log("Turning the light %s!", on ? "on" : "off");
FAKELIGHT.powerOn = on;
client.publish('bedroomplug', 'on');
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)
.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) {
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`
.addService(Service.Lightbulb, "Bedroom plug") // services exposed to the user should have "names" like "Fake Light" for us
.on('set', function(value, callback) {
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.
.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
.on('get', function(callback) {
callback(null, FAKELIGHT.brightness);
.on('set', function(value, callback) {
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
You can’t perform that action at this time.