From 7d6de732035f108b196d1be2c76f812d6498f20a Mon Sep 17 00:00:00 2001 From: hobbyquaker Date: Sat, 20 Oct 2018 17:48:51 +0200 Subject: [PATCH] create listeners for optional characteristics (#44) --- nodes/redmatic-homekit-universal.js | 70 +++++++++++++++++------------ 1 file changed, 41 insertions(+), 29 deletions(-) diff --git a/nodes/redmatic-homekit-universal.js b/nodes/redmatic-homekit-universal.js index e9629fc..2904a5c 100644 --- a/nodes/redmatic-homekit-universal.js +++ b/nodes/redmatic-homekit-universal.js @@ -40,24 +40,7 @@ module.exports = function (RED) { service = acc.addService(hap.Service[s.service], s.name, s.subtype); } service.characteristics.forEach(c => { - const cName = c.displayName.replace(/ /g, ''); - - this.debug('create change listener', s.subtype, cName); - - const changeListener = obj => { - const topic = s.subtype + '/' + cName; - this.debug('hap ->', topic, obj.newValue); - if (obj && obj.context && obj.context.request) { - this.send({ - topic, - payload: obj.newValue - }); - } - }; - - this.listeners.push({subtype: s.subtype, characteristic: c, listener: changeListener, cName}); - - c.on('change', changeListener); + this.addListener(s.subtype, c); }); }); @@ -65,17 +48,16 @@ module.exports = function (RED) { const [subtype, c] = msg.topic.split('/'); const service = acc.getService(subtype); if (service) { - //if (service.testCharacteristic(hap.Characteristic[c])) { - if (typeof msg.payload === 'object') { - this.debug('setProps ' + msg.topic + ' ' + JSON.stringify(msg.payload)); - service.getCharacteristic(hap.Characteristic[c]).setProps(msg.payload); - } else { - this.debug('-> hap ' + msg.topic + ' ' + msg.payload); - service.updateCharacteristic(hap.Characteristic[c], msg.payload); - } - //} else { - // this.error('unknown characteristic ' + c + ' on subtype ' + subtype); - //} + if (!this.hasListener(subtype, c)) { + this.addListener(subtype, service.getCharacteristic(hap.Characteristic[c])); + } + if (typeof msg.payload === 'object') { + this.debug('setProps ' + msg.topic + ' ' + JSON.stringify(msg.payload)); + service.getCharacteristic(hap.Characteristic[c]).setProps(msg.payload); + } else { + this.debug('-> hap ' + msg.topic + ' ' + msg.payload); + service.updateCharacteristic(hap.Characteristic[c], msg.payload); + } } else { this.error('unknown subtype ' + subtype); } @@ -88,6 +70,36 @@ module.exports = function (RED) { }); }); } + + addListener(subtype, c) { + const cName = c.displayName.replace(/ /g, ''); + this.debug('create change listener ' + subtype + ' ' + cName); + + const changeListener = obj => { + const topic = subtype + '/' + cName; + this.debug('hap ->', topic, obj.newValue); + if (obj && obj.context && obj.context.request) { + this.send({ + topic, + payload: obj.newValue + }); + } + }; + + this.listeners.push({subtype, characteristic: c, listener: changeListener, cName}); + + c.on('change', changeListener); + } + + hasListener(subtype, characteristicName) { + let res = false; + this.listeners.forEach(l => { + if (subtype === l.subtype && characteristicName === l.cName) { + res = true; + } + }); + return res; + } } RED.nodes.registerType('redmatic-homekit-universal', RedMaticHomeKitUniversal);