-
Notifications
You must be signed in to change notification settings - Fork 3
/
Copy pathpressuresensor.js
98 lines (92 loc) · 3.79 KB
/
pressuresensor.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
const { hasProperty, isNumber } = require('./utils');
const {battery} = require('./battery')
module.exports = function(RED) {
function MatterPressureSensor(config) {
RED.nodes.createNode(this,config);
var node = this;
node.bridge = RED.nodes.getNode(config.bridge);
node.name = config.name
node.minlevel = config.minlevel*10
node.maxlevel = config.maxlevel*10
node.ctx = this.context().global;
node.measuredValue = node.ctx.get(node.id+"-measuredValue") || null
node.bat = config.bat;
this.log(`Loading Device node ${node.id}`)
node.status({fill:"red",shape:"ring",text:"not running"});
node.identifying = false
node.identifyEvt = function() {
node.identifying = !node.identifying
if (node.identifying){
node.status({fill:"blue",shape:"dot",text:"identify"});
} else {
node.status({fill:"green",shape:"dot",text:"ready"});
}
};
this.on('input', function(msg) {
switch (msg.topic) {
case 'state':
if (hasProperty(msg, 'payload')) {
node.device.set(msg.payload)
}
if (config.wires.length != 0){
msg.payload = node.device.state
node.send(msg)
} else{
node.error((node.device.state));
}
break;
case 'battery':
if (node.bat){
battery(node, msg)
}
break
default:
if (isNumber(msg.payload)){
let value = msg.payload*10
node.device.set({pressureMeasurement: {measuredValue: value }}).catch((err) => {node.debug(err); node.error('Invalid Input')})
node.ctx.set(node.id+"-measuredValue", value)
node.measuredValue = value
} else {
node.error('Invalid Input')
}
break
}
});
this.on('serverReady', function() {
var node = this
node.device.events.identify.startIdentifying.on(node.identifyEvt)
node.device.events.identify.stopIdentifying.on(node.identifyEvt)
node.status({fill:"green",shape:"dot",text:"ready"});
})
this.on('close', async function(removed, done) {
let node = this
let rtype = removed ? 'Device was removed/disabled' : 'Device was restarted'
node.log(`Closing device: ${this.id}, ${rtype}`)
//Remove Matter.js Events
await node.device.events.identify.startIdentifying.off(node.identifyEvt)
await node.device.events.identify.stopIdentifying.off(node.identifyEvt)
//Remove Node-RED Custom Events
node.removeAllListeners('serverReady')
//Remove from Bridge Node Registered
let index = node.bridge.registered.indexOf(node);
if (index > -1) {
node.bridge.registered.splice(index, 1);
}
if (removed){
await node.device.close()
}
done();
});
//Wait till server is started
function waitforserver(node) {
if (!node.bridge.serverReady) {
setTimeout(waitforserver, 100, node)
} else {
node.log('Registering Child......')
node.bridge.emit('registerChild', node)
}
}
waitforserver(node)
}
RED.nodes.registerType("matterpressuresensor",MatterPressureSensor)
}