UNPKG

@gravypower/node-red-franklinwh

Version:

Node-RED node to control FranklinWH gateway

85 lines (75 loc) 2.96 kB
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); }