I would like to have a function in node RED that transforms all the data that arrives via mqtt from the controller into data that I can pass to Influx, especially the modbus_A90 data, and range of each bank data, since if I integrate directly to Influx, I do not receive this range of data .
But my knowledge is not enough to generate this function.
I copy it as I have it so that you can identify the errors I am making and, if necessary, suggest corrections.
Thank you very much in advance
const topic = msg.topic.split('/');
const message = topic[1];
var measurement = null;
var retentionPolicy = null;
var expiry = "";
var tags = "";
var data = "";
if (!isNaN(message)) {
measurement = "series";
tags = { bank: message,
series: topic[2].padStart(2, "0")
};
data = { voltage: msg.payload.voltage,
vMax: msg.payload.vMax,
vMin: msg.payload.vMin,
inttemp: msg.payload.inttemp,
exttemp: msg.payload.exttemp,
bypass: msg.payload.bypass,
PWM: msg.payload.PWM,
bypassT: msg.payload.bypassT,
bpc: msg.payload.bpc,
mAh: msg.payload.mAh
};
node.send([null, { topic: "diybms/series", bank: tags.bank, series: tags. series, payload: data}]);
} else if (message == 'status') {
measurement = "status";
tags = {};
data = { banks: msg.payload.banks,
cells: msg.payload.cells,
uptime: msg.payload.uptime,
commserr: msg.payload.commserr,
sent: msg.payload.sent,
received: msg.payload.received,
badcrc: msg.payload.badcrc,
ignored: msg.payload.ignored,
oos: msg.payload.oos,
roundtrip: msg.payload.roundtrip,
dynchargev: msg.payload.dynchargev,
dynchargec: msg.payload.dynchargec
};
} else if (message == 'modbus_A90') {
if (!msg.payload.valid || msg.payload.valid == 0) return;
measurement = "modbus_A90";
tags = {};
data = { valid: msg.payload.valid,
voltage: msg.payload.voltage,
current: msg.payload.currentm,
mAhIn: msg.payload.mAhIn,
mAhOut: msg.payload.mAhOut,
power: msg.payload.power,
temperature: msg.payload.temperature,
shuntmV: msg.payload.shuntmV,
relayState: msg.payload.relayState,
soc: msg.payload.soc
};
node.send([null, { topic: "diybms/modbus_A90", payload: data}]);
} else if (message == 'bank') {
measurement = "bank";
tags = { bank: topic[2] };
data = { voltage: msg.payload.voltage };
} else return;
return [{measurement: measurement, retentionPolicy: retentionPolicy, payload: [data, tags]}, null];
Moderator’s comment & request:
For future reference, when posting code or output, please put 3 ‘backticks’ (normally found at the top left of the keyboard) on a line of their own before the code, and 3 more backticks also on a line of their own after the code:
```
code
```
If it is something like php you can add a language identifier after the first 3 backticks: ```php
or even ```text
if you don’t want any language markup applied.