Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 3 additions & 1 deletion README.md
Original file line number Diff line number Diff line change
Expand Up @@ -47,7 +47,8 @@
"host": "192.168.0.100",
"port": "8080",
"sitemap": "demo",
"useLabelForName": true
"useLabelForName": true,
"polling": 5000
}
]
}
Expand All @@ -60,6 +61,7 @@ Fields:
* "port" - Port of the openHAB server
* "sitemap" - Sitemap name of your openHAB server
* "useLabelForName" - true if you want use item's label in the name field of HomeKit, useful if you want to use Siri. If you set this attribute to true it's important that you have unique label in your sitemap.
* "polling" - the time interval in with to check for changes from *openHAB* in milliseconds (optional, defaults to 5000).

## Advanced configuration (config.json)
If you want set custom attributes to your openHAB's item you should add "customAttrs" attribute to your config.json file.
Expand Down
3 changes: 2 additions & 1 deletion config.json
Original file line number Diff line number Diff line change
Expand Up @@ -18,7 +18,8 @@
"host": "127.0.0.1",
"port": "8080",
"sitemap":"demo",
"useLabelForName": true
"useLabelForName": true,
"pollingInterval": 5000
}
]
}
8 changes: 8 additions & 0 deletions index.js
Original file line number Diff line number Diff line change
Expand Up @@ -92,6 +92,14 @@ function OpenHABPlatform(log, config){
} else {
this.customAttrs = [];
}

if (typeof config["pollingInterval"] != 'undefined') {
this.pollingInterval = config["pollingInterval"];
} else {
this.pollingInterval = 5000;
}


}

