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