Skip to content
This repository has been archived by the owner on Dec 28, 2022. It is now read-only.

Commit

Permalink
event node: configurable topic (close #7)
Browse files Browse the repository at this point in the history
  • Loading branch information
hobbyquaker committed Apr 21, 2019
1 parent 0833ab7 commit 7c4f63a
Show file tree
Hide file tree
Showing 4 changed files with 107 additions and 13 deletions.
20 changes: 19 additions & 1 deletion nodes/event.html
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,9 @@
defaults: {
shepherd: {value: '', type: 'zigbee-shepherd', required: true},
device: {value: ''},
events: {value: ['attReport', 'devChange']}
events: {value: ['attReport']},
topic: {value: 'zigbee/${ieeeAddr}/attReport/${epId}/${cid}/${attribute}'},
payload: {value: 'json'}
},
inputs: 0,
outputs: 1,
Expand Down Expand Up @@ -55,6 +57,7 @@
<label for="node-input-shepherd"><i class="icon-global"></i> shepherd</label>
<input type="text" id="node-input-shepherd">
</div>

<div class="form-row">
<label for="event"><i class="icon-global"></i> events</label>
<style>
Expand Down Expand Up @@ -83,11 +86,26 @@
<label for="node-input-event-devLeaving"><input type="checkbox" id="node-input-event-devLeaving"/>devLeaving</label>
</div>
</div>

<div class="form-row">
<label for="node-input-device"><i class="icon-global"></i> device</label>
<select id="node-input-device" style="width: 70%">
</select>
</div>

<div class="form-row">
<label for="node-input-topic"><i class="icon-global"></i> topic</label>
<input type="text" id="node-input-topic">
</div>

<div class="form-row">
<label for="node-input-payload"><i class="icon-global"></i> payload</label>
<select id="node-input-payload" style="width: 70%">
<option value="plain">plain, one msg per attribute</option>
<option value="json">json, all attributes in one msg</option>
</select>
</div>

</script>


Expand Down
96 changes: 86 additions & 10 deletions nodes/event.js
Original file line number Diff line number Diff line change
Expand Up @@ -16,30 +16,106 @@ module.exports = function (RED) {
this.devices = shepherdNode.devices;

this.shepherd.on('ind', message => {
console.log(message);
const event = message.type;

let ieeeAddr;
let cid;
let attribute;
let epId;
let devId;
let profId;

if (event === 'devIncoming' || event === 'devLeaving') {
ieeeAddr = message.data;
} else {
ieeeAddr = message && message.endpoints && message.endpoints[0] && message.endpoints[0].device && message.endpoints[0].device.ieeeAddr;
// Todo clarify Endpoint. Is it always 1 per attReport?
const firstEp = (message && message.endpoints && message.endpoints[0]) || {};
epId = firstEp.epId;
devId = firstEp.devId;
profId = firstEp.profId;
ieeeAddr = firstEp.device && firstEp.device.ieeeAddr;
cid = message.data.cid;
}

if (ieeeAddr && config.events.includes(message.type)) {
if (!config.device || (ieeeAddr === config.device)) {
const out = {
topic: ieeeAddr + '/' + event,
payload: message.data,
event,
device: this.devices[ieeeAddr] || {}

if (config.payload !== 'json' && message.data.data) {
Object.keys(message.data.data).forEach(attribute => {
const topicAttrs = {
name: this.devices[ieeeAddr] && this.devices[ieeeAddr].name,
ieeeAddr,
epId,
cid,
profId,
devId,
attribute,
linkquality: message.linkquality,
groupid: message.groupid
};

this.send(out);
if (ieeeAddr && config.events.includes(message.type)) {
if (!config.device || (ieeeAddr === config.device)) {
const out = {
topic: this.topicReplace(config.topic, topicAttrs),
payload: message.data.data[attribute],
event,
device: this.devices[ieeeAddr] || {}
};

this.send(out);
}
}
});
} else {
const topicAttrs = {
name: this.devices[ieeeAddr] && this.devices[ieeeAddr].name,
ieeeAddr,
epId,
cid,
profId,
devId,
linkquality: message.linkquality,
groupid: message.groupid
};

if (ieeeAddr && config.events.includes(message.type)) {
if (!config.device || (ieeeAddr === config.device)) {
const out = {
topic: this.topicReplace(config.topic, topicAttrs),
payload: (message.data && message.data.data) || message.data,
event,
device: this.devices[ieeeAddr] || {}

};

this.send(out);
}
}
}
});
}

topicReplace(topic, msg) {
if (!topic || typeof msg !== 'object') {
return topic;
}

const msgLower = {};
Object.keys(msg).forEach(k => {
msgLower[k.toLowerCase()] = msg[k];
});

const match = topic.match(/\${[^}]+}/g);
if (match) {
match.forEach(v => {
const key = v.substr(2, v.length - 3);
const rx = new RegExp('\\${' + key + '}', 'g');
const rkey = key.toLowerCase();
topic = topic.replace(rx, msgLower[rkey] || '');
});
}

return topic;
}
}

RED.nodes.registerType('zigbee-event', ZigbeeEvent);
Expand Down
2 changes: 1 addition & 1 deletion package-lock.json

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

2 changes: 1 addition & 1 deletion package.json
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
{
"name": "node-red-contrib-zigbee",
"version": "0.2.0-alpha.1",
"version": "0.2.0-alpha.2",
"keywords": [
"node-red",
"zigbee",
Expand Down

0 comments on commit 7c4f63a

Please sign in to comment.