Use Venus OS Node Red to run the battery grid friendly

I have a Multi plus 3000 a small 2kWp DC coupled and a large 12 kWp PVsystem with a 9.6 kW pylon tech battery 48V. I live in Germany and have an electricity contract with a fixed price per kWh, so an ESS system does not make to much sense. With growing renewable energy we face the problem of higher grid load, but the battery of privat PV system are not used grid firiendly. The charge excess already in the morning, when everybody needs power to make coffee or whatever. The battery is charged already at noon, when the excess PV power in summer is overloading the grid.
My constrains were:

  • load as late as possible in the morning
  • make sure the battery is charged in the evening, even when it gets cloudy/raining in the afternoon
  • avoid feeding DC excess into the grid

Watt do the Nodes do:

They ask for the SOC of the battery
They ask once for the daily PV yield forecast (2 options Victron forecast or solforcast)
They ask for the current PV yield of the DC system

from 6:00-9:30 h it is asked, if the SOC is above 25%, so there is some residual load, if the PV yield is not high enough to run my coffee maker. If SOC above 25% it asks, if PV yield forecast is above 22 kWh (10 kWh for the battery and 12 kWh for the typical house use in my case, to be adopted). If both is OK, the charge power is limited to the DC load and AC excess is charged into the grid.
at 9:30 h the charging power to the battery is limited depending on the SOC of the battery. I calculated, that the charging time from every 10% step takes approximately 5 h to charge, so the battery is charged at 14:30 h latest.
at 13:30 h the program ends and the maximum capability of the multi II is used to charge the battery.

I run that during the summer and had all days with not sufficient PV yield covered.

I put the code in here, but as I am not an IT expert, I can not run a GitHub page and can only give limited support.

what you need to change is the “site ID” in the solar forecast node you find it, when you open your VRM Portal and click on the https address in your brother: You see something like VRM Portal - Victron Energy the number you find in your installation instead of the 1xyz45 is your site ID. The rest should work.

There is an alternative forecast, which I used up to know, which is still included in the node. I owe some thank you, for the one, who wrote it, but I do not know, where I got it from. it gives still a forecast, but in this Node you have to insert your location (I changed it to Kassel Germany with a 25° south PV of 10 kWp)

