Skip to content

Instantly share code, notes, and snippets.

@nalditopr
Last active April 12, 2025 04:42
Show Gist options
  • Save nalditopr/493af377e9928b88c2639a9e1607f127 to your computer and use it in GitHub Desktop.
Save nalditopr/493af377e9928b88c2639a9e1607f127 to your computer and use it in GitHub Desktop.
Eco Flow Delta 3 + Node-Red + Homeassistant
[
{
"id": "5c3a7efbb734c312",
"type": "tab",
"label": "Ecoflow MQTT",
"disabled": false,
"info": "",
"env": []
},
{
"id": "773fab09ddaa9e53",
"type": "inject",
"z": "5c3a7efbb734c312",
"name": "connect",
"props": [
{
"p": "action",
"v": "connect",
"vt": "str"
},
{
"p": "topic",
"vt": "str"
}
],
"repeat": "",
"crontab": "",
"once": false,
"onceDelay": 0.1,
"topic": "",
"x": 350,
"y": 520,
"wires": [
[
"d5d7e8960ba14429"
]
]
},
{
"id": "d5d7e8960ba14429",
"type": "mqtt out",
"z": "5c3a7efbb734c312",
"name": "ef-mqtt",
"topic": "",
"qos": "",
"retain": "",
"respTopic": "",
"contentType": "",
"userProps": "",
"correl": "",
"expiry": "",
"broker": "4a025f91e9595714",
"x": 540,
"y": 540,
"wires": []
},
{
"id": "6d38c1d92d6c19eb",
"type": "mqtt in",
"z": "5c3a7efbb734c312",
"name": "",
"topic": "/app/[[APPID]]/[[SN]]/thing/property/get",
"qos": "2",
"datatype": "base64",
"broker": "4a025f91e9595714",
"nl": false,
"rap": true,
"rh": 0,
"inputs": 0,
"x": 970,
"y": 340,
"wires": [
[
"0cf29e3992e7bfdc"
]
]
},
{
"id": "c8d401ac3c0d530b",
"type": "debug",
"z": "5c3a7efbb734c312",
"name": "debug 2",
"active": false,
"tosidebar": true,
"console": false,
"tostatus": false,
"complete": "payload",
"targetType": "msg",
"statusVal": "",
"statusType": "auto",
"x": 1180,
"y": 220,
"wires": []
},
{
"id": "0cf29e3992e7bfdc",
"type": "debug",
"z": "5c3a7efbb734c312",
"name": "debug 3",
"active": false,
"tosidebar": true,
"console": false,
"tostatus": false,
"complete": "false",
"statusVal": "",
"statusType": "auto",
"x": 1420,
"y": 340,
"wires": []
},
{
"id": "d9ecc011d0be04ea",
"type": "mqtt in",
"z": "5c3a7efbb734c312",
"name": "",
"topic": "/app/[[APPID]]/[[SN]]/thing/property/get_reply",
"qos": "2",
"datatype": "base64",
"broker": "4a025f91e9595714",
"nl": false,
"rap": true,
"rh": 0,
"inputs": 0,
"x": 990,
"y": 460,
"wires": [
[
"5dc759c3914d8893"
]
]
},
{
"id": "34495fd19ce3c931",
"type": "mqtt in",
"z": "5c3a7efbb734c312",
"name": "",
"topic": "/app/[[APPID]]/[[SN]]/thing/property/set",
"qos": "2",
"datatype": "base64",
"broker": "4a025f91e9595714",
"nl": false,
"rap": true,
"rh": 0,
"inputs": 0,
"x": 970,
"y": 580,
"wires": [
[
"1b07cbc9319439e6"
]
]
},
{
"id": "196e8e1147aa9c70",
"type": "mqtt in",
"z": "5c3a7efbb734c312",
"name": "",
"topic": "/app/[[APPID]]/[[SN]]/thing/property/set_reply",
"qos": "2",
"datatype": "base64",
"broker": "4a025f91e9595714",
"nl": false,
"rap": true,
"rh": 0,
"inputs": 0,
"x": 980,
"y": 700,
"wires": [
[
"222174cf92b067ba"
]
]
},
{
"id": "5dc759c3914d8893",
"type": "debug",
"z": "5c3a7efbb734c312",
"name": "debug 4",
"active": false,
"tosidebar": true,
"console": false,
"tostatus": false,
"complete": "false",
"statusVal": "",
"statusType": "auto",
"x": 1420,
"y": 460,
"wires": []
},
{
"id": "1b07cbc9319439e6",
"type": "debug",
"z": "5c3a7efbb734c312",
"name": "debug 5",
"active": false,
"tosidebar": true,
"console": false,
"tostatus": false,
"complete": "false",
"statusVal": "",
"statusType": "auto",
"x": 1420,
"y": 580,
"wires": []
},
{
"id": "222174cf92b067ba",
"type": "debug",
"z": "5c3a7efbb734c312",
"name": "debug 6",
"active": false,
"tosidebar": true,
"console": false,
"tostatus": false,
"complete": "false",
"statusVal": "",
"statusType": "auto",
"x": 1420,
"y": 700,
"wires": []
},
{
"id": "2ea889238290350b",
"type": "mqtt out",
"z": "5c3a7efbb734c312",
"name": "",
"topic": "/app/[[APPID]]/[[SN]]/thing/property/set",
"qos": "0",
"retain": "",
"respTopic": "",
"contentType": "",
"userProps": "",
"correl": "",
"expiry": "",
"broker": "4a025f91e9595714",
"x": 990,
"y": 980,
"wires": []
},
{
"id": "3507d66f640759d3",
"type": "inject",
"z": "5c3a7efbb734c312",
"name": "beep_on",
"props": [
{
"p": "payload"
}
],
"repeat": "",
"crontab": "",
"once": false,
"onceDelay": 0.1,
"topic": "",
"payload": "{\"subMesssage_1\":{\"NestedsubMesssage_1\":{\"int_9\":1},\"int_2\":32,\"int_3\":2,\"int_4\":1,\"int_5\":1,\"int_8\":254,\"int_9\":17,\"int_10\":2,\"int_11\":1,\"int_14\":128301330,\"int_15\":1,\"int_16\":19,\"int_17\":1}}",
"payloadType": "json",
"x": 340,
"y": 1080,
"wires": [
[
"1879d2c74d981f0a"
]
]
},
{
"id": "2126c09b8693f86a",
"type": "mqtt in",
"z": "5c3a7efbb734c312",
"name": "",
"topic": "/app/[[APPID]]/[[SN]]/thing/property/set",
"qos": "2",
"datatype": "auto-detect",
"broker": "4a025f91e9595714",
"nl": false,
"rap": true,
"rh": 0,
"inputs": 0,
"x": 990,
"y": 640,
"wires": [
[
"1b07cbc9319439e6"
]
]
},
{
"id": "1771f8034a515b9c",
"type": "mqtt in",
"z": "5c3a7efbb734c312",
"name": "",
"topic": "/app/[[APPID]]/[[SN]]/thing/property/get",
"qos": "2",
"datatype": "auto-detect",
"broker": "4a025f91e9595714",
"nl": false,
"rap": true,
"rh": 0,
"inputs": 0,
"x": 990,
"y": 400,
"wires": [
[
"0cf29e3992e7bfdc"
]
]
},
{
"id": "6bd61b7f744cd6dd",
"type": "mqtt in",
"z": "5c3a7efbb734c312",
"name": "",
"topic": "/app/[[APPID]]/[[SN]]/thing/property/get_reply",
"qos": "2",
"datatype": "auto-detect",
"broker": "4a025f91e9595714",
"nl": false,
"rap": true,
"rh": 0,
"inputs": 0,
"x": 1010,
"y": 520,
"wires": [
[
"5dc759c3914d8893",
"15622328ecef2318"
]
]
},
{
"id": "2aa01b5bcbc04c2d",
"type": "mqtt in",
"z": "5c3a7efbb734c312",
"name": "",
"topic": "/app/[[APPID]]/[[SN]]/thing/property/set_reply",
"qos": "2",
"datatype": "auto-detect",
"broker": "4a025f91e9595714",
"nl": false,
"rap": true,
"rh": 0,
"inputs": 0,
"x": 1000,
"y": 760,
"wires": [
[
"222174cf92b067ba"
]
]
},
{
"id": "af84a2f4c0da27f2",
"type": "mqtt in",
"z": "5c3a7efbb734c312",
"name": "",
"topic": "/app/device/status/[[SN]]",
"qos": "2",
"datatype": "auto-detect",
"broker": "4a025f91e9595714",
"nl": false,
"rap": true,
"rh": 0,
"inputs": 0,
"x": 900,
"y": 280,
"wires": [
[
"c8d401ac3c0d530b"
]
]
},
{
"id": "1879d2c74d981f0a",
"type": "encode",
"z": "5c3a7efbb734c312",
"name": "",
"protofile": "fd04eecb52341faa",
"protoType": "MessageFromJson",
"x": 620,
"y": 980,
"wires": [
[
"2ea889238290350b"
]
]
},
{
"id": "c41e867bd65c48cc",
"type": "inject",
"z": "5c3a7efbb734c312",
"name": "beep_off",
"props": [
{
"p": "payload"
}
],
"repeat": "",
"crontab": "",
"once": false,
"onceDelay": 0.1,
"topic": "",
"payload": "{\"subMesssage_1\":{\"NestedsubMesssage_1\":{\"int_9\":0},\"int_2\":32,\"int_3\":2,\"int_4\":1,\"int_5\":1,\"int_8\":254,\"int_9\":17,\"int_10\":2,\"int_11\":1,\"int_14\":128301330,\"int_15\":1,\"int_16\":19,\"int_17\":1}}",
"payloadType": "json",
"x": 340,
"y": 1200,
"wires": [
[
"1879d2c74d981f0a"
]
]
},
{
"id": "4ec8c1c4e51da6e7",
"type": "inject",
"z": "5c3a7efbb734c312",
"name": "get",
"props": [
{
"p": "payload"
}
],
"repeat": "15",
"crontab": "",
"once": false,
"onceDelay": 0.1,
"topic": "",
"payload": "{\"subMesssage_1\":{\"NestedsubMesssage_1\":{\"int_14\":128301330,\"bytes_23\":\"Android\"}}}",
"payloadType": "json",
"x": 350,
"y": 660,
"wires": [
[
"d0662aaa5ced35c4"
]
]
},
{
"id": "1050b450dc646a9f",
"type": "mqtt out",
"z": "5c3a7efbb734c312",
"name": "",
"topic": "/app/[[APPID]]/[[SN]]/thing/property/get",
"qos": "2",
"retain": "",
"respTopic": "",
"contentType": "",
"userProps": "",
"correl": "",
"expiry": "",
"broker": "4a025f91e9595714",
"x": 990,
"y": 860,
"wires": []
},
{
"id": "d0662aaa5ced35c4",
"type": "encode",
"z": "5c3a7efbb734c312",
"name": "",
"protofile": "fd04eecb52341faa",
"protoType": "MessageFromJson",
"x": 620,
"y": 860,
"wires": [
[
"1050b450dc646a9f"
]
]
},
{
"id": "1981b4272caec0f1",
"type": "debug",
"z": "5c3a7efbb734c312",
"name": "debug 7",
"active": false,
"tosidebar": true,
"console": false,
"tostatus": false,
"complete": "false",
"statusVal": "",
"statusType": "auto",
"x": 2240,
"y": 520,
"wires": []
},
{
"id": "668e876f10fa3918",
"type": "inject",
"z": "5c3a7efbb734c312",
"name": "charge_15",
"props": [
{
"p": "payload"
}
],
"repeat": "",
"crontab": "",
"once": false,
"onceDelay": 0.1,
"topic": "",
"payload": "{\"subMesssage_1\":{\"NestedsubMesssage_1\":{\"int_102\":15},\"int_2\":32,\"int_3\":2,\"int_4\":1,\"int_5\":1,\"int_8\":254,\"int_9\":17,\"int_10\":3,\"int_11\":1,\"int_14\":148771586,\"int_15\":1,\"int_16\":19,\"int_17\":1}}",
"payloadType": "json",
"x": 340,
"y": 1000,
"wires": [
[
"1879d2c74d981f0a"
]
]
},
{
"id": "fab3e8f819aca276",
"type": "inject",
"z": "5c3a7efbb734c312",
"name": "charge_90",
"props": [
{
"p": "payload"
}
],
"repeat": "",
"crontab": "",
"once": false,
"onceDelay": 0.1,
"topic": "",
"payload": "{\"subMesssage_1\":{\"NestedsubMesssage_1\":{\"int_102\":90},\"int_2\":32,\"int_3\":2,\"int_4\":1,\"int_5\":1,\"int_8\":254,\"int_9\":17,\"int_10\":3,\"int_11\":1,\"int_14\":148771586,\"int_15\":1,\"int_16\":19,\"int_17\":1}}",
"payloadType": "json",
"x": 340,
"y": 920,
"wires": [
[
"1879d2c74d981f0a"
]
]
},
{
"id": "15622328ecef2318",
"type": "decode",
"z": "5c3a7efbb734c312",
"name": "",
"protofile": "09526bce7b477f38",
"protoType": "MessageFromJson",
"x": 1560,
"y": 520,
"wires": [
[
"86e09c3f6d07938c"
]
]
},
{
"id": "86e09c3f6d07938c",
"type": "function",
"z": "5c3a7efbb734c312",
"name": "parser",
"func": "// Array of variables to convert (define the path to each variable as a string, excluding the array index)\nlet variablesToConvert = [\n \"NestedsubMesssage_1.batteryLevel\",\n \"NestedsubMesssage_1.acPower\",\n \"NestedsubMesssage_1.acOut\"\n];\n\n// Helper function to access and modify nested properties\nfunction convertFixed32ToFloat(obj, path) {\n let keys = path.split(\".\");\n let lastKey = keys.pop();\n let target = keys.reduce((o, k) => (o && o[k] ? o[k] : undefined), obj);\n\n if (target && target[lastKey] !== undefined) {\n let fixed32Value = target[lastKey];\n let buffer = Buffer.alloc(4);\n buffer.writeUInt32LE(fixed32Value); // Write as little-endian\n let dataView = new DataView(buffer.buffer);\n let floatValue = dataView.getFloat32(0, true); // Convert to float (little-endian)\n target[lastKey] = Math.round(floatValue * 100) / 100; // Round to 2 decimals\n }\n}\n\n// Validate that the array exists\nif (\n msg.payload.subMesssage_1 &&\n Array.isArray(msg.payload.subMesssage_1)\n) {\n // Automatically find the element with the largest NestedsubMesssage_1 (by number of keys)\n let selectedElement = msg.payload.subMesssage_1.reduce((largest, current) => {\n const currentSize = current?.NestedsubMesssage_1 ? Object.keys(current.NestedsubMesssage_1).length : 0;\n const largestSize = largest?.NestedsubMesssage_1 ? Object.keys(largest.NestedsubMesssage_1).length : 0;\n return currentSize > largestSize ? current : largest;\n }, null);\n\n if (selectedElement) {\n // Loop through the variables and convert them for the selected element\n variablesToConvert.forEach(path => {\n convertFixed32ToFloat(selectedElement, path);\n });\n\n // Flatten the selected element for output\n msg.payload = {\n ...selectedElement.NestedsubMesssage_1\n };\n } else {\n msg.payload = { error: \"No valid element found in subMesssage_1.\" };\n }\n} else {\n // Handle the case where the array is invalid\n msg.payload = {\n error: \"subMesssage_1 is not a valid array.\"\n };\n}\n\n// Return the flattened object as the payload\nreturn msg;\n",
"outputs": 1,
"timeout": 0,
"noerr": 0,
"initialize": "",
"finalize": "",
"libs": [],
"x": 1710,
"y": 520,
"wires": [
[
"1981b4272caec0f1",
"16d905301a29dbdf",
"4df43232664f45b5",
"2177e930db19a389",
"5adb6177ab992ca0"
]
]
},
{
"id": "ab9e1d2599c501f9",
"type": "inject",
"z": "5c3a7efbb734c312",
"name": "self-powered off",
"props": [
{
"p": "payload"
}
],
"repeat": "",
"crontab": "",
"once": false,
"onceDelay": 0.1,
"topic": "",
"payload": "{\"subMesssage_1\":{\"NestedsubMesssage_1\":{\"selfpowered_106\":{}},\"int_2\":32,\"int_3\":2,\"int_4\":1,\"int_5\":1,\"int_8\":254,\"int_9\":17,\"int_10\":3,\"int_11\":1,\"int_14\":148771586,\"int_15\":1,\"int_16\":19,\"int_17\":1}}",
"payloadType": "json",
"x": 320,
"y": 860,
"wires": [
[
"1879d2c74d981f0a"
]
]
},
{
"id": "2b4391ab6cfa2082",
"type": "inject",
"z": "5c3a7efbb734c312",
"name": "self-powered on",
"props": [
{
"p": "payload"
}
],
"repeat": "",
"crontab": "",
"once": false,
"onceDelay": 0.1,
"topic": "",
"payload": "{\"subMesssage_1\":{\"NestedsubMesssage_1\":{\"int_26\":0,\"selfpowered_106\":{\"int_1\":1},\"int_138\":0},\"int_2\":32,\"int_3\":2,\"int_4\":1,\"int_5\":1,\"int_8\":254,\"int_9\":17,\"int_10\":11,\"int_11\":1,\"int_14\":357051739,\"int_15\":1,\"int_16\":19,\"int_17\":1}}",
"payloadType": "json",
"x": 320,
"y": 740,
"wires": [
[
"1879d2c74d981f0a"
]
]
},
{
"id": "16d905301a29dbdf",
"type": "ha-sensor",
"z": "5c3a7efbb734c312",
"name": "device_a_Battery Level",
"entityConfig": "49b4f2bfd1956a24",
"version": 0,
"state": "payload.batteryLevel",
"stateType": "msg",
"attributes": [],
"inputOverride": "allow",
"outputProperties": [],
"x": 1950,
"y": 700,
"wires": [
[
"1981b4272caec0f1"
]
]
},
{
"id": "4df43232664f45b5",
"type": "ha-sensor",
"z": "5c3a7efbb734c312",
"name": "device_a_Charge Target",
"entityConfig": "87a97985e13b1458",
"version": 0,
"state": "payload.target",
"stateType": "msg",
"attributes": [],
"inputOverride": "allow",
"outputProperties": [],
"x": 1960,
"y": 760,
"wires": [
[
"1981b4272caec0f1"
]
]
},
{
"id": "dfcac4c65259021a",
"type": "ha-switch",
"z": "5c3a7efbb734c312",
"name": "device_a_self-powered",
"version": 0,
"debugenabled": false,
"inputs": 0,
"outputs": 2,
"entityConfig": "20ef2d5be7415ccd",
"enableInput": false,
"outputOnStateChange": true,
"outputProperties": [
{
"property": "payload",
"propertyType": "msg",
"value": "",
"valueType": "str"
}
],
"x": 90,
"y": 800,
"wires": [
[
"14cf1dbdc9323cf5"
],
[
"168a92bf365a0769"
]
]
},
{
"id": "14cf1dbdc9323cf5",
"type": "change",
"z": "5c3a7efbb734c312",
"name": "self-powered on",
"rules": [
{
"t": "set",
"p": "payload",
"pt": "msg",
"to": "{\"subMesssage_1\":{\"NestedsubMesssage_1\":{\"int_26\":0,\"selfpowered_106\":{\"int_1\":1},\"int_138\":0},\"int_2\":32,\"int_3\":2,\"int_4\":1,\"int_5\":1,\"int_8\":254,\"int_9\":17,\"int_10\":11,\"int_11\":1,\"int_14\":357051739,\"int_15\":1,\"int_16\":19,\"int_17\":1}}",
"tot": "json"
}
],
"action": "",
"property": "",
"from": "",
"to": "",
"reg": false,
"x": 320,
"y": 780,
"wires": [
[
"1879d2c74d981f0a"
]
]
},
{
"id": "168a92bf365a0769",
"type": "change",
"z": "5c3a7efbb734c312",
"name": "self-powered off",
"rules": [
{
"t": "set",
"p": "payload",
"pt": "msg",
"to": "{\"subMesssage_1\":{\"NestedsubMesssage_1\":{\"selfpowered_106\":{}},\"int_2\":32,\"int_3\":2,\"int_4\":1,\"int_5\":1,\"int_8\":254,\"int_9\":17,\"int_10\":3,\"int_11\":1,\"int_14\":148771586,\"int_15\":1,\"int_16\":19,\"int_17\":1}}",
"tot": "json"
}
],
"action": "",
"property": "",
"from": "",
"to": "",
"reg": false,
"x": 320,
"y": 820,
"wires": [
[
"1879d2c74d981f0a"
]
]
},
{
"id": "2177e930db19a389",
"type": "ha-sensor",
"z": "5c3a7efbb734c312",
"name": "device_a_AC Power",
"entityConfig": "6670dfa7e6a8c02e",
"version": 0,
"state": "payload.acPower",
"stateType": "msg",
"attributes": [],
"inputOverride": "allow",
"outputProperties": [],
"x": 1940,
"y": 640,
"wires": [
[
"1981b4272caec0f1"
]
]
},
{
"id": "18c73ca84e0549a8",
"type": "ha-number",
"z": "5c3a7efbb734c312",
"name": "device_a_charge-target",
"version": 1,
"debugenabled": false,
"inputs": 0,
"outputs": 1,
"entityConfig": "a0136659e84650bb",
"exposeAsEntityConfig": "",
"mode": "listen",
"value": "payload",
"valueType": "msg",
"outputProperties": [
{
"property": "payload",
"propertyType": "msg",
"value": "",
"valueType": "value"
},
{
"property": "previousValue",
"propertyType": "msg",
"value": "",
"valueType": "previousValue"
}
],
"x": 90,
"y": 960,
"wires": [
[
"06a42ae752c09211"
]
]
},
{
"id": "06a42ae752c09211",
"type": "function",
"z": "5c3a7efbb734c312",
"name": "charge-target",
"func": "// Get the input number from the msg payload\nlet inputNumber = msg.payload;\n\n// Validate the input number and clamp it between 15 and 90\nif (inputNumber < 15) {\n inputNumber = 15;\n} else if (inputNumber > 90) {\n inputNumber = 90;\n}\n\n// Define the JSON structure\nconst jsonResponse = {\n \"subMesssage_1\": {\n \"NestedsubMesssage_1\": {\n \"int_102\": inputNumber // Use the validated input number here\n },\n \"int_2\": 32,\n \"int_3\": 2,\n \"int_4\": 1,\n \"int_5\": 1,\n \"int_8\": 254,\n \"int_9\": 17,\n \"int_10\": 3,\n \"int_11\": 1,\n \"int_14\": 148771586,\n \"int_15\": 1,\n \"int_16\": 19,\n \"int_17\": 1\n }\n};\n\n// Assign the JSON to msg.payload\nmsg.payload = jsonResponse;\n\n// Return the modified msg object\nreturn msg;\n",
"outputs": 1,
"timeout": 0,
"noerr": 0,
"initialize": "",
"finalize": "",
"libs": [],
"x": 330,
"y": 960,
"wires": [
[
"1879d2c74d981f0a"
]
]
},
{
"id": "20d9b6e2c35b70fc",
"type": "ha-switch",
"z": "5c3a7efbb734c312",
"name": "device_a_beep",
"version": 0,
"debugenabled": false,
"inputs": 0,
"outputs": 2,
"entityConfig": "43ab0950c992e96d",
"enableInput": false,
"outputOnStateChange": true,
"outputProperties": [
{
"property": "payload",
"propertyType": "msg",
"value": "",
"valueType": "str"
}
],
"x": 120,
"y": 1140,
"wires": [
[
"8d0c4baed56b9bfe"
],
[
"f591f651b4d2153a"
]
]
},
{
"id": "8d0c4baed56b9bfe",
"type": "change",
"z": "5c3a7efbb734c312",
"name": "beep-on",
"rules": [
{
"t": "set",
"p": "payload",
"pt": "msg",
"to": "{\"subMesssage_1\":{\"NestedsubMesssage_1\":{\"int_9\":1},\"int_2\":32,\"int_3\":2,\"int_4\":1,\"int_5\":1,\"int_8\":254,\"int_9\":17,\"int_10\":2,\"int_11\":1,\"int_14\":128301330,\"int_15\":1,\"int_16\":19,\"int_17\":1}}",
"tot": "json"
}
],
"action": "",
"property": "",
"from": "",
"to": "",
"reg": false,
"x": 340,
"y": 1120,
"wires": [
[
"1879d2c74d981f0a"
]
]
},
{
"id": "f591f651b4d2153a",
"type": "change",
"z": "5c3a7efbb734c312",
"name": "beep-off",
"rules": [
{
"t": "set",
"p": "payload",
"pt": "msg",
"to": "{\"subMesssage_1\":{\"NestedsubMesssage_1\":{\"int_9\":0},\"int_2\":32,\"int_3\":2,\"int_4\":1,\"int_5\":1,\"int_8\":254,\"int_9\":17,\"int_10\":2,\"int_11\":1,\"int_14\":128301330,\"int_15\":1,\"int_16\":19,\"int_17\":1}}",
"tot": "json"
}
],
"action": "",
"property": "",
"from": "",
"to": "",
"reg": false,
"x": 340,
"y": 1160,
"wires": [
[
"1879d2c74d981f0a"
]
]
},
{
"id": "5adb6177ab992ca0",
"type": "ha-sensor",
"z": "5c3a7efbb734c312",
"name": "device_a_AC Out",
"entityConfig": "9531e396809c4293",
"version": 0,
"state": "payload.acOut",
"stateType": "msg",
"attributes": [],
"inputOverride": "allow",
"outputProperties": [],
"x": 1930,
"y": 580,
"wires": [
[
"1981b4272caec0f1"
]
]
},
{
"id": "61291127c9a9b736",
"type": "debug",
"z": "5c3a7efbb734c312",
"name": "debug 10",
"active": false,
"tosidebar": true,
"console": false,
"tostatus": false,
"complete": "false",
"statusVal": "",
"statusType": "auto",
"x": 1420,
"y": 1440,
"wires": []
},
{
"id": "78bcd84f0434c885",
"type": "mqtt out",
"z": "5c3a7efbb734c312",
"name": "",
"topic": "/app/[[APPID]]/[[SN]]/thing/property/set",
"qos": "0",
"retain": "",
"respTopic": "",
"contentType": "",
"userProps": "",
"correl": "",
"expiry": "",
"broker": "4a025f91e9595714",
"x": 990,
"y": 1960,
"wires": []
},
{
"id": "cbc2dd792fc76a03",
"type": "inject",
"z": "5c3a7efbb734c312",
"name": "beep_on",
"props": [
{
"p": "payload"
}
],
"repeat": "",
"crontab": "",
"once": false,
"onceDelay": 0.1,
"topic": "",
"payload": "{\"subMesssage_1\":{\"NestedsubMesssage_1\":{\"int_9\":1},\"int_2\":32,\"int_3\":2,\"int_4\":1,\"int_5\":1,\"int_8\":254,\"int_9\":17,\"int_10\":2,\"int_11\":1,\"int_14\":128301330,\"int_15\":1,\"int_16\":19,\"int_17\":1}}",
"payloadType": "json",
"x": 340,
"y": 2060,
"wires": [
[
"4afdedfb126c3adb"
]
]
},
{
"id": "79a047ea301467c3",
"type": "mqtt in",
"z": "5c3a7efbb734c312",
"name": "",
"topic": "/app/[[APPID]]/[[SN]]/thing/property/get_reply",
"qos": "2",
"datatype": "auto-detect",
"broker": "4a025f91e9595714",
"nl": false,
"rap": true,
"rh": 0,
"inputs": 0,
"x": 1010,
"y": 1500,
"wires": [
[
"61291127c9a9b736",
"a3ddcd10a21dabe5"
]
]
},
{
"id": "4afdedfb126c3adb",
"type": "encode",
"z": "5c3a7efbb734c312",
"name": "",
"protofile": "fd04eecb52341faa",
"protoType": "MessageFromJson",
"x": 620,
"y": 1960,
"wires": [
[
"78bcd84f0434c885"
]
]
},
{
"id": "d2c67cfa36b8eddd",
"type": "inject",
"z": "5c3a7efbb734c312",
"name": "beep_off",
"props": [
{
"p": "payload"
}
],
"repeat": "",
"crontab": "",
"once": false,
"onceDelay": 0.1,
"topic": "",
"payload": "{\"subMesssage_1\":{\"NestedsubMesssage_1\":{\"int_9\":0},\"int_2\":32,\"int_3\":2,\"int_4\":1,\"int_5\":1,\"int_8\":254,\"int_9\":17,\"int_10\":2,\"int_11\":1,\"int_14\":128301330,\"int_15\":1,\"int_16\":19,\"int_17\":1}}",
"payloadType": "json",
"x": 340,
"y": 2180,
"wires": [
[
"4afdedfb126c3adb"
]
]
},
{
"id": "4c886e6bc42a159d",
"type": "inject",
"z": "5c3a7efbb734c312",
"name": "get",
"props": [
{
"p": "payload"
}
],
"repeat": "15",
"crontab": "",
"once": false,
"onceDelay": 0.1,
"topic": "",
"payload": "{\"subMesssage_1\":{\"NestedsubMesssage_1\":{\"int_14\":128301340,\"bytes_23\":\"Android\"}}}",
"payloadType": "json",
"x": 350,
"y": 1640,
"wires": [
[
"a866568cee5cc41b"
]
]
},
{
"id": "53e91d153c751f3b",
"type": "mqtt out",
"z": "5c3a7efbb734c312",
"name": "",
"topic": "/app/[[APPID]]/[[SN]]/thing/property/get",
"qos": "2",
"retain": "",
"respTopic": "",
"contentType": "",
"userProps": "",
"correl": "",
"expiry": "",
"broker": "4a025f91e9595714",
"x": 990,
"y": 1840,
"wires": []
},
{
"id": "a866568cee5cc41b",
"type": "encode",
"z": "5c3a7efbb734c312",
"name": "",
"protofile": "fd04eecb52341faa",
"protoType": "MessageFromJson",
"x": 620,
"y": 1840,
"wires": [
[
"53e91d153c751f3b"
]
]
},
{
"id": "14915a090ac399a6",
"type": "debug",
"z": "5c3a7efbb734c312",
"name": "debug 13",
"active": false,
"tosidebar": true,
"console": false,
"tostatus": false,
"complete": "false",
"statusVal": "",
"statusType": "auto",
"x": 2240,
"y": 1500,
"wires": []
},
{
"id": "3117402a17b4b898",
"type": "inject",
"z": "5c3a7efbb734c312",
"name": "charge_15",
"props": [
{
"p": "payload"
}
],
"repeat": "",
"crontab": "",
"once": false,
"onceDelay": 0.1,
"topic": "",
"payload": "{\"subMesssage_1\":{\"NestedsubMesssage_1\":{\"int_102\":15},\"int_2\":32,\"int_3\":2,\"int_4\":1,\"int_5\":1,\"int_8\":254,\"int_9\":17,\"int_10\":3,\"int_11\":1,\"int_14\":148771586,\"int_15\":1,\"int_16\":19,\"int_17\":1}}",
"payloadType": "json",
"x": 340,
"y": 1980,
"wires": [
[
"4afdedfb126c3adb"
]
]
},
{
"id": "78ab8f746a16080b",
"type": "inject",
"z": "5c3a7efbb734c312",
"name": "charge_90",
"props": [
{
"p": "payload"
}
],
"repeat": "",
"crontab": "",
"once": false,
"onceDelay": 0.1,
"topic": "",
"payload": "{\"subMesssage_1\":{\"NestedsubMesssage_1\":{\"int_102\":90},\"int_2\":32,\"int_3\":2,\"int_4\":1,\"int_5\":1,\"int_8\":254,\"int_9\":17,\"int_10\":3,\"int_11\":1,\"int_14\":148771586,\"int_15\":1,\"int_16\":19,\"int_17\":1}}",
"payloadType": "json",
"x": 340,
"y": 1900,
"wires": [
[
"4afdedfb126c3adb"
]
]
},
{
"id": "a3ddcd10a21dabe5",
"type": "decode",
"z": "5c3a7efbb734c312",
"name": "",
"protofile": "09526bce7b477f38",
"protoType": "MessageFromJson",
"x": 1560,
"y": 1500,
"wires": [
[
"2ccc9eebdc8b1c6d"
]
]
},
{
"id": "2ccc9eebdc8b1c6d",
"type": "function",
"z": "5c3a7efbb734c312",
"name": "parser",
"func": "// Array of variables to convert (define the path to each variable as a string, excluding the array index)\nlet variablesToConvert = [\n \"NestedsubMesssage_1.batteryLevel\",\n \"NestedsubMesssage_1.acPower\",\n \"NestedsubMesssage_1.acOut\"\n];\n\n// Helper function to access and modify nested properties\nfunction convertFixed32ToFloat(obj, path) {\n let keys = path.split(\".\");\n let lastKey = keys.pop();\n let target = keys.reduce((o, k) => (o && o[k] ? o[k] : undefined), obj);\n\n if (target && target[lastKey] !== undefined) {\n let fixed32Value = target[lastKey];\n let buffer = Buffer.alloc(4);\n buffer.writeUInt32LE(fixed32Value); // Write as little-endian\n let dataView = new DataView(buffer.buffer);\n let floatValue = dataView.getFloat32(0, true); // Convert to float (little-endian)\n target[lastKey] = Math.round(floatValue * 100) / 100; // Round to 2 decimals\n }\n}\n\n// Validate that the array exists\nif (\n msg.payload.subMesssage_1 &&\n Array.isArray(msg.payload.subMesssage_1)\n) {\n // Automatically find the element with the largest NestedsubMesssage_1 (by number of keys)\n let selectedElement = msg.payload.subMesssage_1.reduce((largest, current) => {\n const currentSize = current?.NestedsubMesssage_1 ? Object.keys(current.NestedsubMesssage_1).length : 0;\n const largestSize = largest?.NestedsubMesssage_1 ? Object.keys(largest.NestedsubMesssage_1).length : 0;\n return currentSize > largestSize ? current : largest;\n }, null);\n\n if (selectedElement) {\n // Loop through the variables and convert them for the selected element\n variablesToConvert.forEach(path => {\n convertFixed32ToFloat(selectedElement, path);\n });\n\n // Flatten the selected element for output\n msg.payload = {\n ...selectedElement.NestedsubMesssage_1\n };\n } else {\n msg.payload = { error: \"No valid element found in subMesssage_1.\" };\n }\n} else {\n // Handle the case where the array is invalid\n msg.payload = {\n error: \"subMesssage_1 is not a valid array.\"\n };\n}\n\n// Return the flattened object as the payload\nreturn msg;\n",
"outputs": 1,
"timeout": 0,
"noerr": 0,
"initialize": "",
"finalize": "",
"libs": [],
"x": 1710,
"y": 1500,
"wires": [
[
"14915a090ac399a6",
"9cee10300a29e6a9",
"1b4d1659ea3a926c",
"bada8f8ece2635aa",
"43c3e714cd35d499"
]
]
},
{
"id": "b48fdb9a8c3cc648",
"type": "inject",
"z": "5c3a7efbb734c312",
"name": "self-powered off",
"props": [
{
"p": "payload"
}
],
"repeat": "",
"crontab": "",
"once": false,
"onceDelay": 0.1,
"topic": "",
"payload": "{\"subMesssage_1\":{\"NestedsubMesssage_1\":{\"selfpowered_106\":{}},\"int_2\":32,\"int_3\":2,\"int_4\":1,\"int_5\":1,\"int_8\":254,\"int_9\":17,\"int_10\":3,\"int_11\":1,\"int_14\":148771586,\"int_15\":1,\"int_16\":19,\"int_17\":1}}",
"payloadType": "json",
"x": 320,
"y": 1840,
"wires": [
[
"4afdedfb126c3adb"
]
]
},
{
"id": "cdb9de6cfa82de2f",
"type": "inject",
"z": "5c3a7efbb734c312",
"name": "self-powered on",
"props": [
{
"p": "payload"
}
],
"repeat": "",
"crontab": "",
"once": false,
"onceDelay": 0.1,
"topic": "",
"payload": "{\"subMesssage_1\":{\"NestedsubMesssage_1\":{\"int_26\":0,\"selfpowered_106\":{\"int_1\":1},\"int_138\":0},\"int_2\":32,\"int_3\":2,\"int_4\":1,\"int_5\":1,\"int_8\":254,\"int_9\":17,\"int_10\":11,\"int_11\":1,\"int_14\":357051739,\"int_15\":1,\"int_16\":19,\"int_17\":1}}",
"payloadType": "json",
"x": 320,
"y": 1720,
"wires": [
[
"4afdedfb126c3adb"
]
]
},
{
"id": "9cee10300a29e6a9",
"type": "ha-sensor",
"z": "5c3a7efbb734c312",
"name": "device_b_Battery Level",
"entityConfig": "dde3390b2670ecca",
"version": 0,
"state": "payload.batteryLevel",
"stateType": "msg",
"attributes": [],
"inputOverride": "allow",
"outputProperties": [],
"x": 1950,
"y": 1680,
"wires": [
[
"14915a090ac399a6"
]
]
},
{
"id": "1b4d1659ea3a926c",
"type": "ha-sensor",
"z": "5c3a7efbb734c312",
"name": "device_b_Charge Target",
"entityConfig": "8a7f89d5a9fa7c02",
"version": 0,
"state": "payload.target",
"stateType": "msg",
"attributes": [],
"inputOverride": "allow",
"outputProperties": [],
"x": 1950,
"y": 1740,
"wires": [
[
"14915a090ac399a6"
]
]
},
{
"id": "99b6426401998b0e",
"type": "ha-switch",
"z": "5c3a7efbb734c312",
"name": "device_b_self-powered",
"version": 0,
"debugenabled": false,
"inputs": 0,
"outputs": 2,
"entityConfig": "0ed3beaf87d1c18b",
"enableInput": false,
"outputOnStateChange": true,
"outputProperties": [
{
"property": "payload",
"propertyType": "msg",
"value": "",
"valueType": "str"
}
],
"x": 90,
"y": 1780,
"wires": [
[
"63aceac7ccac0171"
],
[
"d832c92ebdc1011f"
]
]
},
{
"id": "63aceac7ccac0171",
"type": "change",
"z": "5c3a7efbb734c312",
"name": "self-powered on",
"rules": [
{
"t": "set",
"p": "payload",
"pt": "msg",
"to": "{\"subMesssage_1\":{\"NestedsubMesssage_1\":{\"int_26\":0,\"selfpowered_106\":{\"int_1\":1},\"int_138\":0},\"int_2\":32,\"int_3\":2,\"int_4\":1,\"int_5\":1,\"int_8\":254,\"int_9\":17,\"int_10\":11,\"int_11\":1,\"int_14\":357051739,\"int_15\":1,\"int_16\":19,\"int_17\":1}}",
"tot": "json"
}
],
"action": "",
"property": "",
"from": "",
"to": "",
"reg": false,
"x": 320,
"y": 1760,
"wires": [
[
"4afdedfb126c3adb"
]
]
},
{
"id": "d832c92ebdc1011f",
"type": "change",
"z": "5c3a7efbb734c312",
"name": "self-powered off",
"rules": [
{
"t": "set",
"p": "payload",
"pt": "msg",
"to": "{\"subMesssage_1\":{\"NestedsubMesssage_1\":{\"selfpowered_106\":{}},\"int_2\":32,\"int_3\":2,\"int_4\":1,\"int_5\":1,\"int_8\":254,\"int_9\":17,\"int_10\":3,\"int_11\":1,\"int_14\":148771586,\"int_15\":1,\"int_16\":19,\"int_17\":1}}",
"tot": "json"
}
],
"action": "",
"property": "",
"from": "",
"to": "",
"reg": false,
"x": 320,
"y": 1800,
"wires": [
[
"4afdedfb126c3adb"
]
]
},
{
"id": "bada8f8ece2635aa",
"type": "ha-sensor",
"z": "5c3a7efbb734c312",
"name": "device_b_AC Power",
"entityConfig": "026a8517f7533933",
"version": 0,
"state": "payload.acPower",
"stateType": "msg",
"attributes": [],
"inputOverride": "allow",
"outputProperties": [],
"x": 1940,
"y": 1620,
"wires": [
[
"14915a090ac399a6"
]
]
},
{
"id": "2ebdec0e9dfb2275",
"type": "ha-number",
"z": "5c3a7efbb734c312",
"name": "device_b_charge-target",
"version": 1,
"debugenabled": false,
"inputs": 0,
"outputs": 1,
"entityConfig": "3c4b70a170c5034c",
"exposeAsEntityConfig": "",
"mode": "listen",
"value": "payload",
"valueType": "msg",
"outputProperties": [
{
"property": "payload",
"propertyType": "msg",
"value": "",
"valueType": "value"
},
{
"property": "previousValue",
"propertyType": "msg",
"value": "",
"valueType": "previousValue"
}
],
"x": 90,
"y": 1940,
"wires": [
[
"154a232e234fcd68"
]
]
},
{
"id": "154a232e234fcd68",
"type": "function",
"z": "5c3a7efbb734c312",
"name": "charge-target",
"func": "// Get the input number from the msg payload\nlet inputNumber = msg.payload;\n\n// Validate the input number and clamp it between 15 and 90\nif (inputNumber < 15) {\n inputNumber = 15;\n} else if (inputNumber > 90) {\n inputNumber = 90;\n}\n\n// Define the JSON structure\nconst jsonResponse = {\n \"subMesssage_1\": {\n \"NestedsubMesssage_1\": {\n \"int_102\": inputNumber // Use the validated input number here\n },\n \"int_2\": 32,\n \"int_3\": 2,\n \"int_4\": 1,\n \"int_5\": 1,\n \"int_8\": 254,\n \"int_9\": 17,\n \"int_10\": 3,\n \"int_11\": 1,\n \"int_14\": 148771586,\n \"int_15\": 1,\n \"int_16\": 19,\n \"int_17\": 1\n }\n};\n\n// Assign the JSON to msg.payload\nmsg.payload = jsonResponse;\n\n// Return the modified msg object\nreturn msg;\n",
"outputs": 1,
"timeout": 0,
"noerr": 0,
"initialize": "",
"finalize": "",
"libs": [],
"x": 330,
"y": 1940,
"wires": [
[
"4afdedfb126c3adb"
]
]
},
{
"id": "e01d4a7f5c8794e8",
"type": "ha-switch",
"z": "5c3a7efbb734c312",
"name": "device_b_beep",
"version": 0,
"debugenabled": false,
"inputs": 0,
"outputs": 2,
"entityConfig": "3631ea3e83d0c784",
"enableInput": false,
"outputOnStateChange": true,
"outputProperties": [
{
"property": "payload",
"propertyType": "msg",
"value": "",
"valueType": "str"
}
],
"x": 120,
"y": 2120,
"wires": [
[
"da187d62e67d4740"
],
[
"0db6d726d44ba972"
]
]
},
{
"id": "da187d62e67d4740",
"type": "change",
"z": "5c3a7efbb734c312",
"name": "beep-on",
"rules": [
{
"t": "set",
"p": "payload",
"pt": "msg",
"to": "{\"subMesssage_1\":{\"NestedsubMesssage_1\":{\"int_9\":1},\"int_2\":32,\"int_3\":2,\"int_4\":1,\"int_5\":1,\"int_8\":254,\"int_9\":17,\"int_10\":2,\"int_11\":1,\"int_14\":128301330,\"int_15\":1,\"int_16\":19,\"int_17\":1}}",
"tot": "json"
}
],
"action": "",
"property": "",
"from": "",
"to": "",
"reg": false,
"x": 340,
"y": 2100,
"wires": [
[
"4afdedfb126c3adb"
]
]
},
{
"id": "0db6d726d44ba972",
"type": "change",
"z": "5c3a7efbb734c312",
"name": "beep-off",
"rules": [
{
"t": "set",
"p": "payload",
"pt": "msg",
"to": "{\"subMesssage_1\":{\"NestedsubMesssage_1\":{\"int_9\":0},\"int_2\":32,\"int_3\":2,\"int_4\":1,\"int_5\":1,\"int_8\":254,\"int_9\":17,\"int_10\":2,\"int_11\":1,\"int_14\":128301330,\"int_15\":1,\"int_16\":19,\"int_17\":1}}",
"tot": "json"
}
],
"action": "",
"property": "",
"from": "",
"to": "",
"reg": false,
"x": 340,
"y": 2140,
"wires": [
[
"4afdedfb126c3adb"
]
]
},
{
"id": "43c3e714cd35d499",
"type": "ha-sensor",
"z": "5c3a7efbb734c312",
"name": "device_b_AC Out",
"entityConfig": "2a388ed5ce9b5e60",
"version": 0,
"state": "payload.acOut",
"stateType": "msg",
"attributes": [],
"inputOverride": "allow",
"outputProperties": [],
"x": 1930,
"y": 1560,
"wires": [
[
"14915a090ac399a6"
]
]
},
{
"id": "2c1452e5064f0d52",
"type": "mqtt in",
"z": "5c3a7efbb734c312",
"name": "",
"topic": "/app/[[APPID]]/[[SN]]/thing/property/get_reply",
"qos": "2",
"datatype": "base64",
"broker": "4a025f91e9595714",
"nl": false,
"rap": true,
"rh": 0,
"inputs": 0,
"x": 1010,
"y": 1440,
"wires": [
[
"61291127c9a9b736"
]
]
},
{
"id": "40899d5bf070eb87",
"type": "mqtt out",
"z": "5c3a7efbb734c312",
"name": "",
"topic": "/app/[[APPID]]/[[SN]]/thing/property/set",
"qos": "0",
"retain": "",
"respTopic": "",
"contentType": "",
"userProps": "",
"correl": "",
"expiry": "",
"broker": "4a025f91e9595714",
"x": 990,
"y": 2640,
"wires": []
},
{
"id": "e7b270e459122203",
"type": "inject",
"z": "5c3a7efbb734c312",
"name": "beep_on",
"props": [
{
"p": "payload"
}
],
"repeat": "",
"crontab": "",
"once": false,
"onceDelay": 0.1,
"topic": "",
"payload": "{\"subMesssage_1\":{\"NestedsubMesssage_1\":{\"int_9\":1},\"int_2\":32,\"int_3\":2,\"int_4\":1,\"int_5\":1,\"int_8\":254,\"int_9\":17,\"int_10\":2,\"int_11\":1,\"int_14\":128301330,\"int_15\":1,\"int_16\":19,\"int_17\":1}}",
"payloadType": "json",
"x": 340,
"y": 2740,
"wires": [
[
"0df3e8fca92c4338"
]
]
},
{
"id": "0df3e8fca92c4338",
"type": "encode",
"z": "5c3a7efbb734c312",
"name": "",
"protofile": "fd04eecb52341faa",
"protoType": "MessageFromJson",
"x": 620,
"y": 2640,
"wires": [
[
"40899d5bf070eb87"
]
]
},
{
"id": "da568bf8284dcb21",
"type": "inject",
"z": "5c3a7efbb734c312",
"name": "beep_off",
"props": [
{
"p": "payload"
}
],
"repeat": "",
"crontab": "",
"once": false,
"onceDelay": 0.1,
"topic": "",
"payload": "{\"subMesssage_1\":{\"NestedsubMesssage_1\":{\"int_9\":0},\"int_2\":32,\"int_3\":2,\"int_4\":1,\"int_5\":1,\"int_8\":254,\"int_9\":17,\"int_10\":2,\"int_11\":1,\"int_14\":128301330,\"int_15\":1,\"int_16\":19,\"int_17\":1}}",
"payloadType": "json",
"x": 340,
"y": 2860,
"wires": [
[
"0df3e8fca92c4338"
]
]
},
{
"id": "206aee2b11b63f84",
"type": "inject",
"z": "5c3a7efbb734c312",
"name": "get",
"props": [
{
"p": "payload"
}
],
"repeat": "15",
"crontab": "",
"once": false,
"onceDelay": 0.1,
"topic": "",
"payload": "{\"subMesssage_1\":{\"NestedsubMesssage_1\":{\"int_14\":128301340,\"bytes_23\":\"Android\"}}}",
"payloadType": "json",
"x": 350,
"y": 2320,
"wires": [
[
"e48d93fa9bd1dede"
]
]
},
{
"id": "c041d0230aae2212",
"type": "mqtt out",
"z": "5c3a7efbb734c312",
"name": "",
"topic": "/app/[[APPID]]/[[SN]]/thing/property/get",
"qos": "2",
"retain": "",
"respTopic": "",
"contentType": "",
"userProps": "",
"correl": "",
"expiry": "",
"broker": "4a025f91e9595714",
"x": 990,
"y": 2520,
"wires": []
},
{
"id": "e48d93fa9bd1dede",
"type": "encode",
"z": "5c3a7efbb734c312",
"name": "",
"protofile": "fd04eecb52341faa",
"protoType": "MessageFromJson",
"x": 620,
"y": 2520,
"wires": [
[
"c041d0230aae2212"
]
]
},
{
"id": "9d19d00006660558",
"type": "inject",
"z": "5c3a7efbb734c312",
"name": "charge_15",
"props": [
{
"p": "payload"
}
],
"repeat": "",
"crontab": "",
"once": false,
"onceDelay": 0.1,
"topic": "",
"payload": "{\"subMesssage_1\":{\"NestedsubMesssage_1\":{\"int_102\":15},\"int_2\":32,\"int_3\":2,\"int_4\":1,\"int_5\":1,\"int_8\":254,\"int_9\":17,\"int_10\":3,\"int_11\":1,\"int_14\":148771586,\"int_15\":1,\"int_16\":19,\"int_17\":1}}",
"payloadType": "json",
"x": 340,
"y": 2660,
"wires": [
[
"0df3e8fca92c4338"
]
]
},
{
"id": "9c7d06381f17ec47",
"type": "inject",
"z": "5c3a7efbb734c312",
"name": "charge_90",
"props": [
{
"p": "payload"
}
],
"repeat": "",
"crontab": "",
"once": false,
"onceDelay": 0.1,
"topic": "",
"payload": "{\"subMesssage_1\":{\"NestedsubMesssage_1\":{\"int_102\":90},\"int_2\":32,\"int_3\":2,\"int_4\":1,\"int_5\":1,\"int_8\":254,\"int_9\":17,\"int_10\":3,\"int_11\":1,\"int_14\":148771586,\"int_15\":1,\"int_16\":19,\"int_17\":1}}",
"payloadType": "json",
"x": 340,
"y": 2580,
"wires": [
[
"0df3e8fca92c4338"
]
]
},
{
"id": "606d09cff852da57",
"type": "inject",
"z": "5c3a7efbb734c312",
"name": "self-powered off",
"props": [
{
"p": "payload"
}
],
"repeat": "",
"crontab": "",
"once": false,
"onceDelay": 0.1,
"topic": "",
"payload": "{\"subMesssage_1\":{\"NestedsubMesssage_1\":{\"selfpowered_106\":{}},\"int_2\":32,\"int_3\":2,\"int_4\":1,\"int_5\":1,\"int_8\":254,\"int_9\":17,\"int_10\":3,\"int_11\":1,\"int_14\":148771586,\"int_15\":1,\"int_16\":19,\"int_17\":1}}",
"payloadType": "json",
"x": 320,
"y": 2520,
"wires": [
[
"0df3e8fca92c4338"
]
]
},
{
"id": "0c965edcfaee92e2",
"type": "inject",
"z": "5c3a7efbb734c312",
"name": "self-powered on",
"props": [
{
"p": "payload"
}
],
"repeat": "",
"crontab": "",
"once": false,
"onceDelay": 0.1,
"topic": "",
"payload": "{\"subMesssage_1\":{\"NestedsubMesssage_1\":{\"int_26\":0,\"selfpowered_106\":{\"int_1\":1},\"int_138\":0},\"int_2\":32,\"int_3\":2,\"int_4\":1,\"int_5\":1,\"int_8\":254,\"int_9\":17,\"int_10\":11,\"int_11\":1,\"int_14\":357051739,\"int_15\":1,\"int_16\":19,\"int_17\":1}}",
"payloadType": "json",
"x": 320,
"y": 2400,
"wires": [
[
"0df3e8fca92c4338"
]
]
},
{
"id": "2a75e18e8370d8dc",
"type": "ha-switch",
"z": "5c3a7efbb734c312",
"name": "game-room_self-powered",
"version": 0,
"debugenabled": false,
"inputs": 0,
"outputs": 2,
"entityConfig": "0ed3beaf87d1c18b",
"enableInput": false,
"outputOnStateChange": true,
"outputProperties": [
{
"property": "payload",
"propertyType": "msg",
"value": "",
"valueType": "str"
}
],
"x": 110,
"y": 2460,
"wires": [
[
"d58f942610d15d41"
],
[
"36b8aa2e46921246"
]
]
},
{
"id": "d58f942610d15d41",
"type": "change",
"z": "5c3a7efbb734c312",
"name": "self-powered on",
"rules": [
{
"t": "set",
"p": "payload",
"pt": "msg",
"to": "{\"subMesssage_1\":{\"NestedsubMesssage_1\":{\"int_26\":0,\"selfpowered_106\":{\"int_1\":1},\"int_138\":0},\"int_2\":32,\"int_3\":2,\"int_4\":1,\"int_5\":1,\"int_8\":254,\"int_9\":17,\"int_10\":11,\"int_11\":1,\"int_14\":357051739,\"int_15\":1,\"int_16\":19,\"int_17\":1}}",
"tot": "json"
}
],
"action": "",
"property": "",
"from": "",
"to": "",
"reg": false,
"x": 320,
"y": 2440,
"wires": [
[
"0df3e8fca92c4338"
]
]
},
{
"id": "36b8aa2e46921246",
"type": "change",
"z": "5c3a7efbb734c312",
"name": "self-powered off",
"rules": [
{
"t": "set",
"p": "payload",
"pt": "msg",
"to": "{\"subMesssage_1\":{\"NestedsubMesssage_1\":{\"selfpowered_106\":{}},\"int_2\":32,\"int_3\":2,\"int_4\":1,\"int_5\":1,\"int_8\":254,\"int_9\":17,\"int_10\":3,\"int_11\":1,\"int_14\":148771586,\"int_15\":1,\"int_16\":19,\"int_17\":1}}",
"tot": "json"
}
],
"action": "",
"property": "",
"from": "",
"to": "",
"reg": false,
"x": 320,
"y": 2480,
"wires": [
[
"0df3e8fca92c4338"
]
]
},
{
"id": "a8889aac5fe8adba",
"type": "ha-number",
"z": "5c3a7efbb734c312",
"name": "game_room_charge-target",
"version": 1,
"debugenabled": false,
"inputs": 0,
"outputs": 1,
"entityConfig": "6d6efedc5ce72e03",
"exposeAsEntityConfig": "",
"mode": "listen",
"value": "payload",
"valueType": "msg",
"outputProperties": [
{
"property": "payload",
"propertyType": "msg",
"value": "",
"valueType": "value"
},
{
"property": "previousValue",
"propertyType": "msg",
"value": "",
"valueType": "previousValue"
}
],
"x": 110,
"y": 2620,
"wires": [
[
"a0e3545c22e94120"
]
]
},
{
"id": "a0e3545c22e94120",
"type": "function",
"z": "5c3a7efbb734c312",
"name": "charge-target",
"func": "// Get the input number from the msg payload\nlet inputNumber = msg.payload;\n\n// Validate the input number and clamp it between 15 and 90\nif (inputNumber < 15) {\n inputNumber = 15;\n} else if (inputNumber > 90) {\n inputNumber = 90;\n}\n\n// Define the JSON structure\nconst jsonResponse = {\n \"subMesssage_1\": {\n \"NestedsubMesssage_1\": {\n \"int_102\": inputNumber // Use the validated input number here\n },\n \"int_2\": 32,\n \"int_3\": 2,\n \"int_4\": 1,\n \"int_5\": 1,\n \"int_8\": 254,\n \"int_9\": 17,\n \"int_10\": 3,\n \"int_11\": 1,\n \"int_14\": 148771586,\n \"int_15\": 1,\n \"int_16\": 19,\n \"int_17\": 1\n }\n};\n\n// Assign the JSON to msg.payload\nmsg.payload = jsonResponse;\n\n// Return the modified msg object\nreturn msg;\n",
"outputs": 1,
"timeout": 0,
"noerr": 0,
"initialize": "",
"finalize": "",
"libs": [],
"x": 330,
"y": 2620,
"wires": [
[
"0df3e8fca92c4338"
]
]
},
{
"id": "c87da4bdf1d50ee0",
"type": "ha-switch",
"z": "5c3a7efbb734c312",
"name": "game_romm_beep",
"version": 0,
"debugenabled": false,
"inputs": 0,
"outputs": 2,
"entityConfig": "7780b0daa4506eb3",
"enableInput": false,
"outputOnStateChange": true,
"outputProperties": [
{
"property": "payload",
"propertyType": "msg",
"value": "",
"valueType": "str"
}
],
"x": 150,
"y": 2800,
"wires": [
[
"84ef3666b4918b11"
],
[
"7797631b8793f548"
]
]
},
{
"id": "84ef3666b4918b11",
"type": "change",
"z": "5c3a7efbb734c312",
"name": "beep-on",
"rules": [
{
"t": "set",
"p": "payload",
"pt": "msg",
"to": "{\"subMesssage_1\":{\"NestedsubMesssage_1\":{\"int_9\":1},\"int_2\":32,\"int_3\":2,\"int_4\":1,\"int_5\":1,\"int_8\":254,\"int_9\":17,\"int_10\":2,\"int_11\":1,\"int_14\":128301330,\"int_15\":1,\"int_16\":19,\"int_17\":1}}",
"tot": "json"
}
],
"action": "",
"property": "",
"from": "",
"to": "",
"reg": false,
"x": 340,
"y": 2780,
"wires": [
[
"0df3e8fca92c4338"
]
]
},
{
"id": "7797631b8793f548",
"type": "change",
"z": "5c3a7efbb734c312",
"name": "beep-off",
"rules": [
{
"t": "set",
"p": "payload",
"pt": "msg",
"to": "{\"subMesssage_1\":{\"NestedsubMesssage_1\":{\"int_9\":0},\"int_2\":32,\"int_3\":2,\"int_4\":1,\"int_5\":1,\"int_8\":254,\"int_9\":17,\"int_10\":2,\"int_11\":1,\"int_14\":128301330,\"int_15\":1,\"int_16\":19,\"int_17\":1}}",
"tot": "json"
}
],
"action": "",
"property": "",
"from": "",
"to": "",
"reg": false,
"x": 340,
"y": 2820,
"wires": [
[
"0df3e8fca92c4338"
]
]
},
{
"id": "86fd2954650666b0",
"type": "debug",
"z": "5c3a7efbb734c312",
"name": "debug 14",
"active": false,
"tosidebar": true,
"console": false,
"tostatus": false,
"complete": "false",
"statusVal": "",
"statusType": "auto",
"x": 1380,
"y": 2380,
"wires": []
},
{
"id": "384d158b61792940",
"type": "mqtt in",
"z": "5c3a7efbb734c312",
"name": "",
"topic": "/app/[[APPID]]/[[SN]]/thing/property/get_reply",
"qos": "2",
"datatype": "auto-detect",
"broker": "4a025f91e9595714",
"nl": false,
"rap": true,
"rh": 0,
"inputs": 0,
"x": 970,
"y": 2440,
"wires": [
[
"86fd2954650666b0",
"26d30e88ae82ce2e"
]
]
},
{
"id": "d0116386713bae5c",
"type": "debug",
"z": "5c3a7efbb734c312",
"name": "debug 15",
"active": false,
"tosidebar": true,
"console": false,
"tostatus": false,
"complete": "false",
"statusVal": "",
"statusType": "auto",
"x": 2260,
"y": 2440,
"wires": []
},
{
"id": "26d30e88ae82ce2e",
"type": "decode",
"z": "5c3a7efbb734c312",
"name": "",
"protofile": "09526bce7b477f38",
"protoType": "MessageFromJson",
"x": 1520,
"y": 2440,
"wires": [
[
"549457785dda7568",
"d0116386713bae5c"
]
]
},
{
"id": "549457785dda7568",
"type": "function",
"z": "5c3a7efbb734c312",
"name": "parser",
"func": "// Array of variables to convert (define the path to each variable as a string, excluding the array index)\nlet variablesToConvert = [\n \"NestedsubMesssage_1.batteryLevel\",\n \"NestedsubMesssage_1.acPower\",\n \"NestedsubMesssage_1.acOut\"\n];\n\n// Helper function to access and modify nested properties\nfunction convertFixed32ToFloat(obj, path) {\n let keys = path.split(\".\");\n let lastKey = keys.pop();\n let target = keys.reduce((o, k) => (o && o[k] ? o[k] : undefined), obj);\n\n if (target && target[lastKey] !== undefined) {\n let fixed32Value = target[lastKey];\n let buffer = Buffer.alloc(4);\n buffer.writeUInt32LE(fixed32Value); // Write as little-endian\n let dataView = new DataView(buffer.buffer);\n let floatValue = dataView.getFloat32(0, true); // Convert to float (little-endian)\n target[lastKey] = Math.round(floatValue * 100) / 100; // Round to 2 decimals\n }\n}\n\n// Validate that the array exists\nif (\n msg.payload.subMesssage_1 &&\n Array.isArray(msg.payload.subMesssage_1)\n) {\n // Automatically find the element with the largest NestedsubMesssage_1 (by number of keys)\n let selectedElement = msg.payload.subMesssage_1.reduce((largest, current) => {\n const currentSize = current?.NestedsubMesssage_1 ? Object.keys(current.NestedsubMesssage_1).length : 0;\n const largestSize = largest?.NestedsubMesssage_1 ? Object.keys(largest.NestedsubMesssage_1).length : 0;\n return currentSize > largestSize ? current : largest;\n }, null);\n\n if (selectedElement) {\n // Loop through the variables and convert them for the selected element\n variablesToConvert.forEach(path => {\n convertFixed32ToFloat(selectedElement, path);\n });\n\n // Flatten the selected element for output\n msg.payload = {\n ...selectedElement.NestedsubMesssage_1\n };\n } else {\n msg.payload = { error: \"No valid element found in subMesssage_1.\" };\n }\n} else {\n // Handle the case where the array is invalid\n msg.payload = {\n error: \"subMesssage_1 is not a valid array.\"\n };\n}\n\n// Return the flattened object as the payload\nreturn msg;\n",
"outputs": 1,
"timeout": 0,
"noerr": 0,
"initialize": "",
"finalize": "",
"libs": [],
"x": 1670,
"y": 2440,
"wires": [
[
"d0116386713bae5c",
"0c4901bd2280a3d7",
"45baf5736570e2ad",
"329113f3c0c5de18",
"e0919f7e1a368afa"
]
]
},
{
"id": "0c4901bd2280a3d7",
"type": "ha-sensor",
"z": "5c3a7efbb734c312",
"name": "game_room_Battery Level",
"entityConfig": "7151f98c7353537a",
"version": 0,
"state": "payload.batteryLevel",
"stateType": "msg",
"attributes": [],
"inputOverride": "allow",
"outputProperties": [],
"x": 1940,
"y": 2620,
"wires": [
[
"d0116386713bae5c"
]
]
},
{
"id": "45baf5736570e2ad",
"type": "ha-sensor",
"z": "5c3a7efbb734c312",
"name": "game_room_Charge Target",
"entityConfig": "441b901f84dcda6f",
"version": 0,
"state": "payload.target",
"stateType": "msg",
"attributes": [],
"inputOverride": "allow",
"outputProperties": [],
"x": 1940,
"y": 2680,
"wires": [
[
"d0116386713bae5c"
]
]
},
{
"id": "329113f3c0c5de18",
"type": "ha-sensor",
"z": "5c3a7efbb734c312",
"name": "game_room_AC Power",
"entityConfig": "0f0fe1c43b8f4534",
"version": 0,
"state": "payload.acPower",
"stateType": "msg",
"attributes": [],
"inputOverride": "allow",
"outputProperties": [],
"x": 1930,
"y": 2560,
"wires": [
[
"d0116386713bae5c"
]
]
},
{
"id": "e0919f7e1a368afa",
"type": "ha-sensor",
"z": "5c3a7efbb734c312",
"name": "game_room_AC Out",
"entityConfig": "859ef31dd27d08ad",
"version": 0,
"state": "payload.acOut",
"stateType": "msg",
"attributes": [],
"inputOverride": "allow",
"outputProperties": [],
"x": 1920,
"y": 2500,
"wires": [
[
"d0116386713bae5c"
]
]
},
{
"id": "fd881a468a285660",
"type": "mqtt in",
"z": "5c3a7efbb734c312",
"name": "",
"topic": "/app/[[APPID]]/[[SN]]/thing/property/get_reply",
"qos": "2",
"datatype": "base64",
"broker": "4a025f91e9595714",
"nl": false,
"rap": true,
"rh": 0,
"inputs": 0,
"x": 970,
"y": 2380,
"wires": [
[
"86fd2954650666b0"
]
]
},
{
"id": "671e0ceff575862c",
"type": "inject",
"z": "5c3a7efbb734c312",
"name": "disconnect",
"props": [
{
"p": "action",
"v": "disconnect",
"vt": "str"
},
{
"p": "topic",
"vt": "str"
}
],
"repeat": "",
"crontab": "",
"once": false,
"onceDelay": 0.1,
"topic": "",
"x": 340,
"y": 580,
"wires": [
[
"d5d7e8960ba14429"
]
]
},
{
"id": "5b6c19b0a776f928",
"type": "mqtt in",
"z": "5c3a7efbb734c312",
"name": "",
"topic": "/app/device/status/[[SN]]",
"qos": "2",
"datatype": "base64",
"broker": "4a025f91e9595714",
"nl": false,
"rap": true,
"rh": 0,
"inputs": 0,
"x": 900,
"y": 220,
"wires": [
[
"c8d401ac3c0d530b"
]
]
},
{
"id": "4a025f91e9595714",
"type": "mqtt-broker",
"name": "ecoflow",
"broker": "mqtts://mqtt.ecoflow.com:8883",
"port": "8883",
"clientid": "ANDROID_58AC938C-00B3-4635-8D83-D0575E20C8B7_[[APPID]]",
"autoConnect": false,
"usetls": false,
"protocolVersion": "4",
"keepalive": "60",
"cleansession": true,
"autoUnsubscribe": true,
"birthTopic": "",
"birthQos": "0",
"birthRetain": "false",
"birthPayload": "",
"birthMsg": {},
"closeTopic": "",
"closeQos": "0",
"closeRetain": "false",
"closePayload": "",
"closeMsg": {},
"willTopic": "",
"willQos": "0",
"willRetain": "false",
"willPayload": "",
"willMsg": {},
"userProps": "",
"sessionExpiry": ""
},
{
"id": "fd04eecb52341faa",
"type": "protobuf-file",
"protopath": "/homeassistant/www/get-delta3.proto",
"watchFile": true,
"keepCase": false
},
{
"id": "09526bce7b477f38",
"type": "protobuf-file",
"protopath": "/homeassistant/www/decodev2-delta3.proto",
"watchFile": true,
"keepCase": false
},
{
"id": "49b4f2bfd1956a24",
"type": "ha-entity-config",
"server": "399b9507.fdb0ea",
"deviceConfig": "5953bb61763c4552",
"name": "device_a_Battery Level",
"version": "6",
"entityType": "sensor",
"haConfig": [
{
"property": "name",
"value": "Battery Level"
},
{
"property": "icon",
"value": ""
},
{
"property": "entity_picture",
"value": ""
},
{
"property": "entity_category",
"value": "diagnostic"
},
{
"property": "device_class",
"value": "battery"
},
{
"property": "unit_of_measurement",
"value": "%"
},
{
"property": "state_class",
"value": "measurement"
}
],
"resend": false,
"debugEnabled": false
},
{
"id": "87a97985e13b1458",
"type": "ha-entity-config",
"server": "399b9507.fdb0ea",
"deviceConfig": "5953bb61763c4552",
"name": "device_a_Charge Target",
"version": "6",
"entityType": "sensor",
"haConfig": [
{
"property": "name",
"value": "Charge Target"
},
{
"property": "icon",
"value": ""
},
{
"property": "entity_picture",
"value": ""
},
{
"property": "entity_category",
"value": "diagnostic"
},
{
"property": "device_class",
"value": ""
},
{
"property": "unit_of_measurement",
"value": "%"
},
{
"property": "state_class",
"value": ""
}
],
"resend": false,
"debugEnabled": false
},
{
"id": "20ef2d5be7415ccd",
"type": "ha-entity-config",
"server": "399b9507.fdb0ea",
"deviceConfig": "5953bb61763c4552",
"name": "device_a_self-powered",
"version": "6",
"entityType": "switch",
"haConfig": [
{
"property": "name",
"value": "self-powered"
},
{
"property": "icon",
"value": ""
},
{
"property": "entity_picture",
"value": ""
},
{
"property": "entity_category",
"value": "config"
},
{
"property": "device_class",
"value": ""
}
],
"resend": false,
"debugEnabled": false
},
{
"id": "6670dfa7e6a8c02e",
"type": "ha-entity-config",
"server": "399b9507.fdb0ea",
"deviceConfig": "5953bb61763c4552",
"name": "device_a_AC Power",
"version": "6",
"entityType": "sensor",
"haConfig": [
{
"property": "name",
"value": "AC Power"
},
{
"property": "icon",
"value": ""
},
{
"property": "entity_picture",
"value": ""
},
{
"property": "entity_category",
"value": "diagnostic"
},
{
"property": "device_class",
"value": "energy"
},
{
"property": "unit_of_measurement",
"value": "Wh"
},
{
"property": "state_class",
"value": "measurement"
}
],
"resend": false,
"debugEnabled": false
},
{
"id": "a0136659e84650bb",
"type": "ha-entity-config",
"server": "399b9507.fdb0ea",
"deviceConfig": "5953bb61763c4552",
"name": "device_a_charge-target",
"version": "6",
"entityType": "number",
"haConfig": [
{
"property": "name",
"value": "charge-target"
},
{
"property": "icon",
"value": ""
},
{
"property": "entity_picture",
"value": ""
},
{
"property": "entity_category",
"value": "config"
},
{
"property": "device_class",
"value": ""
},
{
"property": "unit_of_measurement",
"value": "%"
},
{
"property": "min_value",
"value": 15
},
{
"property": "max_value",
"value": 90
},
{
"property": "step_value",
"value": 1
},
{
"property": "mode",
"value": "auto"
}
],
"resend": false,
"debugEnabled": false
},
{
"id": "43ab0950c992e96d",
"type": "ha-entity-config",
"server": "399b9507.fdb0ea",
"deviceConfig": "5953bb61763c4552",
"name": "device_a_beep",
"version": "6",
"entityType": "switch",
"haConfig": [
{
"property": "name",
"value": "Beep"
},
{
"property": "icon",
"value": ""
},
{
"property": "entity_picture",
"value": ""
},
{
"property": "entity_category",
"value": "config"
},
{
"property": "device_class",
"value": ""
}
],
"resend": false,
"debugEnabled": false
},
{
"id": "9531e396809c4293",
"type": "ha-entity-config",
"server": "399b9507.fdb0ea",
"deviceConfig": "5953bb61763c4552",
"name": "device_a_AC Out",
"version": "6",
"entityType": "sensor",
"haConfig": [
{
"property": "name",
"value": "AC Out"
},
{
"property": "icon",
"value": ""
},
{
"property": "entity_picture",
"value": ""
},
{
"property": "entity_category",
"value": "diagnostic"
},
{
"property": "device_class",
"value": "energy"
},
{
"property": "unit_of_measurement",
"value": "Wh"
},
{
"property": "state_class",
"value": "measurement"
}
],
"resend": false,
"debugEnabled": false
},
{
"id": "dde3390b2670ecca",
"type": "ha-entity-config",
"server": "399b9507.fdb0ea",
"deviceConfig": "65845f97489716d9",
"name": "device_b_Battery Level",
"version": "6",
"entityType": "sensor",
"haConfig": [
{
"property": "name",
"value": "Battery Level"
},
{
"property": "icon",
"value": ""
},
{
"property": "entity_picture",
"value": ""
},
{
"property": "entity_category",
"value": "diagnostic"
},
{
"property": "device_class",
"value": "battery"
},
{
"property": "unit_of_measurement",
"value": "%"
},
{
"property": "state_class",
"value": "measurement"
}
],
"resend": false,
"debugEnabled": false
},
{
"id": "8a7f89d5a9fa7c02",
"type": "ha-entity-config",
"server": "399b9507.fdb0ea",
"deviceConfig": "65845f97489716d9",
"name": "device_b_Charge Target",
"version": "6",
"entityType": "sensor",
"haConfig": [
{
"property": "name",
"value": "Charge Target"
},
{
"property": "icon",
"value": ""
},
{
"property": "entity_picture",
"value": ""
},
{
"property": "entity_category",
"value": "diagnostic"
},
{
"property": "device_class",
"value": ""
},
{
"property": "unit_of_measurement",
"value": "%"
},
{
"property": "state_class",
"value": ""
}
],
"resend": false,
"debugEnabled": false
},
{
"id": "0ed3beaf87d1c18b",
"type": "ha-entity-config",
"server": "399b9507.fdb0ea",
"deviceConfig": "295aed1158103b7f",
"name": "game-room_self-powered",
"version": "6",
"entityType": "switch",
"haConfig": [
{
"property": "name",
"value": "self-powered"
},
{
"property": "icon",
"value": ""
},
{
"property": "entity_picture",
"value": ""
},
{
"property": "entity_category",
"value": ""
},
{
"property": "device_class",
"value": "switch"
}
],
"resend": false,
"debugEnabled": false
},
{
"id": "026a8517f7533933",
"type": "ha-entity-config",
"server": "399b9507.fdb0ea",
"deviceConfig": "65845f97489716d9",
"name": "device_b_AC Power",
"version": "6",
"entityType": "sensor",
"haConfig": [
{
"property": "name",
"value": "AC Power"
},
{
"property": "icon",
"value": ""
},
{
"property": "entity_picture",
"value": ""
},
{
"property": "entity_category",
"value": "diagnostic"
},
{
"property": "device_class",
"value": "energy"
},
{
"property": "unit_of_measurement",
"value": "Wh"
},
{
"property": "state_class",
"value": "measurement"
}
],
"resend": false,
"debugEnabled": false
},
{
"id": "3c4b70a170c5034c",
"type": "ha-entity-config",
"server": "399b9507.fdb0ea",
"deviceConfig": "65845f97489716d9",
"name": "device_b_charge-target",
"version": "6",
"entityType": "number",
"haConfig": [
{
"property": "name",
"value": "charge-target"
},
{
"property": "icon",
"value": ""
},
{
"property": "entity_picture",
"value": ""
},
{
"property": "entity_category",
"value": "config"
},
{
"property": "device_class",
"value": ""
},
{
"property": "unit_of_measurement",
"value": "%"
},
{
"property": "min_value",
"value": 15
},
{
"property": "max_value",
"value": 90
},
{
"property": "step_value",
"value": 1
},
{
"property": "mode",
"value": "slider"
}
],
"resend": false,
"debugEnabled": false
},
{
"id": "3631ea3e83d0c784",
"type": "ha-entity-config",
"server": "399b9507.fdb0ea",
"deviceConfig": "65845f97489716d9",
"name": "device_b_beep",
"version": "6",
"entityType": "switch",
"haConfig": [
{
"property": "name",
"value": "Beep"
},
{
"property": "icon",
"value": ""
},
{
"property": "entity_picture",
"value": ""
},
{
"property": "entity_category",
"value": "config"
},
{
"property": "device_class",
"value": "switch"
}
],
"resend": false,
"debugEnabled": false
},
{
"id": "2a388ed5ce9b5e60",
"type": "ha-entity-config",
"server": "399b9507.fdb0ea",
"deviceConfig": "65845f97489716d9",
"name": "device_b_AC Out",
"version": "6",
"entityType": "sensor",
"haConfig": [
{
"property": "name",
"value": "AC Out"
},
{
"property": "icon",
"value": ""
},
{
"property": "entity_picture",
"value": ""
},
{
"property": "entity_category",
"value": "diagnostic"
},
{
"property": "device_class",
"value": "energy"
},
{
"property": "unit_of_measurement",
"value": "Wh"
},
{
"property": "state_class",
"value": "measurement"
}
],
"resend": false,
"debugEnabled": false
},
{
"id": "6d6efedc5ce72e03",
"type": "ha-entity-config",
"server": "399b9507.fdb0ea",
"deviceConfig": "295aed1158103b7f",
"name": "game_room_charge-target",
"version": "6",
"entityType": "number",
"haConfig": [
{
"property": "name",
"value": ""
},
{
"property": "icon",
"value": ""
},
{
"property": "entity_picture",
"value": ""
},
{
"property": "entity_category",
"value": "config"
},
{
"property": "device_class",
"value": ""
},
{
"property": "unit_of_measurement",
"value": "%"
},
{
"property": "min_value",
"value": 15
},
{
"property": "max_value",
"value": 90
},
{
"property": "step_value",
"value": 1
},
{
"property": "mode",
"value": "slider"
}
],
"resend": false,
"debugEnabled": false
},
{
"id": "7780b0daa4506eb3",
"type": "ha-entity-config",
"server": "399b9507.fdb0ea",
"deviceConfig": "295aed1158103b7f",
"name": "game_room_beep",
"version": "6",
"entityType": "switch",
"haConfig": [
{
"property": "name",
"value": "Beep"
},
{
"property": "icon",
"value": ""
},
{
"property": "entity_picture",
"value": ""
},
{
"property": "entity_category",
"value": "config"
},
{
"property": "device_class",
"value": "switch"
}
],
"resend": false,
"debugEnabled": false
},
{
"id": "7151f98c7353537a",
"type": "ha-entity-config",
"server": "399b9507.fdb0ea",
"deviceConfig": "295aed1158103b7f",
"name": "game_room_Battery_Level",
"version": "6",
"entityType": "sensor",
"haConfig": [
{
"property": "name",
"value": "Battery Level"
},
{
"property": "icon",
"value": ""
},
{
"property": "entity_picture",
"value": ""
},
{
"property": "entity_category",
"value": "diagnostic"
},
{
"property": "device_class",
"value": "battery"
},
{
"property": "unit_of_measurement",
"value": "%"
},
{
"property": "state_class",
"value": "measurement"
}
],
"resend": false,
"debugEnabled": false
},
{
"id": "441b901f84dcda6f",
"type": "ha-entity-config",
"server": "399b9507.fdb0ea",
"deviceConfig": "295aed1158103b7f",
"name": "game_room_charge_target",
"version": "6",
"entityType": "sensor",
"haConfig": [
{
"property": "name",
"value": "Charge Target"
},
{
"property": "icon",
"value": ""
},
{
"property": "entity_picture",
"value": ""
},
{
"property": "entity_category",
"value": "diagnostic"
},
{
"property": "device_class",
"value": ""
},
{
"property": "unit_of_measurement",
"value": "%"
},
{
"property": "state_class",
"value": ""
}
],
"resend": false,
"debugEnabled": false
},
{
"id": "0f0fe1c43b8f4534",
"type": "ha-entity-config",
"server": "399b9507.fdb0ea",
"deviceConfig": "295aed1158103b7f",
"name": "game_room_AC_Power",
"version": "6",
"entityType": "sensor",
"haConfig": [
{
"property": "name",
"value": "AC Power"
},
{
"property": "icon",
"value": ""
},
{
"property": "entity_picture",
"value": ""
},
{
"property": "entity_category",
"value": "diagnostic"
},
{
"property": "device_class",
"value": "energy"
},
{
"property": "unit_of_measurement",
"value": "Wh"
},
{
"property": "state_class",
"value": "measurement"
}
],
"resend": false,
"debugEnabled": false
},
{
"id": "859ef31dd27d08ad",
"type": "ha-entity-config",
"server": "399b9507.fdb0ea",
"deviceConfig": "295aed1158103b7f",
"name": "game_room_AC Out",
"version": "6",
"entityType": "sensor",
"haConfig": [
{
"property": "name",
"value": "AC Out"
},
{
"property": "icon",
"value": ""
},
{
"property": "entity_picture",
"value": ""
},
{
"property": "entity_category",
"value": "diagnostic"
},
{
"property": "device_class",
"value": "energy"
},
{
"property": "unit_of_measurement",
"value": "Wh"
},
{
"property": "state_class",
"value": "measurement"
}
],
"resend": false,
"debugEnabled": false
},
{
"id": "399b9507.fdb0ea",
"type": "server",
"name": "Home Assistant",
"addon": true
},
{
"id": "5953bb61763c4552",
"type": "ha-device-config",
"name": "device_a D3+",
"hwVersion": "",
"manufacturer": "EcoFlow",
"model": "Delta 3+",
"swVersion": ""
},
{
"id": "65845f97489716d9",
"type": "ha-device-config",
"name": "device_b D3+",
"hwVersion": "",
"manufacturer": "EcoFlow",
"model": "Delta 3+",
"swVersion": ""
},
{
"id": "295aed1158103b7f",
"type": "ha-device-config",
"name": "Game Room D3+",
"hwVersion": "",
"manufacturer": "EcoFlow",
"model": "Delta 3+",
"swVersion": ""
}
]
@nalditopr
Copy link
Author

nalditopr commented Apr 10, 2025

@phoniclynx The root cause is that the message coming from ecoflow has some nesting in the protobuf structure that I have not been able to parse.

for example, dc_input 1 is located at position 70 as fixed 32, but on the next value of the array, position 70 has a string message, this causes it to fail decoding.

the other values do not have this problem and parse just fine.

fwiw, value 3 is combined dc input, 70 is dc_01 and 361 is dc_02.

@phoniclynx
Copy link

phoniclynx commented Apr 11, 2025

Did you mean 70 is dc_02 and 361 is dc_01? That's what I worked out on mine.

I'm guessing you need to parse the protobuf file differently?

I've also noticed a small error in the way you've set up the sensors. Category and Last Reset should be blank: (According to this: HA Forum Link - but I could be wrong)
image

However, Last Reset should be filled out here: (If not, you are not able to use it in the energy pages)
image

I'm not too sure if the actual date means anything or if it needs to be calculated elsewhere for some reason. But it does stop the Energy pages from throwing up an error message.

The final step is to get that protobuf nesting solved; then, it should work quite nicely. Until we find a different error LOL

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment