red-contrib-discovergy-meter
Version:
Allows to work with a Discovergy Smart Meter (Electricity only) within Node RED flows
94 lines (84 loc) • 4.04 kB
JavaScript
module.exports = async function(payload,config) {
const axios = require("axios");
const fetchTimeFrame = async function(resolution,from,to) {
responds = await axios.get("https://api.discovergy.com/public/v1/readings?meterId="+config.meterId+"&resolution="+resolution+"&from="+from+"&to="+to,{
auth: {
username: node.config.credentials.username,
password: node.config.credentials.password
}});
responds = responds.data;
let stats = {
energy: responds[responds.length -1].values.energy - responds[0].values.energy,
energyOut: responds[responds.length -1].values.energyOut - responds[0].values.energyOut
};
stats.energy_wh = Math.round(stats.energy/10000000);
stats.energyOut_wh = Math.round(stats.energyOut/10000000);
let deltayears = (to - from) / (365*86400000);
stats.baseCosts = Math.round(meterinfo.yearlyBasePrice * deltayears * 100)/100;
stats.energyCost = Math.round(meterinfo.energyPriceWh * (stats.energy_wh)*100)/100;
stats.energyRevenue = Math.round(config.revenue * (stats.energyOut_wh))/100;
stats.incomeSaldo = (stats.energyRevenue - ( stats.energyCost + stats.baseCosts ));
stats.energySaldo_wh = (stats.energyOut_wh - stats.energy_wh);
return stats;
};
payload.stats = {};
try {
// last 24 hours
if(payload.time > new Date().getTime() - 3600000) {
let to = payload.time;
let from = payload.time - (24* 3600000);
let resolution = 'three_minutes';
payload.stats.last24h = await fetchTimeFrame(resolution,from,to);
}
// today
if(payload.time > new Date().getTime() - 3600000) {
let to = payload.time;
let from = new Date(payload.time).setHours(0,0,0,0);
let resolution = 'three_minutes';
payload.stats.today = await fetchTimeFrame(resolution,from,to);
}
// yesterday
if(payload.time > new Date().getTime() - 3600000) {
let to = new Date(payload.time).setHours(0,0,0,0);
let from = to - 86400000;
let resolution = 'three_minutes';
payload.stats.yesterday = await fetchTimeFrame(resolution,from,to);
}
// monthToDay
if(payload.time > new Date().getTime() - 3600000) {
let to = payload.time;
let d = new Date(new Date(to).setHours(0,0,0,0));
let from = new Date((d.getYear()+1900) + "-" + (d.getMonth()+1) + "-1").setHours(0,0,0,0);
let resolution = 'fifteen_minutes';
payload.stats.monthToDay = await fetchTimeFrame(resolution,from,to);
}
// lastMonth
if(payload.time > new Date().getTime() - 3600000) {
let d = new Date(new Date(payload.time).setHours(0,0,0,0));
let to = new Date((d.getYear()+1900) + "-" + (d.getMonth()+1) + "-1").setHours(0,0,0,0);
d = new Date(new Date(to).getTime() - (2*86400000));
let from = new Date((d.getYear()+1900) + "-" + (d.getMonth()+1) + "-1").setHours(0,0,0,0);
let resolution = 'fifteen_minutes';
payload.stats.lastMonth = await fetchTimeFrame(resolution,from,to);
}
// yeatToDay
if(payload.time > new Date().getTime() - 3600000) {
let to = payload.time;
let d = new Date(new Date(to).setHours(0,0,0,0));
let from = new Date((d.getYear()+1900) + "-1-1").setHours(0,0,0,0);
let resolution = 'one_day';
payload.stats.yearToDay = await fetchTimeFrame(resolution,from,to);
}
// last365d
if(payload.time > new Date().getTime() - 3600000) {
let to = payload.time;
let d = new Date(new Date(to).setHours(0,0,0,0));
let from = payload.time - (365*86400000);
let resolution = 'one_day';
payload.stats.last365d = await fetchTimeFrame(resolution,from,to);
}
} catch(e) {
console.warn("Error retrieving Statistics from Discovergy API",e);
}
return payload;
};