[
    {
        "id": "93f485839dfa27a8",
        "type": "subflow",
        "name": "Solar forecast",
        "info": "This subflow uses the http request node to fetch solar forecasts for geographical positions, using the API from https://forecast.solar/. Please check their website and consider getting a paid account.\n\nDo note that, on a free account, you are limited in the number of requests to do. Also note that the data only gets updated once every 15 minutes, so there is no reason to query more often. There is rate limiting built in the subflow not to perform requests more than once every 15 minutes.\n\n# Configuration\n\nIt uses the parameters as described on: http://doc.forecast.solar/doku.php\n\n - `:apikey` - personal API key for registered users\n - `:lat` - latitude of location, -90 (south) … 90 (north); Internal precission is 0.0001 or abt. 10 m\n - `:lon` - longitude of location, -180 (west) … 180 (east); Internal precission is 0.0001 or abt. 10 m\n - `:dec` - plane declination, 0 (horizontal) … 90 (vertical); Internal precission is integer\n - `:az` - plane azimuth, -180 … 180 (-180 = north, -90 = east, 0 = south, 90 = west, 180 = north); Internal precission is integer\n - `:kwp` - installed modules power in kilo watt peak (kWp)\n\nYou can choose between 3 different type of requests. Note that only `estimate` is available on the free plan.\n\n- `estimate` - this is the forecasted estimate that your panels should produce (given the right parameter settings)\n- `history` - historycal data\n- `clear sky` - estimate given if there would be a clear sky tomorrow\n\nIn case of estimates, one of the following options can be selected:\n- `watts` - Watts (power) average for the period\n- `watthours/period` - Watt hours (energy) for the period\n- `watthours` - Watt hours (energy) summarized over the day\n- `watthours/day` - Watt hours (energy) summarized for each day\n\nFor the graph output there are some extra settings available:\n\n- _Output in kWh_ - when checked output can be set to kWh instead of Wh\n- _Show todays forecast_ - whether or not to include todays forecast\n- _Days to forecast_ - the number of days to forecast (excluding today). Note that you can not get more days forecasted than your API key allows.\n- _Widen graph_ - widen the graph to only show non-zero values\n- _Show day instead of date_ - Show the day instead of the date in the series and labels\n\nThe optional _horizon_ field can be filled out in case an object blocks\nyour solar panels from the sun. See the description [here](https://doc.forecast.solar/horizon)\non what numbers to fill out.\nLeave it empty if you have no objects blocking your panels.\n\n# Input \n\nThe input is for triggering the solar forecast request. \nIt triggers when injecting a message into the node.\n\n# Output\n\nThere are two outputs. The first output is an object with the result and a status message stored into the `msg.payload`.\n\nMost important is the `msg.payload.result`, which contains the estimated production of the panels. E.g.:\n\n```\npayload: object\n  result: object\n    2022-11-28: 23\n    2022-11-29: 35\n```\n\nThe `msg.payload.message` gives information on how successful the query was, the exitcode of the query and the status of the rate limit (how many queries you have left).\n\nThe **second** output can be directly linked to a line or a bar chart, quickly giving a once-glance overview for the predicted forecast.\n\n# Status\n\nInitially the status of the note will be a blue dot, showing \"_Unknown limit_\", as it is unaware of the set ratelmits. After the first request, the returned ratelimit will be put in the text in the form of `remaining/limit`. If more than half the limit is remaining, the dot will be green. If less then half the limit is remaining, the dot will be yellow. If no limit is left, the dot will turn red.\nPlease keep in mind that the ratelimit will be reset after one hour, so you can send a new request after that hour.\n\nIf something is wrong in the API request, the dot will turn red\nand the message will contain the msg.payload with the error. This\nhappens typically when the API is temporally down for maintenance.",
        "category": "",
        "in": [
            {
                "x": 240,
                "y": 100,
                "wires": [
                    {
                        "id": "c8dc6aa14b9f3e92"
                    }
                ]
            }
        ],
        "out": [
            {
                "x": 760,
                "y": 260,
                "wires": [
                    {
                        "id": "2f42837904c91d73",
                        "port": 0
                    },
                    {
                        "id": "fcc8d69a3ab88e6d",
                        "port": 0
                    }
                ]
            },
            {
                "x": 770,
                "y": 340,
                "wires": [
                    {
                        "id": "5b0a430fb61e70e7",
                        "port": 0
                    }
                ]
            }
        ],
        "env": [
            {
                "name": "latitude",
                "type": "num",
                "value": "51.3",
                "ui": {
                    "icon": "font-awesome/fa-location-arrow",
                    "label": {
                        "en-US": "Latitude"
                    },
                    "type": "input",
                    "opts": {
                        "types": [
                            "num"
                        ]
                    }
                }
            },
            {
                "name": "longitude",
                "type": "num",
                "value": "5.6",
                "ui": {
                    "icon": "font-awesome/fa-location-arrow",
                    "label": {
                        "en-US": "Longitude"
                    },
                    "type": "input",
                    "opts": {
                        "types": [
                            "num"
                        ]
                    }
                }
            },
            {
                "name": "declination",
                "type": "num",
                "value": "37",
                "ui": {
                    "icon": "font-awesome/fa-chevron-up",
                    "label": {
                        "en-US": "Declination"
                    },
                    "type": "input",
                    "opts": {
                        "types": [
                            "num"
                        ]
                    }
                }
            },
            {
                "name": "azimuth",
                "type": "num",
                "value": "0",
                "ui": {
                    "icon": "font-awesome/fa-compass",
                    "label": {
                        "en-US": "Azimuth"
                    },
                    "type": "spinner",
                    "opts": {
                        "min": -180,
                        "max": 180
                    }
                }
            },
            {
                "name": "modules power",
                "type": "num",
                "value": "1",
                "ui": {
                    "icon": "font-awesome/fa-power-off",
                    "label": {
                        "en-US": "Modules power (kWp)"
                    },
                    "type": "input",
                    "opts": {
                        "types": [
                            "num"
                        ]
                    }
                }
            },
            {
                "name": "apikey",
                "type": "cred",
                "ui": {
                    "icon": "font-awesome/fa-key",
                    "label": {
                        "en-US": "API key"
                    },
                    "type": "input",
                    "opts": {
                        "types": [
                            "cred"
                        ]
                    }
                }
            },
            {
                "name": "type",
                "type": "str",
                "value": "estimate",
                "ui": {
                    "label": {
                        "en-US": "Type"
                    },
                    "type": "select",
                    "opts": {
                        "opts": [
                            {
                                "l": {
                                    "en-US": "Estimate"
                                },
                                "v": "estimate"
                            },
                            {
                                "l": {
                                    "en-US": "History"
                                },
                                "v": "history"
                            },
                            {
                                "l": {
                                    "en-US": "Clear sky"
                                },
                                "v": "clearsky"
                            }
                        ]
                    }
                }
            },
            {
                "name": "watt",
                "type": "str",
                "value": "watts",
                "ui": {
                    "icon": "font-awesome/fa-question-circle-o",
                    "label": {
                        "en-US": "Watt"
                    },
                    "type": "select",
                    "opts": {
                        "opts": [
                            {
                                "l": {
                                    "en-US": "Watts (power) average for the period"
                                },
                                "v": "watts"
                            },
                            {
                                "l": {
                                    "en-US": "Watt hours (energy) for the period"
                                },
                                "v": "watthours/period"
                            },
                            {
                                "l": {
                                    "en-US": "Watt hours (energy) summarized over the day"
                                },
                                "v": "watthours"
                            },
                            {
                                "l": {
                                    "en-US": "Watt hours (energy) summarized for each day"
                                },
                                "v": "watthours/day"
                            }
                        ]
                    }
                }
            },
            {
                "name": "kwhoutput",
                "type": "bool",
                "value": "false",
                "ui": {
                    "label": {
                        "en-US": "Output in kWh (in the graph)"
                    },
                    "type": "checkbox"
                }
            },
            {
                "name": "showtoday",
                "type": "bool",
                "value": "true",
                "ui": {
                    "label": {
                        "en-US": "Show todays forecast"
                    },
                    "type": "checkbox"
                }
            },
            {
                "name": "daystoforecast",
                "type": "str",
                "value": "-1",
                "ui": {
                    "label": {
                        "en-US": "Days to forecast"
                    },
                    "type": "select",
                    "opts": {
                        "opts": [
                            {
                                "l": {
                                    "en-US": "Max"
                                },
                                "v": "-1"
                            },
                            {
                                "l": {
                                    "en-US": "0"
                                },
                                "v": "0"
                            },
                            {
                                "l": {
                                    "en-US": "1"
                                },
                                "v": "1"
                            },
                            {
                                "l": {
                                    "en-US": "2"
                                },
                                "v": "2"
                            },
                            {
                                "l": {
                                    "en-US": "3"
                                },
                                "v": "3"
                            },
                            {
                                "l": {
                                    "en-US": "4"
                                },
                                "v": "4"
                            },
                            {
                                "l": {
                                    "en-US": "5"
                                },
                                "v": "5"
                            },
                            {
                                "l": {
                                    "en-US": "6"
                                },
                                "v": "6"
                            }
                        ]
                    }
                }
            },
            {
                "name": "widengraph",
                "type": "bool",
                "value": "true",
                "ui": {
                    "label": {
                        "en-US": "Widen graph"
                    },
                    "type": "checkbox"
                }
            },
            {
                "name": "showday",
                "type": "bool",
                "value": "false",
                "ui": {
                    "label": {
                        "en-US": "Show day instead of date"
                    },
                    "type": "checkbox"
                }
            },
            {
                "name": "horizon",
                "type": "str",
                "value": "",
                "ui": {
                    "icon": "font-awesome/fa-tree",
                    "label": {
                        "en-US": "(optional) horizon"
                    },
                    "type": "input",
                    "opts": {
                        "types": [
                            "str"
                        ]
                    }
                }
            }
        ],
        "meta": {
            "module": "Solar Forecast",
            "version": "0.0.14",
            "author": "dfaber@victronenergy.com",
            "desc": "Get solar forecasting per location",
            "keywords": "solar,forecast,api",
            "license": "GPL-3.0"
        },
        "color": "#FFCC66",
        "inputLabels": [
            "trigger"
        ],
        "outputLabels": [
            "output",
            "graph",
            ""
        ],
        "icon": "font-awesome/fa-sun-o",
        "status": {
            "x": 680,
            "y": 560,
            "wires": [
                {
                    "id": "1bfc1cde3ee94e4b",
                    "port": 0
                },
                {
                    "id": "a798fbe66cf133d5",
                    "port": 0
                }
            ]
        }
    },
    {
        "id": "c706820c0d61f023",
        "type": "http request",
        "z": "93f485839dfa27a8",
        "name": "",
        "method": "GET",
        "ret": "txt",
        "paytoqs": "ignore",
        "url": "",
        "tls": "",
        "persist": false,
        "proxy": "",
        "insecureHTTPParser": false,
        "authType": "",
        "senderr": false,
        "headers": [],
        "x": 390,
        "y": 180,
        "wires": [
            [
                "1b5ccaa05d54f7c3"
            ]
        ]
    },
    {
        "id": "b9488734852cd0ca",
        "type": "function",
        "z": "93f485839dfa27a8",
        "name": "create forecast.solar url",
        "func": "msg.url = 'https://api.forecast.solar/';\n\n//if (env.get('apikey')) {\n//    msg.url += env.get('apikey') + '/';\n //   }\n\nmsg.url += env.get('type') + '/';\n\nmsg.url += env.get('watt') + '/';\n\nmsg.url += env.get('latitude') + '/' +\n           env.get('longitude') + '/' +\n           env.get('declination') + '/' +\n           env.get('azimuth') + '/' +\n           env.get('modules power');\n\nif (env.get('horizon')) {\n    msg.url += '?horizon=' + env.get('horizon')\n}\nmsg.topic = 'solar forecast: '+(env.get('type') || '');\nmsg.topic += (' '+env.get('watt') || '');\nif (env.get('kwhoutput')) {\n    msg.topic += ' (kWh)';\n}\n\nreturn msg;",
        "outputs": 1,
        "timeout": "",
        "noerr": 0,
        "initialize": "",
        "finalize": "",
        "libs": [],
        "x": 630,
        "y": 100,
        "wires": [
            [
                "975daf96f15cfb61"
            ]
        ]
    },
    {
        "id": "1b5ccaa05d54f7c3",
        "type": "json",
        "z": "93f485839dfa27a8",
        "name": "Convert to json",
        "property": "payload",
        "action": "",
        "pretty": false,
        "x": 680,
        "y": 180,
        "wires": [
            [
                "e718a22973cc2864"
            ]
        ]
    },
    {
        "id": "559391d1288f762a",
        "type": "function",
        "z": "93f485839dfa27a8",
        "name": "update ratelimit",
        "func": "var remaining = msg.payload.message.ratelimit.remaining || 0;\nvar limit = msg.payload.message.ratelimit.limit;\n\nflow.set('forecast.solar.ratelimit.remaining', remaining)\nflow.set('forecast.solar.ratelimit.limit', limit)\n\nreturn msg;",
        "outputs": 1,
        "noerr": 0,
        "initialize": "",
        "finalize": "",
        "libs": [],
        "x": 520,
        "y": 480,
        "wires": [
            [
                "e56826252134b93a"
            ]
        ]
    },
    {
        "id": "e718a22973cc2864",
        "type": "link out",
        "z": "93f485839dfa27a8",
        "name": "link out 1",
        "mode": "link",
        "links": [
            "3fa24f2d08195961",
            "0a20e852662c8cec"
        ],
        "x": 815,
        "y": 180,
        "wires": []
    },
    {
        "id": "3fa24f2d08195961",
        "type": "link in",
        "z": "93f485839dfa27a8",
        "name": "link in 1",
        "links": [
            "e718a22973cc2864"
        ],
        "x": 385,
        "y": 480,
        "wires": [
            [
                "559391d1288f762a"
            ]
        ]
    },
    {
        "id": "0a20e852662c8cec",
        "type": "link in",
        "z": "93f485839dfa27a8",
        "name": "link in 2",
        "links": [
            "e718a22973cc2864"
        ],
        "x": 225,
        "y": 260,
        "wires": [
            [
                "fcc8d69a3ab88e6d"
            ]
        ]
    },
    {
        "id": "4734b6f403e1f03e",
        "type": "inject",
        "z": "93f485839dfa27a8",
        "name": "",
        "props": [
            {
                "p": "payload"
            },
            {
                "p": "topic",
                "vt": "str"
            }
        ],
        "repeat": "",
        "crontab": "",
        "once": true,
        "onceDelay": 0.1,
        "topic": "",
        "payload": "",
        "payloadType": "date",
        "x": 530,
        "y": 440,
        "wires": [
            [
                "e56826252134b93a"
            ]
        ]
    },
    {
        "id": "1bfc1cde3ee94e4b",
        "type": "function",
        "z": "93f485839dfa27a8",
        "name": "update status",
        "func": "var remaining = flow.get('forecast.solar.ratelimit.remaining') || -1;\nvar limit = flow.get('forecast.solar.ratelimit.limit') || -1\n\nvar text = remaining.toString() + '/' + limit.toString();\nvar fill = \"green\";\n\nif (remaining == 0) {\n    fill = \"red\";\n    text = \"Limit used\";\n}\n\nif (remaining > 0 && remaining < limit / 2) {\n    fill = \"yellow\"\n}\n\nif (remaining == -1 ) {\n    fill = \"blue\"\n    text = \"Limits unknown\"\n}\n\nmsg.payload = ({ fill: fill, text: text });\n\nreturn msg;",
        "outputs": 1,
        "noerr": 0,
        "initialize": "",
        "finalize": "",
        "libs": [],
        "x": 520,
        "y": 580,
        "wires": [
            []
        ]
    },
    {
        "id": "a18e96179ec2d987",
        "type": "function",
        "z": "93f485839dfa27a8",
        "name": "Create graph output",
        "func": "var m = {};\nm.labels = [];\nm.data = [];\nm.series = [];\n\nfor (let j = 0; j <= msg.days; j++) {\n    m.data[j] = [];\n}\n\nif (msg.watt === 'watt_hours_day' || msg.watt === 'watthours/day') {\n    var i = 0;\n    if (msg.kwhoutput) {\n        m.series.push(\"kWh per day\");\n    } else {\n        m.series.push(\"Watt hours per day\");\n    }\n    for (const key in msg.payload.result) {\n        m.labels.push(key);\n        if (msg.kwhoutput) {\n            m.data[i] = +(Math.round(msg.payload.result[key]/100)*.1).toFixed(1);\n        } else {\n            m.data[i] = msg.payload.result[key];\n        }\n        i++;\n    }\n    m.data = [m.data];\n    return { payload: [m] };\n}\n\nfor (let i = 0; i <= 23; i++) {\n\n    m.labels.push(i.toString()+':00');\n    if (msg.resolution === 4) {\n       m.labels.push(i.toString()+':15');\n    }\n    if (msg.resolution === 2 || msg.resolution == 4) {\n       m.labels.push(i.toString()+':30');\n    }\n    if (msg.resolution === 4) {\n       m.labels.push(i.toString()+':45');\n    }\n\n    for (let j = 0; j <= msg.days; j++) {\n        m.data[j].push(0);\n        if (msg.resolution === 4) {\n           m.data[j].push(0)\n        }\n        if (msg.resolution === 2 || msg.resolution == 4) {\n           m.data[j].push(0)\n        }\n        if (msg.resolution === 4) {\n           m.data[j].push(0)\n        }\n\n    }\n}\n\nvar offset = 0;\nfor (const key in msg.payload.result) {\n    var d = new Date(key)\n    if (m.series.indexOf(d.toISOString().split('T')[0]) === -1) {\n        m.series.push(d.toISOString().split('T')[0])\n    }\n\n    var h = d.getHours();\n    var minutes = d.getMinutes();\n\n    if (minutes === 0 ) {\n        offset = 0;\n    } else {\n        offset++;\n    }\n\n    if (msg.kwhoutput) {\n        m.data[m.series.length - 1][h*msg.resolution+offset] = +(Math.round(msg.payload.result[key]/100)*.1).toFixed(1);\n    } else {\n        m.data[m.series.length - 1][h*msg.resolution+offset] = msg.payload.result[key];\n    }\n}\n\nif (msg.watt === 'watt_hours') {\n    for (const i in m.data) {\n        let x = m.data[i][0]\n        for (const d in m.data[i]) {\n            if ( x > m.data[i][d]) {\n                m.data[i][d] = x \n            }\n            x = m.data[i][d]\n        }\n    }\n}\n\nreturn { payload: [m] };\n",
        "outputs": 1,
        "timeout": "",
        "noerr": 0,
        "initialize": "",
        "finalize": "",
        "libs": [],
        "x": 360,
        "y": 340,
        "wires": [
            [
                "5b0a430fb61e70e7"
            ]
        ]
    },
    {
        "id": "975daf96f15cfb61",
        "type": "link out",
        "z": "93f485839dfa27a8",
        "name": "link out 7",
        "mode": "link",
        "links": [
            "14f2e68e572f4ef8"
        ],
        "x": 805,
        "y": 100,
        "wires": []
    },
    {
        "id": "14f2e68e572f4ef8",
        "type": "link in",
        "z": "93f485839dfa27a8",
        "name": "link in 18",
        "links": [
            "975daf96f15cfb61"
        ],
        "x": 245,
        "y": 180,
        "wires": [
            [
                "c706820c0d61f023"
            ]
        ]
    },
    {
        "id": "c4307905e114824f",
        "type": "catch",
        "z": "93f485839dfa27a8",
        "name": "",
        "scope": null,
        "uncaught": false,
        "x": 260,
        "y": 440,
        "wires": [
            [
                "f427f19392c399ce"
            ]
        ]
    },
    {
        "id": "e56826252134b93a",
        "type": "link out",
        "z": "93f485839dfa27a8",
        "name": "link out 8",
        "mode": "link",
        "links": [
            "dbaf8f5f5a920686"
        ],
        "x": 685,
        "y": 480,
        "wires": []
    },
    {
        "id": "dbaf8f5f5a920686",
        "type": "link in",
        "z": "93f485839dfa27a8",
        "name": "link in 19",
        "links": [
            "e56826252134b93a"
        ],
        "x": 385,
        "y": 580,
        "wires": [
            [
                "1bfc1cde3ee94e4b"
            ]
        ]
    },
    {
        "id": "f427f19392c399ce",
        "type": "link out",
        "z": "93f485839dfa27a8",
        "name": "link out 9",
        "mode": "link",
        "links": [
            "2ded0c14a222b4d9",
            "2f42837904c91d73"
        ],
        "x": 375,
        "y": 440,
        "wires": []
    },
    {
        "id": "2ded0c14a222b4d9",
        "type": "link in",
        "z": "93f485839dfa27a8",
        "name": "link in 20",
        "links": [
            "f427f19392c399ce"
        ],
        "x": 385,
        "y": 540,
        "wires": [
            [
                "a798fbe66cf133d5"
            ]
        ]
    },
    {
        "id": "a798fbe66cf133d5",
        "type": "function",
        "z": "93f485839dfa27a8",
        "name": "Set error status",
        "func": "node.warn(msg.payload)\nmsg.payload = ({ fill: \"red\", text: msg.payload });\n\nreturn msg;",
        "outputs": 1,
        "noerr": 0,
        "initialize": "",
        "finalize": "",
        "libs": [],
        "x": 520,
        "y": 540,
        "wires": [
            []
        ]
    },
    {
        "id": "2f42837904c91d73",
        "type": "link in",
        "z": "93f485839dfa27a8",
        "name": "link in 21",
        "links": [
            "f427f19392c399ce"
        ],
        "x": 665,
        "y": 280,
        "wires": [
            []
        ]
    },
    {
        "id": "fcc8d69a3ab88e6d",
        "type": "function",
        "z": "93f485839dfa27a8",
        "name": "Processed info",
        "func": "msg.resolution = 60;\nmsg.days = 1;\nmsg.type = env.get('type');\nmsg.watt = env.get('watt');\nmsg.kwhoutput = env.get('kwhoutput');\n\nvar key1 = Object.keys(msg.payload.result)[1];\nvar key2 = Object.keys(msg.payload.result)[2];\nvar key3 = Object.keys(msg.payload.result)[Object.keys(msg.payload.result).length-1];\n\nvar d1 = new Date(key1);\nvar d2 = new Date(key2); \nvar d3 = new Date(key3);\nmsg.resolution = 3600000 / (d2.getTime() - d1.getTime());\n\nmsg.days = Math.floor((d3.getTime() - d1.getTime()) / (1000 * 3600 * 24));\n\nif (msg.watt === 'watt_hours_day' || msg.watt === 'watthours/day') {\n    msg.resolution = null;\n}\n\nreturn msg;",
        "outputs": 1,
        "timeout": "",
        "noerr": 0,
        "initialize": "",
        "finalize": "",
        "libs": [],
        "x": 360,
        "y": 260,
        "wires": [
            [
                "a18e96179ec2d987"
            ]
        ],
        "info": "Function to process the result from forecast.solar to add\nextra information, which is handy for either graphing or\nto store in a database.\n\n\nThe extra values added:\n- `msg.resolution` - The number of measurements per hour. If\nno API key is used, this will be 1. Other values may be 2 or 4.\n- `msg.days` - The number of days in the forcast. If no API\n- key is used this will be 1. Other values may be 3 or 6."
    },
    {
        "id": "5b0a430fb61e70e7",
        "type": "function",
        "z": "93f485839dfa27a8",
        "name": "Filter graph",
        "func": "\nif (env.get('showday')) {\n    const weekday = [\"Sunday\", \"Monday\", \"Tuesday\", \"Wednesday\", \"Thursday\", \"Friday\", \"Saturday\"];\n    msg.payload[0].labels.forEach(function (/** @type {string | number | Date} */ date, /** @type {string | number} */ index, /** @type {{ [x: string]: string; }} */ array) {\n        const d = new Date(date)\n        if (!isNaN(d)) {\n            array[index] = weekday[d.getDay()]\n        }\n    })\n    msg.payload[0].series.forEach(function (/** @type {string | number | Date} */ date, /** @type {string | number} */ index, /** @type {{ [x: string]: string; }} */ array) {\n        const d = new Date(date)\n        if (!isNaN(d)) {\n            array[index] = weekday[d.getDay()]\n        }\n    })\n}\n\nif (env.get('watt') === 'watt_hours_day' || env.get('watt') === 'watthours/day') {\n    if (!env.get('showtoday')) {\n        msg.payload[0].data[0].shift();\n        msg.payload[0].labels.shift();\n    }\n    return msg;\n}\n\nif (!env.get('showtoday')) {\n    msg.payload[0].data.shift();\n    msg.payload[0].series.shift();\n}\n\nvar forecasted = msg.payload[0].series.length;\n\nif ((Number(env.get('daystoforecast')) > -1) && (Number(env.get('daystoforecast')) < forecasted)) {\n    for (let i = 1; i <= (forecasted - Number(env.get('daystoforecast'))); i++ ) {\n        msg.payload[0].data.pop();\n        msg.payload[0].series.pop();\n    }\n}\n\nif (env.get('widengraph')) {\n    var c = msg.payload[0].labels.length;\n    var x = 0;\n    for (let i = 0; i < c; i++) {\n        var remove = true;\n        for (let d = 0; d < msg.payload[0].data.length; d++) {\n            if (msg.payload[0].data[d][x] > 0) {\n                remove = false;\n            }\n        }\n        if (remove) {\n            msg.payload[0].labels.splice(x, 1);\n            for (let d = 0; d < msg.payload[0].data.length; d++) {\n                 msg.payload[0].data[d].splice(x, 1);\n            }\n            x--;\n        }\n        x++;\n    }\n    // Still the first and last datapoints should be zero, so\n    // add those again\n    msg.payload[0].labels.unshift('');\n    msg.payload[0].labels.push('');\n    for (let d = 0; d < msg.payload[0].data.length; d++) {\n         msg.payload[0].data[d].unshift(0);\n         msg.payload[0].data[d].push(0);\n    }   \n}\n\nreturn msg;",
        "outputs": 1,
        "timeout": "",
        "noerr": 0,
        "initialize": "",
        "finalize": "",
        "libs": [],
        "x": 590,
        "y": 340,
        "wires": [
            []
        ]
    },
    {
        "id": "c8dc6aa14b9f3e92",
        "type": "delay",
        "z": "93f485839dfa27a8",
        "name": "1 msg/15 minutes",
        "pauseType": "rate",
        "timeout": "5",
        "timeoutUnits": "seconds",
        "rate": "1",
        "nbRateUnits": "15",
        "rateUnits": "minute",
        "randomFirst": "1",
        "randomLast": "5",
        "randomUnits": "seconds",
        "drop": false,
        "allowrate": false,
        "outputs": 1,
        "x": 390,
        "y": 100,
        "wires": [
            [
                "b9488734852cd0ca"
            ]
        ]
    },
    {
        "id": "4f3f584b76922fbd",
        "type": "inject",
        "z": "4facfd665af09b5c",
        "name": "6 bis 10 Uhr",
        "props": [
            {
                "p": "payload"
            },
            {
                "p": "topic",
                "vt": "str"
            }
        ],
        "repeat": "",
        "crontab": "*/1 6-8 * * *",
        "once": false,
        "onceDelay": 0.1,
        "topic": "",
        "payload": "",
        "payloadType": "date",
        "x": 250,
        "y": 220,
        "wires": [
            [
                "6a2fed301b2596c0"
            ]
        ]
    },
    {
        "id": "1fa7197d2e9f35b9",
        "type": "inject",
        "z": "4facfd665af09b5c",
        "name": "",
        "props": [
            {
                "p": "payload"
            },
            {
                "p": "topic",
                "vt": "str"
            }
        ],
        "repeat": "",
        "crontab": "30 13 * * *",
        "once": false,
        "onceDelay": 0.1,
        "topic": "",
        "payload": "50",
        "payloadType": "num",
        "x": 230,
        "y": 380,
        "wires": [
            [
                "7175dcf7eb049e02",
                "73b4c25080650ffa"
            ]
        ]
    },
    {
        "id": "5587286aa4f55e27",
        "type": "debug",
        "z": "4facfd665af09b5c",
        "name": "Forecast +time stamp",
        "active": true,
        "tosidebar": true,
        "console": false,
        "tostatus": true,
        "complete": "payload",
        "targetType": "msg",
        "statusVal": "payload",
        "statusType": "auto",
        "x": 900,
        "y": 500,
        "wires": []
    },
    {
        "id": "9b274fd00ce86099",
        "type": "inject",
        "z": "4facfd665af09b5c",
        "name": "",
        "props": [
            {
                "p": "payload"
            },
            {
                "p": "topic",
                "vt": "str"
            }
        ],
        "repeat": "",
        "crontab": "00 17 * * *",
        "once": false,
        "onceDelay": 0.1,
        "topic": "",
        "payload": "",
        "payloadType": "date",
        "x": 250,
        "y": 520,
        "wires": [
            [
                "ab55402b3761d00b"
            ]
        ]
    },
    {
        "id": "296012c7a497194f",
        "type": "change",
        "z": "4facfd665af09b5c",
        "name": "Store forecast",
        "rules": [
            {
                "t": "set",
                "p": "forecast",
                "pt": "flow",
                "to": "payload",
                "tot": "msg"
            }
        ],
        "action": "",
        "property": "",
        "from": "",
        "to": "",
        "reg": false,
        "x": 720,
        "y": 580,
        "wires": [
            [
                "f67e2ea5cf93b877"
            ]
        ]
    },
    {
        "id": "f67e2ea5cf93b877",
        "type": "debug",
        "z": "4facfd665af09b5c",
        "name": "forecast storde",
        "active": true,
        "tosidebar": false,
        "console": false,
        "tostatus": true,
        "complete": "payload",
        "targetType": "msg",
        "statusVal": "payload",
        "statusType": "auto",
        "x": 920,
        "y": 580,
        "wires": []
    },
    {
        "id": "b66066e0d1a4f825",
        "type": "victron-input-battery",
        "z": "4facfd665af09b5c",
        "service": "com.victronenergy.battery/512",
        "path": "/Soc",
        "serviceObj": {
            "service": "com.victronenergy.battery/512",
            "name": "Pylontech battery"
        },
        "pathObj": {
            "path": "/Soc",
            "type": "float",
            "name": "State of charge (%)"
        },
        "name": "",
        "onlyChanges": false,
        "roundValues": "1",
        "x": 310,
        "y": 100,
        "wires": [
            [
                "a5f281eeacc305cd"
            ]
        ]
    },
    {
        "id": "528307f576da9fb4",
        "type": "switch",
        "z": "4facfd665af09b5c",
        "name": "Batterie über 25%? ",
        "property": "SOC",
        "propertyType": "flow",
        "rules": [
            {
                "t": "gt",
                "v": "25",
                "vt": "num"
            },
            {
                "t": "else"
            }
        ],
        "checkall": "true",
        "repair": false,
        "outputs": 2,
        "x": 670,
        "y": 220,
        "wires": [
            [
                "f68fde5ba7de8563"
            ],
            [
                "11b587b897f75e8e"
            ]
        ]
    },
    {
        "id": "6ea5113acf386767",
        "type": "debug",
        "z": "4facfd665af09b5c",
        "name": "SOC",
        "active": false,
        "tosidebar": false,
        "console": false,
        "tostatus": true,
        "complete": "payload",
        "targetType": "msg",
        "statusVal": "payload",
        "statusType": "auto",
        "x": 910,
        "y": 100,
        "wires": []
    },
    {
        "id": "a5f281eeacc305cd",
        "type": "change",
        "z": "4facfd665af09b5c",
        "name": "Store SOC",
        "rules": [
            {
                "t": "set",
                "p": "SOC",
                "pt": "flow",
                "to": "payload",
                "tot": "msg"
            }
        ],
        "action": "",
        "property": "",
        "from": "",
        "to": "",
        "reg": false,
        "x": 570,
        "y": 100,
        "wires": [
            [
                "6ea5113acf386767"
            ]
        ]
    },
    {
        "id": "c7023aa0c5da170c",
        "type": "function",
        "z": "4facfd665af09b5c",
        "name": "Extract  Forecast",
        "func": "var key1 = Object.keys(msg.payload.result)[1];\n\n\n\nvar outputValue = -99;\n\n outputValue = msg.payload.result[key1];\n\nmsg.payload = outputValue;\n\nreturn msg;",
        "outputs": 1,
        "timeout": "",
        "noerr": 0,
        "initialize": "",
        "finalize": "",
        "libs": [],
        "x": 500,
        "y": 640,
        "wires": [
            [
                "227921d53d22acaa"
            ]
        ]
    },
    {
        "id": "227921d53d22acaa",
        "type": "debug",
        "z": "4facfd665af09b5c",
        "name": "forecast direct",
        "active": true,
        "tosidebar": true,
        "console": false,
        "tostatus": true,
        "complete": "payload",
        "targetType": "msg",
        "statusVal": "payload",
        "statusType": "auto",
        "x": 920,
        "y": 640,
        "wires": []
    },
    {
        "id": "f68fde5ba7de8563",
        "type": "switch",
        "z": "4facfd665af09b5c",
        "name": "genug PV?",
        "property": "forecast",
        "propertyType": "flow",
        "rules": [
            {
                "t": "gt",
                "v": "21000",
                "vt": "num"
            },
            {
                "t": "else"
            }
        ],
        "checkall": "true",
        "repair": false,
        "outputs": 2,
        "x": 890,
        "y": 220,
        "wires": [
            [
                "94425ca6cc01d6a3",
                "f87ff9d6ba4663b9"
            ],
            []
        ]
    },
    {
        "id": "94425ca6cc01d6a3",
        "type": "victron-output-ess",
        "z": "4facfd665af09b5c",
        "service": "com.victronenergy.settings",
        "path": "/Settings/SystemSetup/MaxChargeCurrent",
        "serviceObj": {
            "service": "com.victronenergy.settings",
            "name": "Venus settings"
        },
        "pathObj": {
            "path": "/Settings/SystemSetup/MaxChargeCurrent",
            "type": "float",
            "name": "Charge current limit (A)",
            "writable": true
        },
        "initial": "",
        "name": "",
        "onlyChanges": false,
        "x": 1240,
        "y": 220,
        "wires": []
    },
    {
        "id": "7175dcf7eb049e02",
        "type": "victron-output-ess",
        "z": "4facfd665af09b5c",
        "service": "com.victronenergy.settings",
        "path": "/Settings/SystemSetup/MaxChargeCurrent",
        "serviceObj": {
            "service": "com.victronenergy.settings",
            "name": "Venus settings"
        },
        "pathObj": {
            "path": "/Settings/SystemSetup/MaxChargeCurrent",
            "type": "float",
            "name": "Charge current limit (A)",
            "writable": true
        },
        "initial": "",
        "name": "",
        "onlyChanges": false,
        "x": 700,
        "y": 380,
        "wires": []
    },
    {
        "id": "f87ff9d6ba4663b9",
        "type": "debug",
        "z": "4facfd665af09b5c",
        "name": "debug 56",
        "active": true,
        "tosidebar": false,
        "console": false,
        "tostatus": true,
        "complete": "payload",
        "targetType": "msg",
        "statusVal": "payload",
        "statusType": "auto",
        "x": 1140,
        "y": 160,
        "wires": []
    },
    {
        "id": "73b4c25080650ffa",
        "type": "debug",
        "z": "4facfd665af09b5c",
        "name": "debug 57",
        "active": true,
        "tosidebar": false,
        "console": false,
        "tostatus": true,
        "complete": "payload",
        "targetType": "msg",
        "statusVal": "payload",
        "statusType": "auto",
        "x": 700,
        "y": 460,
        "wires": []
    },
    {
        "id": "5a2cda4de03ba0a4",
        "type": "change",
        "z": "4facfd665af09b5c",
        "name": "Rechnung DC Ladung",
        "rules": [
            {
                "t": "set",
                "p": "payload",
                "pt": "msg",
                "to": "msg.payload / 50 + 0.5",
                "tot": "jsonata"
            }
        ],
        "action": "",
        "property": "",
        "from": "",
        "to": "",
        "reg": false,
        "x": 680,
        "y": 900,
        "wires": [
            [
                "013d28f303ca30d3"
            ]
        ]
    },
    {
        "id": "1ef8fee117f1522f",
        "type": "victron-input-solarcharger",
        "z": "4facfd665af09b5c",
        "service": "com.victronenergy.solarcharger/288",
        "path": "/Yield/Power",
        "serviceObj": {
            "service": "com.victronenergy.solarcharger/288",
            "name": "SmartSolar Charger MPPT 150/45 rev3"
        },
        "pathObj": {
            "path": "/Yield/Power",
            "type": "float",
            "name": "PV Power (W)"
        },
        "name": "Victron PV Leistung",
        "onlyChanges": true,
        "x": 250,
        "y": 900,
        "wires": [
            [
                "5a2cda4de03ba0a4",
                "a85b31a1fbcfd214",
                "166aaa7952b940f8"
            ]
        ]
    },
    {
        "id": "013d28f303ca30d3",
        "type": "change",
        "z": "4facfd665af09b5c",
        "name": "",
        "rules": [
            {
                "t": "set",
                "p": "pvLeistungVictron",
                "pt": "flow",
                "to": "payload",
                "tot": "msg"
            }
        ],
        "action": "",
        "property": "",
        "from": "",
        "to": "",
        "reg": false,
        "x": 940,
        "y": 900,
        "wires": [
            [
                "fbf85e188bd4e300"
            ]
        ]
    },
    {
        "id": "fbf85e188bd4e300",
        "type": "debug",
        "z": "4facfd665af09b5c",
        "name": "debug 58",
        "active": false,
        "tosidebar": false,
        "console": false,
        "tostatus": true,
        "complete": "payload",
        "targetType": "msg",
        "statusVal": "payload",
        "statusType": "auto",
        "x": 1200,
        "y": 900,
        "wires": []
    },
    {
        "id": "6a2fed301b2596c0",
        "type": "change",
        "z": "4facfd665af09b5c",
        "name": "",
        "rules": [
            {
                "t": "set",
                "p": "payload",
                "pt": "msg",
                "to": "pvLeistungVictron",
                "tot": "flow"
            }
        ],
        "action": "",
        "property": "",
        "from": "",
        "to": "",
        "reg": false,
        "x": 450,
        "y": 220,
        "wires": [
            [
                "528307f576da9fb4"
            ]
        ]
    },
    {
        "id": "ab55402b3761d00b",
        "type": "subflow:93f485839dfa27a8",
        "z": "4facfd665af09b5c",
        "name": "",
        "env": [
            {
                "name": "latitude",
                "value": "51.1873",
                "type": "num"
            },
            {
                "name": "longitude",
                "value": "9.2954",
                "type": "num"
            },
            {
                "name": "declination",
                "value": "25",
                "type": "num"
            },
            {
                "name": "azimuth",
                "value": "0",
                "type": "num"
            },
            {
                "name": "modules power",
                "value": "10",
                "type": "num"
            },
            {
                "name": "apikey",
                "type": "cred"
            },
            {
                "name": "watt",
                "value": "watthours/day",
                "type": "str"
            },
            {
                "name": "kwhoutput",
                "type": "bool",
                "value": "true"
            },
            {
                "name": "showtoday",
                "type": "bool",
                "value": "false"
            },
            {
                "name": "daystoforecast",
                "value": "1",
                "type": "str"
            }
        ],
        "x": 440,
        "y": 520,
        "wires": [
            [
                "c7023aa0c5da170c",
                "5587286aa4f55e27"
            ],
            []
        ]
    },
    {
        "id": "a85b31a1fbcfd214",
        "type": "switch",
        "z": "4facfd665af09b5c",
        "name": "Batterie unter 20%",
        "property": "SOC",
        "propertyType": "flow",
        "rules": [
            {
                "t": "lte",
                "v": "20",
                "vt": "num"
            },
            {
                "t": "else"
            }
        ],
        "checkall": "true",
        "repair": false,
        "outputs": 2,
        "x": 470,
        "y": 960,
        "wires": [
            [
                "640bad93103f0ad6"
            ],
            [
                "508b4e4b5af791d7"
            ]
        ]
    },
    {
        "id": "640bad93103f0ad6",
        "type": "change",
        "z": "4facfd665af09b5c",
        "name": "Rechnung Multi Ladung max",
        "rules": [
            {
                "t": "set",
                "p": "payload",
                "pt": "msg",
                "to": "msg.payload / 50 + 50",
                "tot": "jsonata"
            }
        ],
        "action": "",
        "property": "",
        "from": "",
        "to": "",
        "reg": false,
        "x": 840,
        "y": 960,
        "wires": [
            [
                "e389df69d34a81a2"
            ]
        ]
    },
    {
        "id": "508b4e4b5af791d7",
        "type": "switch",
        "z": "4facfd665af09b5c",
        "name": "Batterie zwischen 20 und 30%",
        "property": "SOC",
        "propertyType": "flow",
        "rules": [
            {
                "t": "lte",
                "v": "30",
                "vt": "num"
            },
            {
                "t": "else"
            }
        ],
        "checkall": "true",
        "repair": false,
        "outputs": 2,
        "x": 510,
        "y": 1020,
        "wires": [
            [
                "72574e23a6d45498"
            ],
            [
                "d1735a0904551708"
            ]
        ]
    },
    {
        "id": "72574e23a6d45498",
        "type": "change",
        "z": "4facfd665af09b5c",
        "name": "Rechnung Multi Ladung 1.4 kW",
        "rules": [
            {
                "t": "set",
                "p": "payload",
                "pt": "msg",
                "to": "msg.payload / 50 + 28",
                "tot": "jsonata"
            }
        ],
        "action": "",
        "property": "",
        "from": "",
        "to": "",
        "reg": false,
        "x": 850,
        "y": 1020,
        "wires": [
            [
                "e389df69d34a81a2"
            ]
        ]
    },
    {
        "id": "d1735a0904551708",
        "type": "switch",
        "z": "4facfd665af09b5c",
        "name": "Batterie zwischen 30 und 40%",
        "property": "SOC",
        "propertyType": "flow",
        "rules": [
            {
                "t": "lte",
                "v": "40",
                "vt": "num"
            },
            {
                "t": "else"
            }
        ],
        "checkall": "true",
        "repair": false,
        "outputs": 2,
        "x": 510,
        "y": 1080,
        "wires": [
            [
                "bc4a0d4c4b630d27"
            ],
            [
                "b0bb5f342793b1cf"
            ]
        ]
    },
    {
        "id": "bc4a0d4c4b630d27",
        "type": "change",
        "z": "4facfd665af09b5c",
        "name": "Rechnung Multi Ladung 1.2 kW",
        "rules": [
            {
                "t": "set",
                "p": "payload",
                "pt": "msg",
                "to": "msg.payload / 50 + 24",
                "tot": "jsonata"
            }
        ],
        "action": "",
        "property": "",
        "from": "",
        "to": "",
        "reg": false,
        "x": 850,
        "y": 1080,
        "wires": [
            [
                "e389df69d34a81a2"
            ]
        ]
    },
    {
        "id": "b0bb5f342793b1cf",
        "type": "switch",
        "z": "4facfd665af09b5c",
        "name": "Batterie zwischen 40 und 50%",
        "property": "SOC",
        "propertyType": "flow",
        "rules": [
            {
                "t": "lte",
                "v": "50",
                "vt": "num"
            },
            {
                "t": "else"
            }
        ],
        "checkall": "true",
        "repair": false,
        "outputs": 2,
        "x": 510,
        "y": 1140,
        "wires": [
            [
                "240354b586f5db6e"
            ],
            [
                "aacf4c4d9b340ddf"
            ]
        ]
    },
    {
        "id": "240354b586f5db6e",
        "type": "change",
        "z": "4facfd665af09b5c",
        "name": "Rechnung Multi Ladung 1.0 kW",
        "rules": [
            {
                "t": "set",
                "p": "payload",
                "pt": "msg",
                "to": "msg.payload / 50 + 20",
                "tot": "jsonata"
            }
        ],
        "action": "",
        "property": "",
        "from": "",
        "to": "",
        "reg": false,
        "x": 850,
        "y": 1140,
        "wires": [
            [
                "e389df69d34a81a2"
            ]
        ]
    },
    {
        "id": "aacf4c4d9b340ddf",
        "type": "switch",
        "z": "4facfd665af09b5c",
        "name": "Batterie zwischen 50 und 60%",
        "property": "SOC",
        "propertyType": "flow",
        "rules": [
            {
                "t": "lte",
                "v": "60",
                "vt": "num"
            },
            {
                "t": "else"
            }
        ],
        "checkall": "true",
        "repair": false,
        "outputs": 2,
        "x": 510,
        "y": 1200,
        "wires": [
            [
                "6f7317ca4876ad73"
            ],
            [
                "cf7760bca9b5f034"
            ]
        ]
    },
    {
        "id": "6f7317ca4876ad73",
        "type": "change",
        "z": "4facfd665af09b5c",
        "name": "Rechnung Multi Ladung 0.8 kW",
        "rules": [
            {
                "t": "set",
                "p": "payload",
                "pt": "msg",
                "to": "msg.payload / 50 + 16",
                "tot": "jsonata"
            }
        ],
        "action": "",
        "property": "",
        "from": "",
        "to": "",
        "reg": false,
        "x": 850,
        "y": 1200,
        "wires": [
            [
                "e389df69d34a81a2"
            ]
        ]
    },
    {
        "id": "cf7760bca9b5f034",
        "type": "switch",
        "z": "4facfd665af09b5c",
        "name": "Batterie zwischen 60 und 70%",
        "property": "SOC",
        "propertyType": "flow",
        "rules": [
            {
                "t": "lte",
                "v": "70",
                "vt": "num"
            },
            {
                "t": "else"
            }
        ],
        "checkall": "true",
        "repair": false,
        "outputs": 2,
        "x": 530,
        "y": 1260,
        "wires": [
            [
                "4d8b6d4a3d207fe7"
            ],
            [
                "cbfc8d98df2cb155"
            ]
        ]
    },
    {
        "id": "4d8b6d4a3d207fe7",
        "type": "change",
        "z": "4facfd665af09b5c",
        "name": "Rechnung Multi Ladung 0.6 kW",
        "rules": [
            {
                "t": "set",
                "p": "payload",
                "pt": "msg",
                "to": "msg.payload / 50 + 12",
                "tot": "jsonata"
            }
        ],
        "action": "",
        "property": "",
        "from": "",
        "to": "",
        "reg": false,
        "x": 850,
        "y": 1260,
        "wires": [
            [
                "e389df69d34a81a2"
            ]
        ]
    },
    {
        "id": "cbfc8d98df2cb155",
        "type": "switch",
        "z": "4facfd665af09b5c",
        "name": "Batterie zwischen 70 und 80%",
        "property": "SOC",
        "propertyType": "flow",
        "rules": [
            {
                "t": "lte",
                "v": "80",
                "vt": "num"
            },
            {
                "t": "else"
            }
        ],
        "checkall": "true",
        "repair": false,
        "outputs": 2,
        "x": 530,
        "y": 1320,
        "wires": [
            [
                "7e67bf365aee928c"
            ],
            [
                "f6da5c99e347f928"
            ]
        ]
    },
    {
        "id": "7e67bf365aee928c",
        "type": "change",
        "z": "4facfd665af09b5c",
        "name": "Rechnung Multi Ladung 0.4 kW",
        "rules": [
            {
                "t": "set",
                "p": "payload",
                "pt": "msg",
                "to": "msg.payload / 50 + 8",
                "tot": "jsonata"
            }
        ],
        "action": "",
        "property": "",
        "from": "",
        "to": "",
        "reg": false,
        "x": 850,
        "y": 1320,
        "wires": [
            [
                "e389df69d34a81a2"
            ]
        ]
    },
    {
        "id": "f6da5c99e347f928",
        "type": "change",
        "z": "4facfd665af09b5c",
        "name": "Rechnung nur DC Ladung",
        "rules": [
            {
                "t": "set",
                "p": "payload",
                "pt": "msg",
                "to": "msg.payload / 50 + 0.5",
                "tot": "jsonata"
            }
        ],
        "action": "",
        "property": "",
        "from": "",
        "to": "",
        "reg": false,
        "x": 830,
        "y": 1380,
        "wires": [
            [
                "e389df69d34a81a2"
            ]
        ]
    },
    {
        "id": "f87bd121820c43d8",
        "type": "inject",
        "z": "4facfd665af09b5c",
        "name": "10 bis 13:00",
        "props": [
            {
                "p": "payload"
            },
            {
                "p": "topic",
                "vt": "str"
            }
        ],
        "repeat": "",
        "crontab": "*/1 10-12 * * *",
        "once": false,
        "onceDelay": 0.1,
        "topic": "",
        "payload": "",
        "payloadType": "date",
        "x": 250,
        "y": 320,
        "wires": [
            [
                "4d1199e0b9397afd"
            ]
        ]
    },
    {
        "id": "74333025fcc4d811",
        "type": "switch",
        "z": "4facfd665af09b5c",
        "name": "Batterie über 25%? ",
        "property": "SOC",
        "propertyType": "flow",
        "rules": [
            {
                "t": "gt",
                "v": "25",
                "vt": "num"
            },
            {
                "t": "else"
            }
        ],
        "checkall": "true",
        "repair": false,
        "outputs": 2,
        "x": 670,
        "y": 300,
        "wires": [
            [
                "9172615c9a708c0b"
            ],
            []
        ]
    },
    {
        "id": "9172615c9a708c0b",
        "type": "switch",
        "z": "4facfd665af09b5c",
        "name": "genug PV?",
        "property": "forecast",
        "propertyType": "flow",
        "rules": [
            {
                "t": "gt",
                "v": "21000",
                "vt": "num"
            },
            {
                "t": "else"
            }
        ],
        "checkall": "true",
        "repair": false,
        "outputs": 2,
        "x": 890,
        "y": 300,
        "wires": [
            [
                "a4996ca1d4354765",
                "f26385454ea50069"
            ],
            []
        ]
    },
    {
        "id": "a4996ca1d4354765",
        "type": "victron-output-ess",
        "z": "4facfd665af09b5c",
        "service": "com.victronenergy.settings",
        "path": "/Settings/SystemSetup/MaxChargeCurrent",
        "serviceObj": {
            "service": "com.victronenergy.settings",
            "name": "Venus settings"
        },
        "pathObj": {
            "path": "/Settings/SystemSetup/MaxChargeCurrent",
            "type": "float",
            "name": "Charge current limit (A)",
            "writable": true
        },
        "initial": "",
        "name": "",
        "onlyChanges": false,
        "x": 1240,
        "y": 320,
        "wires": []
    },
    {
        "id": "f26385454ea50069",
        "type": "debug",
        "z": "4facfd665af09b5c",
        "name": "debug 59",
        "active": true,
        "tosidebar": false,
        "console": false,
        "tostatus": true,
        "complete": "payload",
        "targetType": "msg",
        "statusVal": "payload",
        "statusType": "auto",
        "x": 1140,
        "y": 280,
        "wires": []
    },
    {
        "id": "4d1199e0b9397afd",
        "type": "change",
        "z": "4facfd665af09b5c",
        "name": "",
        "rules": [
            {
                "t": "set",
                "p": "payload",
                "pt": "msg",
                "to": "pvLeistungVictron10",
                "tot": "flow"
            }
        ],
        "action": "",
        "property": "",
        "from": "",
        "to": "",
        "reg": false,
        "x": 430,
        "y": 300,
        "wires": [
            [
                "74333025fcc4d811"
            ]
        ]
    },
    {
        "id": "e389df69d34a81a2",
        "type": "change",
        "z": "4facfd665af09b5c",
        "name": "",
        "rules": [
            {
                "t": "set",
                "p": "pvLeistungVictron10",
                "pt": "flow",
                "to": "payload",
                "tot": "msg"
            }
        ],
        "action": "",
        "property": "",
        "from": "",
        "to": "",
        "reg": false,
        "x": 1190,
        "y": 1020,
        "wires": [
            [
                "32fd511b97a315c9"
            ]
        ]
    },
    {
        "id": "32fd511b97a315c9",
        "type": "debug",
        "z": "4facfd665af09b5c",
        "name": "debug 60",
        "active": false,
        "tosidebar": false,
        "console": false,
        "tostatus": true,
        "complete": "payload",
        "targetType": "msg",
        "statusVal": "payload",
        "statusType": "auto",
        "x": 1420,
        "y": 1020,
        "wires": []
    },
    {
        "id": "e875ecd41745c2eb",
        "type": "inject",
        "z": "4facfd665af09b5c",
        "name": "9:30",
        "props": [
            {
                "p": "payload"
            },
            {
                "p": "topic",
                "vt": "str"
            }
        ],
        "repeat": "",
        "crontab": "30 09 * * *",
        "once": false,
        "onceDelay": 0.1,
        "topic": "",
        "payload": "",
        "payloadType": "date",
        "x": 230,
        "y": 280,
        "wires": [
            [
                "4d1199e0b9397afd"
            ]
        ]
    },
    {
        "id": "166aaa7952b940f8",
        "type": "change",
        "z": "4facfd665af09b5c",
        "name": "Rechnung Multi Ladung max",
        "rules": [
            {
                "t": "set",
                "p": "payload",
                "pt": "msg",
                "to": "msg.payload / 50",
                "tot": "jsonata"
            }
        ],
        "action": "",
        "property": "",
        "from": "",
        "to": "",
        "reg": false,
        "x": 460,
        "y": 800,
        "wires": [
            [
                "c6a1962fc4d0b059"
            ]
        ]
    },
    {
        "id": "c6a1962fc4d0b059",
        "type": "debug",
        "z": "4facfd665af09b5c",
        "name": "debug 61",
        "active": false,
        "tosidebar": false,
        "console": false,
        "tostatus": true,
        "complete": "payload",
        "targetType": "msg",
        "statusVal": "payload",
        "statusType": "auto",
        "x": 720,
        "y": 800,
        "wires": []
    },
    {
        "id": "11b587b897f75e8e",
        "type": "change",
        "z": "4facfd665af09b5c",
        "name": "",
        "rules": [
            {
                "t": "set",
                "p": "payload",
                "pt": "msg",
                "to": "50",
                "tot": "num"
            }
        ],
        "action": "",
        "property": "",
        "from": "",
        "to": "",
        "reg": false,
        "x": 910,
        "y": 260,
        "wires": [
            [
                "94425ca6cc01d6a3"
            ]
        ]
    },
    {
        "id": "185d0e21b19eaab3",
        "type": "vrm-api",
        "z": "4facfd665af09b5c",
        "vrm": "808cbad6ef13f058",
        "name": "Solar forecast",
        "api_type": "installations",
        "idUser": "",
        "users": "installations",
        "idSite": "",
        "installations": "stats",
        "attribute": "solar_yield_forecast",
        "stats_interval": "days",
        "show_instance": false,
        "stats_start": "bod",
        "stats_end": "eod",
        "use_utc": false,
        "gps_start": "",
        "gps_end": "",
        "widgets": "SolarChargerSummary",
        "instance": "",
        "vrm_id": "",
        "country": "de",
        "b_max": "",
        "tb_max": "",
        "fb_max": "",
        "tg_max": "",
        "fg_max": "",
        "b_cycle_cost": "",
        "buy_price_formula": "",
        "sell_price_formula": "",
        "green_mode_on": "",
        "feed_in_possible": "",
        "feed_in_control_on": "",
        "b_goal_hour": "",
        "b_goal_SOC": "",
        "store_in_global_context": false,
        "verbose": false,
        "x": 540,
        "y": 740,
        "wires": [
            [
                "1787ef5c80e4db3f",
                "343cae6b723c8bd6"
            ]
        ]
    },
    {
        "id": "1787ef5c80e4db3f",
        "type": "debug",
        "z": "4facfd665af09b5c",
        "name": "debug 62",
        "active": true,
        "tosidebar": true,
        "console": false,
        "tostatus": true,
        "complete": "payload",
        "targetType": "msg",
        "statusVal": "payload",
        "statusType": "auto",
        "x": 940,
        "y": 800,
        "wires": []
    },
    {
        "id": "67522e0f9db0053d",
        "type": "inject",
        "z": "4facfd665af09b5c",
        "name": "",
        "props": [
            {
                "p": "payload"
            },
            {
                "p": "topic",
                "vt": "str"
            }
        ],
        "repeat": "",
        "crontab": "00 04 * * *",
        "once": false,
        "onceDelay": 0.1,
        "topic": "",
        "payload": "",
        "payloadType": "date",
        "x": 250,
        "y": 740,
        "wires": [
            [
                "185d0e21b19eaab3"
            ]
        ]
    },
    {
        "id": "43f3934be93e341e",
        "type": "debug",
        "z": "4facfd665af09b5c",
        "name": "debug 63",
        "active": true,
        "tosidebar": true,
        "console": false,
        "tostatus": true,
        "complete": "payload",
        "targetType": "msg",
        "statusVal": "payload",
        "statusType": "auto",
        "x": 1020,
        "y": 740,
        "wires": []
    },
    {
        "id": "343cae6b723c8bd6",
        "type": "change",
        "z": "4facfd665af09b5c",
        "name": "",
        "rules": [
            {
                "t": "set",
                "p": "payload",
                "pt": "msg",
                "to": "payload.totals.solar_yield_forecast",
                "tot": "msg"
            }
        ],
        "action": "",
        "property": "",
        "from": "",
        "to": "",
        "reg": false,
        "x": 790,
        "y": 740,
        "wires": [
            [
                "43f3934be93e341e",
                "296012c7a497194f"
            ]
        ]
    },
    {
        "id": "808cbad6ef13f058",
        "type": "config-vrm-api",
        "name": ""
    }
]

Moin @Ruediger
wenn Du möchtest, dann würde ich Dir mit Github helfen. Da PM nicht geht, gerne per Mail an (redacted)

VG
Björn

Hallo Björn,
vielen Dank für die schnelle Antwort. Du kannst das script gerne nehmen und damit machen was du möchtest. Ich verstehe in den GitHubs relativ wenig. Ich wollte die Idee für die Regelung teilen, weil ich zum Teil die Skripte aus den GitHubs nicht mal geladen bekomme uns etwas in der Art eh nicht gefunden habe.

Zeit für echten Support hätte ich auch bei Kompetenz nicht.

viele Grüsse

Rüdiger

I forgot something to add:

to get the VRM forecast you need a token, which you generate with this link:

https://vrm.victronenergy.com/access-tokens

you need to give a name for the token and get a long number only available once.

The name and the number are entered into the VRM node
sorry pictures are in German, but should not be so difficult.

image

image

and maybe a picture of all flows:

best regards

Ruediger

PN scheint bei mir nicht zu gehen als Neuling.