As temperatures continue to drop, I’ve been monitoring our LFP batteries, watching the battery temp get well below 32°F (0°C). I know this isn’t necessarily a problem, LFP cannot be charged below 32°F (0°C), the BMS ensures they won’t. We purchased batteries with integrated heaters because they will be installed in unheated cabinets and will be exposed to these conditions. While LFP chemistry can safely discharge down to approximately –4°F (–20°C), we’ve discovered that the batteries do not activate their internal heaters unless they are actively calling for a charge.
This creates a potential issue: during periods of sustained cold, the batteries could cool well below freezing and ultimately disconnect if they reach the low-temperature discharge limit (–4°F/–20°C). We only see temperatures that low a few days each year, but that’s going to be a problem.
We could install heating mats or cabinet heaters, but I came up with a software-based solution. Attached is a Node-RED flow that monitors the battery temperature, checks for conditions at or below 0°C, and—when necessary—temporarily forces the inverter into “invert only” mode for 10 minutes. This draws down the battery a bit, reducing SOC, then returns the inverter to “ON” prompting the batteries to request a charge and thereby activate their internal heaters. The flow then waits 20 minutes to allow heating to begin before repeating the process.
This approach ensures the battery heaters maintain temperatures in the 32–45°F (0–7°C) range and prevent the batteries from ever approaching the –4°F (–20°C) disconnect threshold. It was tested last night and worked great ![]()
Temp-Monitor.txt (3.4 KB)
[
{
"id": "78a8695a0648c390",
"type": "tab",
"label": "Flow 2",
"disabled": false,
"info": "",
"env": []
},
{
"id": "16e2f26b4ec378c3",
"type": "victron-input-battery",
"z": "78a8695a0648c390",
"service": "com.victronenergy.battery/512",
"path": "/Dc/0/Temperature",
"serviceObj": {
"service": "com.victronenergy.battery/512",
"name": "BigBattery"
},
"pathObj": {
"path": "/Dc/0/Temperature",
"type": "float",
"name": "Battery temperature (°C)"
},
"name": "Battery Temp",
"onlyChanges": false,
"roundValues": "no",
"x": 330,
"y": 180,
"wires": [
[
"46a3183356488eb5"
]
]
},
{
"id": "46a3183356488eb5",
"type": "change",
"z": "78a8695a0648c390",
"name": "BatteryTempC",
"rules": [
{
"t": "set",
"p": "BatteryTempC",
"pt": "flow",
"to": "payload",
"tot": "msg"
}
],
"action": "",
"property": "",
"from": "",
"to": "",
"reg": false,
"x": 540,
"y": 180,
"wires": [
[
"3dbf59edd172860b"
]
]
},
{
"id": "3dbf59edd172860b",
"type": "function",
"z": "78a8695a0648c390",
"name": "Battery Heater Logic",
"func": "const BatteryTempC = Number(flow.get('BatteryTempC') || 0);\nlet lockoutUntil = flow.get('lockoutUntil') || 0;\nconst now = Date.now();\n\n// If currently in lockout, exit without doing anything\nif (now < lockoutUntil) {\n return null;\n}\n\n// Only evaluate temperature if not in lockout\nif (BatteryTempC <= 0) {\n\n // Set to 2 immediately\n flow.set(\"ChargeState\", 2);\n msg.payload = 2;\n\n // After 10 minutes set back to 3\n setTimeout(() => {\n flow.set(\"ChargeState\", 3);\n node.send({ payload: 3 });\n\n // Set a new lockout for 20 minutes **after the restore**\n const newLockout = Date.now() + (20 * 60 * 1000);\n flow.set('lockoutUntil', newLockout);\n\n }, 20 * 60 * 1000);\n\n return msg;\n}\n\n// Temp > 0 and not in lockout → do nothing\nreturn null;\n",
"outputs": 1,
"timeout": 0,
"noerr": 0,
"initialize": "",
"finalize": "",
"libs": [],
"x": 800,
"y": 180,
"wires": [
[
"17040ddecb91b909"
]
]
},
{
"id": "17040ddecb91b909",
"type": "victron-output-vebus",
"z": "78a8695a0648c390",
"service": "com.victronenergy.vebus/274",
"path": "/Mode",
"serviceObj": {
"service": "com.victronenergy.vebus/274",
"name": "MultiPlus 48/2000/25-50 120V"
},
"pathObj": {
"path": "/Mode",
"type": "enum",
"name": "Switch Position",
"enum": {
"1": "Charger Only",
"2": "Inverter Only",
"3": "On",
"4": "Off"
},
"mode": "both"
},
"name": "Multiplus Charger Control",
"onlyChanges": false,
"x": 1070,
"y": 180,
"wires": []
}
]
