-
-
Notifications
You must be signed in to change notification settings - Fork 7
/
index.js
121 lines (106 loc) · 3.76 KB
/
index.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
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
/*
* USBRelay
* Copyright(c) 2018 Joseph Adams, github.com/josephdadams/usbrelay
* MIT Licensed
*/
'use strict';
var HID = require('node-hid');
class USBRelay
{
//gets relay devices currently connected
static get Relays()
{
const devices = HID.devices();
const connectedRelays = devices.filter(device => {
return device.product && device.product.indexOf("USBRelay") !== -1;
});
connectedRelays.forEach(device=>{
try{
device.serial = new USBRelay(device.path).getSerialNumber();
}
catch(e){
device.serial = "";
}
});
return connectedRelays;
}
constructor(devicePath)
{
if (typeof devicePath === 'undefined')
{
// Device path was not provided, so let's select the first connected device.
const devices = HID.devices();
const connectedRelays = devices.filter(device => {
return device.product && device.product.indexOf("USBRelay") !== -1;
});
if (!connectedRelays.length) {
throw new Error('No USB Relays are connected.');
}
this.device = new HID.HID(connectedRelays[0].path);
}
else
{
this.device = new HID.HID(devicePath);
}
}
//set the current state (on = true, off = false) of relayNumber
setState(relayNumber, state)
{
// Byte 0 = Report ID
// Byte 1 = State
// Byte 2 = Relay
// Bytes 3-8 = Padding
// index 0 turns all the relays on or off
var relayOn = [
[0x00, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00],
[0x00, 0xFF, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00],
[0x00, 0xFF, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00],
[0x00, 0xFF, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00],
[0x00, 0xFF, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00],
[0x00, 0xFF, 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00],
[0x00, 0xFF, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00],
[0x00, 0xFF, 0x07, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00],
[0x00, 0xFF, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00]
];
var relayOff = [
[0x00, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00],
[0x00, 0xFD, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00],
[0x00, 0xFD, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00],
[0x00, 0xFD, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00],
[0x00, 0xFD, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00],
[0x00, 0xFD, 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00],
[0x00, 0xFD, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00],
[0x00, 0xFD, 0x07, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00],
[0x00, 0xFD, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00]
];
var command = null;
if (state)
{
command = relayOn[relayNumber];
}
else
{
command = relayOff[relayNumber];
}
this.device.sendFeatureReport(command);
}
getState(relayNumber)
{
let relayIndex = relayNumber-1;
if(relayIndex<0 || relayIndex>7){
throw new Error('Invalid relayNumber must be between 1 and 8');
}
let report = this.device.getFeatureReport(0,9);
return ((report[8]>>relayIndex)&1)==1;
}
getSerialNumber()
{
let report = this.device.getFeatureReport(0,9);
let serial = new Array(5);
for(let i=0;i<5;i++){
serial[i]=String.fromCharCode( report[i+1] );
}
return serial.join("");
}
}
module.exports = USBRelay;