axpert-monitor
Version:
Monitor Voltronic/Axpert inverter via USB
61 lines (52 loc) • 2.16 kB
JavaScript
const _ = require("lodash");
const STATUS_FALSE = "OK";
const STATUS_WARN = "Warning";
const STATUS_FAULT = "Fault";
const STATUS_COMPILE = "compile";
const WARNING_BITS = {
inverterFault: { offset: 1, status: STATUS_FAULT },
busOver: { offset: 2, status: STATUS_FAULT },
busUnder: { offset: 3, status: STATUS_FAULT },
busSoftFail: { offset: 4, status: STATUS_FAULT },
lineFail: { offset: 5, status: STATUS_WARN },
opvShort: { offset: 6, status: STATUS_WARN },
inverterVoltageLow: { offset: 7, status: STATUS_FAULT },
inverterVoltageHigh: { offset: 8, status: STATUS_FAULT },
overTemp: { offset: 9, status: STATUS_COMPILE },
fanLocked: { offset: 10, status: STATUS_COMPILE },
batteryVoltageHigh: { offset: 11, status: STATUS_COMPILE },
batteryLowAlarm: { offset: 12, status: STATUS_WARN },
batteryUnderShutdown: { offset: 14, status: STATUS_WARN },
overLoad: { offset: 16, status: STATUS_COMPILE },
eepromFault: { offset: 17, status: STATUS_WARN },
inverterOverCurrent: { offset: 18, status: STATUS_FAULT },
inverterSoftFail: { offset: 19, status: STATUS_FAULT },
selfTestFail: { offset: 20, status: STATUS_FAULT },
opDcVoltageOver: { offset: 21, status: STATUS_FAULT },
batOpen: { offset: 22, status: STATUS_FAULT },
currentSensorFail: { offset: 23, status: STATUS_FAULT },
batteryShort: { offset: 24, status: STATUS_FAULT },
powerLimit: { offset: 25, status: STATUS_WARN },
pvVoltageHigh: { offset: 26, status: STATUS_WARN },
mpptOverloadFault: { offset: 27, status: STATUS_WARN },
mpptOverloadWarning: { offset: 28, status: STATUS_WARN },
batteryTooLowToCharge: { offset: 29, status: STATUS_WARN },
};
function format(rawResponse) {
const inverterFault = rawResponse[1] === "1";
const result = {};
_.forEach(WARNING_BITS, (property, name) => {
const bitSet = rawResponse[property.offset] === "1";
if (!bitSet) {
result[name] = STATUS_FALSE;
return;
}
if (property.status === STATUS_COMPILE) {
result[name] = inverterFault ? STATUS_FAULT : STATUS_WARN;
} else {
result[name] = property.status;
}
});
return result;
}
module.exports = format;