@hermannp/node-red-getproduction-fusionsolar
Version:
Get Solar electricity production amount of Huawei FusionSolar.
121 lines (109 loc) • 4.15 kB
JavaScript
;
var request = require('request');
module.exports = function(RED) {
function GetProductionFusionSolarNode(config) {
RED.nodes.createNode(this,config);
this.username = config.username;
this.systemcode = config.systemcode;
this.totalpower = config.totalpower;
this.daypower = config.daypower;
this.monthpower = config.monthpower;
this.dayincome = config.dayincome;
var node = this;
node.on('input', function(msg) {
var xsrftoken = '';
var stationcode = '';
var sumTotalPower = 0;
var sumDayPower = 0;
var sumMonthPower = 0;
var sumDayIncome = 0;
if (!node.totalpower && !node.daypower && !node.monthpower && !node.dayincome) {
msg.payload = "Error: At least one output option must be selected.";
node.send(msg);
return;
}
const optionsForAuthentication = {
url: 'https://eu5.fusionsolar.huawei.com/thirdData/login',
json: true,
body: {
userName: node.username,
systemCode: node.systemcode
}
};
request.post(optionsForAuthentication, (err, res, body) => {
if (err) {
return console.log(err);
}
var jsonres = JSON.stringify(res);
var jsonobj = JSON.parse(jsonres);
xsrftoken = jsonobj.headers["xsrf-token"];
if (xsrftoken == undefined) {
msg.payload = "Error: Invalid credentials for openAPI login";
node.send(msg);
return;
}
const optionsForGetStationList = {
url: 'https://eu5.fusionsolar.huawei.com/thirdData/getStationList',
json: true,
headers: {
'Content-Type': 'application/json',
'XSRF-token': xsrftoken
}
};
request.post(optionsForGetStationList, (err, res, body) => {
if (err) {
return console.log(err);
}
var jsonres = JSON.stringify(res);
jsonobj = JSON.parse(jsonres);
jsonobj = jsonobj.body.data;
for (let i=0; i<jsonobj.length; i++) {
let oneobj = jsonobj[i];
stationcode = stationcode.concat(oneobj.stationCode + ",");
}
stationcode = stationcode.substring(0, stationcode.length-1);
const optionsForGetRealKPI = {
url: 'https://eu5.fusionsolar.huawei.com/thirdData/getStationRealKpi',
json: true,
headers: {
'Content-Type': 'application/json',
'XSRF-token': xsrftoken
},
body: {
'stationCodes': stationcode
}
};
request.post(optionsForGetRealKPI, (err, res, body) => {
if (err) {
return console.log(err);
}
var jsonres = JSON.stringify(res);
jsonobj = JSON.parse(jsonres);
sumTotalPower = sumTotalPower + jsonobj.body.data[0].dataItemMap.total_power;
sumDayPower = sumDayPower + jsonobj.body.data[0].dataItemMap.day_power;
sumMonthPower = sumMonthPower + jsonobj.body.data[0].dataItemMap.month_power;
sumDayIncome = sumDayIncome + jsonobj.body.data[0].dataItemMap.day_income;
var resultJson = {
"total_power": sumTotalPower,
"day_power": sumDayPower,
"month_power": sumMonthPower,
"day_income": sumDayIncome
};
var resultOutput = JSON.parse(JSON.stringify(resultJson));
if (!node.totalpower) delete resultOutput["total_power"];
if (!node.daypower) delete resultOutput["day_power"];
if (!node.monthpower) delete resultOutput["month_power"];
if (!node.dayincome) delete resultOutput["day_income"];
msg.payload = resultOutput;
if (node.totalpower && !node.daypower && !node.monthpower && !node.dayincome) msg.payload = sumTotalPower;
if (!node.totalpower && node.daypower && !node.monthpower && !node.dayincome) msg.payload = sumDayPower;
if (!node.totalpower && !node.daypower && node.monthpower && !node.dayincome) msg.payload = sumMonthPower;
if (!node.totalpower && !node.daypower && !node.monthpower && node.dayincome) msg.payload = sumDayIncome;
node.send(msg);
});
});
});
});
}
RED.nodes.registerType("getProduction_FusionSolar", GetProductionFusionSolarNode);
}