DESS, VRM and related queries

The highly anticipated high-precision “target SoC for current time slot” is not disappointing @dognose . (can say for once: I told you so?)

1 Like

Glad to hear (and see :heart_eyes:) it works.

Yeah, once we nailed the issue down it became apparent, where prior issues arrised from.

Pretty backwards thinking to see that a “more precice system” had more issues to follow a less precice target than a less precise system had.

2 Likes

Ps.: you may now play a bit with your configured battery size:

The charge rate jig saw indicates, that your bms is reporting the soc increase slightly faster than it should according to calculation. Thus, the chargerate is continiously lowered towards the end of each window.

That usually means your battery is slightly smaller in capacity than configured, hence charging faster for a certain rate than expected.

Mind even a few percent age-degradation is a good bunch energy for your battery size, some BMS do account for that in their soc-value.

:+1:

Next thing to look into: The VRM-API return schedule objects seem to suffer from some sort of ordering issue in the immediate upcoming timeslots. It is easy to spot if you look at the return object during a charge or discharge cycle and inspect a handful of slots from current time forward. For instance: SoC should decrease somewhat constantly but it doesn’t always do so. Normally this will not affect execution when the new schedules come in fast enough (every 15 minute or so). But I suspect it may lead to very strange behavior during longer connection or VRM outages.

Have a look right here, timeslot 64 is incorrect and actually looks to be a copy of timeslot 67 and also linearity is broken around timeslot 67 as well (looks like a shift in timeslots):

Which obviously is not supposed to be so:

And this is pretty strange as well:

I suspect the above shown issue is related to the use of hourly prices (Zonneplan) while requesting 15 minute windows from the API. But switching to hourly windows won’t help because we need access to the 15 minute timeslot data, as used to populate the D-BUS scheduler (and shown in VRM dashboard). (And not to complicate things further but let me mention already that the Zonnebonus is actually using 15 minute timeslots, despite the hourly pricing scheme).

UPDATE: I suspect the issue with VRM-API results can be replicated by using the following price settings for Zonneplan + Zonnebonus with note that Zonneplan requires the pricing to be set to hourly intervals while the Zonnebonus timing shifts in 15 minute blocks during the year. This may explain why this edge-case wasn’t noticed / accounted for:

But yes , switching to an hourly window in the API call shows expected values.

Either way, the issue is also present on the D-BUS itself (directly populated by VenusOS / VRM) as can be seen in the following flow. The top row are direct readouts from the D-BUS for slot 0, 1, 2, 3, 4, 5, 6 and 7. EDIT: Slot 5 had a bug in my flow still reading SoC instead of the new TargetSoC, now corrected in picture and flow below. Therefore the issue may not present on the D-BUS itself after all. Nevertheless, the issue IS present in the VRM-API return object.

And if you look real good at the ‘DESS scheduled SoC’ a certain ‘bumpiness’ can be seen as well. Something is not quite right there. (Un)fortunately this won’t lead to direct issues, as long as the new VRM schedules keep rolling in every 15 minutes. But I bet it will bite us in the butt as soon as there is another VRM outage (or internet disconnect).

And while we are at it, I suspect there is a ‘documentation bug’ in the ‘Active restrictions’ node, seems to me that (1) should be ‘Battery to grid energy flow is restricted’ and (2) should be ‘Grid to battery energy flow is restricted’. Or am I mistaken here?

BONUS EDIT (install boolean-logic-ultimate first) UPDATE: Corrected Bug reading timeslot 5 SoC, see above:

[
    {
        "id": "795ab308409ef435",
        "type": "group",
        "z": "4dc207279e9d07bd",
        "name": "UpCyCle Hybrid DESS Trade : D-Bus Change Interupts",
        "style": {
            "label": true
        },
        "nodes": [
            "cc98d84136773d92",
            "7569fc85b5110e1d",
            "d5524e32a405baba",
            "ba378015b786a36f",
            "05828dca7fa96689",
            "a180ddb0ecdf4fbc",
            "5394274ee063226f",
            "c62188bdb1f75740",
            "420f83edecb9dd7a",
            "9afa7062a54792f4",
            "e30e71b112c18ad7",
            "0ec71d7ca325818d",
            "fae13744625fd9a7",
            "286d2348c4745ab2",
            "7178f9778197754c",
            "e60b1aa743b4bd66",
            "5d310fcd87df6957",
            "9fb649152634f5d0",
            "beeda57c89ce9510",
            "2140e325d18df72e",
            "071429149eabc01b",
            "61a1b061639b1c8a",
            "cefd63d5264ca617",
            "fb5a8e81c10c52f2",
            "5a6e8f242f72b962",
            "75e42a1e12a4f41c",
            "24989e3e9a9dec47",
            "b73eb74b90698b2f",
            "5abe91e78f5c777c",
            "a068d9d50f991012",
            "839a8b120b125a48",
            "2e8fa4ed64852810",
            "5d87168e0a652821",
            "de4dd735db9fe2cb",
            "4bf881431ac24961",
            "95c7effff9f03dd8",
            "74294e39a13ae286",
            "272f7d95f9e998ec",
            "a13bf1c1ed54c20e",
            "82b56a870caf2c33",
            "ab7fb17b9e466c66",
            "8c3a3d605279deeb",
            "9bbc32a1b35504df",
            "6b8a6b5aaa42fa2e",
            "6b6ea71d224c037d",
            "5b74dd0c87dc74ef",
            "204d7162e77324e6",
            "388f436e900f5a7f",
            "f1f175c876024aaa",
            "f76261f283a6b915",
            "e64ed196a169b27e",
            "b7858c4663839bfd",
            "3cc7bf6426c24f60",
            "efd3cdb77955abe8",
            "89e8dcacafe38f9a",
            "7d9f2604e98ec284",
            "9efd39f280b0abeb",
            "5ec9de341864f213",
            "9d409ebb8d918bb0"
        ],
        "x": 954,
        "y": 299,
        "w": 1212,
        "h": 622
    },
    {
        "id": "cc98d84136773d92",
        "type": "victron-input-custom",
        "z": "4dc207279e9d07bd",
        "g": "795ab308409ef435",
        "service": "com.victronenergy.settings",
        "path": "/Settings/DynamicEss/Schedule/0/TargetSoc",
        "serviceObj": {
            "service": "com.victronenergy.settings",
            "name": "com.victronenergy.settings"
        },
        "pathObj": {
            "path": "/Settings/DynamicEss/Schedule/0/TargetSoc",
            "name": "/Settings/DynamicEss/Schedule/0/TargetSoc",
            "type": "number",
            "value": 59.4
        },
        "name": "dbsTSoC0",
        "onlyChanges": true,
        "roundValues": "no",
        "rateLimit": "0",
        "x": 1040,
        "y": 340,
        "wires": [
            [
                "6b6ea71d224c037d"
            ]
        ]
    },
    {
        "id": "7569fc85b5110e1d",
        "type": "victron-input-custom",
        "z": "4dc207279e9d07bd",
        "g": "795ab308409ef435",
        "service": "com.victronenergy.settings",
        "path": "/Settings/DynamicEss/Schedule/1/TargetSoc",
        "serviceObj": {
            "service": "com.victronenergy.settings",
            "name": "com.victronenergy.settings"
        },
        "pathObj": {
            "path": "/Settings/DynamicEss/Schedule/1/TargetSoc",
            "name": "/Settings/DynamicEss/Schedule/1/TargetSoc",
            "type": "number",
            "value": 57.7
        },
        "name": "dbsTSoC1",
        "onlyChanges": true,
        "roundValues": "no",
        "rateLimit": "0",
        "x": 1180,
        "y": 340,
        "wires": [
            [
                "6b6ea71d224c037d"
            ]
        ]
    },
    {
        "id": "d5524e32a405baba",
        "type": "victron-input-custom",
        "z": "4dc207279e9d07bd",
        "g": "795ab308409ef435",
        "service": "com.victronenergy.settings",
        "path": "/Settings/DynamicEss/Schedule/2/TargetSoc",
        "serviceObj": {
            "service": "com.victronenergy.settings",
            "name": "com.victronenergy.settings"
        },
        "pathObj": {
            "path": "/Settings/DynamicEss/Schedule/2/TargetSoc",
            "name": "/Settings/DynamicEss/Schedule/2/TargetSoc",
            "type": "number",
            "value": 56.14
        },
        "name": "dbsTSoC2",
        "onlyChanges": true,
        "roundValues": "no",
        "rateLimit": "0",
        "x": 1320,
        "y": 340,
        "wires": [
            [
                "6b6ea71d224c037d"
            ]
        ]
    },
    {
        "id": "ba378015b786a36f",
        "type": "victron-input-custom",
        "z": "4dc207279e9d07bd",
        "g": "795ab308409ef435",
        "service": "com.victronenergy.settings",
        "path": "/Settings/DynamicEss/Schedule/3/TargetSoc",
        "serviceObj": {
            "service": "com.victronenergy.settings",
            "name": "com.victronenergy.settings"
        },
        "pathObj": {
            "path": "/Settings/DynamicEss/Schedule/3/TargetSoc",
            "name": "/Settings/DynamicEss/Schedule/3/TargetSoc",
            "type": "number",
            "value": 55
        },
        "name": "dbsTSoC3",
        "onlyChanges": true,
        "roundValues": "no",
        "rateLimit": "0",
        "x": 1460,
        "y": 340,
        "wires": [
            [
                "6b6ea71d224c037d"
            ]
        ]
    },
    {
        "id": "05828dca7fa96689",
        "type": "victron-input-custom",
        "z": "4dc207279e9d07bd",
        "g": "795ab308409ef435",
        "service": "com.victronenergy.settings",
        "path": "/Settings/DynamicEss/Schedule/4/Restrictions",
        "serviceObj": {
            "service": "com.victronenergy.settings",
            "name": "com.victronenergy.settings"
        },
        "pathObj": {
            "path": "/Settings/DynamicEss/Schedule/4/Restrictions",
            "name": "/Settings/DynamicEss/Schedule/4/Restrictions",
            "type": "number",
            "value": 0
        },
        "name": "dbsRes4",
        "onlyChanges": true,
        "x": 1600,
        "y": 460,
        "wires": [
            [
                "204d7162e77324e6"
            ]
        ]
    },
    {
        "id": "a180ddb0ecdf4fbc",
        "type": "victron-input-custom",
        "z": "4dc207279e9d07bd",
        "g": "795ab308409ef435",
        "service": "com.victronenergy.settings",
        "path": "/Settings/DynamicEss/Schedule/5/Restrictions",
        "serviceObj": {
            "service": "com.victronenergy.settings",
            "name": "com.victronenergy.settings"
        },
        "pathObj": {
            "path": "/Settings/DynamicEss/Schedule/5/Restrictions",
            "name": "/Settings/DynamicEss/Schedule/5/Restrictions",
            "type": "number",
            "value": 0
        },
        "name": "dbsRes5",
        "onlyChanges": true,
        "x": 1740,
        "y": 460,
        "wires": [
            [
                "204d7162e77324e6"
            ]
        ]
    },
    {
        "id": "5394274ee063226f",
        "type": "victron-input-custom",
        "z": "4dc207279e9d07bd",
        "g": "795ab308409ef435",
        "service": "com.victronenergy.settings",
        "path": "/Settings/DynamicEss/Schedule/6/Restrictions",
        "serviceObj": {
            "service": "com.victronenergy.settings",
            "name": "com.victronenergy.settings"
        },
        "pathObj": {
            "path": "/Settings/DynamicEss/Schedule/6/Restrictions",
            "name": "/Settings/DynamicEss/Schedule/6/Restrictions",
            "type": "number",
            "value": 0
        },
        "name": "dbsRes6",
        "onlyChanges": true,
        "x": 1880,
        "y": 460,
        "wires": [
            [
                "204d7162e77324e6"
            ]
        ]
    },
    {
        "id": "c62188bdb1f75740",
        "type": "victron-input-custom",
        "z": "4dc207279e9d07bd",
        "g": "795ab308409ef435",
        "service": "com.victronenergy.settings",
        "path": "/Settings/DynamicEss/Schedule/7/Restrictions",
        "serviceObj": {
            "service": "com.victronenergy.settings",
            "name": "com.victronenergy.settings"
        },
        "pathObj": {
            "path": "/Settings/DynamicEss/Schedule/7/Restrictions",
            "name": "/Settings/DynamicEss/Schedule/7/Restrictions",
            "type": "number",
            "value": 0
        },
        "name": "dbsRes7",
        "onlyChanges": true,
        "x": 2020,
        "y": 460,
        "wires": [
            [
                "204d7162e77324e6"
            ]
        ]
    },
    {
        "id": "420f83edecb9dd7a",
        "type": "victron-input-custom",
        "z": "4dc207279e9d07bd",
        "g": "795ab308409ef435",
        "service": "com.victronenergy.settings",
        "path": "/Settings/DynamicEss/Schedule/4/TargetSoc",
        "serviceObj": {
            "service": "com.victronenergy.settings",
            "name": "com.victronenergy.settings"
        },
        "pathObj": {
            "path": "/Settings/DynamicEss/Schedule/4/TargetSoc",
            "name": "/Settings/DynamicEss/Schedule/4/TargetSoc",
            "type": "number",
            "value": 55
        },
        "name": "dbsTSoC4",
        "onlyChanges": true,
        "roundValues": "no",
        "rateLimit": "0",
        "x": 1600,
        "y": 340,
        "wires": [
            [
                "6b6ea71d224c037d"
            ]
        ]
    },
    {
        "id": "9afa7062a54792f4",
        "type": "victron-input-custom",
        "z": "4dc207279e9d07bd",
        "g": "795ab308409ef435",
        "service": "com.victronenergy.settings",
        "path": "/Settings/DynamicEss/Schedule/5/TargetSoc",
        "serviceObj": {
            "service": "com.victronenergy.settings",
            "name": "com.victronenergy.settings"
        },
        "pathObj": {
            "path": "/Settings/DynamicEss/Schedule/5/TargetSoc",
            "name": "/Settings/DynamicEss/Schedule/5/TargetSoc",
            "type": "number",
            "value": 51.05
        },
        "name": "dbsTSoC5",
        "onlyChanges": true,
        "roundValues": "no",
        "rateLimit": "0",
        "x": 1740,
        "y": 340,
        "wires": [
            [
                "6b6ea71d224c037d"
            ]
        ]
    },
    {
        "id": "e30e71b112c18ad7",
        "type": "victron-input-custom",
        "z": "4dc207279e9d07bd",
        "g": "795ab308409ef435",
        "service": "com.victronenergy.settings",
        "path": "/Settings/DynamicEss/Schedule/6/TargetSoc",
        "serviceObj": {
            "service": "com.victronenergy.settings",
            "name": "com.victronenergy.settings"
        },
        "pathObj": {
            "path": "/Settings/DynamicEss/Schedule/6/TargetSoc",
            "name": "/Settings/DynamicEss/Schedule/6/TargetSoc",
            "type": "number",
            "value": 55
        },
        "name": "dbsTSoC6",
        "onlyChanges": true,
        "roundValues": "no",
        "rateLimit": "0",
        "x": 1880,
        "y": 340,
        "wires": [
            [
                "6b6ea71d224c037d"
            ]
        ]
    },
    {
        "id": "0ec71d7ca325818d",
        "type": "victron-input-custom",
        "z": "4dc207279e9d07bd",
        "g": "795ab308409ef435",
        "service": "com.victronenergy.settings",
        "path": "/Settings/DynamicEss/Schedule/7/TargetSoc",
        "serviceObj": {
            "service": "com.victronenergy.settings",
            "name": "com.victronenergy.settings"
        },
        "pathObj": {
            "path": "/Settings/DynamicEss/Schedule/7/TargetSoc",
            "name": "/Settings/DynamicEss/Schedule/7/TargetSoc",
            "type": "number",
            "value": 59.5
        },
        "name": "dbsTSoC7",
        "onlyChanges": true,
        "roundValues": "no",
        "rateLimit": "0",
        "x": 2020,
        "y": 340,
        "wires": [
            [
                "6b6ea71d224c037d"
            ]
        ]
    },
    {
        "id": "fae13744625fd9a7",
        "type": "victron-input-custom",
        "z": "4dc207279e9d07bd",
        "g": "795ab308409ef435",
        "service": "com.victronenergy.settings",
        "path": "/Settings/DynamicEss/Schedule/0/Restrictions",
        "serviceObj": {
            "service": "com.victronenergy.settings",
            "name": "com.victronenergy.settings"
        },
        "pathObj": {
            "path": "/Settings/DynamicEss/Schedule/0/Restrictions",
            "name": "/Settings/DynamicEss/Schedule/0/Restrictions",
            "type": "number",
            "value": 0
        },
        "name": "dbsRes0",
        "onlyChanges": true,
        "x": 1040,
        "y": 460,
        "wires": [
            [
                "204d7162e77324e6"
            ]
        ]
    },
    {
        "id": "286d2348c4745ab2",
        "type": "victron-input-custom",
        "z": "4dc207279e9d07bd",
        "g": "795ab308409ef435",
        "service": "com.victronenergy.settings",
        "path": "/Settings/DynamicEss/Schedule/1/Restrictions",
        "serviceObj": {
            "service": "com.victronenergy.settings",
            "name": "com.victronenergy.settings"
        },
        "pathObj": {
            "path": "/Settings/DynamicEss/Schedule/1/Restrictions",
            "name": "/Settings/DynamicEss/Schedule/1/Restrictions",
            "type": "number",
            "value": 0
        },
        "name": "dbsRes1",
        "onlyChanges": true,
        "x": 1180,
        "y": 460,
        "wires": [
            [
                "204d7162e77324e6"
            ]
        ]
    },
    {
        "id": "7178f9778197754c",
        "type": "victron-input-custom",
        "z": "4dc207279e9d07bd",
        "g": "795ab308409ef435",
        "service": "com.victronenergy.settings",
        "path": "/Settings/DynamicEss/Schedule/2/Restrictions",
        "serviceObj": {
            "service": "com.victronenergy.settings",
            "name": "com.victronenergy.settings"
        },
        "pathObj": {
            "path": "/Settings/DynamicEss/Schedule/2/Restrictions",
            "name": "/Settings/DynamicEss/Schedule/2/Restrictions",
            "type": "number",
            "value": 0
        },
        "name": "dbsRes2",
        "onlyChanges": true,
        "x": 1320,
        "y": 460,
        "wires": [
            [
                "204d7162e77324e6"
            ]
        ]
    },
    {
        "id": "e60b1aa743b4bd66",
        "type": "victron-input-custom",
        "z": "4dc207279e9d07bd",
        "g": "795ab308409ef435",
        "service": "com.victronenergy.settings",
        "path": "/Settings/DynamicEss/Schedule/3/Restrictions",
        "serviceObj": {
            "service": "com.victronenergy.settings",
            "name": "com.victronenergy.settings"
        },
        "pathObj": {
            "path": "/Settings/DynamicEss/Schedule/3/Restrictions",
            "name": "/Settings/DynamicEss/Schedule/3/Restrictions",
            "type": "number",
            "value": 0
        },
        "name": "dbsRes3",
        "onlyChanges": true,
        "x": 1460,
        "y": 460,
        "wires": [
            [
                "204d7162e77324e6"
            ]
        ]
    },
    {
        "id": "5d310fcd87df6957",
        "type": "victron-input-dess",
        "z": "4dc207279e9d07bd",
        "g": "795ab308409ef435",
        "service": "com.victronenergy.system/0",
        "path": "/DynamicEss/TargetSoc",
        "serviceObj": {
            "service": "com.victronenergy.system/0",
            "name": "Venus system",
            "communityTag": "dess"
        },
        "pathObj": {
            "path": "/DynamicEss/TargetSoc",
            "type": "float",
            "name": "The set target SOC for this time slot (%)"
        },
        "name": "",
        "onlyChanges": true,
        "roundValues": "no",
        "rateLimit": "0",
        "x": 1180,
        "y": 760,
        "wires": [
            [
                "de4dd735db9fe2cb"
            ]
        ]
    },
    {
        "id": "9fb649152634f5d0",
        "type": "victron-input-dess",
        "z": "4dc207279e9d07bd",
        "g": "795ab308409ef435",
        "service": "com.victronenergy.system/0",
        "path": "/DynamicEss/Restrictions",
        "serviceObj": {
            "service": "com.victronenergy.system/0",
            "name": "Venus system",
            "communityTag": "dess"
        },
        "pathObj": {
            "path": "/DynamicEss/Restrictions",
            "type": "enum",
            "name": "Active restrictions",
            "enum": {
                "0": "No restrictions between battery and the grid",
                "1": "Grid to battery energy flow is restricted",
                "2": "Battery to grid energy flow is restricted",
                "3": "No energy flow between battery and grid"
            }
        },
        "name": "",
        "onlyChanges": true,
        "rateLimit": "0",
        "x": 1110,
        "y": 880,
        "wires": [
            [
                "272f7d95f9e998ec"
            ]
        ]
    },
    {
        "id": "beeda57c89ce9510",
        "type": "link out",
        "z": "4dc207279e9d07bd",
        "g": "795ab308409ef435",
        "name": "link out 3",
        "mode": "link",
        "links": [],
        "x": 2125,
        "y": 880,
        "wires": []
    },
    {
        "id": "2140e325d18df72e",
        "type": "link out",
        "z": "4dc207279e9d07bd",
        "g": "795ab308409ef435",
        "name": "link out 4",
        "mode": "link",
        "links": [
            "91b5076b60b12915"
        ],
        "x": 2125,
        "y": 760,
        "wires": []
    },
    {
        "id": "071429149eabc01b",
        "type": "victron-input-custom",
        "z": "4dc207279e9d07bd",
        "g": "795ab308409ef435",
        "service": "com.victronenergy.settings",
        "path": "/Settings/DynamicEss/Schedule/4/Strategy",
        "serviceObj": {
            "service": "com.victronenergy.settings",
            "name": "com.victronenergy.settings"
        },
        "pathObj": {
            "path": "/Settings/DynamicEss/Schedule/4/Strategy",
            "name": "/Settings/DynamicEss/Schedule/4/Strategy",
            "type": "number",
            "value": 3
        },
        "name": "dbsStr4",
        "onlyChanges": true,
        "x": 1590,
        "y": 400,
        "wires": [
            [
                "5b74dd0c87dc74ef"
            ]
        ]
    },
    {
        "id": "61a1b061639b1c8a",
        "type": "victron-input-custom",
        "z": "4dc207279e9d07bd",
        "g": "795ab308409ef435",
        "service": "com.victronenergy.settings",
        "path": "/Settings/DynamicEss/Schedule/5/Strategy",
        "serviceObj": {
            "service": "com.victronenergy.settings",
            "name": "com.victronenergy.settings"
        },
        "pathObj": {
            "path": "/Settings/DynamicEss/Schedule/5/Strategy",
            "name": "/Settings/DynamicEss/Schedule/5/Strategy",
            "type": "number",
            "value": 2
        },
        "name": "dbsStr5",
        "onlyChanges": true,
        "x": 1730,
        "y": 400,
        "wires": [
            [
                "5b74dd0c87dc74ef"
            ]
        ]
    },
    {
        "id": "cefd63d5264ca617",
        "type": "victron-input-custom",
        "z": "4dc207279e9d07bd",
        "g": "795ab308409ef435",
        "service": "com.victronenergy.settings",
        "path": "/Settings/DynamicEss/Schedule/6/Strategy",
        "serviceObj": {
            "service": "com.victronenergy.settings",
            "name": "com.victronenergy.settings"
        },
        "pathObj": {
            "path": "/Settings/DynamicEss/Schedule/6/Strategy",
            "name": "/Settings/DynamicEss/Schedule/6/Strategy",
            "type": "number",
            "value": 2
        },
        "name": "dbsStr6",
        "onlyChanges": true,
        "x": 1870,
        "y": 400,
        "wires": [
            [
                "5b74dd0c87dc74ef"
            ]
        ]
    },
    {
        "id": "fb5a8e81c10c52f2",
        "type": "victron-input-custom",
        "z": "4dc207279e9d07bd",
        "g": "795ab308409ef435",
        "service": "com.victronenergy.settings",
        "path": "/Settings/DynamicEss/Schedule/7/Strategy",
        "serviceObj": {
            "service": "com.victronenergy.settings",
            "name": "com.victronenergy.settings"
        },
        "pathObj": {
            "path": "/Settings/DynamicEss/Schedule/7/Strategy",
            "name": "/Settings/DynamicEss/Schedule/7/Strategy",
            "type": "number",
            "value": 2
        },
        "name": "dbsStr7",
        "onlyChanges": true,
        "x": 2010,
        "y": 400,
        "wires": [
            [
                "5b74dd0c87dc74ef"
            ]
        ]
    },
    {
        "id": "5a6e8f242f72b962",
        "type": "victron-input-custom",
        "z": "4dc207279e9d07bd",
        "g": "795ab308409ef435",
        "service": "com.victronenergy.settings",
        "path": "/Settings/DynamicEss/Schedule/0/Strategy",
        "serviceObj": {
            "service": "com.victronenergy.settings",
            "name": "com.victronenergy.settings"
        },
        "pathObj": {
            "path": "/Settings/DynamicEss/Schedule/0/Strategy",
            "name": "/Settings/DynamicEss/Schedule/0/Strategy",
            "type": "number",
            "value": 3
        },
        "name": "dbsStr0",
        "onlyChanges": true,
        "x": 1030,
        "y": 400,
        "wires": [
            [
                "5b74dd0c87dc74ef"
            ]
        ]
    },
    {
        "id": "75e42a1e12a4f41c",
        "type": "victron-input-custom",
        "z": "4dc207279e9d07bd",
        "g": "795ab308409ef435",
        "service": "com.victronenergy.settings",
        "path": "/Settings/DynamicEss/Schedule/1/Strategy",
        "serviceObj": {
            "service": "com.victronenergy.settings",
            "name": "com.victronenergy.settings"
        },
        "pathObj": {
            "path": "/Settings/DynamicEss/Schedule/1/Strategy",
            "name": "/Settings/DynamicEss/Schedule/1/Strategy",
            "type": "number",
            "value": 3
        },
        "name": "dbsStr1",
        "onlyChanges": true,
        "x": 1170,
        "y": 400,
        "wires": [
            [
                "5b74dd0c87dc74ef"
            ]
        ]
    },
    {
        "id": "24989e3e9a9dec47",
        "type": "victron-input-custom",
        "z": "4dc207279e9d07bd",
        "g": "795ab308409ef435",
        "service": "com.victronenergy.settings",
        "path": "/Settings/DynamicEss/Schedule/2/Strategy",
        "serviceObj": {
            "service": "com.victronenergy.settings",
            "name": "com.victronenergy.settings"
        },
        "pathObj": {
            "path": "/Settings/DynamicEss/Schedule/2/Strategy",
            "name": "/Settings/DynamicEss/Schedule/2/Strategy",
            "type": "number",
            "value": 2
        },
        "name": "dbsStr2",
        "onlyChanges": true,
        "x": 1310,
        "y": 400,
        "wires": [
            [
                "5b74dd0c87dc74ef"
            ]
        ]
    },
    {
        "id": "b73eb74b90698b2f",
        "type": "victron-input-custom",
        "z": "4dc207279e9d07bd",
        "g": "795ab308409ef435",
        "service": "com.victronenergy.settings",
        "path": "/Settings/DynamicEss/Schedule/3/Strategy",
        "serviceObj": {
            "service": "com.victronenergy.settings",
            "name": "com.victronenergy.settings"
        },
        "pathObj": {
            "path": "/Settings/DynamicEss/Schedule/3/Strategy",
            "name": "/Settings/DynamicEss/Schedule/3/Strategy",
            "type": "number",
            "value": 2
        },
        "name": "dbsStr3",
        "onlyChanges": true,
        "x": 1450,
        "y": 400,
        "wires": [
            [
                "5b74dd0c87dc74ef"
            ]
        ]
    },
    {
        "id": "5abe91e78f5c777c",
        "type": "victron-input-dess",
        "z": "4dc207279e9d07bd",
        "g": "795ab308409ef435",
        "service": "com.victronenergy.system/0",
        "path": "/DynamicEss/Strategy",
        "serviceObj": {
            "service": "com.victronenergy.system/0",
            "name": "Venus system",
            "communityTag": "dess"
        },
        "pathObj": {
            "path": "/DynamicEss/Strategy",
            "type": "enum",
            "name": "Used strategy for current time slot",
            "enum": {
                "0": "Target SOC",
                "1": "Self-consumption",
                "2": "Pro battery",
                "3": "Pro grid"
            }
        },
        "name": "",
        "onlyChanges": true,
        "rateLimit": "0",
        "x": 1160,
        "y": 820,
        "wires": [
            [
                "74294e39a13ae286"
            ]
        ]
    },
    {
        "id": "a068d9d50f991012",
        "type": "link out",
        "z": "4dc207279e9d07bd",
        "g": "795ab308409ef435",
        "name": "link out 6",
        "mode": "link",
        "links": [],
        "x": 2125,
        "y": 820,
        "wires": []
    },
    {
        "id": "839a8b120b125a48",
        "type": "StatusUltimate",
        "z": "4dc207279e9d07bd",
        "g": "795ab308409ef435",
        "name": "topic",
        "property": "topic",
        "x": 1590,
        "y": 880,
        "wires": [
            [
                "a13bf1c1ed54c20e",
                "beeda57c89ce9510"
            ]
        ]
    },
    {
        "id": "2e8fa4ed64852810",
        "type": "StatusUltimate",
        "z": "4dc207279e9d07bd",
        "g": "795ab308409ef435",
        "name": "topic",
        "property": "topic",
        "x": 1590,
        "y": 820,
        "wires": [
            [
                "95c7effff9f03dd8",
                "a068d9d50f991012"
            ]
        ]
    },
    {
        "id": "5d87168e0a652821",
        "type": "StatusUltimate",
        "z": "4dc207279e9d07bd",
        "g": "795ab308409ef435",
        "name": "topic",
        "property": "topic",
        "x": 1590,
        "y": 760,
        "wires": [
            [
                "4bf881431ac24961",
                "2140e325d18df72e"
            ]
        ]
    },
    {
        "id": "de4dd735db9fe2cb",
        "type": "delay",
        "z": "4dc207279e9d07bd",
        "g": "795ab308409ef435",
        "name": "1/m",
        "pauseType": "rate",
        "timeout": "1",
        "timeoutUnits": "seconds",
        "rate": "1",
        "nbRateUnits": "1",
        "rateUnits": "minute",
        "randomFirst": "1",
        "randomLast": "5",
        "randomUnits": "seconds",
        "drop": true,
        "allowrate": false,
        "outputs": 1,
        "x": 1450,
        "y": 760,
        "wires": [
            [
                "5d87168e0a652821"
            ]
        ]
    },
    {
        "id": "4bf881431ac24961",
        "type": "debug",
        "z": "4dc207279e9d07bd",
        "g": "795ab308409ef435",
        "name": "dbsTSOC",
        "active": true,
        "tosidebar": true,
        "console": false,
        "tostatus": true,
        "complete": "payload",
        "targetType": "msg",
        "statusVal": "payload",
        "statusType": "msg",
        "x": 2020,
        "y": 760,
        "wires": []
    },
    {
        "id": "95c7effff9f03dd8",
        "type": "debug",
        "z": "4dc207279e9d07bd",
        "g": "795ab308409ef435",
        "name": "dbsSTR",
        "active": true,
        "tosidebar": false,
        "console": false,
        "tostatus": true,
        "complete": "true",
        "targetType": "full",
        "statusVal": "payload",
        "statusType": "msg",
        "x": 2020,
        "y": 820,
        "wires": []
    },
    {
        "id": "74294e39a13ae286",
        "type": "delay",
        "z": "4dc207279e9d07bd",
        "g": "795ab308409ef435",
        "name": "1/m",
        "pauseType": "rate",
        "timeout": "1",
        "timeoutUnits": "seconds",
        "rate": "1",
        "nbRateUnits": "1",
        "rateUnits": "minute",
        "randomFirst": "1",
        "randomLast": "5",
        "randomUnits": "seconds",
        "drop": true,
        "allowrate": false,
        "outputs": 1,
        "x": 1450,
        "y": 820,
        "wires": [
            [
                "2e8fa4ed64852810"
            ]
        ]
    },
    {
        "id": "272f7d95f9e998ec",
        "type": "delay",
        "z": "4dc207279e9d07bd",
        "g": "795ab308409ef435",
        "name": "1/m",
        "pauseType": "rate",
        "timeout": "1",
        "timeoutUnits": "seconds",
        "rate": "1",
        "nbRateUnits": "1",
        "rateUnits": "minute",
        "randomFirst": "1",
        "randomLast": "5",
        "randomUnits": "seconds",
        "drop": true,
        "allowrate": false,
        "outputs": 1,
        "x": 1450,
        "y": 880,
        "wires": [
            [
                "839a8b120b125a48"
            ]
        ]
    },
    {
        "id": "a13bf1c1ed54c20e",
        "type": "debug",
        "z": "4dc207279e9d07bd",
        "g": "795ab308409ef435",
        "name": "dbsRES",
        "active": true,
        "tosidebar": false,
        "console": false,
        "tostatus": true,
        "complete": "true",
        "targetType": "full",
        "statusVal": "payload",
        "statusType": "msg",
        "x": 2020,
        "y": 880,
        "wires": []
    },
    {
        "id": "82b56a870caf2c33",
        "type": "link out",
        "z": "4dc207279e9d07bd",
        "g": "795ab308409ef435",
        "name": "link out 7",
        "mode": "link",
        "links": [
            "93342a5994b7ccdc"
        ],
        "x": 2125,
        "y": 680,
        "wires": []
    },
    {
        "id": "ab7fb17b9e466c66",
        "type": "delay",
        "z": "4dc207279e9d07bd",
        "g": "795ab308409ef435",
        "name": "",
        "pauseType": "rate",
        "timeout": "1",
        "timeoutUnits": "seconds",
        "rate": "1",
        "nbRateUnits": "1",
        "rateUnits": "second",
        "randomFirst": "1",
        "randomLast": "5",
        "randomUnits": "seconds",
        "drop": true,
        "allowrate": false,
        "outputs": 1,
        "x": 1110,
        "y": 680,
        "wires": [
            [
                "8c3a3d605279deeb"
            ]
        ]
    },
    {
        "id": "8c3a3d605279deeb",
        "type": "change",
        "z": "4dc207279e9d07bd",
        "g": "795ab308409ef435",
        "name": "dbs-interupt",
        "rules": [
            {
                "t": "set",
                "p": "topic",
                "pt": "msg",
                "to": "dbs-interupt",
                "tot": "str"
            },
            {
                "t": "set",
                "p": "payload",
                "pt": "msg",
                "to": "",
                "tot": "date"
            }
        ],
        "action": "",
        "property": "",
        "from": "",
        "to": "",
        "reg": false,
        "x": 1310,
        "y": 680,
        "wires": [
            [
                "6b8a6b5aaa42fa2e"
            ]
        ]
    },
    {
        "id": "9bbc32a1b35504df",
        "type": "debug",
        "z": "4dc207279e9d07bd",
        "g": "795ab308409ef435",
        "name": "dbsINT",
        "active": true,
        "tosidebar": true,
        "console": false,
        "tostatus": true,
        "complete": "payload",
        "targetType": "msg",
        "statusVal": "payload",
        "statusType": "msg",
        "x": 2020,
        "y": 680,
        "wires": []
    },
    {
        "id": "6b8a6b5aaa42fa2e",
        "type": "StatusUltimate",
        "z": "4dc207279e9d07bd",
        "g": "795ab308409ef435",
        "name": "topic",
        "property": "topic",
        "x": 1590,
        "y": 680,
        "wires": [
            [
                "9bbc32a1b35504df",
                "82b56a870caf2c33"
            ]
        ]
    },
    {
        "id": "6b6ea71d224c037d",
        "type": "link out",
        "z": "4dc207279e9d07bd",
        "g": "795ab308409ef435",
        "name": "link out 1",
        "mode": "link",
        "links": [
            "388f436e900f5a7f"
        ],
        "x": 2125,
        "y": 340,
        "wires": []
    },
    {
        "id": "5b74dd0c87dc74ef",
        "type": "link out",
        "z": "4dc207279e9d07bd",
        "g": "795ab308409ef435",
        "name": "link out 5",
        "mode": "link",
        "links": [
            "388f436e900f5a7f"
        ],
        "x": 2125,
        "y": 400,
        "wires": []
    },
    {
        "id": "204d7162e77324e6",
        "type": "link out",
        "z": "4dc207279e9d07bd",
        "g": "795ab308409ef435",
        "name": "link out 2",
        "mode": "link",
        "links": [
            "388f436e900f5a7f"
        ],
        "x": 2125,
        "y": 460,
        "wires": []
    },
    {
        "id": "388f436e900f5a7f",
        "type": "link in",
        "z": "4dc207279e9d07bd",
        "g": "795ab308409ef435",
        "name": "link in 1",
        "links": [
            "6b6ea71d224c037d",
            "204d7162e77324e6",
            "5b74dd0c87dc74ef",
            "efd3cdb77955abe8"
        ],
        "x": 995,
        "y": 680,
        "wires": [
            [
                "ab7fb17b9e466c66"
            ]
        ]
    },
    {
        "id": "f1f175c876024aaa",
        "type": "inject",
        "z": "4dc207279e9d07bd",
        "g": "795ab308409ef435",
        "name": "quarter-timestamp",
        "props": [
            {
                "p": "payload"
            },
            {
                "p": "topic",
                "vt": "str"
            }
        ],
        "repeat": "",
        "crontab": "*/15 0-23 * * *",
        "once": true,
        "onceDelay": 0.1,
        "topic": "quarter-timestamp",
        "payload": "",
        "payloadType": "date",
        "x": 1090,
        "y": 600,
        "wires": [
            [
                "f76261f283a6b915"
            ]
        ]
    },
    {
        "id": "f76261f283a6b915",
        "type": "function",
        "z": "4dc207279e9d07bd",
        "g": "795ab308409ef435",
        "name": "time",
        "func": "msg.timestamp = msg.payload;\nmsg.topic = 'time';\nmsg.payload = Math.round(msg.payload/1000);\nlet fill = ( 'green' );\nlet shape = 'dot';\nlet text = ( msg.topic +': ' + msg.payload );\nnode.status({fill, shape, text});\nreturn msg;",
        "outputs": 1,
        "timeout": "",
        "noerr": 0,
        "initialize": "",
        "finalize": "",
        "libs": [],
        "x": 1290,
        "y": 600,
        "wires": [
            [
                "5ec9de341864f213"
            ]
        ]
    },
    {
        "id": "e64ed196a169b27e",
        "type": "SumUltimate",
        "z": "4dc207279e9d07bd",
        "g": "795ab308409ef435",
        "name": "deltatime",
        "property": "payload",
        "math": "subtract",
        "subtractstartfrom": "time",
        "x": 1600,
        "y": 600,
        "wires": [
            [
                "b7858c4663839bfd"
            ]
        ]
    },
    {
        "id": "b7858c4663839bfd",
        "type": "function",
        "z": "4dc207279e9d07bd",
        "g": "795ab308409ef435",
        "name": "dbsindex",
        "func": "let deltatime = msg.payload;\nlet deltaminutes =  deltatime / 60;\nlet dbsindexf = ( deltaminutes / 15 ) ;\nlet dbsindex = dbsindexf - ( dbsindexf % 1 );\nlet fill = ( 'green' );\nlet shape = 'dot';\nlet text = ( 'dbsindex : ' + dbsindex );\nnode.status({fill, shape, text});\nmsg.payload = dbsindex;\nmsg.dbsindex = dbsindex;\nmsg.topic = 'dbsindex';\nif (msg.measurements == 2) {\n    msg.average = null;\n    msg.measurements = null;\n    flow.set('dbsindex', dbsindex);\n    return msg;\n}",
        "outputs": 1,
        "timeout": "",
        "noerr": 0,
        "initialize": "",
        "finalize": "",
        "libs": [],
        "x": 1800,
        "y": 600,
        "wires": [
            [
                "3cc7bf6426c24f60",
                "efd3cdb77955abe8"
            ]
        ]
    },
    {
        "id": "3cc7bf6426c24f60",
        "type": "debug",
        "z": "4dc207279e9d07bd",
        "g": "795ab308409ef435",
        "name": "dbsINDEX",
        "active": true,
        "tosidebar": true,
        "console": false,
        "tostatus": true,
        "complete": "payload",
        "targetType": "msg",
        "statusVal": "payload",
        "statusType": "msg",
        "x": 2010,
        "y": 600,
        "wires": []
    },
    {
        "id": "efd3cdb77955abe8",
        "type": "link out",
        "z": "4dc207279e9d07bd",
        "g": "795ab308409ef435",
        "name": "link out 47",
        "mode": "link",
        "links": [
            "46c237ebafab52a5",
            "7a5396e1cb5b27f4",
            "68ee5ab56a9713a6",
            "388f436e900f5a7f"
        ],
        "x": 2125,
        "y": 600,
        "wires": []
    },
    {
        "id": "89e8dcacafe38f9a",
        "type": "victron-input-custom",
        "z": "4dc207279e9d07bd",
        "g": "795ab308409ef435",
        "service": "com.victronenergy.settings",
        "path": "/Settings/DynamicEss/Schedule/0/Start",
        "serviceObj": {
            "service": "com.victronenergy.settings",
            "name": "com.victronenergy.settings"
        },
        "pathObj": {
            "path": "/Settings/DynamicEss/Schedule/0/Start",
            "name": "/Settings/DynamicEss/Schedule/0/Start",
            "type": "number",
            "value": 1769346900
        },
        "name": "dbsStart0",
        "onlyChanges": true,
        "roundValues": "no",
        "rateLimit": "0",
        "x": 1180,
        "y": 540,
        "wires": [
            [
                "9efd39f280b0abeb"
            ]
        ]
    },
    {
        "id": "7d9f2604e98ec284",
        "type": "debug",
        "z": "4dc207279e9d07bd",
        "g": "795ab308409ef435",
        "name": "dbsSTART",
        "active": true,
        "tosidebar": true,
        "console": false,
        "tostatus": true,
        "complete": "payload",
        "targetType": "msg",
        "statusVal": "payload",
        "statusType": "msg",
        "x": 2010,
        "y": 540,
        "wires": []
    },
    {
        "id": "9efd39f280b0abeb",
        "type": "StatusUltimate",
        "z": "4dc207279e9d07bd",
        "g": "795ab308409ef435",
        "name": "topic",
        "property": "topic",
        "x": 1450,
        "y": 540,
        "wires": [
            [
                "7d9f2604e98ec284",
                "e64ed196a169b27e"
            ]
        ]
    },
    {
        "id": "5ec9de341864f213",
        "type": "StatusUltimate",
        "z": "4dc207279e9d07bd",
        "g": "795ab308409ef435",
        "name": "topic",
        "property": "topic",
        "x": 1450,
        "y": 600,
        "wires": [
            [
                "e64ed196a169b27e"
            ]
        ]
    },
    {
        "id": "9d409ebb8d918bb0",
        "type": "victron-input-custom",
        "z": "4dc207279e9d07bd",
        "g": "795ab308409ef435",
        "service": "com.victronenergy.settings",
        "path": "/Settings/DynamicEss/Schedule/0/Duration",
        "serviceObj": {
            "service": "com.victronenergy.settings",
            "name": "com.victronenergy.settings"
        },
        "pathObj": {
            "path": "/Settings/DynamicEss/Schedule/0/Duration",
            "name": "/Settings/DynamicEss/Schedule/0/Duration",
            "type": "number",
            "value": 900
        },
        "name": "dbsDur0",
        "onlyChanges": true,
        "roundValues": "no",
        "rateLimit": "0",
        "x": 1040,
        "y": 540,
        "wires": [
            []
        ]
    },
    {
        "id": "a0cd87182f7ff245",
        "type": "global-config",
        "env": [],
        "modules": {
            "@victronenergy/node-red-contrib-victron": "1.6.56",
            "node-red-contrib-boolean-logic-ultimate": "1.2.6"
        }
    }
]

