For the problem/bug? I’ve created with AI a flow in node-red to limit the inverter’s output when it goes over the 26A and scales back up to 27A when it goes below 26A. Maybe usefull for someone with the same problem in the future.
PS. all software has latested updates multi RS is @ 1.25 energy meter is at the latest version so is the ekrano GX.
[
{
"id": "0f730b6d35e486ef",
"type": "victron-input-gridmeter",
"z": "3591ff74abb32652",
"service": "com.victronenergy.grid/0",
"path": "/Ac/L1/Current",
"serviceObj": {
"service": "com.victronenergy.grid/0",
"name": "Grid Meter"
},
"pathObj": {
"path": "/Ac/L1/Current",
"type": "float",
"name": "L1 Current (A)"
},
"name": "L1 current @ grid meter",
"onlyChanges": false,
"roundValues": "3",
"x": 380,
"y": 1720,
"wires": [
[
"edbc17c87b3ebd5b"
]
]
},
{
"id": "edbc17c87b3ebd5b",
"type": "link out",
"z": "3591ff74abb32652",
"name": "link out 2",
"mode": "link",
"links": [
"777970f7dc16405e",
"cb649ce71ac17ded",
"b37fdd8ae5a62e42"
],
"x": 525,
"y": 1760,
"wires": []
},
{
"id": "1379fed71d757fb5",
"type": "victron-input-multi",
"z": "3591ff74abb32652",
"service": "com.victronenergy.multi/0",
"path": "/Ac/In/1/L1/I",
"serviceObj": {
"service": "com.victronenergy.multi/0",
"name": "RS 48/6000/100"
},
"pathObj": {
"path": "/Ac/In/1/L1/I",
"type": "float",
"name": "Input current phase 1 (A AC)"
},
"name": "RS in/output current L1",
"onlyChanges": false,
"roundValues": "3",
"x": 380,
"y": 1800,
"wires": [
[
"edbc17c87b3ebd5b"
]
]
},
{
"id": "ampere_control_logic",
"type": "function",
"z": "3591ff74abb32652",
"name": "Ampere Regeling Logic 26A",
"func": "// Initialiseer context variabelen\nlet gridCurrent = context.get('gridCurrent') || 0;\nlet inverterCurrent = context.get('inverterCurrent') || 0;\nlet lastControlValue = context.get('lastControlValue') || 0;\nlet lastGridCurrent = context.get('lastGridCurrent') || 0;\n\n// Helper functie voor afronding naar 2 decimalen\nfunction roundTo2(num) {\n return Math.round(num * 100) / 100;\n}\n\n// Bepaal welke input we hebben ontvangen\nif (msg.topic === \"L1 current @ grid meter\") {\n lastGridCurrent = gridCurrent;\n gridCurrent = roundTo2(msg.payload);\n context.set('gridCurrent', gridCurrent);\n context.set('lastGridCurrent', lastGridCurrent);\n} else if (msg.topic === \"RS in/output current L1\") {\n inverterCurrent = roundTo2(msg.payload);\n context.set('inverterCurrent', inverterCurrent);\n} else {\n return null;\n}\n\n// Detecteer trend\nlet gridTrend = roundTo2(gridCurrent - lastGridCurrent);\nlet isSunDecreasing = gridTrend > 0;\n\n// Bereken lokaal verbruik\nlet localConsumption = roundTo2(Math.abs(inverterCurrent) - Math.abs(gridCurrent));\n\nnode.status({\n fill: \"blue\", \n shape: \"dot\", \n text: `Grid: ${gridCurrent}A, Inv: ${inverterCurrent}A, Lokaal: ${localConsumption}A (Max grid: -26A)`\n});\n\nlet needsControl = false;\nlet newControlValue = lastControlValue || 27;\nlet action = \"monitor\";\n\nif (gridCurrent < -26) {\n // LIMITEREN - Grid levert meer dan 26A terug\n let overshoot = roundTo2(Math.abs(gridCurrent + 26));\n \n // Nieuwe inverter limiet = huidige lokale verbruik + maximaal toegestane grid (26A)\n newControlValue = roundTo2(localConsumption + 26);\n \n // Zorg dat we niet onder 0 gaan\n newControlValue = Math.max(0, newControlValue);\n \n needsControl = true;\n action = \"reduce\";\n \n // ALLEEN loggen bij daadwerkelijke actie\n node.warn(`🔴 LIMITEREN: Grid ${gridCurrent}A > -26A limiet, Overshoot: ${overshoot}A, Nieuwe inverter limiet: ${newControlValue}A`);\n \n} else if (gridCurrent >= -25.5 && gridCurrent <= -22 && lastControlValue < 27) {\n // GELEIDELIJKE OPSCHALING\n let availableGridHeadroom = roundTo2(Math.abs(-26 - gridCurrent));\n let increaseAmount = roundTo2(Math.min(availableGridHeadroom, 3));\n \n newControlValue = roundTo2(Math.min(lastControlValue + increaseAmount, 27));\n \n needsControl = true;\n action = \"increase\";\n \n // ALLEEN loggen bij daadwerkelijke actie\n node.warn(`🟡 OPSCHALING: Grid ${gridCurrent}A, Inverter limiet: ${lastControlValue}A → ${newControlValue}A`);\n \n} else if (gridCurrent > -22 && lastControlValue < 27) {\n // VOLLEDIGE VRIJGAVE\n newControlValue = 27;\n needsControl = true;\n action = \"reset\";\n \n // ALLEEN loggen bij daadwerkelijke actie\n node.warn(`🟢 VRIJGAVE naar 40A: Grid ${gridCurrent}A is veilig`);\n}\n\n// Voorkom te kleine wijzigingen (onder 0.5A)\nif (needsControl && action !== \"reset\" && Math.abs(newControlValue - lastControlValue) < 0.5) {\n needsControl = false;\n // Geen logging voor geskipte kleine wijzigingen\n}\n\nif (needsControl) {\n context.set('lastControlValue', newControlValue);\n \n return {\n payload: newControlValue,\n topic: \"inverter_control\",\n gridCurrent: gridCurrent,\n inverterCurrent: inverterCurrent,\n localConsumption: localConsumption,\n action: action,\n trend: gridTrend,\n sunDecreasing: isSunDecreasing,\n gridLimit: -26,\n inverterMaxLimit: 27,\n timestamp: new Date().toISOString()\n };\n}\n\n// GEEN logging voor \"geen actie nodig\" - gewoon stil monitoren\nreturn null;",
"outputs": 1,
"timeout": "",
"noerr": 0,
"initialize": "",
"finalize": "",
"libs": [],
"x": 540,
"y": 1860,
"wires": [
[
"filter_control"
]
]
},
{
"id": "b37fdd8ae5a62e42",
"type": "link in",
"z": "3591ff74abb32652",
"name": "link in 4",
"links": [
"edbc17c87b3ebd5b"
],
"x": 405,
"y": 1860,
"wires": [
[
"ampere_control_logic"
]
]
},
{
"id": "filter_control",
"type": "switch",
"z": "3591ff74abb32652",
"name": "Filter Control Messages",
"property": "payload",
"propertyType": "msg",
"rules": [
{
"t": "nnull"
}
],
"checkall": "true",
"repair": false,
"outputs": 1,
"x": 770,
"y": 1860,
"wires": [
[
"0611dbc2e3c5d32d"
]
]
},
{
"id": "0611dbc2e3c5d32d",
"type": "function",
"z": "3591ff74abb32652",
"name": "Format Control Command",
"func": "// Controleer of we een geldig bericht hebben\nif (!msg.payload && msg.payload !== 0) {\n return null;\n}\n\nlet controlValue = msg.payload;\ncontrolValue = Math.max(0, Math.min(controlValue, 27));\ncontrolValue = Math.round(controlValue * 100) / 100;\n\n// Status indicator\nlet statusColor = \"green\";\nlet statusText = \"Monitor\";\n\nif (msg.action === \"reduce\") {\n statusColor = \"red\";\n statusText = \"REDUCE\";\n} else if (msg.action === \"increase\") {\n statusColor = \"yellow\";\n statusText = \"INCREASE\";\n} else if (msg.action === \"reset\") {\n statusColor = \"green\";\n statusText = \"RESET to 27A\";\n}\n\nnode.status({\n fill: statusColor,\n shape: \"dot\",\n text: `${statusText}: Inverter ${controlValue}A (Grid max: -26A)`\n});\n\n// ALLEEN loggen bij echte controle acties (niet bij monitoring)\nif (msg.action && msg.action !== \"monitor\") {\n node.warn(`Control Command: ${statusText} → Inverter limiet: ${controlValue}A | Grid: ${msg.gridCurrent}A`);\n}\n\nreturn {\n payload: controlValue,\n topic: \"inverter/control/current_limit\",\n command: {\n value: controlValue,\n unit: \"A\",\n action: msg.action || \"monitor\"\n },\n original: {\n gridCurrent: Math.round((msg.gridCurrent || 0) * 100) / 100,\n inverterCurrent: Math.round((msg.inverterCurrent || 0) * 100) / 100,\n localConsumption: Math.round((msg.localConsumption || 0) * 100) / 100,\n gridLimit: msg.gridLimit || -26,\n inverterMaxLimit: msg.inverterMaxLimit || 27\n },\n metadata: {\n timestamp: msg.timestamp || new Date().toISOString(),\n trend: msg.trend || 0,\n sunDecreasing: msg.sunDecreasing || false\n }\n};",
"outputs": 1,
"timeout": "",
"noerr": 0,
"initialize": "",
"finalize": "",
"libs": [],
"x": 1000,
"y": 1860,
"wires": [
[
"5a1b21f27a974fc0"
]
]
},
{
"id": "8c6d54c70422c58c",
"type": "link in",
"z": "3591ff74abb32652",
"name": "link in 5",
"links": [
"5a1b21f27a974fc0",
"e7fdb976556ef9fc"
],
"x": 845,
"y": 1680,
"wires": [
[
"1e83b83dd6c70db8"
]
]
},
{
"id": "1e83b83dd6c70db8",
"type": "rbe",
"z": "3591ff74abb32652",
"name": "",
"func": "rbe",
"gap": "",
"start": "",
"inout": "out",
"septopics": true,
"property": "payload",
"topi": "topic",
"x": 910,
"y": 1680,
"wires": [
[
"a3afad27e610d3fb"
]
]
},
{
"id": "a3afad27e610d3fb",
"type": "victron-output-acsystem",
"z": "3591ff74abb32652",
"service": "com.victronenergy.acsystem/0",
"path": "/Ac/In/1/CurrentLimit",
"serviceObj": {
"service": "com.victronenergy.acsystem/0",
"name": "Multi RS Solar"
},
"pathObj": {
"path": "/Ac/In/1/CurrentLimit",
"type": "float",
"name": "Ac input 1 current limit (A)",
"mode": "both"
},
"name": "",
"onlyChanges": false,
"x": 1120,
"y": 1680,
"wires": []
},
{
"id": "5a1b21f27a974fc0",
"type": "link out",
"z": "3591ff74abb32652",
"name": "link out 3",
"mode": "link",
"links": [
"8c6d54c70422c58c"
],
"x": 1135,
"y": 1860,
"wires": []
}
]