OpenHABPlatform.prototype.accessories = function(callback) {
Expand Down
2 changes: 1 addition & 1 deletion items/AbstractItem.js
Original file line number Diff line number Diff line change
Expand Up @@ -63,7 +63,7 @@ AbstractItem.prototype.initListener = function() {
};

AbstractItem.prototype.listenerFactory = function(itemName,itemUrl,ws,log,callback) {
return new WSListener(itemName,itemUrl,ws,log,callback.bind(this)).startListener();
return new WSListener(itemName,itemUrl,ws,log,this.platform,callback.bind(this)).startListener();
};

module.exports = AbstractItem;
4 changes: 2 additions & 2 deletions items/ColorItem.js
Original file line number Diff line number Diff line change
Expand Up @@ -161,7 +161,7 @@ ColorItem.prototype.setOpenHabColorState = function (data) {
headers: {'Content-Type': 'text/plain'}
},
function (error, response, body) {
if (!error && response.statusCode == 201) {
if (!error && response.statusCode == 200) {
this.log("OpenHAB HTTP RESP <" + this.name + "> - " + "OK");
resolve(body);
} else {
Expand Down Expand Up @@ -190,7 +190,7 @@ ColorItem.prototype.setOpenHabPowerSwitchState = function (data) {
headers: {'Content-Type': 'text/plain'}
},
function (error, response, body) {
if (!error && response.statusCode == 201) {
if (!error && response.statusCode == 200) {
this.log("OpenHAB HTTP RESP <" + this.name + "> - " + "OK");
resolve(body);
} else {
Expand Down
2 changes: 1 addition & 1 deletion items/DimmerItem.js
100644 → 100755
Original file line number Diff line number Diff line change
Expand Up @@ -66,7 +66,7 @@ DimmerItem.prototype.updateOpenHabState = function (value, type, callback, conte
headers: {'Content-Type': 'text/plain'}
},
function (error, response, body) {
if (!error && response.statusCode == 201) {
if (!error && response.statusCode == 200) {
self.log("OpenHAB HTTP - response from " + self.name + ": " + body);
} else {
self.log("OpenHAB HTTP - error from " + self.name + ": " + error);
Expand Down
2 changes: 1 addition & 1 deletion items/GarageDoorOpenerItem.js
100644 → 100755
Original file line number Diff line number Diff line change
Expand Up @@ -255,7 +255,7 @@ GarageDoorOpenerItem.prototype.setTargetDoorState = function(value, callback){
headers: {'Content-Type': 'text/plain'}
},
function (error, response, body) {
if (!error && response.statusCode == 201) {
if (!error && response.statusCode == 200) {
self.log("OpenHAB HTTP - response from " + self.itemTargetDoorState.name + ": " + body);
} else {
self.log("OpenHAB HTTP - error from " + self.itemTargetDoorState.name + ": " + error);
Expand Down
2 changes: 1 addition & 1 deletion items/RollerShutterItem.js
100644 → 100755
Original file line number Diff line number Diff line change
Expand Up @@ -86,7 +86,7 @@ RollershutterItem.prototype.setItem = function(value, callback) {
headers: {'Content-Type': 'text/plain'}
},
function (error, response, body) {
if (!error && response.statusCode == 201) {
if (!error && response.statusCode == 200) {
self.log("OpenHAB HTTP - response from " + self.name + ": " + body);
self.targetPosition = parseInt(value);
} else {
Expand Down
2 changes: 1 addition & 1 deletion items/SwitchItem.js
Original file line number Diff line number Diff line change
Expand Up @@ -65,7 +65,7 @@ SwitchItem.prototype.setItemState = function(value, callback) {
this.url,
{ body: command },
function (error, response, body) {
if (!error && response.statusCode == 201) {
if (!error && response.statusCode == 200) {
self.log("OpenHAB HTTP - response from " + self.name + ": " + body);
} else {
self.log("OpenHAB HTTP - error from " + self.name + ": " + error);
Expand Down
2 changes: 1 addition & 1 deletion items/ThermostatItem.js
Original file line number Diff line number Diff line change
Expand Up @@ -174,7 +174,7 @@ ThermostatItem.prototype.setTargetTemperatureStateFromEmit = function(){
headers: {'Content-Type': 'text/plain'}
},
function (error, response, body) {
if (!error && response.statusCode == 201) {
if (!error && response.statusCode == 200) {
self.log("OpenHAB HTTP - response from " + self.itemTargetTemperature.name + " (" + (self.name)+"): " + body);
} else {
self.log("OpenHAB HTTP - error from " + self.itemTargetTemperature.name + " (" + (self.name)+"): " + error);
Expand Down
45 changes: 32 additions & 13 deletions libs/ItemFactory.js
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,7 @@ exports.ThermostatItem = require('../items/ThermostatItem.js');
exports.GarageDoorOpenerItem = require('../items/GarageDoorOpenerItem.js');
exports.ColorItem = require('../items/ColorItem.js');


exports.Factory = function(OpenHABPlatform,homebridge) {
this.platform = OpenHABPlatform;
this.log = this.platform.log;
Expand All @@ -42,6 +43,7 @@ exports.Factory.prototype.parseSitemap = function (jsonSitemap) {
if (this.itemList.hasOwnProperty(key)){

this.itemList[key] = exports.Factory.prototype.checkCustomAttrs(this.itemList[key],this.platform);

if (!(this.itemList[key].itemType in exports)){
this.log("Platform - The widget '" + this.itemList[key].label + "' of type "+this.itemList[key].type+" is an item not handled.");
continue;
Expand All @@ -63,7 +65,7 @@ exports.Factory.prototype.parseSitemap = function (jsonSitemap) {

var accessory = new exports[this.itemList[key].itemType](this.itemList[key], this.platform, this.homebridge);
this.log("Platform - Accessory Found: " + this.itemList[key].label);

if (typeof this.itemList[key].itemUniqueAggregationId !== 'undefined') {
this.uniqueIds[this.itemList[key].itemUniqueAggregationId] = accessory;
this.log("Platform - New attribute found for " + this.itemList[key].label);
Expand All @@ -79,7 +81,7 @@ exports.Factory.prototype.parseSitemap = function (jsonSitemap) {
exports.Factory.prototype.checkCustomAttrs = function(widget,platform) {
widget.manufacturer = "OpenHAB";
widget.model = widget.type;
widget.itemType = widget.type;
widget.itemType = widget.type + "Item";
widget.serialNumber = widget.name;
widget.skipItem = false;

Expand Down Expand Up @@ -119,37 +121,44 @@ exports.Factory.prototype.checkCustomAttrs = function(widget,platform) {
};

exports.Factory.prototype.traverseSitemap = function(jsonSitmap,factory) {

//initialize variables
var lastLabel="";

var lastTitle="";

for (var key in jsonSitmap) {

var name = "";
var label = "";
var type = "";
var state = "";
var link = "";
var item = undefined;

if (jsonSitmap.hasOwnProperty(key)){

if (key == "label"){
lastLabel = jsonSitmap[key];
}
if (key == "title") {
lastTitle = jsonSitmap[key];
} else if(typeof(jsonSitmap[key].title) !== 'undefined') {
lastTitle = jsonSitmap[key].title;
}

if (key == "item" && typeof(jsonSitmap[key].type) !== 'undefined'){
name = jsonSitmap[key].name;
label = (lastLabel.trim() === "") ? name : lastLabel;
type = jsonSitmap[key].type;
state = jsonSitmap[key].state;
link = jsonSitmap[key].link;

} else if (typeof(jsonSitmap[key].item) !== 'undefined'){
name = jsonSitmap[key].item.name;
label = (jsonSitmap[key].label.trim() === "") ? name : jsonSitmap[key].label;
type = jsonSitmap[key].item.type;
state = jsonSitmap[key].item.state;
link = jsonSitmap[key].item.link;
label = label+jsonSitmap[key].widgetId;
}

if (name !== ""){
Expand All @@ -164,16 +173,26 @@ exports.Factory.prototype.traverseSitemap = function(jsonSitmap,factory) {
//avoid duplicate items
if (!(name in factory.itemList)) factory.itemList[name] = item;
}

if ((typeof(jsonSitmap[key].widgets) !== 'undefined') || key === 'widgets'){

if (typeof(jsonSitmap[key].widgets) !== 'undefined'){
exports.Factory.prototype.traverseSitemap(jsonSitmap[key].widgets,factory);
} else if(key === 'widgets') {
exports.Factory.prototype.traverseSitemap(jsonSitmap[key],factory);
}
}

if ((typeof(jsonSitmap[key].widget) !== 'undefined') || (typeof(jsonSitmap[key].linkedPage) !== 'undefined') || key === 'widget'){
if (typeof(jsonSitmap[key].widget) !== 'undefined'){
exports.Factory.prototype.traverseSitemap(jsonSitmap[key].widget,factory);
} else if(key === 'widget') {
if ((typeof(jsonSitmap[key].linkedPage) !== 'undefined') || key === 'linkedPage'){

if(key === 'linkedPage') {
exports.Factory.prototype.traverseSitemap(jsonSitmap[key],factory);
} else {
exports.Factory.prototype.traverseSitemap(jsonSitmap[key].linkedPage,factory);
}
}

}

}
}
};
};
Empty file modified libs/Utility.js
100644 → 100755
Empty file.
32 changes: 10 additions & 22 deletions libs/WSListener.js
100644 → 100755
Original file line number Diff line number Diff line change
@@ -1,44 +1,32 @@
"use strict";
var request = require('request');

var WebSocket = require('ws');

var WSListener = function(itemName,itemUrl,ws,log,callback) {
var WSListener = function(itemName,itemUrl,ws,log,plattform,callback) {
this.itemName = itemName;
this.itemUrl = itemUrl;
this.log = log;
this.ws = ws;
this.plattform = plattform;
this.callback = callback;
};

WSListener.prototype.startListener = function () {
var self = this;

if (typeof this.ws == 'undefined') {
this.ws = new WebSocket(this.itemUrl.replace('http:', 'ws:') + '/state?type=json');
this.ws = this.itemUrl + '/state?type=json';
}

this.ws.on('open', function() {
self.log("OpenHAB WS - new connection for "+self.itemName);
self.runForever(15000);
});

this.ws.on('message', function(message) {
self.log("OpenHAB WS - message from " +self.itemName+": "+ message);
self.callback(message);
});

this.ws.on('close', function close() {
self.log("OpenHAB WS - closed connection for "+self.itemName);
self.ws = undefined;
self = undefined;
});
self.runForever(this.plattform.pollingInterval);
};

WSListener.prototype.runForever = function (interval) {
var self = this;
var intervalId = setInterval(function timeout() {
if (typeof self.ws !== 'undefined'){
self.ws.ping();
request(self.ws, function (error, response, body) {
if (!error && response.statusCode == 200) {
self.callback(body)
}
})
} else {
clearInterval(intervalId);
}
Expand Down