I’ll save this discussion for later, I have a lot of questions concerning the inner workings of the DESS scheduler there (energy versus amperage versus SoC linearity, efficiency factors, that kind of questions). I’d need to study that stuff a bit more first.

Any news on VRM-API / DESS:

  • schedule stats irregularities
  • predictive pricing (beyond the day ahead)
  • extra SoC control setings

For those interested in nudging DESS Target SoC up or down during buy and sell periods, here a self contained flow that allows you to do precisely that. Don’t forget to install boolean-logic-ultimate first.

The flow will not do anything until you set a (none zero) SoC% offset/delta. This allows to first monitor what takes part: in the top row you will see the new VRM DESS schedule (SoC) values getting pushed onto timeslot 0 to 7 every 15 minutes on average, at the same time as the new schedule start time. Then ‘under the hood’ VenusOS picks the correct timeslot to take the targetSoC from and copy it to the active TargetSoC for current timeslot that drives the power setting for the inverter. That parameter cannot be set directly which I circumvent by adjusting timeslot 0 to 7 SoC values instead.

Setting up a few good advanced graphs can help a lot too:

Inject true or false signals in the group above, adjusty the required SoC% points to your liking, or use the demonstration inject buttons in the large lower group. This flow will instantly and constantly “nudge” the D-BUS Target SoC values with the chosen percentage points to your liking. No VRM-API required, everything works directly on the D-BUS. This continues every time a new VRM DESS schedule gets pushed onto the D-BUS automatically. :wink: until you set a Delta o SoC of 0% again.

