-
Notifications
You must be signed in to change notification settings - Fork 7
/
solaredge.js
81 lines (62 loc) · 2.32 KB
/
solaredge.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
var https = require('https'),
urllib = require("url"),
EventEmitter = require('events').EventEmitter;
module.exports = function(RED) {
var API_BASE = "https://monitoringapi.solaredge.com";
function SolarEdgeSite(n) {
RED.nodes.createNode(this, n);
this.siteid = n.siteid;
this.apikey = n.apikey;
}
RED.nodes.registerType("solaredge-site", SolarEdgeSite);
function SolarEdgeNode(n) {
RED.nodes.createNode(this, n);
var node = this;
node.site = RED.nodes.getNode(n.site);
node.interval = n.interval;
node.command = n.command;
node.timer = {};
function generateURL(command, options) {
var query = "";
for (var key in options) {
query += encodeURIComponent(key) + "=" + encodeURIComponent(options[key]);
}
return API_BASE + "/site/" + node.site.siteid + "/" + command + ".json" + "?" + query;
}
function fetchData() {
node.timer = setTimeout(fetchData, node.interval * 1000);
var options = { api_key: node.site.apikey };
var url = generateURL(node.command, options);
var opts = urllib.parse(url);
opts.method = "GET";
var request = https.request(opts, function(res) {
res.setEncoding('utf8');
var msg = {};
msg.statusCode = res.statusCode;
msg.payload = "";
res.on("data", function(chunk) {
msg.payload += chunk;
node.log(chunk);
});
res.on("end",function() {
try { msg.payload = JSON.parse(msg.payload); }
catch(e) { node.warn("Invalid JSON returned"); }
node.send(msg);
node.status({});
});
});
request.on("error", function(err) {
node.error(err);
node.status({ fill: "red", shape: "dot", text: "error" });
});
request.end();
}
node.on("close", function(){
if (node.timer) {
clearTimeout(node.timer);
}
});
fetchData();
}
RED.nodes.registerType("solaredge", SolarEdgeNode);
};