Formatear Respuesta del Inversor Voltronic al comando QPIGS.
Esta entrada está relacionada con mi vídeo (parte 3) de cómo comunicar con el Inversor Voltronic vía RS232, coger los datos a través de Node-Red y cargar los parámetros obtenidos en variables para su uso en el propio DashBoard de Node-Red, en Emoncms o cualquier otra aplicación...
El vídeo de referencia es el siguiente:
La función de análisis de la respuesta es la siguiente, está entrada la he realizado precisamente para daros disponibilidad y las podáis implementar en Node-Red tal y como describo en el vídeo.
Están los cálculos de la Potencia Reactiva y el Factor de Potencia, así cómo la hora de obtención de los datos para tener un Timestamp asociado.
La función es la siguiente (algunos datos no son exportados y están comentados ya que no los utilizo, podemos obtener los datos de este comando qué más nos interesen):
var output = msg.payload.split(" ");
let gridvoltage = parseFloat(output[0].slice(1,5));
let gridfrequency = parseFloat(output[1]);
let outputvoltage = parseFloat(output[2]);
let outputfrequency = parseFloat(output[3]);
let outputapparentpw = parseInt(output[4]);
let outputactivepw = parseInt(output[5]);
let outputloadpercent = parseInt(output[6]);
let busvoltage = parseInt(output[7]);
let batteryvoltage = parseFloat(output[8]);
let batterychargingcurrent = parseInt(output[9]);
let batterycapacity = parseInt(output[10])
let heatsinktemp = parseInt(output[11]);
let pvinputcurrentforbatt = parseInt(output[12]);
let pvinputvoltage = parseInt(output[13]);
let batteryvoltagefromscc = parseFloat(output[14]);
let batterydischargecurrent = parseInt(output[15]);
let devicestatus = parseInt(output[16].slice(0,1));
let configstatus = parseInt(output[16].slice(1,2));
let sccfirmwareversion = parseInt(output[16].slice(2,3));
let loadstatus = parseInt(output[16].slice(3,4));
let battvoltagetosteadywhilecharging = parseInt(output[16].slice(4,5));
let chargingstatus = parseInt(output[16].slice(5,6));
let chargingstatusscc = parseInt(output[16].slice(6,7));
let chargingstatusac = parseInt(output[16].slice(7,9));
let chargingonwithsccchargeon = parseInt(output[19]);
let chargingonwithacchargeon = parseInt(output[20].slice(0,1));
let chargingonwithsccandacchargeon = parseInt(output[20].slice(1,2));
var powerfactor = (outputactivepw / outputapparentpw);
powerfactor = parseFloat(powerfactor.toFixed(2));
//ojo que se opera en Radianes
var outputreactivepw = ((Math.acos(powerfactor) * 180) / 3.141592653);
outputreactivepw = Math.sin((outputreactivepw * 3.141592653) / 180) * outputapparentpw;
outputreactivepw = parseInt(outputreactivepw);
var time = new Date();
var horas = time.getHours();
var minutos = time.getMinutes();
if (minutos < 10){
minutos = "0" + minutos;
}
if (horas < 10){
horas = "0" + horas;
}
var hora = horas + ":" + minutos;
batteryvoltage = batteryvoltage.toFixed(1)
return [
{
payload: {
gridvoltage: gridvoltage,
gridfrequency: gridfrequency,
outputvoltage: outputvoltage,
outputfrequency: outputfrequency,
outputactivepw: outputactivepw,
outputapparentpw: outputapparentpw,
outputreactivepw: outputreactivepw,
outputpowerfactor: powerfactor,
outputloadpercent: outputloadpercent,
//busvoltage: busvoltage,
batteryvoltage: batteryvoltage,
batterychargingcurrent: batterychargingcurrent,
batterycapacity: batterycapacity,
heatsinktemp: heatsinktemp,
pvinputcurrentforbatt: pvinputcurrentforbatt,
pvinputvoltage: pvinputvoltage,
batteryvoltagefromscc: batteryvoltagefromscc,
batterydischargecurrent: batterydischargecurrent,
//devicestatus: devicestatus,
//configstatus: configstatus,
//sccfirmwareversion: sccfirmwareversion,
//loadstatus: loadstatus,
//battvoltagetosteadywhilecharging: battvoltagetosteadywhilecharging,
//chargingstatus: chargingstatus,
//chargingstatusscc: chargingstatusscc,
//chargingstatusac: chargingstatusac,
//chargingonwithsccchargeon: chargingonwithsccchargeon,
//chargingonwithacchargeon: chargingonwithacchargeon,
//chargingonwithsccandacchargeon: chargingonwithsccandacchargeon
} ,
fecha: {hora: hora
}
}
];