-
Notifications
You must be signed in to change notification settings - Fork 0
/
index.js
124 lines (107 loc) · 3.59 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
122
123
124
// This node is designed to work with local Node-RED flow
// Refer is included flow for more information
var http = require('http');
var Service, Characteristic;
var Pilot, Button;
module.exports = function(homebridge) {
Service = homebridge.hap.Service;
Characteristic = homebridge.hap.Characteristic;
homebridge.registerAccessory("homebridge-http-light", "http-light", LightAccessory);
}
function LightAccessory(log, config) {
this.log = log;
// Configuration
this.name = config["name"];
this.lightName = config["light_name"] || this.name; // fallback to "name" if you didn't specify an exact "light_name"
this.host = config["host"] || "127.0.0.1";
// Accessory information
this.manufacturer = config["manufacturer"] || "MurchHome";
this.model = config["model"] || "MH-Light";
this.serial = config["serial"] || "LT-0001";
// Light
this.switchAddr = config["switchAddr"] || 16394; // Modbus address on remote PLC to switch light on/off (momentary/ push button)
this.statusAddr = config["statusAddr"] || 16994; // Modbus address on remote PLC to read status of light
}
function getData(pilot, host, callback) {
var param = 'raddr=' + pilot + '&rtype=c';
sendData(param,host,function(res) {
callback(res);
});
}
function getSetData(pilot, button, host, callback) {
var param = 'write=true&waddr=' + button + '&wtype=c&wmode=mom&raddr=' + pilot + '&rtype=c';
sendData(param,host,function(res) {
callback(res);
});
}
function sendData(param, host, callback) {
var req = null;
var options = {
hostname: host, // NodeRED local HTTP server
port: '1880', // NodeRED port
path: '/modbus?' + param, // HTTP access point + parameters
method: 'GET',
timeout: 2500
};
req = http.request(options, function (res) {
res.setEncoding('utf8');
res.on('data', function (chunk) {
data = JSON.parse(chunk);
callback(data);
});
});
req.on('error', function(e) {
console.log('Problem with request: ' + JSON.stringify(e));
callback(null);
});
req.end();
}
LightAccessory.prototype = {
light: undefined,
getPowerOn: function(callback) {
var that = this;
var Pilot = this.statusAddr;
var host = this.host;
getData(Pilot, host, function(returnValue) {
if (returnValue) {
callback(null,1);
} else {
callback(null,0);
}
});
},
setPowerOn: function(powerCmd, callback) {
var that = this;
var Pilot = this.statusAddr;
var Button = this.switchAddr;
var host = this.host;
getData(Pilot, host, function(returnValue) {
var status = 0;
if (returnValue) status = 1;
if (status != powerCmd) {
getSetData(Pilot, Button, host, function(returnValue2) {
that.light.getCharacteristic(Characteristic.On).getValue();
callback(null);
});
} else {
callback(null);
}
});
},
getServices: function() {
var services = [], informationService = new Service.AccessoryInformation();
informationService
.setCharacteristic(Characteristic.Manufacturer, this.manufacturer)
.setCharacteristic(Characteristic.Model, this.model)
.setCharacteristic(Characteristic.SerialNumber, this.serial);
services.push(informationService);
var lightService = new Service.Lightbulb(this.lightName + ' Light');
lightService
.getCharacteristic(Characteristic.On)
.on('get', this.getPowerOn.bind(this))
.on('set', this.setPowerOn.bind(this));
this.light = lightService;
services.push(this.light);
return services;
}
};