UNPKG

@hermannp/node-red-getproduction-fusionsolar

Version:

Get Solar electricity production amount of Huawei FusionSolar.

121 lines (109 loc) 4.15 kB
"use strict"; 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); }