And check your global context variables as well

As always: as-is, use at your own risk (but it is pretty safe and self explanatory really)

[
    {
        "id": "d546a7f2f52bd257",
        "type": "tab",
        "label": "UpCycle Hybrid DESS Trade : D-BUS Target SoC",
        "disabled": false,
        "info": "",
        "env": []
    },
    {
        "id": "eaf159580a690d2a",
        "type": "group",
        "z": "d546a7f2f52bd257",
        "name": "UpCycle Hybrid DESS Trade : Nudge D-BUS Target SoC",
        "style": {
            "label": true
        },
        "nodes": [
            "f0909c64ef9889d7",
            "7379d49b0bc699d7",
            "9a934681bd6e9ed4",
            "ce6dd2dc5da2c727",
            "d7727076eaa77999",
            "1ec124278e595e57",
            "51f9ca82aaaf66fe",
            "2afcbdb9fd442aca",
            "da2287ac462f9ecf",
            "c55a3002f6e212cb",
            "7e6a2e51b350b50c",
            "da38ee5e2116cba5",
            "8b74274d8a11bd5e",
            "5567082c16df16f1",
            "9b22fda3d5a488c8",
            "5bf419f461c13e65",
            "0f678b7ec81b04cd",
            "af2a1cc5932ced1d",
            "067a0113d17d6da8",
            "5e393a15da9820e9",
            "4f57b8732475bb13",
            "209de5a964cf5069",
            "7a2a14d68c85245e",
            "a081a1629e5861e8",
            "b5e89a4cdf7ecea6",
            "7e39ea8809307ea6",
            "f59a0f276fcd85a1",
            "1c017d6204566304",
            "85d6dc621bdb7afc",
            "ce60a50a0fcb9493",
            "45a6022ff020cb94",
            "d00f2f9590e9f171",
            "ac54765aefa362d1",
            "f8a41d3b9374b9bc",
            "8421c4ec24255810",
            "db4bbc7fc1331007",
            "9d108da2a293c6f9",
            "fb30c9135179a62f",
            "4d8ca25210087ec3",
            "36d31e5c878115f5",
            "637b6675546a6b18",
            "d96ba7f4a871a7e3",
            "35021f028a9a0d07",
            "77bd228e9bec3062",
            "0d3d5abb1493c33c",
            "3bf11a513c75a483",
            "648c482ca61f8860",
            "e722df9152b4f3f4",
            "3f125870b56e60b3",
            "a2b8d887e141830e",
            "4af906a82716e271",
            "cd2a9e9290458f59",
            "6604b7e124259de6",
            "5b6d4d270918f3bd",
            "20710f151444147b",
            "f050523f1ec9b64d",
            "59d74c3f49be1232",
            "5d129839c432b297",
            "99292ad702bc3ee7",
            "960cfe0607b3f250",
            "69b727b798a106fe",
            "a031959550f4440a",
            "89b1740e7f1c4060",
            "4e44cb640c04a30d",
            "fd17d3b9e7704e62"
        ],
        "x": 74,
        "y": 299,
        "w": 1852,
        "h": 382
    },
    {
        "id": "fa9ce3c96d079afe",
        "type": "group",
        "z": "d546a7f2f52bd257",
        "name": "UpCycle Hybrid DESS Trade : Buy / Sell / Idle",
        "style": {
            "label": true
        },
        "nodes": [
            "df67ae4c9bc5c1d6",
            "e6483578d6c9dc1b",
            "c82212a4c721a3a6",
            "aeb1dc194297d3e8",
            "afac26496e76721a",
            "6c2a4eefc419f8da",
            "f07a128703b879af",
            "226a1aa87ed3a6bb",
            "569d43abdc1a87b4",
            "81885ad367ee40f4",
            "f4491dbf3f9594d8"
        ],
        "x": 154,
        "y": 59,
        "w": 492,
        "h": 202
    },
    {
        "id": "d96ba7f4a871a7e3",
        "type": "junction",
        "z": "d546a7f2f52bd257",
        "g": "eaf159580a690d2a",
        "x": 1900,
        "y": 340,
        "wires": [
            [
                "f050523f1ec9b64d"
            ]
        ]
    },
    {
        "id": "a031959550f4440a",
        "type": "junction",
        "z": "d546a7f2f52bd257",
        "g": "eaf159580a690d2a",
        "x": 280,
        "y": 460,
        "wires": [
            [
                "0f678b7ec81b04cd",
                "7e39ea8809307ea6",
                "f59a0f276fcd85a1",
                "1c017d6204566304",
                "85d6dc621bdb7afc",
                "ce60a50a0fcb9493",
                "45a6022ff020cb94",
                "d00f2f9590e9f171"
            ]
        ]
    },
    {
        "id": "f0909c64ef9889d7",
        "type": "victron-input-custom",
        "z": "d546a7f2f52bd257",
        "g": "eaf159580a690d2a",
        "service": "com.victronenergy.settings",
        "path": "/Settings/DynamicEss/Schedule/0/TargetSoc",
        "serviceObj": {
            "service": "com.victronenergy.settings",
            "name": "com.victronenergy.settings"
        },
        "pathObj": {
            "path": "/Settings/DynamicEss/Schedule/0/TargetSoc",
            "name": "/Settings/DynamicEss/Schedule/0/TargetSoc",
            "type": "number",
            "value": 49.25
        },
        "name": "dbsTSoC0",
        "onlyChanges": true,
        "roundValues": "no",
        "rateLimit": "0",
        "x": 380,
        "y": 340,
        "wires": [
            [
                "d96ba7f4a871a7e3",
                "af2a1cc5932ced1d"
            ]
        ]
    },
    {
        "id": "7379d49b0bc699d7",
        "type": "victron-input-custom",
        "z": "d546a7f2f52bd257",
        "g": "eaf159580a690d2a",
        "service": "com.victronenergy.settings",
        "path": "/Settings/DynamicEss/Schedule/1/TargetSoc",
        "serviceObj": {
            "service": "com.victronenergy.settings",
            "name": "com.victronenergy.settings"
        },
        "pathObj": {
            "path": "/Settings/DynamicEss/Schedule/1/TargetSoc",
            "name": "/Settings/DynamicEss/Schedule/1/TargetSoc",
            "type": "number",
            "value": 57.7
        },
        "name": "dbsTSoC1",
        "onlyChanges": true,
        "roundValues": "no",
        "rateLimit": "0",
        "x": 560,
        "y": 340,
        "wires": [
            [
                "d96ba7f4a871a7e3",
                "067a0113d17d6da8"
            ]
        ]
    },
    {
        "id": "9a934681bd6e9ed4",
        "type": "victron-input-custom",
        "z": "d546a7f2f52bd257",
        "g": "eaf159580a690d2a",
        "service": "com.victronenergy.settings",
        "path": "/Settings/DynamicEss/Schedule/2/TargetSoc",
        "serviceObj": {
            "service": "com.victronenergy.settings",
            "name": "com.victronenergy.settings"
        },
        "pathObj": {
            "path": "/Settings/DynamicEss/Schedule/2/TargetSoc",
            "name": "/Settings/DynamicEss/Schedule/2/TargetSoc",
            "type": "number",
            "value": 56.14
        },
        "name": "dbsTSoC2",
        "onlyChanges": true,
        "roundValues": "no",
        "rateLimit": "0",
        "x": 740,
        "y": 340,
        "wires": [
            [
                "d96ba7f4a871a7e3",
                "5e393a15da9820e9"
            ]
        ]
    },
    {
        "id": "ce6dd2dc5da2c727",
        "type": "victron-input-custom",
        "z": "d546a7f2f52bd257",
        "g": "eaf159580a690d2a",
        "service": "com.victronenergy.settings",
        "path": "/Settings/DynamicEss/Schedule/3/TargetSoc",
        "serviceObj": {
            "service": "com.victronenergy.settings",
            "name": "com.victronenergy.settings"
        },
        "pathObj": {
            "path": "/Settings/DynamicEss/Schedule/3/TargetSoc",
            "name": "/Settings/DynamicEss/Schedule/3/TargetSoc",
            "type": "number",
            "value": 55
        },
        "name": "dbsTSoC3",
        "onlyChanges": true,
        "roundValues": "no",
        "rateLimit": "0",
        "x": 920,
        "y": 340,
        "wires": [
            [
                "d96ba7f4a871a7e3",
                "4f57b8732475bb13"
            ]
        ]
    },
    {
        "id": "d7727076eaa77999",
        "type": "victron-input-custom",
        "z": "d546a7f2f52bd257",
        "g": "eaf159580a690d2a",
        "service": "com.victronenergy.settings",
        "path": "/Settings/DynamicEss/Schedule/4/TargetSoc",
        "serviceObj": {
            "service": "com.victronenergy.settings",
            "name": "com.victronenergy.settings"
        },
        "pathObj": {
            "path": "/Settings/DynamicEss/Schedule/4/TargetSoc",
            "name": "/Settings/DynamicEss/Schedule/4/TargetSoc",
            "type": "number",
            "value": 55
        },
        "name": "dbsTSoC4",
        "onlyChanges": true,
        "roundValues": "no",
        "rateLimit": "0",
        "x": 1100,
        "y": 340,
        "wires": [
            [
                "d96ba7f4a871a7e3",
                "209de5a964cf5069"
            ]
        ]
    },
    {
        "id": "1ec124278e595e57",
        "type": "victron-input-custom",
        "z": "d546a7f2f52bd257",
        "g": "eaf159580a690d2a",
        "service": "com.victronenergy.settings",
        "path": "/Settings/DynamicEss/Schedule/5/TargetSoc",
        "serviceObj": {
            "service": "com.victronenergy.settings",
            "name": "com.victronenergy.settings"
        },
        "pathObj": {
            "path": "/Settings/DynamicEss/Schedule/5/TargetSoc",
            "name": "/Settings/DynamicEss/Schedule/5/TargetSoc",
            "type": "number",
            "value": 51.05
        },
        "name": "dbsTSoC5",
        "onlyChanges": true,
        "roundValues": "no",
        "rateLimit": "0",
        "x": 1280,
        "y": 340,
        "wires": [
            [
                "d96ba7f4a871a7e3",
                "7a2a14d68c85245e"
            ]
        ]
    },
    {
        "id": "51f9ca82aaaf66fe",
        "type": "victron-input-custom",
        "z": "d546a7f2f52bd257",
        "g": "eaf159580a690d2a",
        "service": "com.victronenergy.settings",
        "path": "/Settings/DynamicEss/Schedule/6/TargetSoc",
        "serviceObj": {
            "service": "com.victronenergy.settings",
            "name": "com.victronenergy.settings"
        },
        "pathObj": {
            "path": "/Settings/DynamicEss/Schedule/6/TargetSoc",
            "name": "/Settings/DynamicEss/Schedule/6/TargetSoc",
            "type": "number",
            "value": 55
        },
        "name": "dbsTSoC6",
        "onlyChanges": true,
        "roundValues": "no",
        "rateLimit": "0",
        "x": 1460,
        "y": 340,
        "wires": [
            [
                "d96ba7f4a871a7e3",
                "a081a1629e5861e8"
            ]
        ]
    },
    {
        "id": "2afcbdb9fd442aca",
        "type": "victron-input-custom",
        "z": "d546a7f2f52bd257",
        "g": "eaf159580a690d2a",
        "service": "com.victronenergy.settings",
        "path": "/Settings/DynamicEss/Schedule/7/TargetSoc",
        "serviceObj": {
            "service": "com.victronenergy.settings",
            "name": "com.victronenergy.settings"
        },
        "pathObj": {
            "path": "/Settings/DynamicEss/Schedule/7/TargetSoc",
            "name": "/Settings/DynamicEss/Schedule/7/TargetSoc",
            "type": "number",
            "value": 60
        },
        "name": "dbsTSoC7",
        "onlyChanges": true,
        "roundValues": "no",
        "rateLimit": "0",
        "x": 1640,
        "y": 340,
        "wires": [
            [
                "d96ba7f4a871a7e3",
                "b5e89a4cdf7ecea6"
            ]
        ]
    },
    {
        "id": "da2287ac462f9ecf",
        "type": "function",
        "z": "d546a7f2f52bd257",
        "g": "eaf159580a690d2a",
        "name": "limit",
        "func": "const timestamp = Date.now();\nlet fill = ( 'red' );\nlet shape = 'dot';\nlet text = ( 'ts: ' + timestamp );\nnode.status({fill, shape, text});\n\nif ( msg.measurements == 2)\n{\n    if ( msg.payload > 100 ) {\n        msg.payload = 100;\n    } else if ( msg.payload < 0 ) {\n        msg.payload = 0;\n    }\n/*    msg.topic = 'dbsSoC'\n    let fill = ( 'green' )\n    let shape = 'dot'\n    let text = ( msg.topic + ': ' + msg.payload )\n    node.status({fill, shape, text})\n    */\n    return msg;\n}\nreturn;",
        "outputs": 1,
        "timeout": "",
        "noerr": 0,
        "initialize": "",
        "finalize": "",
        "libs": [],
        "x": 370,
        "y": 520,
        "wires": [
            [
                "0d3d5abb1493c33c"
            ]
        ]
    },
    {
        "id": "c55a3002f6e212cb",
        "type": "function",
        "z": "d546a7f2f52bd257",
        "g": "eaf159580a690d2a",
        "name": "limit",
        "func": "const timestamp = Date.now();\nlet fill = ( 'red' );\nlet shape = 'dot';\nlet text = ( 'ts: ' + timestamp );\nnode.status({fill, shape, text});\n\nif ( msg.measurements == 2)\n{\n    if ( msg.payload > 100 ) {\n        msg.payload = 100;\n    } else if ( msg.payload < 0 ) {\n        msg.payload = 0;\n    }\n/*    msg.topic = 'dbsSoC'\n    let fill = ( 'green' )\n    let shape = 'dot'\n    let text = ( msg.topic + ': ' + msg.payload )\n    node.status({fill, shape, text})\n    */\n    return msg;\n}\nreturn;",
        "outputs": 1,
        "timeout": "",
        "noerr": 0,
        "initialize": "",
        "finalize": "",
        "libs": [],
        "x": 550,
        "y": 520,
        "wires": [
            [
                "3bf11a513c75a483"
            ]
        ]
    },
    {
        "id": "7e6a2e51b350b50c",
        "type": "function",
        "z": "d546a7f2f52bd257",
        "g": "eaf159580a690d2a",
        "name": "limit",
        "func": "const timestamp = Date.now();\nlet fill = ( 'red' );\nlet shape = 'dot';\nlet text = ( 'ts: ' + timestamp );\nnode.status({fill, shape, text});\n\nif ( msg.measurements == 2)\n{\n    if ( msg.payload > 100 ) {\n        msg.payload = 100;\n    } else if ( msg.payload < 0 ) {\n        msg.payload = 0;\n    }\n/*    msg.topic = 'dbsSoC'\n    let fill = ( 'green' )\n    let shape = 'dot'\n    let text = ( msg.topic + ': ' + msg.payload )\n    node.status({fill, shape, text})\n    */\n    return msg;\n}\nreturn;",
        "outputs": 1,
        "timeout": "",
        "noerr": 0,
        "initialize": "",
        "finalize": "",
        "libs": [],
        "x": 730,
        "y": 520,
        "wires": [
            [
                "648c482ca61f8860"
            ]
        ]
    },
    {
        "id": "da38ee5e2116cba5",
        "type": "function",
        "z": "d546a7f2f52bd257",
        "g": "eaf159580a690d2a",
        "name": "limit",
        "func": "const timestamp = Date.now();\nlet fill = ( 'red' );\nlet shape = 'dot';\nlet text = ( 'ts: ' + timestamp );\nnode.status({fill, shape, text});\n\nif ( msg.measurements == 2)\n{\n    if ( msg.payload > 100 ) {\n        msg.payload = 100;\n    } else if ( msg.payload < 0 ) {\n        msg.payload = 0;\n    }\n/*    msg.topic = 'dbsSoC'\n    let fill = ( 'green' )\n    let shape = 'dot'\n    let text = ( msg.topic + ': ' + msg.payload )\n    node.status({fill, shape, text})\n    */\n    return msg;\n}\nreturn;",
        "outputs": 1,
        "timeout": "",
        "noerr": 0,
        "initialize": "",
        "finalize": "",
        "libs": [],
        "x": 910,
        "y": 520,
        "wires": [
            [
                "e722df9152b4f3f4"
            ]
        ]
    },
    {
        "id": "8b74274d8a11bd5e",
        "type": "function",
        "z": "d546a7f2f52bd257",
        "g": "eaf159580a690d2a",
        "name": "limit",
        "func": "const timestamp = Date.now();\nlet fill = ( 'red' );\nlet shape = 'dot';\nlet text = ( 'ts: ' + timestamp );\nnode.status({fill, shape, text});\n\nif ( msg.measurements == 2)\n{\n    if ( msg.payload > 100 ) {\n        msg.payload = 100;\n    } else if ( msg.payload < 0 ) {\n        msg.payload = 0;\n    }\n/*    msg.topic = 'dbsSoC'\n    let fill = ( 'green' )\n    let shape = 'dot'\n    let text = ( msg.topic + ': ' + msg.payload )\n    node.status({fill, shape, text})\n    */\n    return msg;\n}\nreturn;",
        "outputs": 1,
        "timeout": "",
        "noerr": 0,
        "initialize": "",
        "finalize": "",
        "libs": [],
        "x": 1090,
        "y": 520,
        "wires": [
            [
                "3f125870b56e60b3"
            ]
        ]
    },
    {
        "id": "5567082c16df16f1",
        "type": "function",
        "z": "d546a7f2f52bd257",
        "g": "eaf159580a690d2a",
        "name": "limit",
        "func": "const timestamp = Date.now();\nlet fill = ( 'red' );\nlet shape = 'dot';\nlet text = ( 'ts: ' + timestamp );\nnode.status({fill, shape, text});\n\nif ( msg.measurements == 2)\n{\n    if ( msg.payload > 100 ) {\n        msg.payload = 100;\n    } else if ( msg.payload < 0 ) {\n        msg.payload = 0;\n    }\n/*    msg.topic = 'dbsSoC'\n    let fill = ( 'green' )\n    let shape = 'dot'\n    let text = ( msg.topic + ': ' + msg.payload )\n    node.status({fill, shape, text})\n    */\n    return msg;\n}\nreturn;",
        "outputs": 1,
        "timeout": "",
        "noerr": 0,
        "initialize": "",
        "finalize": "",
        "libs": [],
        "x": 1270,
        "y": 520,
        "wires": [
            [
                "a2b8d887e141830e"
            ]
        ]
    },
    {
        "id": "9b22fda3d5a488c8",
        "type": "function",
        "z": "d546a7f2f52bd257",
        "g": "eaf159580a690d2a",
        "name": "limit",
        "func": "const timestamp = Date.now();\nlet fill = ( 'red' );\nlet shape = 'dot';\nlet text = ( 'ts: ' + timestamp );\nnode.status({fill, shape, text});\n\nif ( msg.measurements == 2)\n{\n    if ( msg.payload > 100 ) {\n        msg.payload = 100;\n    } else if ( msg.payload < 0 ) {\n        msg.payload = 0;\n    }\n/*    msg.topic = 'dbsSoC'\n    let fill = ( 'green' )\n    let shape = 'dot'\n    let text = ( msg.topic + ': ' + msg.payload )\n    node.status({fill, shape, text})\n    */\n    return msg;\n}\nreturn;",
        "outputs": 1,
        "timeout": "",
        "noerr": 0,
        "initialize": "",
        "finalize": "",
        "libs": [],
        "x": 1450,
        "y": 520,
        "wires": [
            [
                "4af906a82716e271"
            ]
        ]
    },
    {
        "id": "5bf419f461c13e65",
        "type": "function",
        "z": "d546a7f2f52bd257",
        "g": "eaf159580a690d2a",
        "name": "limit",
        "func": "const timestamp = Date.now();\nlet fill = ( 'red' );\nlet shape = 'dot';\nlet text = ( 'ts: ' + timestamp );\nnode.status({fill, shape, text});\n\nif ( msg.measurements == 2)\n{\n    if ( msg.payload > 100 ) {\n        msg.payload = 100;\n    } else if ( msg.payload < 0 ) {\n        msg.payload = 0;\n    }\n/*    msg.topic = 'dbsSoC'\n    let fill = ( 'green' )\n    let shape = 'dot'\n    let text = ( msg.topic + ': ' + msg.payload )\n    node.status({fill, shape, text})\n    */\n    return msg;\n}\nreturn;",
        "outputs": 1,
        "timeout": "",
        "noerr": 0,
        "initialize": "",
        "finalize": "",
        "libs": [],
        "x": 1630,
        "y": 520,
        "wires": [
            [
                "cd2a9e9290458f59"
            ]
        ]
    },
    {
        "id": "0f678b7ec81b04cd",
        "type": "SumUltimate",
        "z": "d546a7f2f52bd257",
        "g": "eaf159580a690d2a",
        "name": "sum",
        "property": "payload",
        "math": "sum",
        "subtractstartfrom": "LastScheduledEnd",
        "x": 370,
        "y": 460,
        "wires": [
            [
                "da2287ac462f9ecf"
            ]
        ]
    },
    {
        "id": "af2a1cc5932ced1d",
        "type": "delay",
        "z": "d546a7f2f52bd257",
        "g": "eaf159580a690d2a",
        "name": "1 msg/5s",
        "pauseType": "rate",
        "timeout": "1",
        "timeoutUnits": "seconds",
        "rate": "1",
        "nbRateUnits": "5",
        "rateUnits": "second",
        "randomFirst": "1",
        "randomLast": "5",
        "randomUnits": "seconds",
        "drop": true,
        "allowrate": false,
        "outputs": 1,
        "x": 380,
        "y": 400,
        "wires": [
            [
                "0f678b7ec81b04cd"
            ]
        ]
    },
    {
        "id": "067a0113d17d6da8",
        "type": "delay",
        "z": "d546a7f2f52bd257",
        "g": "eaf159580a690d2a",
        "name": "1 msg/5s",
        "pauseType": "rate",
        "timeout": "1",
        "timeoutUnits": "seconds",
        "rate": "1",
        "nbRateUnits": "5",
        "rateUnits": "second",
        "randomFirst": "1",
        "randomLast": "5",
        "randomUnits": "seconds",
        "drop": true,
        "allowrate": false,
        "outputs": 1,
        "x": 560,
        "y": 400,
        "wires": [
            [
                "7e39ea8809307ea6"
            ]
        ]
    },
    {
        "id": "5e393a15da9820e9",
        "type": "delay",
        "z": "d546a7f2f52bd257",
        "g": "eaf159580a690d2a",
        "name": "1 msg/5s",
        "pauseType": "rate",
        "timeout": "1",
        "timeoutUnits": "seconds",
        "rate": "1",
        "nbRateUnits": "5",
        "rateUnits": "second",
        "randomFirst": "1",
        "randomLast": "5",
        "randomUnits": "seconds",
        "drop": true,
        "allowrate": false,
        "outputs": 1,
        "x": 740,
        "y": 400,
        "wires": [
            [
                "f59a0f276fcd85a1"
            ]
        ]
    },
    {
        "id": "4f57b8732475bb13",
        "type": "delay",
        "z": "d546a7f2f52bd257",
        "g": "eaf159580a690d2a",
        "name": "1 msg/5s",
        "pauseType": "rate",
        "timeout": "1",
        "timeoutUnits": "seconds",
        "rate": "1",
        "nbRateUnits": "5",
        "rateUnits": "second",
        "randomFirst": "1",
        "randomLast": "5",
        "randomUnits": "seconds",
        "drop": true,
        "allowrate": false,
        "outputs": 1,
        "x": 920,
        "y": 400,
        "wires": [
            [
                "1c017d6204566304"
            ]
        ]
    },
    {
        "id": "209de5a964cf5069",
        "type": "delay",
        "z": "d546a7f2f52bd257",
        "g": "eaf159580a690d2a",
        "name": "1 msg/5s",
        "pauseType": "rate",
        "timeout": "1",
        "timeoutUnits": "seconds",
        "rate": "1",
        "nbRateUnits": "5",
        "rateUnits": "second",
        "randomFirst": "1",
        "randomLast": "5",
        "randomUnits": "seconds",
        "drop": true,
        "allowrate": false,
        "outputs": 1,
        "x": 1100,
        "y": 400,
        "wires": [
            [
                "85d6dc621bdb7afc"
            ]
        ]
    },
    {
        "id": "7a2a14d68c85245e",
        "type": "delay",
        "z": "d546a7f2f52bd257",
        "g": "eaf159580a690d2a",
        "name": "1 msg/5s",
        "pauseType": "rate",
        "timeout": "1",
        "timeoutUnits": "seconds",
        "rate": "1",
        "nbRateUnits": "5",
        "rateUnits": "second",
        "randomFirst": "1",
        "randomLast": "5",
        "randomUnits": "seconds",
        "drop": true,
        "allowrate": false,
        "outputs": 1,
        "x": 1280,
        "y": 400,
        "wires": [
            [
                "ce60a50a0fcb9493"
            ]
        ]
    },
    {
        "id": "a081a1629e5861e8",
        "type": "delay",
        "z": "d546a7f2f52bd257",
        "g": "eaf159580a690d2a",
        "name": "1 msg/5s",
        "pauseType": "rate",
        "timeout": "1",
        "timeoutUnits": "seconds",
        "rate": "1",
        "nbRateUnits": "5",
        "rateUnits": "second",
        "randomFirst": "1",
        "randomLast": "5",
        "randomUnits": "seconds",
        "drop": true,
        "allowrate": false,
        "outputs": 1,
        "x": 1460,
        "y": 400,
        "wires": [
            [
                "45a6022ff020cb94"
            ]
        ]
    },
    {
        "id": "b5e89a4cdf7ecea6",
        "type": "delay",
        "z": "d546a7f2f52bd257",
        "g": "eaf159580a690d2a",
        "name": "1 msg/5s",
        "pauseType": "rate",
        "timeout": "1",
        "timeoutUnits": "seconds",
        "rate": "1",
        "nbRateUnits": "5",
        "rateUnits": "second",
        "randomFirst": "1",
        "randomLast": "5",
        "randomUnits": "seconds",
        "drop": true,
        "allowrate": false,
        "outputs": 1,
        "x": 1640,
        "y": 400,
        "wires": [
            [
                "d00f2f9590e9f171"
            ]
        ]
    },
    {
        "id": "7e39ea8809307ea6",
        "type": "SumUltimate",
        "z": "d546a7f2f52bd257",
        "g": "eaf159580a690d2a",
        "name": "sum",
        "property": "payload",
        "math": "sum",
        "subtractstartfrom": "LastScheduledEnd",
        "x": 550,
        "y": 460,
        "wires": [
            [
                "c55a3002f6e212cb"
            ]
        ]
    },
    {
        "id": "f59a0f276fcd85a1",
        "type": "SumUltimate",
        "z": "d546a7f2f52bd257",
        "g": "eaf159580a690d2a",
        "name": "sum",
        "property": "payload",
        "math": "sum",
        "subtractstartfrom": "LastScheduledEnd",
        "x": 730,
        "y": 460,
        "wires": [
            [
                "7e6a2e51b350b50c"
            ]
        ]
    },
    {
        "id": "1c017d6204566304",
        "type": "SumUltimate",
        "z": "d546a7f2f52bd257",
        "g": "eaf159580a690d2a",
        "name": "sum",
        "property": "payload",
        "math": "sum",
        "subtractstartfrom": "LastScheduledEnd",
        "x": 910,
        "y": 460,
        "wires": [
            [
                "da38ee5e2116cba5"
            ]
        ]
    },
    {
        "id": "85d6dc621bdb7afc",
        "type": "SumUltimate",
        "z": "d546a7f2f52bd257",
        "g": "eaf159580a690d2a",
        "name": "sum",
        "property": "payload",
        "math": "sum",
        "subtractstartfrom": "LastScheduledEnd",
        "x": 1090,
        "y": 460,
        "wires": [
            [
                "8b74274d8a11bd5e"
            ]
        ]
    },
    {
        "id": "ce60a50a0fcb9493",
        "type": "SumUltimate",
        "z": "d546a7f2f52bd257",
        "g": "eaf159580a690d2a",
        "name": "sum",
        "property": "payload",
        "math": "sum",
        "subtractstartfrom": "LastScheduledEnd",
        "x": 1270,
        "y": 460,
        "wires": [
            [
                "5567082c16df16f1"
            ]
        ]
    },
    {
        "id": "45a6022ff020cb94",
        "type": "SumUltimate",
        "z": "d546a7f2f52bd257",
        "g": "eaf159580a690d2a",
        "name": "sum",
        "property": "payload",
        "math": "sum",
        "subtractstartfrom": "LastScheduledEnd",
        "x": 1450,
        "y": 460,
        "wires": [
            [
                "9b22fda3d5a488c8"
            ]
        ]
    },
    {
        "id": "d00f2f9590e9f171",
        "type": "SumUltimate",
        "z": "d546a7f2f52bd257",
        "g": "eaf159580a690d2a",
        "name": "sum",
        "property": "payload",
        "math": "sum",
        "subtractstartfrom": "LastScheduledEnd",
        "x": 1630,
        "y": 460,
        "wires": [
            [
                "5bf419f461c13e65"
            ]
        ]
    },
    {
        "id": "ac54765aefa362d1",
        "type": "victron-output-custom",
        "z": "d546a7f2f52bd257",
        "g": "eaf159580a690d2a",
        "service": "com.victronenergy.settings",
        "path": "/Settings/DynamicEss/Schedule/4/TargetSoc",
        "serviceObj": {
            "service": "com.victronenergy.settings",
            "name": "com.victronenergy.settings"
        },
        "pathObj": {
            "path": "/Settings/DynamicEss/Schedule/4/TargetSoc",
            "name": "/Settings/DynamicEss/Schedule/4/TargetSoc",
            "type": "number",
            "value": 47.79
        },
        "name": "dbsTSoC4",
        "onlyChanges": false,
        "x": 1110,
        "y": 640,
        "wires": []
    },
    {
        "id": "f8a41d3b9374b9bc",
        "type": "victron-output-custom",
        "z": "d546a7f2f52bd257",
        "g": "eaf159580a690d2a",
        "service": "com.victronenergy.settings",
        "path": "/Settings/DynamicEss/Schedule/5/TargetSoc",
        "serviceObj": {
            "service": "com.victronenergy.settings",
            "name": "com.victronenergy.settings"
        },
        "pathObj": {
            "path": "/Settings/DynamicEss/Schedule/5/TargetSoc",
            "name": "/Settings/DynamicEss/Schedule/5/TargetSoc",
            "type": "number",
            "value": 49.56
        },
        "name": "dbsTSoC5",
        "onlyChanges": false,
        "x": 1290,
        "y": 640,
        "wires": []
    },
    {
        "id": "8421c4ec24255810",
        "type": "victron-output-custom",
        "z": "d546a7f2f52bd257",
        "g": "eaf159580a690d2a",
        "service": "com.victronenergy.settings",
        "path": "/Settings/DynamicEss/Schedule/6/TargetSoc",
        "serviceObj": {
            "service": "com.victronenergy.settings",
            "name": "com.victronenergy.settings"
        },
        "pathObj": {
            "path": "/Settings/DynamicEss/Schedule/6/TargetSoc",
            "name": "/Settings/DynamicEss/Schedule/6/TargetSoc",
            "type": "number",
            "value": 51.33
        },
        "name": "dbsTSoC6",
        "onlyChanges": false,
        "x": 1470,
        "y": 640,
        "wires": []
    },
    {
        "id": "db4bbc7fc1331007",
        "type": "victron-output-custom",
        "z": "d546a7f2f52bd257",
        "g": "eaf159580a690d2a",
        "service": "com.victronenergy.settings",
        "path": "/Settings/DynamicEss/Schedule/7/TargetSoc",
        "serviceObj": {
            "service": "com.victronenergy.settings",
            "name": "com.victronenergy.settings"
        },
        "pathObj": {
            "path": "/Settings/DynamicEss/Schedule/7/TargetSoc",
            "name": "/Settings/DynamicEss/Schedule/7/TargetSoc",
            "type": "number",
            "value": 53.1
        },
        "name": "dbsTSoC7",
        "onlyChanges": false,
        "x": 1650,
        "y": 640,
        "wires": []
    },
    {
        "id": "9d108da2a293c6f9",
        "type": "victron-output-custom",
        "z": "d546a7f2f52bd257",
        "g": "eaf159580a690d2a",
        "service": "com.victronenergy.settings",
        "path": "/Settings/DynamicEss/Schedule/0/TargetSoc",
        "serviceObj": {
            "service": "com.victronenergy.settings",
            "name": "com.victronenergy.settings"
        },
        "pathObj": {
            "path": "/Settings/DynamicEss/Schedule/0/TargetSoc",
            "name": "/Settings/DynamicEss/Schedule/0/TargetSoc",
            "type": "number",
            "value": 40.15
        },
        "name": "dbsTSoC0",
        "onlyChanges": false,
        "x": 390,
        "y": 640,
        "wires": []
    },
    {
        "id": "fb30c9135179a62f",
        "type": "victron-output-custom",
        "z": "d546a7f2f52bd257",
        "g": "eaf159580a690d2a",
        "service": "com.victronenergy.settings",
        "path": "/Settings/DynamicEss/Schedule/1/TargetSoc",
        "serviceObj": {
            "service": "com.victronenergy.settings",
            "name": "com.victronenergy.settings"
        },
        "pathObj": {
            "path": "/Settings/DynamicEss/Schedule/1/TargetSoc",
            "name": "/Settings/DynamicEss/Schedule/1/TargetSoc",
            "type": "number",
            "value": 42.11
        },
        "name": "dbsTSoC1",
        "onlyChanges": false,
        "x": 570,
        "y": 640,
        "wires": []
    },
    {
        "id": "4d8ca25210087ec3",
        "type": "victron-output-custom",
        "z": "d546a7f2f52bd257",
        "g": "eaf159580a690d2a",
        "service": "com.victronenergy.settings",
        "path": "/Settings/DynamicEss/Schedule/2/TargetSoc",
        "serviceObj": {
            "service": "com.victronenergy.settings",
            "name": "com.victronenergy.settings"
        },
        "pathObj": {
            "path": "/Settings/DynamicEss/Schedule/2/TargetSoc",
            "name": "/Settings/DynamicEss/Schedule/2/TargetSoc",
            "type": "number",
            "value": 44.06
        },
        "name": "dbsTSoC2",
        "onlyChanges": false,
        "x": 750,
        "y": 640,
        "wires": []
    },
    {
        "id": "36d31e5c878115f5",
        "type": "victron-output-custom",
        "z": "d546a7f2f52bd257",
        "g": "eaf159580a690d2a",
        "service": "com.victronenergy.settings",
        "path": "/Settings/DynamicEss/Schedule/3/TargetSoc",
        "serviceObj": {
            "service": "com.victronenergy.settings",
            "name": "com.victronenergy.settings"
        },
        "pathObj": {
            "path": "/Settings/DynamicEss/Schedule/3/TargetSoc",
            "name": "/Settings/DynamicEss/Schedule/3/TargetSoc",
            "type": "number",
            "value": 46.02
        },
        "name": "dbsTSoC3",
        "onlyChanges": false,
        "x": 930,
        "y": 640,
        "wires": []
    },
    {
        "id": "637b6675546a6b18",
        "type": "inject",
        "z": "d546a7f2f52bd257",
        "g": "eaf159580a690d2a",
        "name": "+0.00",
        "props": [
            {
                "p": "payload"
            },
            {
                "p": "topic",
                "vt": "str"
            }
        ],
        "repeat": "",
        "crontab": "",
        "once": false,
        "onceDelay": 0.1,
        "topic": "delta",
        "payload": "0.00",
        "payloadType": "num",
        "x": 170,
        "y": 600,
        "wires": [
            [
                "4e44cb640c04a30d"
            ]
        ]
    },
    {
        "id": "35021f028a9a0d07",
        "type": "inject",
        "z": "d546a7f2f52bd257",
        "g": "eaf159580a690d2a",
        "name": "+1.00",
        "props": [
            {
                "p": "payload"
            },
            {
                "p": "topic",
                "vt": "str"
            }
        ],
        "repeat": "",
        "crontab": "",
        "once": false,
        "onceDelay": 0.1,
        "topic": "delta",
        "payload": "1.00",
        "payloadType": "num",
        "x": 170,
        "y": 560,
        "wires": [
            [
                "4e44cb640c04a30d"
            ]
        ]
    },
    {
        "id": "77bd228e9bec3062",
        "type": "inject",
        "z": "d546a7f2f52bd257",
        "g": "eaf159580a690d2a",
        "name": "-0.50",
        "props": [
            {
                "p": "payload"
            },
            {
                "p": "topic",
                "vt": "str"
            }
        ],
        "repeat": "",
        "crontab": "",
        "once": false,
        "onceDelay": 0.1,
        "topic": "delta",
        "payload": "-0.50",
        "payloadType": "num",
        "x": 170,
        "y": 640,
        "wires": [
            [
                "4e44cb640c04a30d"
            ]
        ]
    },
    {
        "id": "0d3d5abb1493c33c",
        "type": "delay",
        "z": "d546a7f2f52bd257",
        "g": "eaf159580a690d2a",
        "name": "1 msg/5s",
        "pauseType": "rate",
        "timeout": "1",
        "timeoutUnits": "seconds",
        "rate": "1",
        "nbRateUnits": "5",
        "rateUnits": "second",
        "randomFirst": "1",
        "randomLast": "5",
        "randomUnits": "seconds",
        "drop": true,
        "allowrate": false,
        "outputs": 1,
        "x": 380,
        "y": 580,
        "wires": [
            [
                "9d108da2a293c6f9"
            ]
        ]
    },
    {
        "id": "3bf11a513c75a483",
        "type": "delay",
        "z": "d546a7f2f52bd257",
        "g": "eaf159580a690d2a",
        "name": "1 msg/5s",
        "pauseType": "rate",
        "timeout": "1",
        "timeoutUnits": "seconds",
        "rate": "1",
        "nbRateUnits": "5",
        "rateUnits": "second",
        "randomFirst": "1",
        "randomLast": "5",
        "randomUnits": "seconds",
        "drop": true,
        "allowrate": false,
        "outputs": 1,
        "x": 560,
        "y": 580,
        "wires": [
            [
                "fb30c9135179a62f"
            ]
        ]
    },
    {
        "id": "648c482ca61f8860",
        "type": "delay",
        "z": "d546a7f2f52bd257",
        "g": "eaf159580a690d2a",
        "name": "1 msg/5s",
        "pauseType": "rate",
        "timeout": "1",
        "timeoutUnits": "seconds",
        "rate": "1",
        "nbRateUnits": "5",
        "rateUnits": "second",
        "randomFirst": "1",
        "randomLast": "5",
        "randomUnits": "seconds",
        "drop": true,
        "allowrate": false,
        "outputs": 1,
        "x": 740,
        "y": 580,
        "wires": [
            [
                "4d8ca25210087ec3"
            ]
        ]
    },
    {
        "id": "e722df9152b4f3f4",
        "type": "delay",
        "z": "d546a7f2f52bd257",
        "g": "eaf159580a690d2a",
        "name": "1 msg/5s",
        "pauseType": "rate",
        "timeout": "1",
        "timeoutUnits": "seconds",
        "rate": "1",
        "nbRateUnits": "5",
        "rateUnits": "second",
        "randomFirst": "1",
        "randomLast": "5",
        "randomUnits": "seconds",
        "drop": true,
        "allowrate": false,
        "outputs": 1,
        "x": 920,
        "y": 580,
        "wires": [
            [
                "36d31e5c878115f5"
            ]
        ]
    },
    {
        "id": "3f125870b56e60b3",
        "type": "delay",
        "z": "d546a7f2f52bd257",
        "g": "eaf159580a690d2a",
        "name": "1 msg/5s",
        "pauseType": "rate",
        "timeout": "1",
        "timeoutUnits": "seconds",
        "rate": "1",
        "nbRateUnits": "5",
        "rateUnits": "second",
        "randomFirst": "1",
        "randomLast": "5",
        "randomUnits": "seconds",
        "drop": true,
        "allowrate": false,
        "outputs": 1,
        "x": 1100,
        "y": 580,
        "wires": [
            [
                "ac54765aefa362d1"
            ]
        ]
    },
    {
        "id": "a2b8d887e141830e",
        "type": "delay",
        "z": "d546a7f2f52bd257",
        "g": "eaf159580a690d2a",
        "name": "1 msg/5s",
        "pauseType": "rate",
        "timeout": "1",
        "timeoutUnits": "seconds",
        "rate": "1",
        "nbRateUnits": "5",
        "rateUnits": "second",
        "randomFirst": "1",
        "randomLast": "5",
        "randomUnits": "seconds",
        "drop": true,
        "allowrate": false,
        "outputs": 1,
        "x": 1280,
        "y": 580,
        "wires": [
            [
                "f8a41d3b9374b9bc"
            ]
        ]
    },
    {
        "id": "4af906a82716e271",
        "type": "delay",
        "z": "d546a7f2f52bd257",
        "g": "eaf159580a690d2a",
        "name": "1 msg/5s",
        "pauseType": "rate",
        "timeout": "1",
        "timeoutUnits": "seconds",
        "rate": "1",
        "nbRateUnits": "5",
        "rateUnits": "second",
        "randomFirst": "1",
        "randomLast": "5",
        "randomUnits": "seconds",
        "drop": true,
        "allowrate": false,
        "outputs": 1,
        "x": 1460,
        "y": 580,
        "wires": [
            [
                "8421c4ec24255810"
            ]
        ]
    },
    {
        "id": "cd2a9e9290458f59",
        "type": "delay",
        "z": "d546a7f2f52bd257",
        "g": "eaf159580a690d2a",
        "name": "1 msg/5s",
        "pauseType": "rate",
        "timeout": "1",
        "timeoutUnits": "seconds",
        "rate": "1",
        "nbRateUnits": "5",
        "rateUnits": "second",
        "randomFirst": "1",
        "randomLast": "5",
        "randomUnits": "seconds",
        "drop": true,
        "allowrate": false,
        "outputs": 1,
        "x": 1640,
        "y": 580,
        "wires": [
            [
                "db4bbc7fc1331007"
            ]
        ]
    },
    {
        "id": "6604b7e124259de6",
        "type": "debug",
        "z": "d546a7f2f52bd257",
        "g": "eaf159580a690d2a",
        "name": "dbsTSoC",
        "active": true,
        "tosidebar": true,
        "console": false,
        "tostatus": true,
        "complete": "true",
        "targetType": "full",
        "statusVal": "payload",
        "statusType": "msg",
        "x": 1820,
        "y": 580,
        "wires": []
    },
    {
        "id": "5b6d4d270918f3bd",
        "type": "victron-input-custom",
        "z": "d546a7f2f52bd257",
        "g": "eaf159580a690d2a",
        "service": "com.victronenergy.settings",
        "path": "/Settings/DynamicEss/Schedule/0/Start",
        "serviceObj": {
            "service": "com.victronenergy.settings",
            "name": "com.victronenergy.settings"
        },
        "pathObj": {
            "path": "/Settings/DynamicEss/Schedule/0/Start",
            "name": "/Settings/DynamicEss/Schedule/0/Start",
            "type": "number",
            "value": 1769549400
        },
        "name": "newschedule",
        "onlyChanges": true,
        "roundValues": "no",
        "rateLimit": "0",
        "x": 170,
        "y": 340,
        "wires": [
            [
                "d96ba7f4a871a7e3",
                "99292ad702bc3ee7"
            ]
        ]
    },
    {
        "id": "20710f151444147b",
        "type": "victron-input-dess",
        "z": "d546a7f2f52bd257",
        "g": "eaf159580a690d2a",
        "service": "com.victronenergy.system/0",
        "path": "/DynamicEss/TargetSoc",
        "serviceObj": {
            "service": "com.victronenergy.system/0",
            "name": "Venus system",
            "communityTag": "dess"
        },
        "pathObj": {
            "path": "/DynamicEss/TargetSoc",
            "type": "float",
            "name": "The set target SOC for this time slot (%)"
        },
        "name": "dbsTSoC",
        "onlyChanges": true,
        "roundValues": "no",
        "rateLimit": "0",
        "x": 1820,
        "y": 340,
        "wires": [
            [
                "d96ba7f4a871a7e3"
            ]
        ]
    },
    {
        "id": "f050523f1ec9b64d",
        "type": "delay",
        "z": "d546a7f2f52bd257",
        "g": "eaf159580a690d2a",
        "name": "1 msg/s",
        "pauseType": "rate",
        "timeout": "1",
        "timeoutUnits": "seconds",
        "rate": "1",
        "nbRateUnits": "1",
        "rateUnits": "second",
        "randomFirst": "1",
        "randomLast": "5",
        "randomUnits": "seconds",
        "drop": true,
        "allowrate": false,
        "outputs": 1,
        "x": 1820,
        "y": 400,
        "wires": [
            [
                "5d129839c432b297"
            ]
        ]
    },
    {
        "id": "59d74c3f49be1232",
        "type": "function",
        "z": "d546a7f2f52bd257",
        "g": "eaf159580a690d2a",
        "name": "ts",
        "func": "const timestamp = Date.now();\nlet fill = ( 'red' );\nlet shape = 'dot';\nlet text = ( 'ts: ' + timestamp );\nnode.status({fill, shape, text});\nreturn msg;",
        "outputs": 1,
        "timeout": "",
        "noerr": 0,
        "initialize": "",
        "finalize": "",
        "libs": [],
        "x": 1810,
        "y": 520,
        "wires": [
            [
                "6604b7e124259de6"
            ]
        ]
    },
    {
        "id": "5d129839c432b297",
        "type": "StatusUltimate",
        "z": "d546a7f2f52bd257",
        "g": "eaf159580a690d2a",
        "name": "topic",
        "property": "topic",
        "x": 1810,
        "y": 460,
        "wires": [
            [
                "59d74c3f49be1232"
            ]
        ]
    },
    {
        "id": "99292ad702bc3ee7",
        "type": "StatusUltimate",
        "z": "d546a7f2f52bd257",
        "g": "eaf159580a690d2a",
        "name": "topic",
        "property": "topic",
        "x": 150,
        "y": 400,
        "wires": [
            [
                "960cfe0607b3f250"
            ]
        ]
    },
    {
        "id": "960cfe0607b3f250",
        "type": "link out",
        "z": "d546a7f2f52bd257",
        "g": "eaf159580a690d2a",
        "name": "link out 16",
        "mode": "link",
        "links": [
            "93342a5994b7ccdc"
        ],
        "x": 245,
        "y": 400,
        "wires": []
    },
    {
        "id": "69b727b798a106fe",
        "type": "link in",
        "z": "d546a7f2f52bd257",
        "g": "eaf159580a690d2a",
        "name": "link in 13",
        "links": [
            "df67ae4c9bc5c1d6"
        ],
        "x": 115,
        "y": 520,
        "wires": [
            [
                "4e44cb640c04a30d"
            ]
        ]
    },
    {
        "id": "89b1740e7f1c4060",
        "type": "victron-input-custom",
        "z": "d546a7f2f52bd257",
        "g": "eaf159580a690d2a",
        "service": "com.victronenergy.settings",
        "path": "/Settings/DynamicEss/Schedule/0/Duration",
        "serviceObj": {
            "service": "com.victronenergy.settings",
            "name": "com.victronenergy.settings"
        },
        "pathObj": {
            "path": "/Settings/DynamicEss/Schedule/0/Duration",
            "name": "/Settings/DynamicEss/Schedule/0/Duration",
            "type": "number",
            "value": 900
        },
        "name": "dbsDur0",
        "onlyChanges": true,
        "roundValues": "no",
        "rateLimit": "0",
        "x": 1820,
        "y": 640,
        "wires": [
            []
        ]
    },
    {
        "id": "4e44cb640c04a30d",
        "type": "change",
        "z": "d546a7f2f52bd257",
        "g": "eaf159580a690d2a",
        "name": "delta",
        "rules": [
            {
                "t": "set",
                "p": "topic",
                "pt": "msg",
                "to": "delta",
                "tot": "str"
            }
        ],
        "action": "",
        "property": "",
        "from": "",
        "to": "",
        "reg": false,
        "x": 190,
        "y": 520,
        "wires": [
            [
                "fd17d3b9e7704e62"
            ]
        ]
    },
    {
        "id": "fd17d3b9e7704e62",
        "type": "StatusUltimate",
        "z": "d546a7f2f52bd257",
        "g": "eaf159580a690d2a",
        "name": "Status",
        "property": "payload",
        "x": 150,
        "y": 460,
        "wires": [
            [
                "a031959550f4440a"
            ]
        ]
    },
    {
        "id": "df67ae4c9bc5c1d6",
        "type": "link out",
        "z": "d546a7f2f52bd257",
        "g": "fa9ce3c96d079afe",
        "name": "link out 17",
        "mode": "link",
        "links": [
            "69b727b798a106fe"
        ],
        "x": 605,
        "y": 220,
        "wires": []
    },
    {
        "id": "e6483578d6c9dc1b",
        "type": "function",
        "z": "d546a7f2f52bd257",
        "g": "fa9ce3c96d079afe",
        "name": "+1.00",
        "func": "if ( msg.payload ) {    // buy == true\n    msg.payload = +1.00;\n    return msg;\n}\n// do nothing",
        "outputs": 1,
        "timeout": 0,
        "noerr": 0,
        "initialize": "",
        "finalize": "",
        "libs": [],
        "x": 430,
        "y": 100,
        "wires": [
            [
                "226a1aa87ed3a6bb"
            ]
        ]
    },
    {
        "id": "c82212a4c721a3a6",
        "type": "change",
        "z": "d546a7f2f52bd257",
        "g": "fa9ce3c96d079afe",
        "name": "sell",
        "rules": [
            {
                "t": "set",
                "p": "topic",
                "pt": "msg",
                "to": "sell",
                "tot": "str"
            }
        ],
        "action": "",
        "property": "",
        "from": "",
        "to": "",
        "reg": false,
        "x": 290,
        "y": 220,
        "wires": [
            [
                "afac26496e76721a",
                "6c2a4eefc419f8da"
            ]
        ]
    },
    {
        "id": "aeb1dc194297d3e8",
        "type": "change",
        "z": "d546a7f2f52bd257",
        "g": "fa9ce3c96d079afe",
        "name": "buy",
        "rules": [
            {
                "t": "set",
                "p": "topic",
                "pt": "msg",
                "to": "buy",
                "tot": "str"
            }
        ],
        "action": "",
        "property": "",
        "from": "",
        "to": "",
        "reg": false,
        "x": 290,
        "y": 100,
        "wires": [
            [
                "afac26496e76721a",
                "e6483578d6c9dc1b"
            ]
        ]
    },
    {
        "id": "afac26496e76721a",
        "type": "BooleanLogicUltimate",
        "z": "d546a7f2f52bd257",
        "g": "fa9ce3c96d079afe",
        "name": "idle",
        "payloadPropName": "payload",
        "filtertrue": "both",
        "persist": true,
        "sInitializeWith": "WaitForPayload",
        "triggertopic": "trigger",
        "outputtriggeredby": "all",
        "inputCount": "2",
        "topic": "idle",
        "restrictinputevaluation": false,
        "delayEvaluation": "0",
        "translatorConfig": "",
        "x": 270,
        "y": 160,
        "wires": [
            [],
            [
                "f07a128703b879af"
            ],
            []
        ]
    },
    {
        "id": "6c2a4eefc419f8da",
        "type": "function",
        "z": "d546a7f2f52bd257",
        "g": "fa9ce3c96d079afe",
        "name": "-0.50",
        "func": "if ( msg.payload ) {    // sell == true\n    msg.payload = -0.50;\n    return msg;\n}\n// do nothing",
        "outputs": 1,
        "timeout": 0,
        "noerr": 0,
        "initialize": "",
        "finalize": "",
        "libs": [],
        "x": 430,
        "y": 220,
        "wires": [
            [
                "226a1aa87ed3a6bb"
            ]
        ]
    },
    {
        "id": "f07a128703b879af",
        "type": "function",
        "z": "d546a7f2f52bd257",
        "g": "fa9ce3c96d079afe",
        "name": "+0.00",
        "func": "if ( msg.payload === false ) {    // not buy or sell is idle\n    msg.payload = +0.00;\n    return msg;\n}\n// do nothing",
        "outputs": 1,
        "timeout": 0,
        "noerr": 0,
        "initialize": "",
        "finalize": "",
        "libs": [],
        "x": 430,
        "y": 160,
        "wires": [
            [
                "226a1aa87ed3a6bb"
            ]
        ]
    },
    {
        "id": "226a1aa87ed3a6bb",
        "type": "rbe",
        "z": "d546a7f2f52bd257",
        "g": "fa9ce3c96d079afe",
        "name": "dedup",
        "func": "rbe",
        "gap": "",
        "start": "",
        "inout": "out",
        "septopics": false,
        "property": "payload",
        "topi": "topic",
        "x": 570,
        "y": 100,
        "wires": [
            [
                "569d43abdc1a87b4"
            ]
        ]
    },
    {
        "id": "569d43abdc1a87b4",
        "type": "StatusUltimate",
        "z": "d546a7f2f52bd257",
        "g": "fa9ce3c96d079afe",
        "name": "Status",
        "property": "payload",
        "x": 570,
        "y": 160,
        "wires": [
            [
                "df67ae4c9bc5c1d6"
            ]
        ]
    },
    {
        "id": "81885ad367ee40f4",
        "type": "link in",
        "z": "d546a7f2f52bd257",
        "g": "fa9ce3c96d079afe",
        "name": "link in 17",
        "links": [
            "6cbc91fee59f9673"
        ],
        "x": 195,
        "y": 220,
        "wires": [
            []
        ]
    },
    {
        "id": "6cbc91fee59f9673",
        "type": "link out",
        "z": "d546a7f2f52bd257",
        "name": "link out 18",
        "mode": "link",
        "links": [
            "81885ad367ee40f4"
        ],
        "x": 115,
        "y": 220,
        "wires": []
    },
    {
        "id": "f4491dbf3f9594d8",
        "type": "link in",
        "z": "d546a7f2f52bd257",
        "g": "fa9ce3c96d079afe",
        "name": "link in 14",
        "links": [
            "0ffc7bf372384e6b"
        ],
        "x": 195,
        "y": 100,
        "wires": [
            []
        ]
    },
    {
        "id": "0ffc7bf372384e6b",
        "type": "link out",
        "z": "d546a7f2f52bd257",
        "name": "link out 19",
        "mode": "link",
        "links": [
            "f4491dbf3f9594d8"
        ],
        "x": 115,
        "y": 100,
        "wires": []
    },
    {
        "id": "473363447fe500d3",
        "type": "global-config",
        "env": [],
        "modules": {
            "@victronenergy/node-red-contrib-victron": "1.6.58",
            "node-red-contrib-boolean-logic-ultimate": "1.2.6"
        }
    }
]

