Multi RS solar ignores max current at grid connection

Added solar to my multi RS solar last weekend. Today with a lot of sun and the 3 fase SMA tripower and the multi RS on fase 1 I expected the multi RS solar to limit the feed in when the amps at the grid connection exceeded the 25a or 26A, but it kept on rising. At some point I activated the limit system feed in because I didn’t want to blow the grid fuse. When I activated this option, the inverter limited the Multi RS connected solar arrays. The multi RS is connected with can to the VM-3p75CT. I’m running ESS in mode Optimized with batterylife. AC currentlimit @ energymeter was set at 26a. Current limit at AC-in was set at 30A at that moment (for now I have set that both back to 25A.

*update after changing the limits to 25A it still ignores these limits. The energy grid meter even reached 27A.

The feeding limiting option is working only partly, it looks like it ignore the current at the grid meter and only looks to the current that goes out of the AC-in.

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": []
    }
]