Socket
Socket
Sign inDemoInstall

node-red-contrib-deconz

Package Overview
Dependencies
Maintainers
1
Versions
146
Alerts
File Explorer

Advanced tools

Socket logo

Install Socket

Detect and block malicious and high-risk dependencies

Install

node-red-contrib-deconz - npm Package Compare versions

Comparing version 0.9.1 to 0.10.0

13

deconz.js

@@ -42,9 +42,8 @@ var request = require('request');

if (controller && controller.constructor.name === "ServerNode") {
controller.getDeviceMeta(function (items) {
if (items) {
res.json(items.state);
} else {
res.status(404).end();
}
}, config.uniqueid);
var item = controller.getDevice(config.uniqueid);
if (item) {
res.json(item.state);
} else {
res.status(404).end();
}
} else {

@@ -51,0 +50,0 @@ res.status(404).end();

@@ -11,11 +11,16 @@ module.exports = function(RED) {

node.server = RED.nodes.getNode(node.config.server);
if (!node.server) {
if (node.server) {
node.server.on('onClose', () => this.onClose());
node.server.on('onSocketError', () => this.onSocketError());
node.server.on('onSocketClose', () => this.onSocketClose());
node.server.on('onSocketOpen', () => this.onSocketOpen());
node.server.on('onSocketPongTimeout', () => this.onSocketPongTimeout());
node.server.on('onNewDevice', (uniqueid) => this.onNewDevice(uniqueid));
} else {
node.status({
fill: "red",
shape: "dot",
text: 'Server node error'
text: 'server node error'
});
}
node.sendLastState();
}

@@ -73,19 +78,18 @@

if (typeof (node.config.device) == 'string' && node.config.device.length) {
node.server.getDeviceMeta(function (deviceMeta) {
if (deviceMeta) {
node.server.devices[node.id] = deviceMeta.uniqueid;
node.meta = deviceMeta;
if (node.config.outputAtStartup) {
setTimeout(function(){
node.sendState(deviceMeta);
}, 1500); //we need this timeout after restart of node-red (homekit delays)
}
} else {
node.status({
fill: "red",
shape: "dot",
text: 'Device not found'
});
var deviceMeta = node.server.getDevice(node.config.device);
if (deviceMeta) {
node.server.devices[node.id] = deviceMeta.uniqueid;
node.meta = deviceMeta;
if (node.config.outputAtStartup) {
setTimeout(function(){
node.sendState(deviceMeta);
}, 1500); //we need this timeout after restart of node-red (homekit delays)
}
}, node.config.device);
} else {
node.status({
fill: "red",
shape: "dot",
text: 'disconnected'
});
}
} else {

@@ -95,3 +99,3 @@ node.status({

shape: "dot",
text: 'Device not set'
text: 'device not set'
});

@@ -120,2 +124,42 @@ }

onSocketPongTimeout() {
var node = this;
node.onSocketError();
}
onSocketError() {
var node = this;
node.status({
fill: "yellow",
shape: "dot",
text: 'reconnecting...'
});
}
onClose() {
var node = this;
node.onSocketClose();
}
onSocketClose() {
var node = this;
node.status({
fill: "red",
shape: "dot",
text: 'disconnected'
});
}
onSocketOpen() {
var node = this;
node.sendLastState();
}
onNewDevice(uniqueid) {
var node = this;
if (node.config.device === uniqueid) {
node.sendLastState();
}
}
}

@@ -122,0 +166,0 @@ RED.nodes.registerType('deconz-battery', deConzItemBattery);

@@ -13,10 +13,17 @@ module.exports = function(RED) {

node.server = RED.nodes.getNode(node.config.server);
if (!node.server) {
if (node.server) {
node.server.devices[node.id] = 'event';
node.server.on('onClose', () => this.onClose());
node.server.on('onSocketError', () => this.onSocketError());
node.server.on('onSocketClose', () => this.onSocketClose());
node.server.on('onSocketOpen', () => this.onSocketOpen());
node.server.on('onSocketPongTimeout', () => this.onSocketPongTimeout());
} else {
node.status({
fill: "red",
shape: "dot",
text: 'Server node error'
text: 'server node error'
});
}
node.server.devices[node.id] = 'event';

@@ -28,6 +35,41 @@ node.sendLastState();

sendLastState() {
this.status({});
var node = this;
node.status({});
}
onSocketPongTimeout() {
var node = this;
node.onSocketError();
}
onSocketError() {
var node = this;
node.status({
fill: "yellow",
shape: "dot",
text: 'reconnecting...'
});
}
onClose() {
var node = this;
node.onSocketClose();
}
onSocketClose() {
var node = this;
node.status({
fill: "red",
shape: "dot",
text: 'disconnected'
});
}
onSocketOpen() {
var node = this;
node.sendLastState();
}
}
RED.nodes.registerType('deconz-event', deConzItemEvent);
};

@@ -13,7 +13,9 @@ module.exports = function(RED) {

node.server = RED.nodes.getNode(node.config.server);
if (!node.server) {
if (node.server) {
} else {
node.status({
fill: "red",
shape: "dot",
text: 'Server node error'
text: 'server node error'
});

@@ -29,48 +31,48 @@ }

node.server.getDeviceMeta(function(deviceMeta){
if (deviceMeta) {
node.server.devices[node.id] = deviceMeta.uniqueid;
var deviceMeta = node.server.getDevice(node.config.device);
node.meta = deviceMeta;
if (deviceMeta) {
node.server.devices[node.id] = deviceMeta.uniqueid;
node.meta = deviceMeta;
//status
if ("state" in deviceMeta && "reachable" in deviceMeta.state && deviceMeta.state.reachable === false) {
node.status({
fill: "red",
shape: "ring",
text: "not reachable"
});
} else if ("config" in deviceMeta && "reachable" in deviceMeta.config && deviceMeta.config.reachable === false) {
node.status({
fill: "red",
shape: "ring",
text: "not reachable"
});
} else {
node.status({
fill: "green",
shape: "dot",
text: (config.state in node.meta.state)?(node.meta.state[config.state]?node.meta.state[config.state]:'false'):"received",
});
node.send({
payload:(config.state in node.meta.state)?node.meta.state[config.state]:node.meta.state,
meta:deviceMeta,
});
}
node.cleanTimer = setTimeout(function(){
node.status({}); //clean
}, 3000);
//status
if ("state" in deviceMeta && "reachable" in deviceMeta.state && deviceMeta.state.reachable === false) {
node.status({
fill: "red",
shape: "ring",
text: "not reachable"
});
} else if ("config" in deviceMeta && "reachable" in deviceMeta.config && deviceMeta.config.reachable === false) {
node.status({
fill: "red",
shape: "ring",
text: "not reachable"
});
} else {
node.status({
fill: "red",
fill: "green",
shape: "dot",
text: 'Device not found'
text: (config.state in node.meta.state)?(node.meta.state[config.state]?node.meta.state[config.state]:'false'):"received",
});
node.send({
payload:(config.state in node.meta.state)?node.meta.state[config.state]:node.meta.state,
meta:deviceMeta,
});
}
}, node.config.device);
node.cleanTimer = setTimeout(function(){
node.status({}); //clean
}, 3000);
} else {
node.status({
fill: "red",
shape: "dot",
text: 'Device not found'
});
}
});

@@ -77,0 +79,0 @@ } else {

@@ -11,11 +11,16 @@ module.exports = function(RED) {

node.server = RED.nodes.getNode(node.config.server);
if (!node.server) {
if (node.server) {
node.server.on('onClose', () => this.onClose());
node.server.on('onSocketError', () => this.onSocketError());
node.server.on('onSocketClose', () => this.onSocketClose());
node.server.on('onSocketOpen', () => this.onSocketOpen());
node.server.on('onSocketPongTimeout', () => this.onSocketPongTimeout());
node.server.on('onNewDevice', (uniqueid) => this.onNewDevice(uniqueid));
} else {
node.status({
fill: "red",
shape: "dot",
text: 'Server node error'
text: 'server node error'
});
}
node.sendLastState();
}

@@ -27,23 +32,22 @@

if (typeof (node.config.device) == 'string' && node.config.device.length) {
node.server.getDeviceMeta(function (deviceMeta) {
if (deviceMeta) {
node.server.devices[node.id] = deviceMeta.uniqueid;
node.meta = deviceMeta;
if (node.config.outputAtStartup) {
setTimeout(function () {
node.sendState(deviceMeta);
}, 1500); //we need this timeout after restart of node-red (homekit delays)
} else {
setTimeout(function () {
node.status({}); //clean
}, 1500); //update status with the same delay
}
var deviceMeta = node.server.getDevice(node.config.device);
if (deviceMeta !== undefined && deviceMeta && "uniqueid" in deviceMeta) {
node.server.devices[node.id] = deviceMeta.uniqueid;
node.meta = deviceMeta;
if (node.config.outputAtStartup) {
setTimeout(function () {
node.sendState(deviceMeta);
}, 1500); //we need this timeout after restart of node-red (homekit delays)
} else {
node.status({
fill: "red",
shape: "dot",
text: 'Device not found'
});
setTimeout(function () {
node.status({}); //clean
}, 1500); //update status with the same delay
}
}, node.config.device);
} else {
node.status({
fill: "red",
shape: "dot",
text: 'disconnected'
});
}
} else {

@@ -53,3 +57,3 @@ node.status({

shape: "dot",
text: 'Device not set'
text: 'device not set'
});

@@ -63,4 +67,4 @@ }

if (device.state === undefined) {
console.log("CODE: #66");
console.log(device);
// console.log("CODE: #66");
// console.log(device);
} else {

@@ -99,3 +103,3 @@ //status

formatHomeKit(device) {
formatHomeKit(device, options) {
var state = device.state;

@@ -110,2 +114,5 @@ var config = device.config;

}
if (options !== undefined && "reachable" in options && !options['reachable']) {
no_reponse = true;
}

@@ -237,2 +244,56 @@ var msg = {};

}
onSocketPongTimeout() {
var node = this;
node.onSocketError();
}
onSocketError() {
var node = this;
node.status({
fill: "yellow",
shape: "dot",
text: 'reconnecting...'
});
//send NO_RESPONSE
var deviceMeta = node.server.getDevice(node.config.device);
if (deviceMeta) {
node.send([
null,
node.formatHomeKit(deviceMeta, {reachable:false})
]);
}
}
onClose() {
var node = this;
node.onSocketClose();
}
onSocketClose() {
var node = this;
node.status({
fill: "red",
shape: "dot",
text: 'disconnected'
});
}
onSocketOpen() {
var node = this;
node.sendLastState();
}
onNewDevice(uniqueid) {
var node = this;
if (node.config.device === uniqueid) {
node.sendLastState();
}
}
}

@@ -239,0 +300,0 @@ RED.nodes.registerType('deconz-input', deConzItemIn);

@@ -13,7 +13,9 @@ var request = require('request');

node.server = RED.nodes.getNode(node.config.server);
if (!node.server) {
if (node.server) {
} else {
node.status({
fill: "red",
shape: "dot",
text: 'Server node error'
text: 'server node error'
});

@@ -28,3 +30,3 @@ }

if (typeof(config.device) == 'string' && config.device.length) {
// if (typeof(config.device) == 'string' && config.device.length) {
node.status({}); //clean

@@ -113,44 +115,61 @@

if ((/group_/g).test(node.config.device)) {
var url = 'http://' + node.server.ip + ':' + node.server.port + '/api/' + node.server.apikey + '/groups/' + ((node.config.device).split('group_').join('')) + '/action';
var post = {};
if (node.commandType == 'object' || node.commandType == 'homekit') {
post = payload;
var groupid = ((node.config.device).split('group_').join(''));
var group = node.server.getGroup(groupid);
if (group !== false) {
var url = 'http://' + node.server.ip + ':' + node.server.port + '/api/' + node.server.apikey + '/groups/' + groupid + '/action';
var post = {};
if (node.commandType == 'object' || node.commandType == 'homekit') {
post = payload;
} else {
if (command != 'on') post['on'] = true;
if (command == 'bri') post['on'] = payload > 0 ? true : false;
post[command] = payload;
}
node.postData(url, post);
} else {
if (command != 'on') post['on'] = true;
if (command == 'bri') post['on'] = payload > 0 ? true : false;
post[command] = payload;
node.status({
fill: "red",
shape: "dot",
text: 'no device'
});
node.cleanTimer = setTimeout(function(){
node.status({}); //clean
}, 3000);
}
node.postData(url, post);
} else {
node.server.getDeviceMeta(function (deviceMeta) {
if (deviceMeta) {
var url = 'http://' + node.server.ip + ':' + node.server.port + '/api/' + node.server.apikey + '/lights/' + deviceMeta.device_id + '/state';
var post = {};
if (node.commandType == 'object' || node.commandType == 'homekit') {
post = payload;
} else {
if (command != 'on') post['on'] = true;
if (command == 'bri') post['on'] = payload > 0 ? true : false;
post[command] = payload;
}
node.postData(url, post);
var deviceMeta = node.server.getDevice(node.config.device);
if (deviceMeta !== undefined && deviceMeta && "device_id" in deviceMeta) {
var url = 'http://' + node.server.ip + ':' + node.server.port + '/api/' + node.server.apikey + '/lights/' + deviceMeta.device_id + '/state';
var post = {};
if (node.commandType == 'object' || node.commandType == 'homekit') {
post = payload;
} else {
node.status({
fill: "red",
shape: "dot",
text: 'Device not found'
});
if (command != 'on') post['on'] = true;
if (command == 'bri') post['on'] = payload > 0 ? true : false;
post[command] = payload;
}
}, node.config.device);
node.postData(url, post);
} else {
node.status({
fill: "red",
shape: "dot",
text: 'no device'
});
node.cleanTimer = setTimeout(function(){
node.status({}); //clean
}, 3000);
}
}
});
} else {
node.status({
fill: "red",
shape: "dot",
text: 'Device not set'
});
}
// } else {
// node.status({
// fill: "red",
// shape: "dot",
// text: 'Device not set'
// });
// }
}

@@ -169,3 +188,14 @@

}, function(error, response, body){
if (body) {
if (error && typeof(error) === 'object') {
node.warn(error);
node.status({
fill: "red",
shape: "dot",
text: 'connection',
});
node.cleanTimer = setTimeout(function(){
node.status({}); //clean
}, 3000);
} else if (body) {
var response = JSON.parse(body)[0];

@@ -172,0 +202,0 @@

@@ -19,7 +19,9 @@ var request = require('request');

node.apikey = n.apikey;
node.pingTimeout = undefined;
node.devices = {};
node.refreshDiscoverTimer = null;
node.refreshDiscoverInterval = 15000;
node.socket = new DeconzSocket({

@@ -39,225 +41,169 @@ hostname: this.ip,

node.discoverDevices(function(){}, true);
node.discoverDevices = function (callback, forceRefresh = false) {
if (forceRefresh || node.items === undefined) {
node.discoverProcess = true;
node.log('discoverDevices: Refreshing devices list');
this.refreshDiscoverTimer = setInterval(function () {
node.discoverDevices(function(){}, true);
}, node.refreshDiscoverInterval);
}
var url = "http://" + node.ip + ":" + node.port + "/api/" + node.apikey;
node.log('discoverDevices: Requesting: ' + url);
request.get(url, function (error, result, data) {
if (error) {
callback(error);
return;
}
try {
var dataParsed = JSON.parse(data);
} catch (e) {
callback(RED._("deconz.error.invalid-json"));
return;
}
node.items = [];
if (dataParsed) {
for (var index in dataParsed.sensors) {
var prop = dataParsed.sensors[index];
prop.device_type = 'sensors';
prop.device_id = parseInt(index);
discoverDevices(callback, forceRefresh = false) {
var node = this;
node.items[prop.uniqueid] = prop;
}
if (forceRefresh || node.items === undefined) {
node.discoverProcess = true;
// node.log('discoverDevices: Refreshing devices list');
for (var index in dataParsed.lights) {
var prop = dataParsed.lights[index];
prop.device_type = 'lights';
prop.device_id = parseInt(index);
var url = "http://" + node.ip + ":" + node.port + "/api/" + node.apikey;
node.log('discoverDevices: Requesting: ' + url);
node.items[prop.uniqueid] = prop;
}
if ("groups" in dataParsed) {
node.groups = dataParsed.groups;
// console.log(node.groups);
}
}
request.get(url, function (error, result, data) {
// console.log('discoverProcess = false');
if (error) {
node.discoverProcess = false;
callback(false);
return;
}
callback(node.items);
return node.items;
});
} else {
node.log('discoverDevices: Using cached devices');
callback(node.items);
return node.items;
}
}
try {
var dataParsed = JSON.parse(data);
} catch (e) {
node.discoverProcess = false;
callback(false);
return;
}
node.getDeviceMeta = function (callback, uniqueid) {
var result = null;
node.oldItemsList = node.items !== undefined?node.items:undefined;
node.items = [];
if (dataParsed) {
for (var index in dataParsed.sensors) {
var prop = dataParsed.sensors[index];
prop.device_type = 'sensors';
prop.device_id = parseInt(index);
if (node.items === undefined && !node.discoverProcess) {
node.discoverDevices(function (items) {
if (items) {
for (var index in items) {
var item = items[index];
if (index === uniqueid) {
result = item;
break;
}
if (node.oldItemsList !== undefined && prop.uniqueid in node.oldItemsList) {} else {
node.items[prop.uniqueid] = prop;
node.emit("onNewDevice", prop.uniqueid);
}
node.items[prop.uniqueid] = prop;
}
callback(result);
return result;
}, false);
} else {
if (node.getDiscoverProcess()) {
var refreshIntervalId = setInterval(function(){
if (!node.getDiscoverProcess()) {
clearInterval(refreshIntervalId);
for (var index in dataParsed.lights) {
var prop = dataParsed.lights[index];
prop.device_type = 'lights';
prop.device_id = parseInt(index);
result = [];
if ((node.items)) {
for (var index in (node.items)) {
var item = (node.items)[index];
if (index === uniqueid) {
result = item;
break;
}
}
}
callback(result);
return result;
if (node.oldItemsList !== undefined && prop.uniqueid in node.oldItemsList) {} else {
node.items[prop.uniqueid] = prop;
node.emit("onNewDevice", prop.uniqueid);
}
}, 100);
} else {
result = [];
if ((node.items)) {
for (var index in (node.items)) {
var item = (node.items)[index];
if (index === uniqueid) {
result = item;
break;
}
}
node.items[prop.uniqueid] = prop;
}
callback(result);
return result;
if ("groups" in dataParsed) {
node.groups = dataParsed.groups;
}
}
}
node.discoverProcess = false;
callback(node.items);
return node.items;
});
} else {
node.log('discoverDevices: Using cached devices');
callback(node.items);
return node.items;
}
}
node.getItemsList = function (callback, forceRefresh = false) {
node.discoverDevices(function(items){
node.items_list = [];
for (var index in items) {
var prop = items[index];
getDiscoverProcess() {
var node = this;
return node.discoverProcess;
}
node.items_list.push({
device_name: prop.name + ' : ' + prop.type,
uniqueid: prop.uniqueid,
meta: prop
});
getDevice(uniqueid) {
var node = this;
var result = false;
if (node.items !== undefined && node.items) {
for (var index in (node.items)) {
var item = (node.items)[index];
if (index === uniqueid) {
result = item;
break;
}
}
}
return result;
}
callback(node.items_list, node.groups);
return node.items_list;
}, forceRefresh);
getGroup(groupid) {
var node = this;
var result = false;
if (node.groups !== undefined && groupid in node.groups) {
result = node.groups[groupid];
}
node.getDiscoverProcess = function() {
return node.discoverProcess;
}
return result;
}
getItemsList(callback, forceRefresh = false) {
var node = this;
node.discoverDevices(function(items){
node.items_list = [];
for (var index in items) {
var prop = items[index];
node.items_list.push({
device_name: prop.name + ' : ' + prop.type,
uniqueid: prop.uniqueid,
meta: prop
});
}
get deconz() {
return this.socket;
callback(node.items_list, node.groups);
return node.items_list;
}, forceRefresh);
}
onClose() {
clearInterval(this.refreshDiscoverTimer);
this.socket.close();
this.socket = null;
for (var nodeId in this.devices) {
var node = RED.nodes.getNode(nodeId);
if (node) {
node.status({
fill: "red",
shape: "dot",
text: 'disconnected'
});
}
}
this.emit('onClose');
}
onSocketPongTimeout() {
this.warn('WebSocket connection timeout, reconnecting');
for (var nodeId in this.devices) {
var node = RED.nodes.getNode(nodeId);
if (node) {
node.status({
fill: "red",
shape: "dot",
text: 'disconnected'
});
}
}
var that = this;
that.warn('WebSocket connection timeout, reconnecting');
that.emit('onSocketPongTimeout');
}
onSocketClose(code, reason) {
if (reason) { // don't bother the user unless there's a reason
this.warn(`WebSocket disconnected: ${code} - ${reason}`);
}
for (var nodeId in this.devices) {
var node = RED.nodes.getNode(nodeId);
if (node) {
node.status({
fill: "red",
shape: "dot",
text: 'disconnected'
});
}
}
}
onSocketUnauthorized() {
this.warn('WebSocket authentication failed');
var that = this;
that.warn('WebSocket authentication failed');
that.emit('onSocketUnauthorized');
}
onSocketError(err) {
this.warn(`WebSocket error: ${err}`);
var that = this;
that.warn(`WebSocket error: ${err}`);
that.emit('onSocketError');
}
for (var nodeId in this.devices) {
var node = RED.nodes.getNode(nodeId);
if (node) {
node.status({
fill: "yellow",
shape: "dot",
text: 'reconnecting...'
});
}
onSocketClose(code, reason) {
var that = this;
if (reason) { // don't bother the user unless there's a reason
that.warn(`WebSocket disconnected: ${code} - ${reason}`);
}
that.emit('onSocketClose');
}
onSocketOpen(err) {
// this.warn(`WebSocket opened`);
// if ("sendLastState" in config && config.sendLastState) {
for (var nodeId in this.devices) {
var node = RED.nodes.getNode(nodeId);
if (node && typeof (node.sendLastState) == 'function') {
node.sendLastState();
}
}
// }
var that = this;
that.log(`WebSocket opened`);
that.emit('onSocketOpen');
}

@@ -271,3 +217,3 @@

var node = RED.nodes.getNode(nodeId);
if (node && "type" in node && node.type === "deconz-event") {
if (node && "type" in node && node.type === "deconz-event" && serverNode && "items" in serverNode && dataParsed.uniqueid in serverNode.items) {
var serverNode = RED.nodes.getNode(node.server.id);

@@ -274,0 +220,0 @@ node.send({'payload': dataParsed, 'device': serverNode.items[dataParsed.uniqueid]});

@@ -41,3 +41,3 @@ {

},
"version": "0.9.1"
"version": "0.10.0"
}
SocketSocket SOC 2 Logo

Product

  • Package Alerts
  • Integrations
  • Docs
  • Pricing
  • FAQ
  • Roadmap
  • Changelog

Packages

npm

Stay in touch

Get open source security insights delivered straight into your inbox.


  • Terms
  • Privacy
  • Security

Made with ⚡️ by Socket Inc