'use strict'; // // HomeSeer Platform Shim for HomeBridge by Jean-Michel Joudrier - (stipus at stipus dot com) // V0.1 - 2015/10/07 // - Initial version // V0.2 - 2015/10/10 // - Occupancy sensor fix // V0.3 - 2015/10/11 // - Added TemperatureUnit=F|C option to temperature sensors // - Added negative temperature support to temperature sensors // V0.4 - 2015/10/12 // - Added thermostat support // V0.5 - 2015/10/12 // - Added Humidity sensor support // V0.6 - 2015/10/12 // - Added Battery support // - Added low battery support for all sensors // - Added HomeSeer event support (using HomeKit switches...) // V0.7 - 2015/10/13 // - You can add multiple HomeKit devices for the same HomeSeer device reference // - Added CarbonMonoxide sensor // - Added CarbonDioxide sensor // - Added onValues option to all binary sensors // V0.8 - 2015/10/14 // - Added uuid_base parameter to all accessories // V0.9 - 2015/10/16 // - Smoke sensor battery fix // - Added offEventGroup && offEventName to events (turn on launches one HS event. turn off can launch another HS event) // - Added GarageDoorOpener support // - Added Lock support // V0.10 - 2015/10/29 // - Added Security System support // - Added Window support // - Added Window Covering support // - Added obstruction support to doors, windows, and windowCoverings // // // Remember to add platform to config.json. // // You can get HomeSeer Device References by clicking a HomeSeer device name, then // choosing the Advanced Tab. // // The uuid_base parameter is valid for all events and accessories. // If you set this parameter to some unique identifier, the HomeKit accessory ID will be based on uuid_base instead of the accessory name. // It is then easier to change the accessory name without messing the HomeKit database. // // // Example: // "platforms": [ // { // "platform": "HomeSeer", // Required // "name": "HomeSeer", // Required // "host": "http://192.168.3.4:81", // Required - If you did setup HomeSeer authentication, use "http://user:password@ip_address:port" // // "events":[ // Optional - List of Events - Currently they are imported into HomeKit as switches // { // "eventGroup":"My Group", // Required - The HomeSeer event group // "eventName":"My On Event", // Required - The HomeSeer event name // "offEventGroup":"My Group", // Optional - The HomeSeer event group for turn-off // "offEventName":"My Off Event", // Optional - The HomeSeer event name for turn-off // "name":"Test", // Optional - HomeSeer event name is the default // "uuid_base":"SomeUniqueId" // Optional - HomeKit identifier will be derived from this parameter instead of the name // } // ], // // "accessories":[ // Required - List of Accessories // { // "ref":8, // Required - HomeSeer Device Reference (To get it, select the HS Device - then Advanced Tab) // "type":"Lightbulb", // Optional - Lightbulb is the default // "name":"My Light", // Optional - HomeSeer device name is the default // "offValue":"0", // Optional - 0 is the default // "onValue":"100", // Optional - 100 is the default // "can_dim":true, // Optional - true is the default - false for a non dimmable lightbulb // "uuid_base":"SomeUniqueId2" // Optional - HomeKit identifier will be derived from this parameter instead of the name. You SHOULD add this parameter to all accessories ! // }, // { // "ref":9 // This is a dimmable Lightbulb by default // }, // { // "ref":58, // This is a controllable outlet // "type":"Outlet" // }, // { // "ref":111, // Required - HomeSeer Device Reference for your sensor // "type":"TemperatureSensor", // Required for a temperature sensor // "temperatureUnit":"F", // Optional - C is the default // "name":"Bedroom temp", // Optional - HomeSeer device name is the default // "batteryRef":112, // Optional - HomeSeer device reference for the sensor battery level // "batteryThreshold":15 // Optional - If sensor battery level is below this value, the HomeKit LowBattery characteristic is set to 1. Default is 10 // }, // { // "ref":34, // Required - HomeSeer Device Reference for your sensor // "type":"SmokeSensor", // Required for a smoke sensor // "name":"Kichen smoke detector", // Optional - HomeSeer device name is the default // "batteryRef":35, // Optional - HomeSeer device reference for the sensor battery level // "batteryThreshold":15, // Optional - If sensor battery level is below this value, the HomeKit LowBattery characteristic is set to 1. Default is 10 // "onValues":[1,1.255] // Optional - List of all HomeSeer values triggering a "ON" sensor state - Default is any value different than 0 // }, // { // "ref":34, // Required - HomeSeer Device Reference for your sensor (Here it's the same device as the SmokeSensor above) // "type":"CarbonMonoxideSensor", // Required for a carbon monoxide sensor // "name":"Kichen CO detector", // Optional - HomeSeer device name is the default // "batteryRef":35, // Optional - HomeSeer device reference for the sensor battery level // "batteryThreshold":15, // Optional - If sensor battery level is below this value, the HomeKit LowBattery characteristic is set to 1. Default is 10 // "onValues":[2,2.255] // Optional - List of all HomeSeer values triggering a "ON" sensor state - Default is any value different than 0 // }, // { // "ref":113, // Required - HomeSeer Device Reference of the Current Temperature Device // "type":"Thermostat", // Required for a Thermostat // "name":"Température Salon", // Optional - HomeSeer device name is the default // "temperatureUnit":"C", // Optional - F for Fahrenheit, C for Celsius, C is the default // "setPointRef":167, // Required - HomeSeer device reference for your thermostat Set Point. // "setPointReadOnly":true, // Optional - Set to false if your SetPoint is read/write. true is the default // "stateRef":166, // Required - HomeSeer device reference for your thermostat current state // "stateOffValues":[0,4,5], // Required - List of the HomeSeer device values for a HomeKit state=OFF // "stateHeatValues":[1], // Required - List of the HomeSeer device values for a HomeKit state=HEAT // "stateCoolValues":[2], // Required - List of the HomeSeer device values for a HomeKit state=COOL // "stateAutoValues":[3], // Required - List of the HomeSeer device values for a HomeKit state=AUTO // "controlRef":168, // Required - HomeSeer device reference for your thermostat mode control (It can be the same as stateRef for some thermostats) // "controlOffValue":0, // Required - HomeSeer device control value for OFF // "controlHeatValue":1, // Required - HomeSeer device control value for HEAT // "controlCoolValue":2, // Required - HomeSeer device control value for COOL // "controlAutoValue":3, // Required - HomeSeer device control value for AUTO // "coolingThresholdRef":169, // Optional - Not-implemented-yet - HomeSeer device reference for your thermostat cooling threshold // "heatingThresholdRef":170 // Optional - Not-implemented-yet - HomeSeer device reference for your thermostat heating threshold // }, // { // "ref":200, // Required - HomeSeer Device Reference of a garage door opener // "type":"GarageDoorOpener", // Required for a Garage Door Opener // "name":"Garage Door", // Optional - HomeSeer device name is the default // "stateRef":201, // Required - HomeSeer device reference for your garage door opener current state (can be the same as ref) // "stateOpenValues":[0], // Required - List of the HomeSeer device values for a HomeKit state=OPEN // "stateClosedValues":[1], // Required - List of the HomeSeer device values for a HomeKit state=CLOSED // "stateOpeningValues":[2], // Optional - List of the HomeSeer device values for a HomeKit state=OPENING // "stateClosingValues":[3], // Optional - List of the HomeSeer device values for a HomeKit state=CLOSING // "stateStoppedValues":[4], // Optional - List of the HomeSeer device values for a HomeKit state=STOPPED // "controlRef":201, // Required - HomeSeer device reference for your garage door opener control (can be the same as ref and stateRef) // "controlOpenValue":0, // Required - HomeSeer device control value for OPEN // "controlCloseValue":1, // Required - HomeSeer device control value for CLOSE // "obstructionRef":201, // Optional - HomeSeer device reference for your garage door opener obstruction state (can be the same as ref) // "obstructionValues":[5], // Optional - List of the HomeSeer device values for a HomeKit obstruction state=OBSTRUCTION // "lockRef":202, // Optional - HomeSeer device reference for your garage door lock (can be the same as ref) // "lockUnsecuredValues":[0], // Optional - List of the HomeSeer device values for a HomeKit lock state=UNSECURED // "lockSecuredValues":[1], // Optional - List of the HomeSeer device values for a HomeKit lock state=SECURED // "lockJammedValues":[2], // Optional - List of the HomeSeer device values for a HomeKit lock state=JAMMED // "unlockValue":0, // Optional - HomeSeer device control value to unlock the garage door opener // "lockValue":1 // Optional - HomeSeer device control value to lock the garage door opener // }, // { // "ref":210, // Required - HomeSeer Device Reference of a Lock // "type":"Lock", // Required for a Lock // "name":"Main Door Lock", // Optional - HomeSeer device name is the default // "lockUnsecuredValues":[0], // Required - List of the HomeSeer device values for a HomeKit lock state=UNSECURED // "lockSecuredValues":[1], // Required - List of the HomeSeer device values for a HomeKit lock state=SECURED // "lockJammedValues":[2], // Optional - List of the HomeSeer device values for a HomeKit lock state=JAMMED // "unlockValue":0, // Required - HomeSeer device control value to unlock // "lockValue":1 // Required - HomeSeer device control value to lock // }, // { // "ref":230, // Required - HomeSeer Device Reference of a Security System // "type":"SecuritySystem", // Required for a security system // "name":"Home alarm", // Optional - HomeSeer device name is the default // "armedStayValues":[0], // Optional - List of the HomeSeer device values for a HomeKit security state=ARMED-STAY // "armedAwayValues":[1], // Optional - List of the HomeSeer device values for a HomeKit security state=ARMED-AWAY // "armedNightValues":[2], // Optional - List of the HomeSeer device values for a HomeKit security state=ARMED-NIGHT // "disarmedValues":[3], // Optional - List of the HomeSeer device values for a HomeKit security state=DISARMED // "alarmValues":[4], // Optional - List of the HomeSeer device values for a HomeKit security state=ALARM // "armStayValue":0, // Required - HomeSeer device control value to arm in stay mode. If you don't have this mode, select any value that arms your system // "armAwayValue":1, // Required - HomeSeer device control value to arm in away mode. If you don't have this mode, select any value that arms your system // "armNightValue":2, // Required - HomeSeer device control value to arm in night mode. If you don't have this mode, select any value that arms your system // "disarmValue":3 // Required - HomeSeer device control value to disarm security system // }, // { // "ref":115, // Required - HomeSeer Device Reference for a device holding battery level (0-100) // "type":"Battery", // Required for a Battery // "name":"Roomba battery", // Optional - HomeSeer device name is the default // "batteryThreshold":15 // Optional - If the level is below this value, the HomeKit LowBattery characteristic is set to 1. Default is 10 // }, // { // "ref":240, // Required - HomeSeer Device Reference for a door - HomeSeer values must go from 0 (closed) to 100 (open) // "type":"Door", // Required for a Door // "name":"Main door", // Optional - HomeSeer device name is the default // "obstructionRef":241, // Optional - HomeSeer device reference for your door obstruction state (can be the same as ref) // "obstructionValues":[1] // Optional - List of the HomeSeer device values for a HomeKit obstruction state=OBSTRUCTION // } // ] // } // ], // // // SUPORTED TYPES: // - Lightbulb (can_dim, onValue, offValue options) // - Fan (onValue, offValue options) // - Switch (onValue, offValue options) // - Outlet (onValue, offValue options) // - Thermostat (temperatureUnit, setPoint, state, control options) // - TemperatureSensor (temperatureUnit=C|F) // - HumiditySensor (HomeSeer device value in % - batteryRef, batteryThreshold options) // - LightSensor (HomeSeer device value in Lux - batteryRef, batteryThreshold options) // - ContactSensor (onValues, batteryRef, batteryThreshold options) // - MotionSensor (onValues, batteryRef, batteryThreshold options) // - LeakSensor (onValues, batteryRef, batteryThreshold options) // - OccupancySensor (onValues, batteryRef, batteryThreshold options) // - SmokeSensor (onValues, batteryRef, batteryThreshold options) // - CarbonMonoxideSensor (onValues, batteryRef, batteryThreshold options) // - CarbonDioxideSensor (onValues, batteryRef, batteryThreshold options) // - Battery (batteryThreshold option) // - GarageDoorOpener (state, control, obstruction, lock options) // - Lock (unsecured, secured, jammed options) // - SecuritySystem (arm, disarm options) // - Door (obstruction option) // - Window (obstruction option) // - WindowCovering (obstruction option) //var Service = require("../api").homebridge.hap.Service; //var Characteristic = require("../api").homebridge.hap.Characteristic; var request = require("request"); var http = require('http'); var Accessory, Service, Characteristic, UUIDGen; var _services = []; module.exports = function(homebridge) { console.log("homebridge API version: " + homebridge.version); // Accessory must be created from PlatformAccessory Constructor Accessory = homebridge.platformAccessory; // Service and Characteristic are from hap-nodejs Service = homebridge.hap.Service; Characteristic = homebridge.hap.Characteristic; UUIDGen = homebridge.hap.uuid; // For platform plugin to be considered as dynamic platform plugin, // registerPlatform(pluginName, platformName, constructor, dynamic), dynamic must be true homebridge.registerPlatform("homebridge-HomeSeerPlatform", "HomeSeer", HomeSeerPlatform, true); } function httpRequest(url, method, callback) { request({ url: url, method: method }, function (error, response, body) { callback(error, response, body) }) } function HomeSeerPlatform(log, config, api){ this.log = log; this.config = config; } HomeSeerPlatform.prototype = { accessories: function(callback) { var that = this; var foundAccessories = []; if( this.config.events ) { this.log("Creating HomeSeer events."); for( var i=0; i