Load balance and prioritise charging over 2 Victron EVCS

The Victron EV Charging station has limited functionality to share a load within your home. If your setup allows, it will provide basic overload protection but in some setups this functionality may not suffice.

This flow is designed to load balance between 2 Victron EV Charging Stations but it can easily be adjusted to provide load balancing for a single unit.

Grid metering: The flow takes a reading from your grid meter and calculates which phase has the heaviest load.

Grid lost and Multi overload alarms: The flow takes grid lost and overload alarms into account by setting the minimum charge current. It does not specifically read if the charger is connected to AC-OUT but simply assumes it will fail otherwise.

Basic load sharing within the house: The flow controls the EV charge current by taking a maximum of 20A grid load. This number was chosen to prevent the new ESS import current limiting feature from kicking in which will simply start inverting the lack of power. If the remaining charge current is less than 6A it will stop the charging process and try to restart it after 5mins.

Dual charger load balancing: Once the flow detects that a second charger is starting the charge process, it will ramp down for 5mins to ensure both chargers can operate within the 20A limit. After the start, one charger is forced to charge at 6A whilst giving the other charger room to operate within a range of 6-10A. If the combined load is too high it will try and stop the secondary charger first.

For now, this is very very much a beta so please use carefully. Any comments or help to improve is much appreciated!

