casa-corrently
Version:
Casa Corrently EcoSystem - Standalone and Node-RED
110 lines (101 loc) • 4.3 kB
JavaScript
module.exports = async function(msg,config,storage,RED,statsoffset) {
const crypto = require("crypto");
const os = require('os');
function Sleep(milliseconds) {
return new Promise(resolve => setTimeout(resolve, milliseconds));
}
if(config.meterId.indexOf(',') > -1) {
config.meterId = config.meterId.split(',');
}
if(typeof config.source == 'undefined') {
config.source = "./discovergy.js";
}
const source = require(config.source);
const axios = require("axios");
let node = {};
if(((typeof config.username == 'undefined') || (config.username == null)) && (typeof RED !== 'undefined')) {
node.config = RED.nodes.getNode(config.account);
} else {
node.config = config;
node.config.credentials = {
username: config.username,
password: config.password
};
}
await Sleep(100);
// Set Demo Account if data configured
if((typeof node.config.credentials.username == 'undefined') || (node.config.credentials.username == null) || (node.config.credentials.username.length < 3)) {
node.config.credentials.username = "demo@corrently.de";
node.config.credentials.password = "aNPR66nGXQhZ";
}
let doaggregation = false;
if(typeof msg.payload.latest !== 'undefined') {
aggregation = msg.payload;
doaggregation = true;
}
let meterinfo = storage.get("meterinfo_"+config.meterId);
if((typeof meterinfo === "undefined") || ( meterinfo === null)) {
const correntlyInfo = require("./corrently.js");
meterinfo = await correntlyInfo(node,storage,config);
}
if((typeof config.firstReadingDate !== 'undefined')&&(config.firstReadingDate !== null)&&((''+config.firstReadingDate).length>6)) {
meterinfo.firstMeasurementTime = new Date(config.firstReadingDate).getTime();
}
meterinfo.firstMeasurementTime = new Date(meterinfo.firstMeasurementTime).getTime();
let responds = {};
if(typeof config._logger !== 'undefined') {
config._logger.debug("Retrieve Readings for "+config.meterId);
}
try {
responds = await source.last_reading(config.meterId,node);
if((statsoffset !== null)&&(typeof statsoffset !== 'undefined')) {
responds.time -= statsoffset;
}
} catch(e) {
if(typeof config._logger !== 'undefined') {
config._logger.warn("API Request failed for meterId: "+config.meterId);
}
throw Error(e);
}
if(config.isProduction) {
let out = responds.values.energy;
responds.values.energy = responds.values.energyOut;
responds.values.energyOut = out;
}
let productionData = {};
if((typeof config.prodMeterId !== 'undefined')&&(config.prodMeterId.length > 10)) {
productionData = await source.last_reading(config.prodMeterId,node);
}
const decoratorModule = require("./decorator.js");
msg.payload = await decoratorModule( responds,meterinfo,config,productionData);
if(msg.topic == "writeconfig") {
const fs = require("fs");
fs.writeFileSync("./config.json",JSON.stringify(config));
}
if(msg.topic == "statistics") {
const statsModule = require("./stats.js");
try{
msg.payload = await statsModule( msg.payload,config,node.config,meterinfo,storage);
} catch(e) {
if(typeof config._logger !== 'undefined') {
config._logger.error("Empty history requested");
}
return msg.payload;
}
}
if(doaggregation) {
const aggregationModule = require("./aggregation.js");
msg.payload = await aggregationModule( msg.payload,aggregation);
}
if(typeof config.name !== 'undefined') {
msg.payload.name = config.name;
}
msg.payload.uuid = config.uuid;
let system_fp = os.cpus()[0].model + os.totalmem() + config.uuid; //TODO: Make it better
let config_fp = JSON.stringify(msg.payload.meterinfo);
msg.payload.fingerprint = {
config: crypto.createHash('sha256').update(config_fp).digest('base64'),
system: crypto.createHash('sha256').update(system_fp).digest('base64')
}
return msg.payload;
};