diff --git a/NodeRed/NodeRedFiles/flows.json b/NodeRed/NodeRedFiles/flows.json index 5025e75d1..f5396457f 100644 --- a/NodeRed/NodeRedFiles/flows.json +++ b/NodeRed/NodeRedFiles/flows.json @@ -1248,7 +1248,7 @@ "joinerType": "str", "accumulate": true, "timeout": "", - "count": "19", + "count": "18", "reduceRight": false, "reduceExp": "", "reduceInit": "", @@ -1729,6 +1729,7 @@ }, "name": "", "onlyChanges": false, + "roundValues": "0", "x": 210, "y": 1320, "wires": [ @@ -1872,7 +1873,7 @@ "type": "function", "z": "58aeeaac02a3a4c7", "name": "Battery Controller", - "func": "// get inverter num of phases\nif(msg.payload.num_phases == null){\n num_phases = 10000000000;// mimic to make power setpoint be 0 when there is no inverter phase there \n}else{\n num_phases = msg.payload.num_phases;\n}\n\n// get max charge power\nif(msg.payload.max_configured_charge_power == null ||msg.payload.max_configured_charge_power<0){\n max_charge_power=msg.payload.max_battery_charge_power;\n}else{\n max_charge_power=Math.min(msg.payload.max_configured_charge_power,msg.payload.max_battery_charge_power);\n}\n\n// get battery number\nif(msg.payload.num_batteries == null){\n n_batteries = 0;\n}else{\n n_batteries = msg.payload.num_batteries;\n}\n\n// get current battery power\nif(msg.payload.battery_power == null){\n battery_power = 0;\n}else{\n battery_power = msg.payload.battery_power;\n}\n\n// get current power setpoint\nif(msg.payload.L1_AcPowerSetpoint == null){\n L1_AcPowerSetpoint = 0;\n}else{\n L1_AcPowerSetpoint=msg.payload.L1_AcPowerSetpoint;\n}\n\nif(msg.payload.L2_AcPowerSetpoint == null){\n L2_AcPowerSetpoint = 0;\n}else{\n L2_AcPowerSetpoint=msg.payload.L2_AcPowerSetpoint;\n}\n\nif(msg.payload.L3_AcPowerSetpoint == null){\n L3_AcPowerSetpoint = 0;\n}else{\n L3_AcPowerSetpoint=msg.payload.L3_AcPowerSetpoint;\n}\n\ninverter_power_setpoint= L1_AcPowerSetpoint+L2_AcPowerSetpoint+L3_AcPowerSetpoint;\n\n// get AC Out whihc is critical loads\nif(msg.payload.L1_AC_Out == null ||msg.payload.L2_AC_Out == null || msg.payload.L3_AC_Out == null){\n AC_out=0;\n}else{\n AC_out = msg.payload.L1_AC_Out + msg.payload.L2_AC_Out+msg.payload.L3_AC_Out;\n}\n\n// get PV production\nif(msg.payload.PVs_Power == null){\n PV_production = 0;\n}else{\n PV_production = msg.payload.PVs_Power;\n}\n\n// cal calculated max inverter power based on limb strings<=1 and DC Bus voltage >=44V when discharging, further details in flow 3\nconfigured_max_inverter_power = num_phases*10000;//3000W for each phase\nmax_discharge_current_batteries = 15*(5*n_batteries-msg.payload.num_limb_string);\nDC_BUS_Voltage = msg.payload.DC_BUS_Voltage;\n\nif(44.1=44V when discharging, further details in flow 3\nconfigured_max_inverter_power = num_phases*10000;//3000W for each phase\nmax_discharge_current_batteries = 15*(5*n_batteries-msg.payload.num_limb_string);\nDC_BUS_Voltage = msg.payload.DC_BUS_Voltage;\n\nif(44.11){\n total_num_limb_string = -1;//if there are more than 1 limb string in a battery, should give alarm to stop use this battery\n battery_health.push(\"Battery \"+(i+2)+\" has more than 1 limb string!\");\n }\n \n if(main_switch_state == false){\n total_num_limb_string = -1;//no meaning here, just used for stopping calculating max discharge power\n battery_health.push(\"Battery \"+(i+2)+\" has main switch open!\");\n }\n \n if(num_limb_string<=1){\n total_num_limb_string+=num_limb_string;\n battery_health.push(\"Battery \"+(i+2)+\" has \" + num_limb_string+ \" limb strings.\");\n }\n}\nmsg.payload.num_limb_string = total_num_limb_string;\nmsg.payload.battery_health = battery_health;\n\nreturn msg;", + "func": "let total_num_limb_string=0;\nlimb_string_list = msg.payload.limb_string_list;\nmain_switch_state_list = msg.payload.main_switch_state;\nbattery_health = [];\nif (limb_string_list == null){\n msg.payload.battery_health = \"BMS connection lost!\";\n msg.payload.num_limb_string = -1\n return msg;\n}\n\nfor (let i = 0; i < limb_string_list.length; i++) {\n num_limb_string = limb_string_list[i][1][0];\n\n if(num_limb_string>1){\n total_num_limb_string = -1;//if there are more than 1 limb string in a battery, should give alarm to stop use this battery\n battery_health.push(\"Battery \"+(i+2)+\" has more than 1 limb string!\");\n }\n \n if(num_limb_string<=1){\n total_num_limb_string+=num_limb_string;\n battery_health.push(\"Battery \"+(i+2)+\" has \" + num_limb_string+ \" limb strings.\");\n }\n}\nmsg.payload.num_limb_string = total_num_limb_string;\nmsg.payload.battery_health = battery_health;\n\nreturn msg;", "outputs": 1, "timeout": 0, "noerr": 0, @@ -2481,7 +2431,7 @@ "path": "/Ac/NumberOfPhases", "serviceObj": { "service": "com.victronenergy.vebus/276", - "name": "MultiGrid 48/3000/35-50" + "name": "MultiPlus-II 48/3000/35-32" }, "pathObj": { "path": "/Ac/NumberOfPhases", @@ -2490,7 +2440,7 @@ }, "name": "", "onlyChanges": false, - "x": 190, + "x": 200, "y": 1560, "wires": [ [ @@ -2523,7 +2473,7 @@ "path": "/Dc/0/Voltage", "serviceObj": { "service": "com.victronenergy.vebus/276", - "name": "MultiGrid 48/3000/35-50" + "name": "MultiPlus-II 48/3000/35-32" }, "pathObj": { "path": "/Dc/0/Voltage", @@ -2533,7 +2483,7 @@ "name": "", "onlyChanges": false, "roundValues": "0", - "x": 210, + "x": 220, "y": 660, "wires": [ [ @@ -2549,7 +2499,7 @@ "path": "/Hub4/L1/AcPowerSetpoint", "serviceObj": { "service": "com.victronenergy.vebus/276", - "name": "MultiGrid 48/3000/35-50" + "name": "MultiPlus-II 48/3000/35-32" }, "pathObj": { "path": "/Hub4/L1/AcPowerSetpoint", @@ -2558,7 +2508,7 @@ }, "name": "", "onlyChanges": false, - "x": 230, + "x": 240, "y": 760, "wires": [ [ @@ -2574,7 +2524,7 @@ "path": "/Hub4/L2/AcPowerSetpoint", "serviceObj": { "service": "com.victronenergy.vebus/276", - "name": "MultiGrid 48/3000/35-50" + "name": "MultiPlus-II 48/3000/35-32" }, "pathObj": { "path": "/Hub4/L2/AcPowerSetpoint", @@ -2583,7 +2533,7 @@ }, "name": "", "onlyChanges": false, - "x": 230, + "x": 240, "y": 840, "wires": [ [ @@ -2599,7 +2549,7 @@ "path": "/Hub4/L3/AcPowerSetpoint", "serviceObj": { "service": "com.victronenergy.vebus/276", - "name": "MultiGrid 48/3000/35-50" + "name": "MultiPlus-II 48/3000/35-32" }, "pathObj": { "path": "/Hub4/L3/AcPowerSetpoint", @@ -2608,7 +2558,7 @@ }, "name": "", "onlyChanges": false, - "x": 230, + "x": 240, "y": 920, "wires": [ [ @@ -2624,7 +2574,7 @@ "path": "/Hub4/L3/AcPowerSetpoint", "serviceObj": { "service": "com.victronenergy.vebus/276", - "name": "MultiGrid 48/3000/35-50" + "name": "MultiPlus-II 48/3000/35-32" }, "pathObj": { "path": "/Hub4/L3/AcPowerSetpoint", @@ -2634,7 +2584,7 @@ }, "name": "", "onlyChanges": false, - "x": 3090, + "x": 3100, "y": 460, "wires": [] }, @@ -2646,7 +2596,7 @@ "path": "/Hub4/L2/AcPowerSetpoint", "serviceObj": { "service": "com.victronenergy.vebus/276", - "name": "MultiGrid 48/3000/35-50" + "name": "MultiPlus-II 48/3000/35-32" }, "pathObj": { "path": "/Hub4/L2/AcPowerSetpoint", @@ -2656,7 +2606,7 @@ }, "name": "", "onlyChanges": false, - "x": 3090, + "x": 3100, "y": 400, "wires": [] }, @@ -2668,7 +2618,7 @@ "path": "/Hub4/L1/AcPowerSetpoint", "serviceObj": { "service": "com.victronenergy.vebus/276", - "name": "MultiGrid 48/3000/35-50" + "name": "MultiPlus-II 48/3000/35-32" }, "pathObj": { "path": "/Hub4/L1/AcPowerSetpoint", @@ -2678,7 +2628,7 @@ }, "name": "", "onlyChanges": false, - "x": 3090, + "x": 3100, "y": 340, "wires": [] }, @@ -2699,6 +2649,33 @@ "y": 160, "wires": [] }, + { + "id": "664a018fc9f6bbc6", + "type": "change", + "z": "58aeeaac02a3a4c7", + "name": "Please replace battery first!", + "rules": [ + { + "t": "set", + "p": "payload", + "pt": "msg", + "to": "Please replace battery first!", + "tot": "str" + } + ], + "action": "", + "property": "", + "from": "", + "to": "", + "reg": false, + "x": 2060, + "y": 620, + "wires": [ + [ + "c40f347a74b9ef10" + ] + ] + }, { "id": "bf31818b5561403e", "type": "comment",