Now a couple of days later I can state with certainty that the high precision D-Bus target SoC change is by far the best technical upgrade for DESS to date. Precision is back and with it the system control required to make it worth while to invest time and effort in further developments (at my end).


That said, I have a handful of serious topics and issues, with reasonable solution proposals based on root cause analysis and systems engineering principles. Not all but some potentially matching the Target SoC upgrade impact potential.

Could you please move our/my recent DESS posts from this v3.70 beta topic to a new, general community DESS development topic and join me there to discuss further work, starting with a general proposal/request to review the less-than-optimal ways we as interested community developers cooperate with you developers from Victron, with stated intent to remove friction, speed up quality improvements and generally have a bit more fun in the process as well. I’m sorry to say but the latter was dearly missing sometimes, due to said friction foremost.
Thanks :folded_hands: @dognose

1 Like

Things are changing without proper documentation. Some information can be found with search on this forum, some can be glanced from GitHub commits, the rest you’ll have to reverse engineer by testing and monitoring behaviour. The cooperation model between users and developers is, let’s say, sub-optimal. Especially the lack of proper change logs for VRM-API and the closed source scheduler that provides the forward looking data. The most reliable source of information are community members that already did their ‘homework’. Some of those, me included, have become increasingly demotivated by the lack of transparency that forces us into a permanent reverse engineer role, while still expected to be a happy chappy volunteering test engineering ánd community support group. That said, if anybody is willing to make me a deal, even if only marginally better than the status quo with the developers, I would gladly provide support based on my own research. But only in private, not willing anymore to give away my reverse engineering results and tools for free publicly, often drawing more negative responses than praise, for pointing out bugs and issues discovered, and solutions proposed.