[{"id":"82aaf38c45da1315","type":"tab","label":"EVCS Beta","disabled":false,"info":"","env":[]},{"id":"65b4c589398589a9","type":"group","z":"82aaf38c45da1315","style":{"stroke":"#999999","stroke-opacity":"1","fill":"none","fill-opacity":"1","label":true,"label-position":"nw","color":"#a4a4a4"},"nodes":["448400e2ea6c075f","b8d719fa23423d74","ea760e01784b2a28","2c95c28f30317d11","481eac71f8e3f502","6d2cce8e0f08b481","cce00857937fe13d","260cfd4ffb415993","d0482aa866561ed1","56177680bf68d4fe","cefd9481bba89575","9f99cb9084af7df1","7c00f077fb9c58d7","67b9dafc04d68a65"],"x":34,"y":379,"w":1192,"h":362},{"id":"fb560ccaf0ae77a9","type":"group","z":"82aaf38c45da1315","style":{"stroke":"#999999","stroke-opacity":"1","fill":"none","fill-opacity":"1","label":true,"label-position":"nw","color":"#a4a4a4"},"nodes":["4193f91a39f49ede","d757c5b6e28bb802","ebe5ee0190bad930","f5e047131ea1ef85","ad818aeb586d0a91","40d44a07b4a925b7","b5b658b7e8d9cd11"],"x":34,"y":139,"w":892,"h":202},{"id":"c07d4c77f780aa9f","type":"group","z":"82aaf38c45da1315","style":{"stroke":"#999999","stroke-opacity":"1","fill":"none","fill-opacity":"1","label":true,"label-position":"nw","color":"#a4a4a4"},"nodes":["a39f16602d819287","3e142c2a6d33e8bc","68a8d6df745262b8","85d5dedbbf11b06b","399250db1297cbef","a3fd5e825fe42c92","341e2879e1875215","a0eb3c33e889743c","cbf38e663971a9c6","64ae22f3ca2864fb","403440ed5fb69ce5","bc97930e5dde4c69","3ed6e4af8569a0e8","bf94b9c50a20443f"],"x":34,"y":759,"w":1192,"h":362},{"id":"4193f91a39f49ede","type":"victron-input-gridmeter","z":"82aaf38c45da1315","g":"fb560ccaf0ae77a9","service":"com.victronenergy.grid/50","path":"/Ac/L1/Current","serviceObj":{"service":"com.victronenergy.grid/50","name":"Shelly Pro3EM"},"pathObj":{"path":"/Ac/L1/Current","type":"float","name":"L1 Current (A)"},"name":"Grid L1 Current","onlyChanges":false,"roundValues":"0","x":140,"y":180,"wires":[["ad818aeb586d0a91"]]},{"id":"d757c5b6e28bb802","type":"victron-input-gridmeter","z":"82aaf38c45da1315","g":"fb560ccaf0ae77a9","service":"com.victronenergy.grid/50","path":"/Ac/L3/Current","serviceObj":{"service":"com.victronenergy.grid/50","name":"Shelly Pro3EM"},"pathObj":{"path":"/Ac/L3/Current","type":"float","name":"L3 Current (A)"},"name":"Grid L3 Current","onlyChanges":false,"roundValues":"0","x":140,"y":300,"wires":[["ad818aeb586d0a91"]]},{"id":"ebe5ee0190bad930","type":"victron-input-gridmeter","z":"82aaf38c45da1315","g":"fb560ccaf0ae77a9","service":"com.victronenergy.grid/50","path":"/Ac/L2/Current","serviceObj":{"service":"com.victronenergy.grid/50","name":"Shelly Pro3EM"},"pathObj":{"path":"/Ac/L2/Current","type":"float","name":"L2 Current (A)"},"name":"Grid L2 Current","onlyChanges":false,"roundValues":"0","x":140,"y":240,"wires":[["ad818aeb586d0a91"]]},{"id":"f5e047131ea1ef85","type":"function","z":"82aaf38c45da1315","g":"fb560ccaf0ae77a9","name":"MaxAmpsGrid","func":"// Variables to hold max value \nlet maxValue = 0;\n\n//converting the object in the payload to an array\nconst values = Object.values(msg.payload);\n\n//Using the .map() method to loop the array, find maximum value\nvalues.map((entry) => {\n  //getting the value from each object and \n  //comparing to existing value\n  maxValue = Math.max(maxValue, entry);\n});\n\nmsg.topic = \"MaxAmpsGrid\";\nmsg.payload = maxValue;\nreturn msg;","outputs":1,"timeout":"","noerr":0,"initialize":"","finalize":"","libs":[],"x":680,"y":220,"wires":[["40d44a07b4a925b7"]],"info":"Determine which of the phases has the biggest load and return that number for future calculations."},{"id":"ad818aeb586d0a91","type":"join","z":"82aaf38c45da1315","g":"fb560ccaf0ae77a9","name":"Grid Current","mode":"custom","build":"object","property":"payload","propertyType":"msg","key":"topic","joiner":"\\n","joinerType":"str","accumulate":false,"timeout":"","count":"3","reduceRight":false,"reduceExp":"","reduceInit":"","reduceInitType":"","reduceFixup":"","x":420,"y":220,"wires":[["f5e047131ea1ef85"]],"info":"Merge the load of all phases into a single new msg."},{"id":"448400e2ea6c075f","type":"join","z":"82aaf38c45da1315","g":"65b4c589398589a9","name":"InputMerger","mode":"custom","build":"object","property":"payload","propertyType":"msg","key":"topic","joiner":"\\n","joinerType":"str","accumulate":false,"timeout":"","count":"5","reduceRight":false,"reduceExp":"","reduceInit":"","reduceInitType":"","reduceFixup":"","x":480,"y":520,"wires":[["ea760e01784b2a28","2c95c28f30317d11"]],"info":"Merge charger information and the current of the phase that has the most load into a single new msg."},{"id":"b8d719fa23423d74","type":"debug","z":"82aaf38c45da1315","g":"65b4c589398589a9","name":"debug 25","active":false,"tosidebar":true,"console":false,"tostatus":false,"complete":"payload","targetType":"msg","statusVal":"","statusType":"auto","x":920,"y":420,"wires":[]},{"id":"ea760e01784b2a28","type":"function","z":"82aaf38c45da1315","g":"65b4c589398589a9","name":"LoadBalancer 1","func":"// Declare context and flow variables\nvar didwestop = flow.get('ns01.didwestop')||0;\nvar time = context.get('time')||0;\nvar startstop = msg.payload.NS01_StartStop;\n\nconst connectorstatus1 = msg.payload.NS01_Status;\nconst chargemode1 = msg.payload.NS01_Mode;\nconst chargecurrent1 = msg.payload.NS01_ChargeCurrent;\nconst maxGrid = msg.payload.MaxAmpsGrid;\n\n// Declare from the other charger\nconst connectorstatus2 = global.get('victronenergy.evcharger._41.Status');\nconst chargecurrent2 = global.get('victronenergy.evcharger._41.Current');\n\n// Some printing for development\n// node.warn(\"Connector status 1: \" + connectorstatus1);\n// node.warn(\"Charge mode 1: \" + chargemode1);\n// node.warn(\"Start/Stop status: \" + startstop);\n// node.warn(\"Did we stop: \" + didwestop);\n// node.warn(\"Time stamp: \" + time);\n\nif (chargemode1 == 0 && connectorstatus1 !== 3 && typeof startstop !== 'undefined') {\n    // Get out if we're not involved OR start signal after overload did not read back yet\n    if (didwestop == 0 && startstop == 0) {\n        return null;\n    }\n    \n    // Define variables\n    maxAll = 20; // Max grid current before we start throttling\n    maxValue = 12; // Max charge current of this charger, leave room for DESS grid charge behind 16A breaker\n    newValue = 0;\n    \n    // Take external factors into account and ensure statements are sorted high to low\n    // Beware of 2 chargers charging\n    if (connectorstatus2 == 2 || typeof connectorstatus2 == 'undefined') {\n        maxValue = 10;\n    }\n    // Beware of the other charger trying to start while we are taking it all\n    if (connectorstatus2 == 6 && flow.get('ns02.didwestop') == 1) {\n        maxValue = 6;\n    }\n    // Beware of grid lost alarm\n    if (global.get('victronenergy.vebus._276.Alarms.GridLost') == 2 || typeof global.get('victronenergy.vebus._276.Alarms.GridLost') == 'undefined') {\n        maxValue = 6;\n    }\n    // Beware of overload alarm\n    if (global.get('victronenergy.vebus._276.Alarms.Overload') >= 1 || typeof global.get('victronenergy.vebus._276.Alarms.Overload') == 'undefined') {\n        maxValue = 0;\n    }\n    \n    // Do the math and set new value\n    newValue = maxAll - maxGrid + chargecurrent1;\n    // newValue = Math.floor(newValue / 2) * 2;\n    if (newValue >= maxValue) {\n        newValue = maxValue;\n    }\n    \n    // stop and start charging if value out of range\n    switch (didwestop) {\n        case 0:\n            // force the 2nd charger to stop before we do\n            if (newValue < 6 && (connectorstatus2 !== 2 || typeof connectorstatus2 == 'undefined')) {\n                newValue = 6;\n                startstop = 0;\n                didwestop = 1;\n                // create and store a fresh timestamp + 10mins\n                var d = new Date();\n                time = d.getTime();\n                time = time + (300*1000);\n            }\n            else if (newValue < 6) {\n                newValue = 6;\n            } \n            break;\n        case 1:\n            if ((maxAll - maxGrid) < 6) {\n                newValue = 6;\n                break;\n            }\n            // Retrieve the timestamp and compare to @now\n            var nd = new Date();\n            var ntime = nd.getTime();\n\n            if (ntime >= time) {\n                startstop = 1;\n                didwestop = 0;\n                break;\n            }\n            break;\n        default:\n            break;\n    }\n    \n    flow.set('ns01.didwestop',didwestop);\n    context.set('time',time);\n    \n    // Constructing the message\n    var msg1 = { topic: \"payload\", payload: newValue };\n    var msg2 = { topic: \"payload\", payload: startstop };\n    \n    \n    return [msg1,msg2];\n}","outputs":2,"timeout":"","noerr":0,"initialize":"","finalize":"","libs":[],"x":680,"y":520,"wires":[["6d2cce8e0f08b481","b8d719fa23423d74"],["481eac71f8e3f502","cce00857937fe13d"]]},{"id":"2c95c28f30317d11","type":"debug","z":"82aaf38c45da1315","g":"65b4c589398589a9","name":"debug 26","active":false,"tosidebar":true,"console":false,"tostatus":false,"complete":"payload","targetType":"msg","statusVal":"","statusType":"auto","x":440,"y":440,"wires":[]},{"id":"481eac71f8e3f502","type":"rbe","z":"82aaf38c45da1315","g":"65b4c589398589a9","name":"","func":"rbe","gap":"","start":"","inout":"out","septopics":true,"property":"payload","topi":"topic","x":910,"y":540,"wires":[["56177680bf68d4fe"]]},{"id":"6d2cce8e0f08b481","type":"rbe","z":"82aaf38c45da1315","g":"65b4c589398589a9","name":"","func":"rbe","gap":"","start":"","inout":"out","septopics":true,"property":"payload","topi":"topic","x":910,"y":460,"wires":[["d0482aa866561ed1"]]},{"id":"cce00857937fe13d","type":"debug","z":"82aaf38c45da1315","g":"65b4c589398589a9","name":"debug 27","active":false,"tosidebar":true,"console":false,"tostatus":false,"complete":"payload","targetType":"msg","statusVal":"","statusType":"auto","x":920,"y":580,"wires":[]},{"id":"40d44a07b4a925b7","type":"link out","z":"82aaf38c45da1315","g":"fb560ccaf0ae77a9","name":"MaxAmpsGrid Out","mode":"link","links":["260cfd4ffb415993","c5bbf471b266a0b0","a0eb3c33e889743c"],"x":875,"y":220,"wires":[]},{"id":"260cfd4ffb415993","type":"link in","z":"82aaf38c45da1315","g":"65b4c589398589a9","name":"MaxAmpsGrid In","links":["40d44a07b4a925b7"],"x":245,"y":460,"wires":[["448400e2ea6c075f"]]},{"id":"a39f16602d819287","type":"join","z":"82aaf38c45da1315","g":"c07d4c77f780aa9f","name":"InputMerger","mode":"custom","build":"object","property":"payload","propertyType":"msg","key":"topic","joiner":"\\n","joinerType":"str","accumulate":false,"timeout":"","count":"5","reduceRight":false,"reduceExp":"","reduceInit":"","reduceInitType":"","reduceFixup":"","x":480,"y":900,"wires":[["68a8d6df745262b8","85d5dedbbf11b06b"]],"info":"Merge charger information and the current of the phase that has the most load into a single new msg."},{"id":"3e142c2a6d33e8bc","type":"debug","z":"82aaf38c45da1315","g":"c07d4c77f780aa9f","name":"debug 36","active":false,"tosidebar":true,"console":false,"tostatus":false,"complete":"payload","targetType":"msg","statusVal":"","statusType":"auto","x":920,"y":800,"wires":[]},{"id":"68a8d6df745262b8","type":"function","z":"82aaf38c45da1315","g":"c07d4c77f780aa9f","name":"LoadBalancer 2","func":"// Declare context and flow variables\nvar didwestop = flow.get('ns02.didwestop')||0;\nvar time = context.get('time')||0;\nvar startstop = msg.payload.NS02_StartStop;\n\nconst connectorstatus2 = msg.payload.NS02_Status;\nconst chargemode2 = msg.payload.NS02_Mode;\nconst chargecurrent2 = msg.payload.NS02_ChargeCurrent;\nconst maxGrid = msg.payload.MaxAmpsGrid;\n\n// Declare from the other charger\nconst connectorstatus1 = global.get('victronenergy.evcharger._40.Status');\nconst chargecurrent1 = global.get('victronenergy.evcharger._40.Current');\n\n// Some printing for development\n// node.warn(\"Connector status 2: \" + connectorstatus2);\n// node.warn(\"Charge mode 2: \" + chargemode2);\n// node.warn(\"Start/Stop status: \" + startstop);\n// node.warn(\"Did we stop: \" + didwestop);\n// node.warn(\"Time stamp: \" + time);\n\nif (chargemode2 == 0 && connectorstatus2 !== 3 && typeof startstop !== 'undefined') {\n    // Get out if we're not involved OR start signal after overload did not read back yet\n    if (didwestop == 0 && startstop == 0) {\n        return null;\n    }\n    \n    // Define variables\n    maxAll = 20; // Max grid current before we start throttling\n    maxValue = 16; // Max charge current of this charger\n    newValue = 0;\n    \n    // Take external factors into account and ensure statements are sorted high to low\n    // Beware of 2 chargers charging\n    if (connectorstatus1 == 2 || typeof connectorstatus1 == 'undefined') {\n        maxValue = 6;\n    }\n    // Beware of the other charger trying to start while we are taking it all\n    if (connectorstatus1 == 6 && flow.get('ns01.didwestop') == 1) {\n        maxValue = 6;\n    }\n    // Beware of grid lost alarm\n    if (global.get('victronenergy.vebus._276.Alarms.GridLost') == 2 || typeof global.get('victronenergy.vebus._276.Alarms.GridLost') == 'undefined') {\n        maxValue = 6;\n    }\n    // Beware of overload alarm\n    if (global.get('victronenergy.vebus._276.Alarms.Overload') >= 1 || typeof global.get('victronenergy.vebus._276.Alarms.Overload') == 'undefined') {\n        maxValue = 0;\n    }\n    \n    // Do the math and set new value\n    newValue = maxAll - maxGrid + chargecurrent2;\n    // newValue = Math.floor(newValue / 2) * 2;\n    if (newValue >= maxValue) {\n        newValue = maxValue;\n    }\n    \n    // stop and start charging if value out of range\n    switch (didwestop) {\n        case 0:\n            // force the 1st charger down to 6A before we stop\n            if (newValue < 6 && (connectorstatus1 !== 2 || typeof connectorstatus1 == 'undefined' || (connectorstatus1 == 2 && chargecurrent1 == 6 ))) {\n                newValue = 6;\n                startstop = 0;\n                didwestop = 1;\n                // create and store a fresh timestamp + 10mins\n                var d = new Date();\n                time = d.getTime();\n                time = time + (300*1000);\n            }\n            else if (newValue < 6) {\n                newValue = 6;\n            } \n            break;\n        case 1:\n            if ((maxAll - maxGrid) < 6) {\n                newValue = 6;\n                break;\n            }\n            // Retrieve the timestamp and compare to @now\n            var nd = new Date();\n            var ntime = nd.getTime();\n\n            if (ntime >= time) {\n                startstop = 1;\n                didwestop = 0;\n                break;\n            }\n            break;\n        default:\n            break;\n    }\n    \n    flow.set('ns02.didwestop',didwestop);\n    context.set('time',time);\n    \n    // Constructing the message\n    var msg1 = { topic: \"payload\", payload: newValue };\n    var msg2 = { topic: \"payload\", payload: startstop };\n    \n    return [msg1,msg2];\n}","outputs":2,"timeout":"","noerr":0,"initialize":"","finalize":"","libs":[],"x":680,"y":900,"wires":[["a3fd5e825fe42c92","3e142c2a6d33e8bc"],["399250db1297cbef","341e2879e1875215"]]},{"id":"85d5dedbbf11b06b","type":"debug","z":"82aaf38c45da1315","g":"c07d4c77f780aa9f","name":"debug 37","active":false,"tosidebar":true,"console":false,"tostatus":false,"complete":"payload","targetType":"msg","statusVal":"","statusType":"auto","x":440,"y":820,"wires":[]},{"id":"399250db1297cbef","type":"rbe","z":"82aaf38c45da1315","g":"c07d4c77f780aa9f","name":"","func":"rbe","gap":"","start":"","inout":"out","septopics":true,"property":"payload","topi":"topic","x":910,"y":920,"wires":[["64ae22f3ca2864fb"]]},{"id":"a3fd5e825fe42c92","type":"rbe","z":"82aaf38c45da1315","g":"c07d4c77f780aa9f","name":"","func":"rbe","gap":"","start":"","inout":"out","septopics":true,"property":"payload","topi":"topic","x":910,"y":840,"wires":[["403440ed5fb69ce5"]]},{"id":"341e2879e1875215","type":"debug","z":"82aaf38c45da1315","g":"c07d4c77f780aa9f","name":"debug 38","active":false,"tosidebar":true,"console":false,"tostatus":false,"complete":"payload","targetType":"msg","statusVal":"","statusType":"auto","x":920,"y":960,"wires":[]},{"id":"a0eb3c33e889743c","type":"link in","z":"82aaf38c45da1315","g":"c07d4c77f780aa9f","name":"MaxAmpsGrid In","links":["40d44a07b4a925b7"],"x":245,"y":840,"wires":[["a39f16602d819287"]]},{"id":"b5b658b7e8d9cd11","type":"comment","z":"82aaf38c45da1315","g":"fb560ccaf0ae77a9","name":"Link node","info":"Decided not to use a sub-flow to ensure the MaxAmps value is not requested and calculated at different points in time for the two individual chargers.","x":840,"y":300,"wires":[]},{"id":"cbf38e663971a9c6","type":"victron-input-evcharger","z":"82aaf38c45da1315","g":"c07d4c77f780aa9f","service":"com.victronenergy.evcharger/41","path":"/Current","serviceObj":{"service":"com.victronenergy.evcharger/41","name":"EVCS-NS-02"},"pathObj":{"path":"/Current","type":"float","name":"Charge current (A)"},"name":"NS02_ChargeCurrent","onlyChanges":false,"x":160,"y":900,"wires":[["a39f16602d819287"]]},{"id":"64ae22f3ca2864fb","type":"victron-output-evcharger","z":"82aaf38c45da1315","g":"c07d4c77f780aa9f","service":"com.victronenergy.evcharger/41","path":"/StartStop","serviceObj":{"service":"com.victronenergy.evcharger/41","name":"EVCS-NS-02"},"pathObj":{"path":"/StartStop","type":"enum","name":"Start/stop charging (manual mode)","enum":{"0":"Stop","1":"Start"},"writable":true},"initial":"","name":"Start/Stop","onlyChanges":false,"x":1090,"y":920,"wires":[]},{"id":"403440ed5fb69ce5","type":"victron-output-evcharger","z":"82aaf38c45da1315","g":"c07d4c77f780aa9f","service":"com.victronenergy.evcharger/41","path":"/SetCurrent","serviceObj":{"service":"com.victronenergy.evcharger/41","name":"EVCS-NS-02"},"pathObj":{"path":"/SetCurrent","type":"float","name":"Set charge current (manual mode) (A)","writable":true},"initial":"","name":"Charging Current","onlyChanges":false,"x":1110,"y":840,"wires":[]},{"id":"d0482aa866561ed1","type":"victron-output-evcharger","z":"82aaf38c45da1315","g":"65b4c589398589a9","service":"com.victronenergy.evcharger/40","path":"/SetCurrent","serviceObj":{"service":"com.victronenergy.evcharger/40","name":"EVCS-NS-01"},"pathObj":{"path":"/SetCurrent","type":"float","name":"Set charge current (manual mode) (A)","writable":true},"initial":"","name":"Charging Current","onlyChanges":false,"x":1110,"y":460,"wires":[]},{"id":"56177680bf68d4fe","type":"victron-output-evcharger","z":"82aaf38c45da1315","g":"65b4c589398589a9","service":"com.victronenergy.evcharger/40","path":"/StartStop","serviceObj":{"service":"com.victronenergy.evcharger/40","name":"EVCS-NS-01"},"pathObj":{"path":"/StartStop","type":"enum","name":"Start/stop charging (manual mode)","enum":{"0":"Stop","1":"Start"},"writable":true},"initial":"","name":"Start/Stop","onlyChanges":false,"x":1090,"y":540,"wires":[]},{"id":"bc97930e5dde4c69","type":"victron-input-evcharger","z":"82aaf38c45da1315","g":"c07d4c77f780aa9f","service":"com.victronenergy.evcharger/41","path":"/Status","serviceObj":{"service":"com.victronenergy.evcharger/41","name":"EVCS-NS-02"},"pathObj":{"path":"/Status","type":"enum","name":"Status","enum":{"0":"Disconnected","1":"Connected","2":"Charging","3":"Charged","4":"Waiting for sun","5":"Waiting for RFID","6":"Waiting for start","7":"Low SOC","8":"Ground fault","9":"Welded contacts","10":"CP Input shorted","11":"Residual current detected","12":"Under voltage detected","13":"Overvoltage detected","14":"Overheating detected"}},"initial":"","name":"NS02_Status","onlyChanges":false,"x":130,"y":960,"wires":[["a39f16602d819287"]]},{"id":"3ed6e4af8569a0e8","type":"victron-input-evcharger","z":"82aaf38c45da1315","g":"c07d4c77f780aa9f","service":"com.victronenergy.evcharger/41","path":"/Mode","serviceObj":{"service":"com.victronenergy.evcharger/41","name":"EVCS-NS-02"},"pathObj":{"path":"/Mode","type":"enum","name":"Mode","enum":{"0":"Manual","1":"Auto","2":"Schedule"}},"initial":"","name":"NS02_Mode","onlyChanges":false,"x":130,"y":1020,"wires":[["a39f16602d819287"]]},{"id":"bf94b9c50a20443f","type":"victron-input-evcharger","z":"82aaf38c45da1315","g":"c07d4c77f780aa9f","service":"com.victronenergy.evcharger/41","path":"/StartStop","serviceObj":{"service":"com.victronenergy.evcharger/41","name":"EVCS-NS-02"},"pathObj":{"path":"/StartStop","type":"enum","name":"Start/stop charging (manual mode)","enum":{"0":"Stop","1":"Start"}},"initial":"","name":"NS02_StartStop","onlyChanges":false,"x":140,"y":1080,"wires":[["a39f16602d819287"]]},{"id":"a09317ab5a5e6fc4","type":"victron-input-vebus","z":"82aaf38c45da1315","service":"com.victronenergy.vebus/276","path":"/Alarms/GridLost","serviceObj":{"service":"com.victronenergy.vebus/276","name":"MultiPlus-II 48/3000/35-32"},"pathObj":{"path":"/Alarms/GridLost","type":"enum","name":"Grid lost alarm","enum":{"0":"Ok","2":"Alarm"}},"initial":"","name":"MultiPlus_GridAlarm","onlyChanges":false,"x":150,"y":80,"wires":[[]]},{"id":"cefd9481bba89575","type":"victron-input-evcharger","z":"82aaf38c45da1315","g":"65b4c589398589a9","service":"com.victronenergy.evcharger/40","path":"/Current","serviceObj":{"service":"com.victronenergy.evcharger/40","name":"EVCS-NS-01"},"pathObj":{"path":"/Current","type":"float","name":"Charge current (A)"},"name":"NS01_ChargeCurrent","onlyChanges":false,"x":160,"y":520,"wires":[["448400e2ea6c075f"]]},{"id":"9f99cb9084af7df1","type":"victron-input-evcharger","z":"82aaf38c45da1315","g":"65b4c589398589a9","service":"com.victronenergy.evcharger/40","path":"/Status","serviceObj":{"service":"com.victronenergy.evcharger/40","name":"EVCS-NS-01"},"pathObj":{"path":"/Status","type":"enum","name":"Status","enum":{"0":"Disconnected","1":"Connected","2":"Charging","3":"Charged","4":"Waiting for sun","5":"Waiting for RFID","6":"Waiting for start","7":"Low SOC","8":"Ground fault","9":"Welded contacts","10":"CP Input shorted","11":"Residual current detected","12":"Under voltage detected","13":"Overvoltage detected","14":"Overheating detected"}},"initial":"","name":"NS01_Status","onlyChanges":false,"x":130,"y":580,"wires":[["448400e2ea6c075f"]]},{"id":"7c00f077fb9c58d7","type":"victron-input-evcharger","z":"82aaf38c45da1315","g":"65b4c589398589a9","service":"com.victronenergy.evcharger/40","path":"/Mode","serviceObj":{"service":"com.victronenergy.evcharger/40","name":"EVCS-NS-01"},"pathObj":{"path":"/Mode","type":"enum","name":"Mode","enum":{"0":"Manual","1":"Auto","2":"Schedule"}},"initial":"","name":"NS01_Mode","onlyChanges":false,"x":130,"y":640,"wires":[["448400e2ea6c075f"]]},{"id":"67b9dafc04d68a65","type":"victron-input-evcharger","z":"82aaf38c45da1315","g":"65b4c589398589a9","service":"com.victronenergy.evcharger/40","path":"/StartStop","serviceObj":{"service":"com.victronenergy.evcharger/40","name":"EVCS-NS-01"},"pathObj":{"path":"/StartStop","type":"enum","name":"Start/stop charging (manual mode)","enum":{"0":"Stop","1":"Start"}},"initial":"","name":"NS01_StartStop","onlyChanges":false,"x":140,"y":700,"wires":[["448400e2ea6c075f"]]},{"id":"511d3a992af7cb5c","type":"victron-input-vebus","z":"82aaf38c45da1315","service":"com.victronenergy.vebus/276","path":"/Alarms/Overload","serviceObj":{"service":"com.victronenergy.vebus/276","name":"MultiPlus-II 48/3000/35-32"},"pathObj":{"path":"/Alarms/Overload","type":"enum","name":"Overload","enum":{"0":"Ok","1":"Warning","2":"Alarm"}},"initial":"","name":"MultiPlus_Overload","onlyChanges":false,"x":350,"y":80,"wires":[[]]}]

Flow Info

Created 2 months, 3 weeks ago
Rating:

Owner

Actions

Rate:

Node Types

Core
  • comment (x1)
  • debug (x6)
  • function (x3)
  • join (x3)
  • link in (x2)
  • link out (x1)
  • rbe (x4)
Other
  • group (x3)
  • tab (x1)
  • victron-input-evcharger (x8)
  • victron-input-gridmeter (x3)
  • victron-input-vebus (x2)
  • victron-output-evcharger (x4)

Tags

  • victron
  • victronenergy
  • EV
  • Charger
  • evcs
  • dual
  • loadbalancing
Copy this flow JSON to your clipboard and then import into Node-RED using the Import From > Clipboard (Ctrl-I) menu option