**Updated flow added April 1 2026
Read this first:** How does the Multiplus trickle charger work
Summary:
For an RV build, I’ve built a Node-RED Flow to control when the Multiplus’ trickle charge circuit is allowed to be connected to the starter battery. I wanted to use the MPs built-in feature, but I wanted it to be switched (on-screen and remotely) and wanted it to be automated, and wanted it to be smarter than just based on voltages or voltage drop. The behavior described in the link above would actually work out just fine for me, but DIY improving it was well worth the effort.
The solution enables using switches (on-screen for me but could be physical+digital-input if desired) in the GX system to toggle the trickle charge on and off. You could do that part without Node-RED. You have more options if you use Node-RED. In the finished product you have the option to fully disable trickle charging, or fully enable it, or let it occur automatically when configured conditions are suitable.
The Outcome:
A 3-state switch is presented in the UI that can be set to Auto, On or Off.
The automated mode waits until the sun is up, gives the starter battery up to 6 hours of trickle charging if warranted, then turns off. This is possible every day, but won’t happen unless the conditions are suitable, including that the starter battery actually needs maintenance charging. Any number of conditions can interrupt and disable the charging if they arise.
- Auto:
- May turn on if: the sun is up, OR shore power is connected, AND the starter battery is in low SoC AND the Domestic battery is in good SoC
- Won’t turn on, Will turn off if: the Domestic battery Voltage is too high for safe AGM charging, OR “enable/disable” switch is off, OR the ignition is on, OR the starter battery is already in good SoC, OR it’s too cold/hot, OR there’s no shore power or PV available.
- Manual: The user can enable or disable charging regardless of conditions.
Details:
The Node-RED flow handles logic for enabling/disabling the trickle charge circuit conditionally based on all the factors I could think of to include.
- SoC of the Domestic Battery (Smart Shunt provides)
- Voltage of Domestic and Starter batteries (Smart Shunt provides)
- Battery Temperature (MP Provides)
- Cabin Temperature in starter battery location (instead of actual temp probe on battery)
- Vehicle Ignition state (Digital Input on GX)
- Multiplus AC-In state
- Multiplus on/off/charge/invert switch state
- MPPT wattage and voltage (to infer available PV power)
- State of 3-state UI switch
There aren’t many hardware connections. Just the minimally required signals and relay, since the switching is in software.
- The system is not isolated between Domestic battery and Starter battery. Both batteries are 12V systems. Domestic is LiFePO, Starter is AGM.
- The MP trickle charge blade is wired to the COMM pin of an external relay controlled by a relay in the GX device. The starter positive circuit is connected to NO pin of that external relay. The external relay just enables me to avoid passing current through the GX onboard relay.
- An ignition signal wire is connected to a digital input in the GX device via an optocoupler (opto because my GX is a RasPi4 and the input is 5v.)
- A D+ (engine run) signal would be more appropriate, but in my case ‘Ignition On’ signal was easier available. Beware that if you have autostart or remote start, you could have a vehicle where the engine can run without the ignition being considered “on” or sending that signal. That’s why ‘Engine On’ is a better condition if available.
Pics:
The Flow:
This won’t work out of the box unless your installation is identical to mine. It could be easily reconfigured by anyone who’s already familiar with Node-RED though.
[
{
"id": "d554211af8433969",
"type": "tab",
"label": "TR Charge V4",
"disabled": false,
"info": "",
"env": []
},
{
"id": "b1ea313624c02296",
"type": "function",
"z": "d554211af8433969",
"name": "Set Limit Values in Flow Context",
"func": "context.data = context.data || {};\n\nswitch (msg.topic) {\n case \"HVH\":\n context.data.hvh = msg.payload;\n msg = null;\n break;\n case \"TEMPLOW\":\n context.data.templow = msg.payload;\n msg = null;\n break;\n case \"HTEMPLOW\":\n context.data.htemplow = msg.payload;\n msg = null;\n break;\n case \"HTEMPHIGH\":\n context.data.htemphigh = msg.payload;\n msg = null;\n break;\n case \"STARTVLOW\":\n context.data.stvlow = msg.payload;\n msg = null;\n break;\n case \"STARTVSUFF\":\n context.data.stvsuff = msg.payload;\n msg = null;\n break;\n case \"HSOCSUFF\":\n context.data.hsocsuff = msg.payload;\n msg = null;\n break;\n case \"SOLARVSUFF\":\n context.data.solarvsuff = msg.payload;\n msg = null;\n break;\n case \"SOLARWSUFF\":\n context.data.solarwsuff = msg.payload;\n msg = null;\n break;\n \n default:\n msg = null;\n \tbreak;\n\n}\n\nflow.set('HOUSEVHIGH',context.data.hvh);\nflow.set('TEMPLOW',context.data.templow);\nflow.set('HTEMPLOW',context.data.htemplow);\nflow.set('HTEMPHIGH',context.data.htemphigh);\nflow.set('STARTVLOW',context.data.stvlow);\nflow.set('STARTVSUFF',context.data.stvsuff);\nflow.set('HSOCSUFF',context.data.hsocsuff);\nflow.set('SOLARVSUFF',context.data.solarvsuff);\nflow.set('SOLARWSUFF',context.data.solarwsuff);\n",
"outputs": 2,
"timeout": 0,
"noerr": 0,
"initialize": "",
"finalize": "",
"libs": [],
"x": 430,
"y": 160,
"wires": [
[],
[]
],
"outputLabels": [
"Turn On (close) Relay",
"Turn OFF (open) Relay"
],
"info": "This is used to store the values as flow.context data. "
},
{
"id": "e16aea3266b07db9",
"type": "inject",
"z": "d554211af8433969",
"name": "Starter V Low",
"props": [
{
"p": "payload"
},
{
"p": "topic",
"vt": "str"
}
],
"repeat": "",
"crontab": "",
"once": true,
"onceDelay": 0.1,
"topic": "STARTVLOW",
"payload": "12.50",
"payloadType": "num",
"x": 120,
"y": 40,
"wires": [
[
"b1ea313624c02296"
]
]
},
{
"id": "c0269fc481fa1d55",
"type": "inject",
"z": "d554211af8433969",
"name": "Starter V Sufficient",
"props": [
{
"p": "payload"
},
{
"p": "topic",
"vt": "str"
}
],
"repeat": "",
"crontab": "",
"once": true,
"onceDelay": 0.1,
"topic": "STARTVSUFF",
"payload": "14.0",
"payloadType": "num",
"x": 130,
"y": 80,
"wires": [
[
"b1ea313624c02296"
]
]
},
{
"id": "01cbfc8b9a98576d",
"type": "inject",
"z": "d554211af8433969",
"name": "House SOC Sufficient",
"props": [
{
"p": "payload"
},
{
"p": "topic",
"vt": "str"
}
],
"repeat": "",
"crontab": "",
"once": true,
"onceDelay": 0.1,
"topic": "HSOCSUFF",
"payload": "80",
"payloadType": "num",
"x": 140,
"y": 160,
"wires": [
[
"b1ea313624c02296"
]
]
},
{
"id": "6413d5a3c9b8d535",
"type": "inject",
"z": "d554211af8433969",
"name": "Solar V Sufficient",
"props": [
{
"p": "payload"
},
{
"p": "topic",
"vt": "str"
}
],
"repeat": "",
"crontab": "",
"once": true,
"onceDelay": 0.1,
"topic": "SOLARVSUFF",
"payload": "12",
"payloadType": "num",
"x": 130,
"y": 200,
"wires": [
[
"b1ea313624c02296"
]
]
},
{
"id": "3bde1396210daf4d",
"type": "inject",
"z": "d554211af8433969",
"name": "Solar W Sufficient",
"props": [
{
"p": "payload"
},
{
"p": "topic",
"vt": "str"
}
],
"repeat": "",
"crontab": "",
"once": true,
"onceDelay": 0.1,
"topic": "SOLARWSUFF",
"payload": "1",
"payloadType": "num",
"x": 130,
"y": 240,
"wires": [
[
"b1ea313624c02296"
]
]
},
{
"id": "c4dde77756334495",
"type": "inject",
"z": "d554211af8433969",
"name": "Ambient Temp Low",
"props": [
{
"p": "payload"
},
{
"p": "topic",
"vt": "str"
}
],
"repeat": "",
"crontab": "",
"once": true,
"onceDelay": 0.1,
"topic": "TEMPLOW",
"payload": "2.4",
"payloadType": "num",
"x": 130,
"y": 280,
"wires": [
[
"b1ea313624c02296"
]
]
},
{
"id": "f956b125144a76c4",
"type": "inject",
"z": "d554211af8433969",
"name": "House V High",
"props": [
{
"p": "payload"
},
{
"p": "topic",
"vt": "str"
}
],
"repeat": "",
"crontab": "",
"once": true,
"onceDelay": 0.1,
"topic": "HVH",
"payload": "14.2",
"payloadType": "num",
"x": 120,
"y": 120,
"wires": [
[
"b1ea313624c02296"
]
]
},
{
"id": "8d3458aa1003f1ad",
"type": "function",
"z": "d554211af8433969",
"name": "Auto-Enable if Conditions Suit",
"func": "context.data = context.data || {};\n\nlet hvh = flow.get('HOUSEVHIGH');\nlet templow = flow.get('TEMPLOW');\nlet stvlow = flow.get('STARTVLOW');\nlet stvsuff = flow.get('STARTVSUFF');\nlet hsocsuff = flow.get('HSOCSUFF');\nlet solarvsuff = flow.get('SOLARVSUFF');\nlet solarwsuff = flow.get('SOLARWSUFF');\n\nswitch (msg.topic) {\n case \"HV\":\n context.data.hbattv = msg.payload;\n msg = null;\n break;\n case \"INC\":\n context.data.inc = msg.payload;\n msg = null;\n break;\n case \"STRTR\":\n context.data.strtr = msg.payload;\n msg = null;\n break;\n case \"MPSW\":\n context.data.mpsw = msg.payload;\n msg = null;\n break;\n case \"MPIN\":\n context.data.mpin = msg.payload;\n msg = null;\n break;\n case \"MPPTV\":\n context.data.mppt = msg.payload;\n msg = null;\n break;\n case \"MPPTW\":\n context.data.mpptw = msg.payload;\n msg = null;\n break;\n case \"STRTV\":\n context.data.strtv = msg.payload;\n msg = null;\n break; \n case \"HSOC\":\n context.data.hsoc = msg.payload;\n msg = null;\n break;\n case \"3SSA\":\n context.data.ssa = msg.payload;\n msg = null;\n break;\n \n default:\n msg = null;\n \tbreak;\n\n}\n\nif(context.data.mppt != null && context.data.strtv != null && context.data.hsoc != null) {\n \n\t if (context.data.hbattv <= hvh && context.data.strtv <= stvlow && context.data.hsoc >= hsocsuff && context.data.mpin == 240 && context.data.mppt >= solarvsuff && context.data.mpptw >= solarwsuff && context.data.ssa == 1 && context.data.strtr == 11 && context.data.inc >= templow ){ //If: STRTV is low, HSOC is suff, No Shore connection, Solar Power Suff, No UISwitch/Ignition/Temp override active\n\t return [{payload:\"1\"},null] // Turn on relay\n\t \n\t } else if (context.data.hbattv <= hvh && context.data.strtv <= stvlow && context.data.hsoc >= hsocsuff && context.data.mpin == 0 && (context.data.mpsw == 3 || context.data.mpsw == 1) && context.data.ssa == 1 && context.data.strtr == 11 && context.data.inc >= templow ){ //If: HSOC is suff, Shore Power Available, No UISwitch/Ignition/Temp override active\n\t return [{payload:\"1\"},null] // Turn on relay\n\t \n\t } else return [null,{payload:\"0\"}] // Turn off relay if neither Solar or Shore available\n\t \n \n} else return msg; //Ends the function without sending a message if one of the context data values is not available",
"outputs": 2,
"timeout": 0,
"noerr": 0,
"initialize": "",
"finalize": "",
"libs": [],
"x": 490,
"y": 720,
"wires": [
[
"e334c3949a28d67e"
],
[]
],
"outputLabels": [
"Turn On (close) Relay",
"Turn OFF (open) Relay"
],
"info": "This enables trickle charging if the Switch is set to Auto, AND the conditions of the batteries are appropriate for charging, AND one of these conditions are met: A)Shore power is connected B)PV power is available. \nBehavior when the switch is set to On or Off is controlled by a separate function. "
},
{
"id": "a5709779258e3697",
"type": "victron-input-solarcharger",
"z": "d554211af8433969",
"service": "com.victronenergy.solarcharger/289",
"path": "/Pv/V",
"serviceObj": {
"service": "com.victronenergy.solarcharger/289",
"name": "MPPT"
},
"pathObj": {
"path": "/Pv/V",
"type": "float",
"name": "PV voltage"
},
"initial": "",
"name": "MPPTV",
"onlyChanges": true,
"roundValues": "2",
"outputs": 1,
"x": 70,
"y": 540,
"wires": [
[
"8d3458aa1003f1ad",
"704601ce78c7d409"
]
],
"outputLabels": [
"solarA"
]
},
{
"id": "b8b6b9634e0b4d4c",
"type": "victron-input-battery",
"z": "d554211af8433969",
"service": "com.victronenergy.battery/290",
"path": "/Soc",
"serviceObj": {
"service": "com.victronenergy.battery/290",
"name": "Main Shunt"
},
"pathObj": {
"path": "/Soc",
"type": "float",
"name": "State of charge (%)"
},
"name": "HSOC",
"onlyChanges": true,
"roundValues": "2",
"outputs": 1,
"x": 70,
"y": 660,
"wires": [
[
"8d3458aa1003f1ad",
"704601ce78c7d409"
]
]
},
{
"id": "aa2ab6cff8fd3b99",
"type": "victron-input-vebus",
"z": "d554211af8433969",
"service": "com.victronenergy.vebus/288",
"path": "/Ac/ActiveIn/ActiveInput",
"serviceObj": {
"service": "com.victronenergy.vebus/288",
"name": "MultiPlus 12/3000/120-50 120V"
},
"pathObj": {
"path": "/Ac/ActiveIn/ActiveInput",
"type": "enum",
"name": "Active input",
"enum": {
"0": "AC Input 1",
"1": "AC Input 2",
"240": "Disconnected"
}
},
"initial": "",
"name": "MPIN",
"onlyChanges": true,
"outputs": 1,
"x": 210,
"y": 480,
"wires": [
[
"8d3458aa1003f1ad",
"704601ce78c7d409"
]
]
},
{
"id": "10e1ddfa6d52f158",
"type": "victron-input-battery",
"z": "d554211af8433969",
"service": "com.victronenergy.battery/290",
"path": "/Dc/1/Voltage",
"serviceObj": {
"service": "com.victronenergy.battery/290",
"name": "Main Shunt"
},
"pathObj": {
"path": "/Dc/1/Voltage",
"type": "float",
"name": "Starter battery voltage (V)"
},
"name": "STRTV",
"onlyChanges": true,
"roundValues": "2",
"outputs": 1,
"x": 70,
"y": 600,
"wires": [
[
"8d3458aa1003f1ad",
"704601ce78c7d409"
]
]
},
{
"id": "65afa19d6674c748",
"type": "victron-input-solarcharger",
"z": "d554211af8433969",
"service": "com.victronenergy.solarcharger/289",
"path": "/Yield/Power",
"serviceObj": {
"service": "com.victronenergy.solarcharger/289",
"name": "SmartSolar Charger MPPT 100/20 48V"
},
"pathObj": {
"path": "/Yield/Power",
"type": "float",
"name": "PV Power (W)"
},
"name": "MPPTW",
"onlyChanges": true,
"outputs": 1,
"x": 220,
"y": 540,
"wires": [
[
"8d3458aa1003f1ad",
"704601ce78c7d409"
]
]
},
{
"id": "e334c3949a28d67e",
"type": "change",
"z": "d554211af8433969",
"name": "Turn Relay On",
"rules": [
{
"t": "set",
"p": "payload",
"pt": "msg",
"to": "1",
"tot": "num"
}
],
"action": "",
"property": "",
"from": "",
"to": "",
"reg": false,
"x": 540,
"y": 680,
"wires": [
[
"b9c2957c9a55b2ad"
]
]
},
{
"id": "7b221d78614de648",
"type": "victron-input-vebus",
"z": "d554211af8433969",
"service": "com.victronenergy.vebus/288",
"path": "/Mode",
"serviceObj": {
"service": "com.victronenergy.vebus/288",
"name": "MultiPlus 12/3000/120-50 120V"
},
"pathObj": {
"path": "/Mode",
"type": "enum",
"name": "Switch Position",
"enum": {
"1": "Charger Only",
"2": "Inverter Only",
"3": "On",
"4": "Off"
}
},
"initial": "",
"name": "MPSW",
"onlyChanges": true,
"outputs": 1,
"x": 70,
"y": 480,
"wires": [
[
"8d3458aa1003f1ad",
"704601ce78c7d409"
]
]
},
{
"id": "a3781e69fc70a373",
"type": "victron-input-digitalinput",
"z": "d554211af8433969",
"service": "com.victronenergy.digitalinput/1",
"path": "/State",
"serviceObj": {
"service": "com.victronenergy.digitalinput/1",
"name": "Engine"
},
"pathObj": {
"path": "/State",
"type": "enum",
"name": "Digital input state",
"enum": {
"0": "low",
"1": "high",
"2": "off",
"3": "on",
"4": "no",
"5": "yes",
"6": "open",
"7": "closed",
"8": "ok",
"9": "alarm",
"10": "running",
"11": "stopped"
}
},
"initial": "",
"name": "STRTR",
"onlyChanges": true,
"outputs": 1,
"x": 210,
"y": 600,
"wires": [
[
"8d3458aa1003f1ad",
"704601ce78c7d409"
]
]
},
{
"id": "63e0b7072a30435b",
"type": "victron-input-temperature",
"z": "d554211af8433969",
"service": "com.victronenergy.temperature/101",
"path": "/Temperature",
"serviceObj": {
"service": "com.victronenergy.temperature/101",
"name": "Garage",
"communityTag": "temperature"
},
"pathObj": {
"path": "/Temperature",
"type": "float",
"name": "Temperature (°C)"
},
"name": "INC",
"onlyChanges": false,
"roundValues": "2",
"outputs": 1,
"conditionalMode": false,
"outputTrue": "",
"outputFalse": "",
"debounce": "",
"x": 70,
"y": 720,
"wires": [
[
"8d3458aa1003f1ad",
"704601ce78c7d409"
]
]
},
{
"id": "704601ce78c7d409",
"type": "function",
"z": "d554211af8433969",
"name": "Non-Auto Disable/Enable",
"func": "context.data = context.data || {};\n\nlet hvh = flow.get('HOUSEVHIGH');\nlet templow = flow.get('TEMPLOW');\nlet stvlow = flow.get('STARTVLOW');\nlet stvsuff = flow.get('STARTVSUFF');\nlet hsocsuff = flow.get('HSOCSUFF');\nlet solarvsuff = flow.get('SOLARVSUFF');\nlet solarwsuff = flow.get('SOLARWSUFF');\n\nswitch (msg.topic) {\n case \"HV\":\n context.data.hbattv = msg.payload;\n msg = null;\n break;\n case \"INC\":\n context.data.inc = msg.payload;\n msg = null;\n break;\n case \"STRTR\":\n context.data.strtr = msg.payload;\n msg = null;\n break;\n case \"MPSW\":\n context.data.mpsw = msg.payload;\n msg = null;\n break;\n case \"MPIN\":\n context.data.mpin = msg.payload;\n msg = null;\n break;\n case \"MPPTV\":\n context.data.mppt = msg.payload;\n msg = null;\n break;\n case \"MPPTW\":\n context.data.mpptw = msg.payload;\n msg = null;\n break;\n case \"STRTV\":\n context.data.strtv = msg.payload;\n msg = null;\n break; \n case \"HSOC\":\n context.data.hsoc = msg.payload;\n msg = null;\n break;\n case \"3SS\":\n context.data.ss = msg.payload;\n msg = null;\n break;\n case \"3SSA\":\n context.data.ssa = msg.payload;\n msg = null;\n break;\n \n default:\n msg = null;\n \tbreak;\n\n}\n\nif(context.data.mppt != null && context.data.strtv != null && context.data.hsoc != null ) {\n \n\t if (context.data.ss == 1 && context.data.ssa == 0 ){ //If: Switch set to Manual + On\n\t return [{payload:\"1\"},null] // Turn ON relay\n\t \n\t } else if (context.data.hbattv > hvh){ //If: House V is higher than safe AGM charge V\n\t return [null,{payload:\"0\"}] // Turn off relay\n\t \n\t } else if (context.data.strtr != 11){ //If: Ignition on\n\t return [null,{payload:\"0\"}] // Turn off relay\n\t \n\t } else if (context.data.mpin == 240 && context.data.ssa == 0 && (context.data.mppt < solarvsuff || context.data.mpptw < solarwsuff)){ //If: MP is unplugged and Solar is insufficient \n\t return [null,{payload:\"0\"}] // Turn off relay\n\t \n\t } else if (context.data.hsoc < hsocsuff){ //If: HSOC is low\n\t return [null,{payload:\"0\"}] // Turn off relay\n\t \n\t } else if (context.data.ss == 0 && context.data.ssa == 0 ){ //If: Switch set to Manual + Off\n\t return [null,{payload:\"0\"}] // Turn off relay\n\t \n\t } else if (context.data.inc < templow){ //If: Temp Low\n\t return [null,{payload:\"0\"}] // Turn off relay\n\t \n\t } else if (context.data.strtv > stvsuff){ //If: STRTV is sufficient\n\t return [null,{payload:\"0\"}] // Turn off relay\n\t \n\t } else return [null,null] // \n\t \n \n} else return msg; //Ends the function without sending a message if one of the context data values is not available",
"outputs": 2,
"timeout": 0,
"noerr": 0,
"initialize": "",
"finalize": "",
"libs": [],
"x": 510,
"y": 400,
"wires": [
[
"dfe7935115d435b6"
],
[
"ac0fea68fde030e9",
"d7d509c396feeda9"
]
],
"outputLabels": [
"Turn On (close) Relay",
"Turn OFF (open) Relay"
],
"info": "This enables or disables trickle charging if the Switch is set to On (enables) or Off (disables) or if any conditions arise which should prevent connecting the trickle charge cicuit (temperature, ignition state, batt voltages, etc.)\nBehavior when the switch is set to Auto is controlled by a separate function. "
},
{
"id": "ac0fea68fde030e9",
"type": "change",
"z": "d554211af8433969",
"name": "Turn Relay Off",
"rules": [
{
"t": "set",
"p": "payload",
"pt": "msg",
"to": "0",
"tot": "num"
}
],
"action": "",
"property": "",
"from": "",
"to": "",
"reg": false,
"x": 540,
"y": 440,
"wires": [
[
"dd77d6309f786032"
]
]
},
{
"id": "dd77d6309f786032",
"type": "victron-output-relay",
"z": "d554211af8433969",
"service": "com.victronenergy.system/0",
"path": "/Relay/3/State",
"serviceObj": {
"service": "com.victronenergy.system/0",
"name": "Venus device"
},
"pathObj": {
"path": "/Relay/3/State",
"type": "enum",
"name": "Venus relay 4 state",
"enum": {
"0": "Open",
"1": "Closed"
},
"mode": "both"
},
"name": "TR Charge enable (relay4)",
"onlyChanges": false,
"outputs": 0,
"conditionalMode": false,
"outputTrue": "",
"outputFalse": "",
"debounce": "",
"x": 810,
"y": 500,
"wires": []
},
{
"id": "c99c035a5ea82cc9",
"type": "trigger",
"z": "d554211af8433969",
"name": "Run for 6hrs then Turn Off",
"op1": "",
"op2": "0",
"op1type": "pay",
"op2type": "num",
"duration": "6",
"extend": false,
"overrideDelay": false,
"units": "hr",
"reset": "reset",
"bytopic": "all",
"topic": "topic",
"outputs": 1,
"x": 510,
"y": 560,
"wires": [
[
"dd77d6309f786032",
"c0e01e95f8a19728"
]
]
},
{
"id": "b9c2957c9a55b2ad",
"type": "chronos-filter",
"z": "d554211af8433969",
"name": "Only in Daytime",
"config": "9ff882c27f5e65db",
"reference": "",
"referenceType": "absTime",
"baseTime": "",
"baseTimeType": "msgIngress",
"evaluation": "",
"evaluationType": "and",
"conditions": [
{
"operator": "between",
"operands": [
{
"type": "time",
"value": "10:30",
"offset": 0,
"random": 0,
"precision": "minute"
},
{
"type": "time",
"value": "17:00",
"offset": 0,
"random": 0,
"precision": "minute"
}
]
}
],
"x": 540,
"y": 640,
"wires": [
[
"87c6317706115d73"
]
]
},
{
"id": "87c6317706115d73",
"type": "delay",
"z": "d554211af8433969",
"name": "check 4x/hr",
"pauseType": "rate",
"timeout": "5",
"timeoutUnits": "seconds",
"rate": "4",
"nbRateUnits": "1",
"rateUnits": "hour",
"randomFirst": "1",
"randomLast": "5",
"randomUnits": "seconds",
"drop": true,
"allowrate": false,
"outputs": 1,
"x": 550,
"y": 600,
"wires": [
[
"c99c035a5ea82cc9"
]
]
},
{
"id": "5753a6862759c46e",
"type": "victron-input-battery",
"z": "d554211af8433969",
"service": "com.victronenergy.battery/290",
"path": "/Dc/0/Voltage",
"serviceObj": {
"service": "com.victronenergy.battery/290",
"name": "House Batt"
},
"pathObj": {
"path": "/Dc/0/Voltage",
"type": "float",
"name": "Battery voltage (V)"
},
"name": "HV",
"onlyChanges": false,
"roundValues": "2",
"outputs": 1,
"x": 210,
"y": 660,
"wires": [
[
"704601ce78c7d409",
"8d3458aa1003f1ad"
]
]
},
{
"id": "dfe7935115d435b6",
"type": "change",
"z": "d554211af8433969",
"name": "Turn Relay On",
"rules": [
{
"t": "set",
"p": "payload",
"pt": "msg",
"to": "1",
"tot": "num"
}
],
"action": "",
"property": "",
"from": "",
"to": "",
"reg": false,
"x": 540,
"y": 360,
"wires": [
[
"dd77d6309f786032"
]
]
},
{
"id": "ce67ee284a7f7b2c",
"type": "victron-virtual-switch",
"z": "d554211af8433969",
"name": "3-State Switch for UI",
"outputs": 2,
"switch_1_type": 9,
"switch_1_initial": 0,
"switch_1_label": "",
"switch_1_customname": "Starter Trickle Charge V4",
"switch_1_group": "Power",
"switch_1_include_measurement": false,
"switch_1_rgb_color_wheel": false,
"switch_1_cct_wheel": false,
"switch_1_rgb_white_dimmer": false,
"x": 400,
"y": 40,
"wires": [
[],
[]
],
"info": "This creates the switch in the UI that will be used to set the On/Off/Auto state by the user."
},
{
"id": "839a5304919bb3dd",
"type": "victron-input-switch",
"z": "d554211af8433969",
"service": "com.victronenergy.switch/100",
"path": "/SwitchableOutput/output_1/State",
"serviceObj": {
"service": "com.victronenergy.switch/100",
"name": "3SSUI",
"communityTag": "switch"
},
"pathObj": {
"path": "/SwitchableOutput/output_1/State",
"type": "enum",
"enum": {
"0": "Off",
"1": "On"
},
"name": "Starter Trickle Charge state",
"mode": "both"
},
"name": "3SS",
"onlyChanges": true,
"roundValues": "no",
"rateLimit": 0,
"outputs": 1,
"conditionalMode": false,
"outputTrue": "true",
"outputFalse": "false",
"debounce": "2000",
"x": 210,
"y": 420,
"wires": [
[
"8d3458aa1003f1ad",
"704601ce78c7d409"
]
]
},
{
"id": "ae6eec175e55e3cf",
"type": "victron-input-custom",
"z": "d554211af8433969",
"service": "com.victronenergy.switch/100",
"path": "/SwitchableOutput/output_1/Auto",
"serviceObj": {
"service": "com.victronenergy.switch/100",
"name": "3SSUI (100)"
},
"pathObj": {
"path": "/SwitchableOutput/output_1/Auto",
"name": "/SwitchableOutput/output_1/Auto",
"type": "number",
"value": 1
},
"name": "3SSA",
"onlyChanges": true,
"roundValues": "no",
"rateLimit": 0,
"outputs": 1,
"conditionalMode": false,
"outputTrue": "true",
"outputFalse": "false",
"debounce": "2000",
"x": 70,
"y": 420,
"wires": [
[
"704601ce78c7d409",
"8d3458aa1003f1ad"
]
]
},
{
"id": "c0e01e95f8a19728",
"type": "victron-output-switch",
"z": "d554211af8433969",
"service": "com.victronenergy.switch/100",
"path": "/SwitchableOutput/output_1/State",
"serviceObj": {
"service": "com.victronenergy.switch/100",
"name": "3SSUI",
"communityTag": "switch"
},
"pathObj": {
"path": "/SwitchableOutput/output_1/State",
"type": "enum",
"enum": {
"0": "Off",
"1": "On"
},
"name": "Starter Trickle Charge V4 state",
"mode": "both"
},
"name": "",
"onlyChanges": false,
"roundValues": "no",
"rateLimit": 0,
"outputs": 0,
"conditionalMode": false,
"condition1Operator": ">",
"condition2Enabled": false,
"condition2Service": "",
"condition2Path": "",
"condition2Operator": ">",
"logicOperator": "AND",
"outputTrue": "true",
"outputFalse": "false",
"outputOnChange": false,
"debounce": 2000,
"x": 850,
"y": 560,
"wires": []
},
{
"id": "d7d509c396feeda9",
"type": "change",
"z": "d554211af8433969",
"name": "Reset Timer",
"rules": [
{
"t": "set",
"p": "payload",
"pt": "msg",
"to": "reset",
"tot": "str"
}
],
"action": "",
"property": "",
"from": "",
"to": "",
"reg": false,
"x": 550,
"y": 480,
"wires": [
[
"c99c035a5ea82cc9"
]
]
},
{
"id": "17c52f32e678c001",
"type": "victron-input-vebus",
"z": "d554211af8433969",
"service": "com.victronenergy.vebus/288",
"path": "/Dc/0/Temperature",
"serviceObj": {
"service": "com.victronenergy.vebus/288",
"name": "Invrtr/Chrgr",
"communityTag": "vebus"
},
"pathObj": {
"path": "/Dc/0/Temperature",
"type": "float",
"name": "Battery temperature (°C)"
},
"name": "HBTI",
"onlyChanges": false,
"roundValues": "2",
"rateLimit": 0,
"outputs": 1,
"conditionalMode": false,
"outputTrue": "true",
"outputFalse": "false",
"debounce": "2000",
"x": 210,
"y": 720,
"wires": [
[]
]
},
{
"id": "bd2378e89652e448",
"type": "inject",
"z": "d554211af8433969",
"name": "House Batt Temp Low",
"props": [
{
"p": "payload"
},
{
"p": "topic",
"vt": "str"
}
],
"repeat": "",
"crontab": "",
"once": true,
"onceDelay": 0.1,
"topic": "HTEMPLOW",
"payload": "-10",
"payloadType": "num",
"x": 140,
"y": 320,
"wires": [
[
"b1ea313624c02296"
]
]
},
{
"id": "912ef8db9cb8e564",
"type": "inject",
"z": "d554211af8433969",
"name": "House Batt Temp High",
"props": [
{
"p": "payload"
},
{
"p": "topic",
"vt": "str"
}
],
"repeat": "",
"crontab": "",
"once": true,
"onceDelay": 0.1,
"topic": "HTEMPHIGH",
"payload": "50",
"payloadType": "num",
"x": 140,
"y": 360,
"wires": [
[
"b1ea313624c02296"
]
]
},
{
"id": "9ff882c27f5e65db",
"type": "chronos-config",
"name": "home",
"latitudeType": "num",
"longitudeType": "num",
"timezone": "",
"timezoneType": "str",
"sunPositions": []
},
{
"id": "46798f57a5cf1516",
"type": "global-config",
"env": [],
"modules": {
"@victronenergy/node-red-contrib-victron": "1.6.63",
"node-red-contrib-chronos": "1.29.3"
}
}
]