TL;DR I managed to map out the inner workings of DESS and build a toolkit to circumvent it’s shortcomings and add useful high level controls to align it’s (automated) behaviour to a wide range of specific DESS use cases. I’d love to share but not at the price of being forced to defend myself constantly.

2 Likes

I was bummed out by the lack of docs on the node-red components as well. But it seems to be more of a side-project than part of the actual product. I mean, the repo is under a person’s name, not the company: GitHub - dirkjanfaber/victron-vrm-api: Interface with the Victron Energy VRM API .
That said, I think it could use some documentation love. Even if just generated docs (like the VRM API itself seems to have).

For the DESS software, well, if you look at the code on venus OS (a big, complex python script), it seems to me like it all got a bit out of hand :slight_smile:
I tried figuring out why DESS was behaving a certain way, see if I missed some tuning or if I could do a PR or something. But the amount of worms and spaghetti in that box told me to back off :smiley:
I think what we should keep in mind, is that this is a not-so-large company, which doesn’t primarily focus on end-users (support etc). And with that, I’m surprised and very happy to see the amount of support given in this forum by the Victron folks.
Because let’s face it: the people here, the ones hacking and customising, aren’t the people they earn the money with. We’re just a small pool compared to the rest.

On the transparency, I think we should not underestimate the amount of stealing of intellectual property (by other companies). I can imagine that Victron holds back on giving out too much detail. Things get very complicated when you want to disclose internal stuff, with NDAs and all that.

