@gravypower/node-red-franklinwh
Version:
Node-RED node to control FranklinWH gateway
85 lines (75 loc) • 2.96 kB
JavaScript
const apiHandler = require('../../../api-handler');
module.exports = function(RED) {
function FranklinWHGetTouNode(config) {
RED.nodes.createNode(this, config);
const node = this;
const server = RED.nodes.getNode(config.server);
const WORK_MODES = {
1: "Time of Use",
2: "Self Consumption",
3: "Emergency Backup",
tou: 1,
self: 2,
emer: 3
};
if (!server) {
node.status({fill:"red", shape:"ring", text:"missing config"});
node.error("No server configuration");
return;
}
node.on("input", async function (msg, send, done) {
try {
// Show requesting status
node.status({fill:"blue", shape:"dot", text:"requesting..."});
await apiHandler.executeWithRetry(
node,
server,
async (api) => {
// Get both TOU list and current mode
const [touList, currentMode, currentReserve] = await Promise.all([
api._getTouList(),
api.getMode(),
api.getReserve()
]);
// Format mode name for status display
const modeName = WORK_MODES[currentMode] || `Mode ${currentMode}`;
node.status({
fill: "green",
shape: "dot",
text: `${modeName} (${currentReserve}% reserve)`
});
// Format the response data
return {
current: {
mode: currentMode,
modeName: modeName,
backupReserve: currentReserve
},
available: touList.list.map(mode => ({
id: mode.id,
workMode: mode.workMode,
name: WORK_MODES[mode.workMode] || `Mode ${mode.workMode}`,
backupReserve: mode.soc
}))
};
},
msg,
send,
done
);
} catch (error) {
node.status({fill:"red", shape:"ring", text: error.message});
if (done) {
done(error);
} else {
node.error(error, msg);
}
}
});
node.on('close', function(done) {
node.status({});
done();
});
}
RED.nodes.registerType("franklinwh-get-tou", FranklinWHGetTouNode);
}