Thanks. Adjusted to build in update only function.
For most beneficial data points like CVL, DCL, CCL which are not often changing this creates a problem for initial one shot data transfer to DBus Output at start (of the flow or reboot).
Bringing a simple delay in, helps to have DBus ready for writing.
Looks good and I can go on:
[
{
"id": "e4f5e8533ac57fae",
"type": "tab",
"label": "virt.Battery",
"disabled": false,
"info": "",
"env": []
},
{
"id": "0413d13423080ed7",
"type": "victron-input-battery",
"z": "e4f5e8533ac57fae",
"service": "com.victronenergy.battery/290",
"path": "/Dc/0/Voltage",
"serviceObj": {
"service": "com.victronenergy.battery/290",
"name": "YiXiang #3"
},
"pathObj": {
"path": "/Dc/0/Voltage",
"type": "float",
"name": "Battery voltage (V)"
},
"name": "Voltage Shunt #3",
"onlyChanges": true,
"roundValues": "2",
"x": 220,
"y": 460,
"wires": [
[
"3e745bc230da5075"
]
]
},
{
"id": "77c3d173c4a16a55",
"type": "victron-output-custom",
"z": "e4f5e8533ac57fae",
"service": "com.victronenergy.battery/101",
"path": "/Dc/0/Power",
"serviceObj": {
"service": "com.victronenergy.battery/101",
"name": "virt.Battery (101)"
},
"pathObj": {
"path": "/Dc/0/Power",
"name": "/Dc/0/Power",
"type": "object",
"value": null
},
"name": "",
"onlyChanges": false,
"x": 990,
"y": 600,
"wires": []
},
{
"id": "e12958100cc4e2aa",
"type": "victron-output-custom",
"z": "e4f5e8533ac57fae",
"service": "com.victronenergy.battery/101",
"path": "/Info/MaxChargeCurrent",
"serviceObj": {
"service": "com.victronenergy.battery/101",
"name": "virt.Battery (101)"
},
"pathObj": {
"path": "/Info/MaxChargeCurrent",
"name": "/Info/MaxChargeCurrent",
"type": "object",
"value": null
},
"name": "",
"onlyChanges": false,
"x": 1030,
"y": 840,
"wires": []
},
{
"id": "b575872270083217",
"type": "victron-output-custom",
"z": "e4f5e8533ac57fae",
"service": "com.victronenergy.battery/101",
"path": "/Info/MaxDischargeCurrent",
"serviceObj": {
"service": "com.victronenergy.battery/101",
"name": "virt.Battery (101)"
},
"pathObj": {
"path": "/Info/MaxDischargeCurrent",
"name": "/Info/MaxDischargeCurrent",
"type": "object",
"value": null
},
"name": "",
"onlyChanges": false,
"x": 1030,
"y": 900,
"wires": []
},
{
"id": "71ee0fe4c9a413c3",
"type": "victron-output-custom",
"z": "e4f5e8533ac57fae",
"service": "com.victronenergy.battery/101",
"path": "/Info/MaxChargeVoltage",
"serviceObj": {
"service": "com.victronenergy.battery/101",
"name": "virt.Battery (101)"
},
"pathObj": {
"path": "/Info/MaxChargeVoltage",
"name": "/Info/MaxChargeVoltage",
"type": "object",
"value": null
},
"name": "",
"onlyChanges": false,
"x": 1030,
"y": 960,
"wires": []
},
{
"id": "080f1cfea9732d56",
"type": "victron-input-battery",
"z": "e4f5e8533ac57fae",
"service": "com.victronenergy.battery/290",
"path": "/Dc/0/Current",
"serviceObj": {
"service": "com.victronenergy.battery/290",
"name": "YiXiang #3"
},
"pathObj": {
"path": "/Dc/0/Current",
"type": "float",
"name": "Battery current (A)"
},
"name": "Current Shunt #3",
"onlyChanges": true,
"roundValues": "1",
"x": 220,
"y": 320,
"wires": [
[
"7f902812e40b31ed"
]
]
},
{
"id": "caece4e0f918de3a",
"type": "victron-input-battery",
"z": "e4f5e8533ac57fae",
"service": "com.victronenergy.battery/290",
"path": "/Dc/0/Power",
"serviceObj": {
"service": "com.victronenergy.battery/290",
"name": "YiXiang #3"
},
"pathObj": {
"path": "/Dc/0/Power",
"type": "float",
"name": "Battery power (W)"
},
"name": "Power Shunt #3",
"onlyChanges": true,
"roundValues": "0",
"x": 220,
"y": 600,
"wires": [
[
"bc3387b7dba1b08f"
]
]
},
{
"id": "bcbefad20fe64b99",
"type": "victron-input-battery",
"z": "e4f5e8533ac57fae",
"service": "com.victronenergy.battery/290",
"path": "/Soc",
"serviceObj": {
"service": "com.victronenergy.battery/290",
"name": "YiXiang #3"
},
"pathObj": {
"path": "/Soc",
"type": "float",
"name": "State of charge (%)"
},
"name": "SOC Shunt #3",
"onlyChanges": true,
"roundValues": "1",
"x": 210,
"y": 200,
"wires": [
[
"35755d2f9138d667"
]
]
},
{
"id": "35755d2f9138d667",
"type": "function",
"z": "e4f5e8533ac57fae",
"name": "SOC",
"func": "let soc = context.get(\"soc\") || {};\n\n// Neuen SOC-Wert speichern\nsoc[msg.service] = msg.payload;\ncontext.set(\"soc\", soc);\n\n// Durchschnitt aller vorhandenen SOC-Werte berechnen\nlet sum = 0;\nlet count = 0;\n\nfor (let key in soc) {\n let value = soc[key];\n if (value != null && typeof value === \"number\") {\n sum += value;\n count++;\n }\n}\n\n// Wenn mindestens ein Wert vorhanden ist, Durchschnitt zurückgeben\nif (count > 0) {\n let avg = sum / count;\n return { payload: avg };\n}\n\nreturn null;",
"outputs": 1,
"timeout": 0,
"noerr": 0,
"initialize": "",
"finalize": "",
"libs": [],
"x": 650,
"y": 200,
"wires": [
[
"74e667e16030d291"
]
]
},
{
"id": "7f902812e40b31ed",
"type": "function",
"z": "e4f5e8533ac57fae",
"name": "Current",
"func": "let current = context.get(\"current\") || {};\n\n// Neuen Shunt-Wert speichern\ncurrent[msg.service] = msg.payload;\ncontext.set(\"current\", current);\n\n// Summe aller Shunt-Werte berechnen\nlet sum = 0;\nlet hasValue = false;\n\nfor (let key in current) {\n let value = current[key];\n if (value != null && typeof value === \"number\") {\n sum += value;\n hasValue = true;\n }\n}\n\n// Wenn mindestens ein Wert vorhanden ist, zurückgeben\nif (hasValue) {\n return { payload: sum };\n}\n\nreturn null;",
"outputs": 1,
"timeout": 0,
"noerr": 0,
"initialize": "",
"finalize": "",
"libs": [],
"x": 660,
"y": 320,
"wires": [
[
"953f20d917b4ec6d"
]
]
},
{
"id": "3e745bc230da5075",
"type": "function",
"z": "e4f5e8533ac57fae",
"name": "Voltage",
"func": "let volt = context.get(\"volt\") || {};\n\n// Wert speichern (pro Service)\nvolt[msg.service] = msg.payload;\n\ncontext.set(\"volt\", volt);\n\n// Alle vorhandenen Werte sammeln\nlet values = Object.values(volt).filter(v => v !== null && v !== undefined);\n\n// Wenn mindestens 1 Wert vorhanden → Mittelwert\nif (values.length > 0) {\n let avg = values.reduce((a,b)=>a+b,0) / values.length;\n return { payload: avg };\n}\n\n// Wenn keiner da → nichts senden\nreturn null;",
"outputs": 1,
"timeout": 0,
"noerr": 0,
"initialize": "",
"finalize": "",
"libs": [],
"x": 660,
"y": 460,
"wires": [
[
"db603f1b55d34603"
]
]
},
{
"id": "bc3387b7dba1b08f",
"type": "function",
"z": "e4f5e8533ac57fae",
"name": "Power",
"func": "let current = context.get(\"current\") || {};\n\n// Neuen Shunt-Wert speichern\ncurrent[msg.service] = msg.payload;\ncontext.set(\"current\", current);\n\n// Summe aller vorhandenen Shunt-Werte berechnen\nlet sum = 0;\nlet count = 0;\n\nfor (let key in current) {\n let value = current[key];\n if (value != null && typeof value === \"number\") {\n sum += value;\n count++;\n }\n}\n\n// Wenn mindestens ein Wert vorhanden ist, zurückgeben\nif (count > 0) {\n return { payload: sum };\n}\n\nreturn null;",
"outputs": 1,
"timeout": 0,
"noerr": 0,
"initialize": "",
"finalize": "",
"libs": [],
"x": 650,
"y": 600,
"wires": [
[
"77c3d173c4a16a55"
]
]
},
{
"id": "85777564eba91aa0",
"type": "victron-virtual",
"z": "e4f5e8533ac57fae",
"name": "virt.Battery",
"device": "battery",
"default_values": false,
"battery_capacity": "942",
"include_battery_temperature": true,
"grid_nrofphases": 1,
"include_motor_temp": false,
"include_controller_temp": false,
"include_coolant_temp": false,
"include_motor_rpm": true,
"include_motor_direction": true,
"position": 0,
"pvinverter_nrofphases": 1,
"fluid_type": 0,
"include_tank_battery": false,
"include_tank_temperature": false,
"tank_battery_voltage": 3.3,
"tank_capacity": 0.2,
"temperature_type": 2,
"include_humidity": false,
"include_pressure": false,
"include_temp_battery": false,
"temp_battery_voltage": 3.3,
"x": 980,
"y": 80,
"wires": []
},
{
"id": "74e667e16030d291",
"type": "victron-output-custom",
"z": "e4f5e8533ac57fae",
"service": "com.victronenergy.battery/101",
"path": "/Soc",
"serviceObj": {
"service": "com.victronenergy.battery/101",
"name": "virt.Battery (101)"
},
"pathObj": {
"path": "/Soc",
"name": "/Soc",
"type": "object",
"value": null
},
"name": "",
"onlyChanges": false,
"x": 960,
"y": 200,
"wires": []
},
{
"id": "953f20d917b4ec6d",
"type": "victron-output-custom",
"z": "e4f5e8533ac57fae",
"service": "com.victronenergy.battery/101",
"path": "/Dc/0/Current",
"pathObj": {
"path": "/Dc/0/Current",
"name": "/Dc/0/Current",
"type": "object",
"value": null
},
"name": "",
"onlyChanges": false,
"x": 940,
"y": 320,
"wires": []
},
{
"id": "db603f1b55d34603",
"type": "victron-output-custom",
"z": "e4f5e8533ac57fae",
"service": "com.victronenergy.battery/101",
"path": "/Dc/0/Voltage",
"serviceObj": {
"service": "com.victronenergy.battery/101",
"name": "virt.Battery (101)"
},
"pathObj": {
"path": "/Dc/0/Voltage",
"name": "/Dc/0/Voltage",
"type": "object",
"value": null
},
"name": "",
"onlyChanges": false,
"x": 990,
"y": 460,
"wires": []
},
{
"id": "48cd38e59ea73c8a",
"type": "victron-output-custom",
"z": "e4f5e8533ac57fae",
"service": "com.victronenergy.battery/101",
"path": "/Dc/0/Temperature",
"serviceObj": {
"service": "com.victronenergy.battery/101",
"name": "virt.Battery (101)"
},
"pathObj": {
"path": "/Dc/0/Temperature",
"name": "/Dc/0/Temperature",
"type": "object",
"value": null
},
"name": "",
"onlyChanges": false,
"x": 1010,
"y": 780,
"wires": []
},
{
"id": "4fa7621d61c24168",
"type": "victron-input-battery",
"z": "e4f5e8533ac57fae",
"service": "com.victronenergy.battery/512",
"path": "/Dc/0/Temperature",
"serviceObj": {
"service": "com.victronenergy.battery/512",
"name": "JK-BMS"
},
"pathObj": {
"path": "/Dc/0/Temperature",
"type": "float",
"name": "Battery temperature (°C)"
},
"name": "",
"onlyChanges": true,
"roundValues": "1",
"x": 280,
"y": 780,
"wires": [
[
"dca27bac0b3b8b66"
]
]
},
{
"id": "d13da215a334edd5",
"type": "victron-input-battery",
"z": "e4f5e8533ac57fae",
"service": "com.victronenergy.battery/512",
"path": "/Info/MaxChargeCurrent",
"serviceObj": {
"service": "com.victronenergy.battery/512",
"name": "JK-BMS"
},
"pathObj": {
"path": "/Info/MaxChargeCurrent",
"type": "float",
"name": "CCL - Charge Current Limit (A)"
},
"name": "",
"onlyChanges": true,
"roundValues": "0",
"x": 300,
"y": 840,
"wires": [
[
"4a83a5e3434f41df"
]
]
},
{
"id": "19c6012e46019fe7",
"type": "victron-input-battery",
"z": "e4f5e8533ac57fae",
"service": "com.victronenergy.battery/512",
"path": "/Info/MaxDischargeCurrent",
"serviceObj": {
"service": "com.victronenergy.battery/512",
"name": "JK-BMS"
},
"pathObj": {
"path": "/Info/MaxDischargeCurrent",
"type": "float",
"name": "DCL - Discharge Current Limit (A)"
},
"name": "",
"onlyChanges": true,
"roundValues": "0",
"x": 310,
"y": 900,
"wires": [
[
"7524d3e4e9fced6e"
]
]
},
{
"id": "41da1451bdc4071b",
"type": "victron-input-battery",
"z": "e4f5e8533ac57fae",
"service": "com.victronenergy.battery/512",
"path": "/Info/MaxChargeVoltage",
"serviceObj": {
"service": "com.victronenergy.battery/512",
"name": "JK-BMS"
},
"pathObj": {
"path": "/Info/MaxChargeVoltage",
"type": "float",
"name": "CVL - Charge Voltage Limit (V)"
},
"name": "",
"onlyChanges": true,
"roundValues": "2",
"x": 300,
"y": 960,
"wires": [
[
"b35e0cdecdc24c80"
]
]
},
{
"id": "4a83a5e3434f41df",
"type": "delay",
"z": "e4f5e8533ac57fae",
"name": "Delay 3s",
"pauseType": "delay",
"timeout": "3",
"timeoutUnits": "seconds",
"rate": "1",
"nbRateUnits": "1",
"rateUnits": "second",
"randomFirst": "1",
"randomLast": "5",
"randomUnits": "seconds",
"drop": false,
"allowrate": false,
"outputs": 1,
"x": 660,
"y": 840,
"wires": [
[
"e12958100cc4e2aa"
]
]
},
{
"id": "7524d3e4e9fced6e",
"type": "delay",
"z": "e4f5e8533ac57fae",
"name": "Delay 3s",
"pauseType": "delay",
"timeout": "3",
"timeoutUnits": "seconds",
"rate": "1",
"nbRateUnits": "1",
"rateUnits": "second",
"randomFirst": "1",
"randomLast": "5",
"randomUnits": "seconds",
"drop": false,
"allowrate": false,
"outputs": 1,
"x": 660,
"y": 900,
"wires": [
[
"b575872270083217"
]
]
},
{
"id": "b35e0cdecdc24c80",
"type": "delay",
"z": "e4f5e8533ac57fae",
"name": "Delay 3s",
"pauseType": "delay",
"timeout": "3",
"timeoutUnits": "seconds",
"rate": "1",
"nbRateUnits": "1",
"rateUnits": "second",
"randomFirst": "1",
"randomLast": "5",
"randomUnits": "seconds",
"drop": false,
"allowrate": false,
"outputs": 1,
"x": 660,
"y": 960,
"wires": [
[
"71ee0fe4c9a413c3"
]
]
},
{
"id": "dca27bac0b3b8b66",
"type": "delay",
"z": "e4f5e8533ac57fae",
"name": "Delay 3s",
"pauseType": "delay",
"timeout": "3",
"timeoutUnits": "seconds",
"rate": "1",
"nbRateUnits": "1",
"rateUnits": "second",
"randomFirst": "1",
"randomLast": "5",
"randomUnits": "seconds",
"drop": false,
"allowrate": false,
"outputs": 1,
"x": 660,
"y": 780,
"wires": [
[
"48cd38e59ea73c8a"
]
]
}
]