That said, I think changelogs for the API should be there indeed. That’s a ‘public’ service. But also versioning the API and having major releases for breaking things would be very helpful. And I can’t imagine they don’t have this information for their official partners etc.

Sad to read that people respond negatively when you provide insights. That’s so typical for internet fora. It’s very easy to be critical to a screen, as opposed to in person. Any effort done by a person should be met with gratitude I think.

For me what annoyed me most about DESS is that it seems quite unpredictable when it comes to deciding to charge and when to use the grid. The profile programmed in is obviously not the pattern I look after. So now I just charge during the 3 cheapest hours (I have 15kW and charge 5kW per hour). And let my house consume it during the day. Event then DESS still sometimes decides to use the grid when the prices are low. While I would like to instruct it only to do that if the prices are below the ones I just paid for for charging. Maybe I’ll build that some day in node-red.
All this is for the winter obviously. I have 3800Wp solar, so I’ll see in the summer how much of this flow I want to keep enabled.

This exactly is my primary beef with them because a) if something changes/breaks we will find out anyway and b) refusing to alert us of changes forces a massive amount of double work on us to a) constantly monitor the systems behaviour to detect changes were made, b) reverse engineer the rationales, c) test for regressions and then d) adapt to them where needed. a) and b) are completely avoidable but still we are expected to provide feedback on c) while having hardly a say in b) and still required to do d) anyway. I’m simply not buying into this ‘cooperative’ model.

That ship has sailed a long time ago. An interested party with a business model to recoup the reverse engineering effort already have all they need. I think the issue is even worse, almost all proprietary parts of the (DESS) ecosystem have already been copied, cloned or otherwise implemented out of frustration with the half backed flirtation with a mixed open source local control system (VenusOS) boxed in by closed source black box hardware (firmware) and closed source cloud monitoring and DESS scheduling subsystems. It’s just a matter of time for all of those projects to consolidate into a single opensource platform with full backward compatible.

Unless Victron changes course to make it more attractive to stay onboard with them and their ecosystem.