Wasserspeicher elektrisch heizen

Ja das Stimmt, nur muss es auch in DE schon was in der Richtung geben, den es gibt schon in AT Energie Gemeinschaften die auch über die Grenzen das machen nach DE! Habe mich aber nicht weiter beschäftigt damit, nur mal das gelesen wie ich auf der Suche nach einen Energiegemeinschaft war.

Seit dem 1.1.26 ist es bei uns in der Schweiz möglich solche “Energiegemeinschaften” zu bilden. Dabei gibt es 2 Varianten: die eine ist quasi alle die am gleichen Strassenverteiler sind und die andere unabhängig davon. Ist sogar über die Region hinaus möglich.

Tönt alles sehr gut und toll, nur wenn man sich die Bedingungen dann genau anschaut, verfliegt dass Interesse sehr schnell wieder, weil der juristische Aufwand jegliche Erträge oder Nutzen auffrisst. Denn die Energiepreise werden auch bei einer solchen Gemeinschaft weiterhin vom VNB diktiert, ebenfalls muss man eine juristische Gesellschaft gründen mit der ganzen Steuerlichen Geschichte dahinter. Zusätzlich beansprucht der VNB eine Sitz in dieser Gesellschaft, offiziell zur technischen Kontrolle, laut Aussagen des VNB bei mir, zur Kontrolle damit keine Konkurenz zum VNB entstehen kann. Zumindest in der Schweiz sind diese Gesetze von der höchsten Richterlichen Instanz bereits gestützt.

Es darf mir jetzt nicht wieder als politische Meinung ausgelegt werden, denn wer will kann alles nachlesen. Die Seite swissolar.ch gibt Auskunft, zusätzlich gibt es bei uns die sg. “Werksvorschriften” in der jeder VNB zusätzliche Bedingungen für sein Versorgungsgebiet festlegen darf. Ein typisches Beispiel davon ist die Steuerfrequenz vom Tarifumschalter. In diesem Werksvorschriften gibt es noch ganz viele zusätzliche kleine oder grössere Dinge die den Umgang und die Bedingungen für die Rücklieferung festlegen. Zusätzlich kann es durchaus geschehen dass man schriftliche Anweisungen zum Bau einer Anlage bekommt und der Herr welcher das geschrieben hat, dann bei der Inbetriebnahme nichts mehr davon wissen will und behauptet das nie geschrieben zu haben, obwohl man das Mail ausgedruckt vorliegen hat.

Darum ist das für mich im Moment nicht wirklich eine Option, und wenn ich überschuss habe und den wirklich nicht brauchen kann verkaufe ich den eben. Ich habe grundsätzlich kein Problem damit. Meine Frage ging auch gar nie in diese Richtung, sonder es war echt eine technische Frage: “wie kann man das machen”

Andi

Edit: und ja in der Schweiz sind die VNB noch Monopolisten, da haben wir keine Wahlfreiheit wer Messstellenbetreiber etc. sein soll. Auch haben nur die ganz grossen dynamischen Tarife, bei uns kleinen gibt es das nicht, würde sich auch gar nicht lohnen, der Aufwand ist dafür viel zu hoch.

Sorry wollte deinen Thread nicht in die Richtung führen, war eben nur so ein Gedanke wenn man sehr viel Überschuss hat wäre das vllt eine Lösung gewesen. Nur unter den Umständen ist es verständlich wenn man das nicht machen möchte. Hier in AT ist das einfach umzusetzen ohne viel Bürokratie oder Aufwand und ist Online gleich mal erledige und in 3 - 4 Arbeitstage hat man das.
Da ist das mit dem Heizstab dann sicher die bessere Lösung und vor allem ohne viel Bürokratie! Von den Heizstäben die man direkt stufenlos steuern kann sind glaube ich nicht so viel am Markt. Die meisten schaltet man per Phasen in Stufen.

Ich habe auch kein Problem damit, ich finde die Diskussion darüber auch sehr gut. So hat jedes Land oder gar Region ihre eigenen Vor- und Nachteile geschaffen für die PV Energie. Denn ich glaube immer noch daran, dass es ein vernünftiges zusammenarbeiten geben muss, wenn wir die Energie sichern und Umweltfreundlicher machen wollen.

Solange keiner kommt und meine Thread als “politische Hetze” Verurteil ist alles gut. Genau das habe ich anderst wo auch schon erlebt.

Ich würde meine Anlage nach knapp einem Jahr betrieb, wieder genau so bauen, denn der Entscheid auf Victron und 48VDC System zu setzen hat sich absolut gelohnt und kann ich jedem nur empfehlen, auch wenn der Weg dahin bei mir extrem holprig und manchmal nahe am Absturz war, würde ich heute sogar nur noch auf Multiplus 2 setzen. Ich bin im ganzen Versorgungsgebiet des VNB eben der erste und einzige der sich nicht an die Wunschvorstellung vom VNB mit Huawei-WR gehalten hat. Es kann sich jeder der sich schon mal gegen einen VNB zur Wehr gesetzt hat, selber ausdenken was das alles mit sich bringt.

Aus allen diesen Beschreibungen und Tatsachen versuche ich einfach das beste für mich zu suchen und genau darum wollte ich ja die Heizleistung auf der ersten Stufe regulieren und somit näher an die Produktion/Ernte heranführen.

Gruss Andi

Kann dir aus meiner Erfahrung berichten, wenn die Sonne hervor kommt habe ich auch einen Riesen PV Überschuss und da auch schaue, dass ich so viel wie es geht zu Speichern und in Wärme umzuwandeln, da ich mit Splitklima das Haus heize mit BWWP das Brauchwasser und auch den Heizstab der in der BWWP verbaut ist bei Überschuss versorge. Der Rest geht ins Auto oder wird abgeregelt da ich nicht mit dem öffentlichen Netz verbunden bin. An Tagen wo es weniger PV Leistung ist kommt die Energie von der PV, Speicher und Auto wieder zurück ins Haus! Zur Zeit habe wir seit gut einem Monat Temperaturen durchgehend um die -5°C bis -15°C und immer wieder Nebeltage. Jetzt im Januar habe ich einen Durchschnittsverbrauch am Tag von ca. 25kWh die aber auch vorhanden sein müssen sonst wird es dunkel im Haus. Bis jetzt bin ich über die Runden gekommen und trotzdem immer noch am erweitern von Speicher und PV!

Gestern lief eine neue Folge vom PV-Quartett (eine Youtubeshow mit PV Anwendern). Da war jemand dabei (Arne), der einen 6kW Heizstab hatte, welcher 3x2KW hat. Diesen hat er mit einer Steuerung versehen, mittels er ihn von 0-6KW stufenlos steuern kann. Es wird auch kurz die Steuerung und die Funktion erklärt.
Vielleicht wäre das ja einen Alternative zum Thor?

Wo lebst Du? Auf der Zugspitze, oder auf dem Brocken?

Hier bei mir im kalten nordhessischen Bergland haben wir in den letzten 30 Tagen tägliche Höchsttemperaturen zwischen -5°C und +8°C erlebt, und tägliche Tiefsttemperaturen zwischen -10°C und +3°C. Wir dürften damit eine mittlere Temperatur von ca 0,5°C gehabt haben, was etwas niedriger ist als die mittlere Temperatur für ganz Deutschland im Januar von +1°C. Ist halt eine besonders kalte Gegend hier.

Über einen Monat durchgehend Temperaturen von nicht höher als -5°C gab es in Deutschland zuletzt vor ca 15.000 Jahren im letzten Glazial.

Um mal wieder zum eigentlichen Thema zurückzukommen…Ich schalte einen Shelly Pro 3, über den die 3-phasige Heizpatrone gesteuert wird, über Home Assistant. Erreiche ich 100% Akku, schalte ich alle 3 Phasen zu, fällt die Akkuladung unter 90% deaktiviere ich eine der Phasen bei 80% die nächste usw. Das ist nicht perfekt, funktioniert aber recht brauchbar.

Mit euren Shelly würde ich vorsichtig sein solche Lasten auf Dauer zu schalten, denn die sind nicht für das auf ausgelegt! Nehmt lieber Schütz dazu, habe schon einige Shelly gesehen die schwarz gewesen sind weil sie überhitzt sind!.

2 KW pro Phase sollte der Shelly eigentlich dauerhaft vertragen können. Das sind knapp über 8A. Bei meiner Anlagengröße läuft die Patrone dann eh meist dauerhaft nur auf einer bzw. zwei Phasen. Aber danke für den Hinweis. Ich werde da mal ein Auge drauf haben :+1:

Bonjour

Il existe un routeur ARSUN 4 voies (mettre sonde sortie de compteur.

la voie 3 est une prise radio sur laquelle ont peut brancher 1 étage de 1.5kw.

les voies 1 et 2 sont modulables de 0 à 100% par seuil de 1%

Variante mettre 1 seuil sur voie 4 (radio)

Et garder la voie 1 pour ECS (paramétrer eau chaude prioritaire)

Cela pour installation de 5KW crête doit permettre d’avoir un taux d’autoconsommation de 95%

Patrice BOURGOIN

mail patricebourgoin@sfr.fr

Bonjour

Il existe un routeur ARSUN 4 voies sonde à mettre sortie Compteur

Voie 3 radio mettre 1 étage 1.5KW (paramétrer l’ARSUN sans priorité Eau Chaude.)

Voies 1 et 2 modulable de 0à 100% par seuil de 1% les 2 autres étage de 1.5Kw (exclusivement pour des charges résistives.

Das Unterschätzen viele, habe selber mal einen 3kW Heizstab mit einem Sonoff der 16A kann betrieben, bis ich drauf gekommen bin, dass der schön warm wird und auf der Unterseite schon braun gefärbt war. Seit dem nehmen ich nur mehr Schütz und steuere die über Victron

Also bei mir hatte ich uralte Shelly 1 drin (die blauen), und nach ca. 7 Monaten hat sich das Miniatur-Printplattenrelais darauf verabschiedet. Jetzt sind da 2stk Shelly-Pro 2 drin, ich hoffe die haben die besseren (grösseren) Relais drin. Das ist aber nicht der einzige Schaltpunkt, denn bei uns in der Schweiz ist bei jedem Wassererwärmer ein sg. Sicherheitsthermostat Pflicht, welcher mir jetzt mit zusätzlichem Schütz zum einen die 3 Phasen trennt und zum anderen die 230V von den Shelly-Pro 2 abtrennt. Somit sollte zumindest das geregelt sein.

Aber wenn man sich im Web etwas durchwühlt und nach “Boiler-Explosion” sucht, sollte jedem der eine Elektroheizung in einen Wasserspeicher verbaut logisch sein, dass man sich da mit allem was möglich ist absichert. Ich denke da will keiner nur noch ein halbes Haus haben, den die Wucht einer Dampf-Explosion ist beinahe unendlich. 1l Wasser ergibt rund das Volumen von 1600l Dampf, da wird man automatisch etwas vorsichtig. Ich hatte in einem vergangenen Job die Ehre solche Hochdruckdampf-Anlagen Elektrisch zu planen, darum: immer schön vorsichtig mit diesen EL-Heizungen, die können ins unendliche Heizen.

Aktuell läuft bei mir die 3stufig Schaltung über den Iobroker, aber angedacht ist, dass das ganze ins Node-Red auf dem Venus/Cerbo verschoben wird und dabei eben auch gleich die erste Stufe auf stufenlos umgerüstet wird. Es ist mir absolut klar, für die 1.5kW pro Stufe ist die stufenlose Regelung völlig daneben und eigentlich eigentlich überflüssig. Denn mein Akku fängt das Regelungleichgewicht eigentlich wieder auf.

Aber mich reizt “es muss machbar sein” und das ganze ist auch eine Art Hobby für mich.

Zu den “Kritiker vom El-Heizen und für sich schauen” muss ich auch einfach sagen: “jeder der eine Victron-Anlage betreibt, schaut auch primär für sich und nicht nur auf den möglichst grössten Gewinn,. Sonst hätte er keine Victron gebaut, zumindest hier in der Schweiz ist eine solche PV-Anlage ein gutes Stück teurer als eine übliche die so von den PV-Firmen verbaut wird.

Wie habt ihr das im Cerbo/Venus mit Node-Red gelöst? Irgendwie sehe ich da vor lauter Bäumen den Wald nicht ganz.

Andi

1 Like

ich habe es ganz anders gelöst - eine komplett getrennte Steuerung basierend auf ESP32 die per MQTT den aktuellen Hausbezug / Einspeisung kennt, entsprechend über 2 Eltako-Relais zwischen 1 / 2 / 3kW umschaltet

Eine Platine mit 2 Relais / ESP32 bekommst für unter 20€ - mit diesen dann die Eltakos gesteuert

was ähnliches habe ich für einen Kollegen gebaut, läuft seit 2 Jahren problemlos

Und ja, auch in Deutschland sind diese Sicherheitsthermostate vorgeschrieben

mein Heizstab hat 2 Thermostate, einen Sicherheitsthermostat und einen normalen Thermostat - ich gehe deshalb bei meiner Steuerung gar nicht auf die Boilertemperatur ein, soll der Thermostat regeln

ich habe aber im Cerbo / NodeRed einen Flow der mir mein Zusatznetzteil zum Laden steuert - eigentlich macht der ja das Gleiche - kann ich Dir bei Interesse schicken

Ich habe festgestellt, dass mein Iobroker zwischendurch etwas Mühe bekundet mit der Kommunikation mit dem Cerbo resp. bei mir Rpi mit Venus OS. An was das auch immer liegen mag, ich habe es bis jetzt nicht herausgefunden, denn es sind da sowohl im Modbus TCP und auch im MQTT zwischen durch einfach “Gesprächspausen” drin, darum habe ich mir eben gedacht es wäre wohl sinnvoller die EL-Heizung eben doch direkt über den EL-Erzeuger zu steuern. Grundsätzlich bin ich zwar absolut nicht begeistert von “verteilter Logik”, aber wenn die Zuverlässigkeit der Zentrale nicht gegeben ist muss man ja flexibel bleiben.

Ich habe bei mir im Heizkeller eine Klemmendose mit einem ESP8266 drin und mit dem lese ich alle meine 1-Wire Temperaturfühler ein und sende mir die mit MQTT in den Iobroker. Muss mal schauen ob ich das das yaml (ESP-Home im IOB) erweitern kann, so dass er mir die Speichertemperaturen auch gleich an das Venus sendet. Es gibt da im Github eine Beschreibung wie man externe Temperaturfühler mit MQTT im Venus erstellen, resp. einbinden kann.

Nur habe ich eben auch da beim Node-Red im Venus so manchmal das Gefühl, dass es stehen bleibt. Ich habe mir mal ein Log im IOB geschrieben über den Empfang des SOC via MQTT. Dabei habe ich festgestellt, dass es ca 28h ganz gut läuft und danach die Einträge immer spärlicher werden. Wenn ich dann das Node-Red öffne und nur eine Verknüpfung leicht verschieben und es anschliessend neu deploy läuft es wieder ganz gut bis zum nächsten mal. Keine Ahnung an was das liegen könnte. Da ich Node-Red eben wirklich nicht kenne und bis jetzt nur so ganz einfachste Basics gemacht habe, wäre der Flow schon nocht interessant zu sehen, wie die Stufenregelung gelöst ist. Der SOC und Rückspeiseleistung mit dem On/Off eines Ausgang zu verknüpfen werde ich vermutlich schon schaffen, aber das er dann automatisch auf die Leistung reagiert, werde ich als “Nicht-Software-Mensch” vermutlich nur mit sehr viel externem Aufwand hin kriegen. Das war im IOB leider auch nicht anderst und ich habe es auch dort noch immer nicht so ganz begriffen.

Andi

Das wäre wohl das Produkt. Aber so wie ich das verstehe ist das auch nur eine Stufen-Schaltung mit On/Off und keine Regelung. Da ich nicht genügend franz oder englisch kann, wird es extrem schwer für mich das zu beurteile ob das wirklich geeignet wäre für mich.

ich nutze hier u.a. auch IOBroker, habe keine Probleme mit der Kommunikation

Aber ich habe vor paar Monaten von einem Raspi zum Cerbo gewechselt - man merkt irgendwie das Victron das nicht mehr so wirklich unterstützen will

Statt das Yaml der Tempertursensoren zu ändern, mach doch einfach in NodeRed ein paar Flows die Nachrichten vom IOBroker-MQTT zum Venus MQTT weitergeben?

Du musst die Temperaturfühler auch nicht direkt ins VenusOS einbinden, reicht doch wenn Du in NodeRed das MATT -Topic abonierst?

Ich nutze hier an wenigen Stellen auch ESPHome, finde es grausam mit dem ständig neu kompilieren

Stattdessen nutze ich ESPEasy, dort kann ich Änderungen direkt in der Weboberfläche machen

Hier mein NodeRed-Flow fürs Zusatzladegerät, der sollte einfach anzupassen sein

Man könnte dort einiges zusammen fassen, aber ich habs absichtlich einzeln gemacht

[
    {
        "id": "99240352eaf28c7c",
        "type": "function",
        "z": "6d5500c998b1e412",
        "name": "→ current",
        "func": "let val = Number(msg.payload);\nif (isNaN(val)) return null;\nnode.status({fill:\"blue\",shape:\"dot\",text:`I=${val}A`});\nmsg.payload = val;\nmsg.topic = \"current\";\nreturn msg;",
        "outputs": 1,
        "x": 360,
        "y": 220,
        "wires": [
            [
                "2828495fd6bde6ea",
                "24c26a4cf801cd24",
                "0c08b815577eb074"
            ]
        ]
    },
    {
        "id": "2828495fd6bde6ea",
        "type": "function",
        "z": "6d5500c998b1e412",
        "name": "Filter low (7–10 → 5)",
        "func": "let val = Number(msg.payload);\nif (isNaN(val)) return null;\nconst MIN = 7;\nconst MAX = 25;\nlet outValue = (val >= MIN && val <= MAX) ? 5 : 0;\nnode.status({fill: outValue>0?\"green\":\"blue\", shape:\"dot\", text:`Low: In=${val} → ${outValue}`});\nreturn {payload: outValue, topic: \"low\"};",
        "outputs": 1,
        "timeout": "",
        "noerr": 0,
        "initialize": "",
        "finalize": "",
        "libs": [],
        "x": 540,
        "y": 140,
        "wires": [
            [
                "1dc35a8cb3978338"
            ]
        ]
    },
    {
        "id": "24c26a4cf801cd24",
        "type": "function",
        "z": "6d5500c998b1e412",
        "name": "Filter mid (11–20 → 10)",
        "func": "let val = Number(msg.payload);\nif (isNaN(val)) return null;\nconst MIN = 15;\nconst MAX = 35;\nlet outValue = (val >= MIN && val <= MAX) ? 10 : 0;\nnode.status({fill: outValue>0?\"green\":\"blue\", shape:\"dot\", text:`Mid: In=${val} → ${outValue}`});\nreturn {payload: outValue, topic: \"mid\"};",
        "outputs": 1,
        "timeout": "",
        "noerr": 0,
        "initialize": "",
        "finalize": "",
        "libs": [],
        "x": 550,
        "y": 220,
        "wires": [
            [
                "1dc35a8cb3978338"
            ]
        ]
    },
    {
        "id": "0c08b815577eb074",
        "type": "function",
        "z": "6d5500c998b1e412",
        "name": "Filter high (26–70 → 25)",
        "func": "let val = Number(msg.payload);\nif (isNaN(val)) return null;\nconst MIN = 26;\nconst MAX = 80;\nlet outValue = (val >= MIN && val <= MAX) ? 25 : 0;\nnode.status({fill: outValue>0?\"green\":\"blue\", shape:\"dot\", text:`High: In=${val} → ${outValue}`});\nreturn {payload: outValue, topic: \"high\"};",
        "outputs": 1,
        "timeout": "",
        "noerr": 0,
        "initialize": "",
        "finalize": "",
        "libs": [],
        "x": 550,
        "y": 300,
        "wires": [
            [
                "1dc35a8cb3978338"
            ]
        ]
    },
    {
        "id": "5dc4fee5d2aafca0",
        "type": "function",
        "z": "6d5500c998b1e412",
        "name": "Join Status",
        "func": "let obj = msg.payload;\n\n// Reihenfolge garantieren:\nlet order = [\"low\", \"mid\", \"high\"];\n\nlet txt = order\n    .map(k => `${k}:${obj[k] !== undefined ? obj[k] : \"?\"}`)\n    .join(\" | \");\n\nnode.status({\n    fill: \"yellow\",\n    shape: \"dot\",\n    text: txt\n});\n\nreturn msg;\n",
        "outputs": 1,
        "timeout": "",
        "noerr": 0,
        "initialize": "",
        "finalize": "",
        "libs": [],
        "x": 1030,
        "y": 220,
        "wires": [
            [
                "fdd4073ebf064684"
            ]
        ]
    },
    {
        "id": "fdd4073ebf064684",
        "type": "function",
        "z": "6d5500c998b1e412",
        "name": "Maximum wählen",
        "func": "let obj = msg.payload;\n\nlet max = Math.max(...Object.values(obj));\n\nlet order = [\"low\", \"mid\", \"high\"];\nlet txt = order.map(k => `${k}:${obj[k]}`).join(\" | \") + ` → Max=${max}`;\n\nnode.status({\n    fill: \"green\",\n    shape: \"dot\",\n    text: txt\n});\n\nmsg.payload = max;\nmsg.topic = \"current/max\";\nreturn msg;\n",
        "outputs": 1,
        "timeout": "",
        "noerr": 0,
        "initialize": "",
        "finalize": "",
        "libs": [],
        "x": 1230,
        "y": 220,
        "wires": [
            [
                "a06cde4e7bba9b6e"
            ]
        ]
    },
    {
        "id": "1dc35a8cb3978338",
        "type": "join",
        "z": "6d5500c998b1e412",
        "name": "Sammeln low/mid/high",
        "mode": "manual",
        "build": "object",
        "property": "payload",
        "propertyType": "msg",
        "key": "topic",
        "joiner": "",
        "joinerType": "str",
        "accumulate": false,
        "timeout": "",
        "count": "3",
        "reduceRight": false,
        "reduceExp": "",
        "reduceInit": "",
        "reduceInitType": "",
        "reduceFixup": "",
        "x": 800,
        "y": 220,
        "wires": [
            [
                "5dc4fee5d2aafca0"
            ]
        ]
    },
    {
        "id": "a06cde4e7bba9b6e",
        "type": "function",
        "z": "6d5500c998b1e412",
        "name": "Wert 3x èrfüllt",
        "func": "// Aktuellen Wert lesen\nlet val = msg.payload;\n\n// Letzte Werte aus Context laden\nlet lastVal = context.get(\"lastVal\");\nlet count = context.get(\"count\") || 0;\n\n// Wenn erster Durchlauf → speichern & warten\nif (lastVal === undefined) {\n    context.set(\"lastVal\", val);\n    context.set(\"count\", 1);\n    node.status({fill:\"blue\", shape:\"dot\", text:`Warte… (${val}, 1/3)`});\n    return null;\n}\n\n// Prüfen, ob der Wert gleich ist wie zuletzt\nif (val === lastVal) {\n    count++;\n} else {\n    // Wert hat sich geändert → neu zählen\n    lastVal = val;\n    count = 1;\n}\n\n// Werte speichern\ncontext.set(\"lastVal\", lastVal);\ncontext.set(\"count\", count);\n\n// Status-Bubble aktualisieren\nnode.status({\n    fill: count >= 3 ? \"green\" : \"yellow\",\n    shape: \"dot\",\n    text: `Wert=${val} (${count}/3)`\n});\n\n// Nur weitergeben, wenn 3x gleicher Wert\nif (count >= 3) {\n    return { payload: val, topic: \"stable_value\" };\n}\n\nreturn null;\n",
        "outputs": 1,
        "timeout": 0,
        "noerr": 0,
        "initialize": "",
        "finalize": "",
        "libs": [],
        "x": 120,
        "y": 440,
        "wires": [
            [
                "switch_value",
                "05a2106518852c09",
                "c5018be5173f1f58"
            ]
        ]
    },
    {
        "id": "switch_value",
        "type": "switch",
        "z": "6d5500c998b1e412",
        "name": "Wert >3 ?",
        "property": "payload",
        "propertyType": "msg",
        "rules": [
            {
                "t": "gt",
                "v": "3",
                "vt": "num"
            },
            {
                "t": "lte",
                "v": "3",
                "vt": "num"
            }
        ],
        "checkall": "true",
        "repair": false,
        "outputs": 2,
        "x": 400,
        "y": 460,
        "wires": [
            [
                "shelly_on"
            ],
            [
                "delay_off"
            ]
        ]
    },
    {
        "id": "shelly_on",
        "type": "function",
        "z": "6d5500c998b1e412",
        "name": "Shelly AN",
        "func": "let shellyIP = \"192.168.178.69\";\n\nnode.status({\n    fill: \"green\",\n    shape: \"dot\",\n    text: \"Shelly EIN\"\n});\n\nmsg.method = \"GET\";\nmsg.url = `http://${shellyIP}/relay/0?turn=on`;\nmsg.payload = \"\";\nmsg.topic = \"shelly/on\";\n\nreturn msg;",
        "outputs": 1,
        "noerr": 0,
        "x": 640,
        "y": 420,
        "wires": [
            [
                "http_request"
            ]
        ]
    },
    {
        "id": "delay_off",
        "type": "function",
        "z": "6d5500c998b1e412",
        "name": "Ausschalt-Verzögerung (10s)",
        "func": "let shellyIP = \"192.168.178.69\";\nlet delaySeconds = 10;\n\nlet offTimer = context.get(\"offTimer\");\n\n// Falls bereits ein Timer läuft, abbrechen\nif (offTimer) {\n    clearTimeout(offTimer);\n}\n\nnode.status({\n    fill: \"yellow\",\n    shape: \"dot\",\n    text: `Shelly AUS in ${delaySeconds}s`\n});\n\n// Neuen Timer setzen\noffTimer = setTimeout(() => {\n    let out = {\n        method: \"GET\",\n        url: `http://${shellyIP}/relay/0?turn=off`,\n        payload: \"\",\n        topic: \"shelly/off\"\n    };\n\n    node.send(out);\n\n    node.status({\n        fill: \"blue\",\n        shape: \"dot\",\n        text: \"Shelly AUS (verzögert)\"\n    });\n\n    context.set(\"offTimer\", null);\n}, delaySeconds * 1000);\n\ncontext.set(\"offTimer\", offTimer);\n\nreturn null;",
        "outputs": 1,
        "noerr": 0,
        "x": 680,
        "y": 500,
        "wires": [
            [
                "http_request"
            ]
        ]
    },
    {
        "id": "http_request",
        "type": "http request",
        "z": "6d5500c998b1e412",
        "name": "Shelly HTTP Request",
        "method": "use",
        "ret": "txt",
        "url": "",
        "persist": false,
        "authType": "",
        "x": 950,
        "y": 460,
        "wires": [
            [
                "http_debug"
            ]
        ]
    },
    {
        "id": "http_debug",
        "type": "debug",
        "z": "6d5500c998b1e412",
        "name": "Shelly Antwort",
        "active": false,
        "tosidebar": true,
        "console": false,
        "tostatus": false,
        "complete": "true",
        "targetType": "full",
        "x": 1180,
        "y": 460,
        "wires": []
    },
    {
        "id": "2b7658ca29cc8cfd",
        "type": "mqtt out",
        "z": "6d5500c998b1e412",
        "name": "",
        "topic": "",
        "qos": "0",
        "retain": "false",
        "respTopic": "",
        "contentType": "",
        "userProps": "",
        "correl": "",
        "expiry": "",
        "broker": "86642e60e517f7f0",
        "x": 1150,
        "y": 640,
        "wires": []
    },
    {
        "id": "2b7051c330c1f5a2",
        "type": "function",
        "z": "6d5500c998b1e412",
        "name": "mit 5 sec Verzögerung senden",
        "func": "let val = Number(msg.payload);\nlet delaySeconds = 5;\n\n// immer Float senden, wie R48xx es erwartet\nlet floatVal = Number(val.toFixed(1));\n\n// letzten Timer laden\nlet timer = context.get(\"mqttDelayTimer\");\n\n// ungültiger Wert?\nif (isNaN(val)) {\n    node.status({ fill:\"red\", shape:\"ring\", text:\"ungültiger Wert\" });\n    return null;\n}\n\n// wenn ein Timer läuft → stoppen\nif (timer) {\n    clearTimeout(timer);\n}\n\n// Bubble: Countdown läuft\nnode.status({\n    fill:\"yellow\",\n    shape:\"dot\",\n    text:`Sende in ${delaySeconds}s: ${floatVal}`\n});\n\n// neuen Timer starten\ntimer = setTimeout(() => {\n\n    let out = {\n        topic: \"r48xx-off-grid/number/12_set_dc_current_limit/command\",\n        payload: floatVal\n    };\n\n    node.send(out);\n\n    node.status({\n        fill:\"green\",\n        shape:\"dot\",\n        text:`MQTT send: ${floatVal}`\n    });\n\n    // Timer löschen\n    context.set(\"mqttDelayTimer\", null);\n\n}, delaySeconds * 1000);\n\n// Timer speichern\ncontext.set(\"mqttDelayTimer\", timer);\n\nreturn null;\n",
        "outputs": 1,
        "timeout": 0,
        "noerr": 0,
        "initialize": "",
        "finalize": "",
        "libs": [],
        "x": 770,
        "y": 620,
        "wires": [
            [
                "2b7658ca29cc8cfd",
                "2421cbece1db9b86"
            ]
        ]
    },
    {
        "id": "2421cbece1db9b86",
        "type": "debug",
        "z": "6d5500c998b1e412",
        "name": "debug 8",
        "active": true,
        "tosidebar": true,
        "console": false,
        "tostatus": false,
        "complete": "false",
        "statusVal": "",
        "statusType": "auto",
        "x": 1080,
        "y": 580,
        "wires": []
    },
    {
        "id": "7004f17d5c063bda",
        "type": "victron-input-battery",
        "z": "6d5500c998b1e412",
        "service": "com.victronenergy.battery/1024",
        "path": "/Dc/0/Current",
        "serviceObj": {
            "service": "com.victronenergy.battery/1024",
            "name": "Battery Aggregator"
        },
        "pathObj": {
            "path": "/Dc/0/Current",
            "type": "float",
            "name": "Battery current (A)"
        },
        "name": "",
        "onlyChanges": false,
        "x": 190,
        "y": 300,
        "wires": [
            [
                "cf9aa2dbdb92c54b"
            ]
        ]
    },
    {
        "id": "cf9aa2dbdb92c54b",
        "type": "function",
        "z": "6d5500c998b1e412",
        "name": "Mittelwert 10 sec",
        "func": "let val = Number(msg.payload);\nif (isNaN(val)) return null;\n\n// Zeitintervall (10 Sekunden)\nconst INTERVAL = 10000;\n\n// Wertebuffer laden\nlet buffer = context.get(\"buffer\") || [];\nlet lastTime = context.get(\"lastTime\") || 0;\nlet now = Date.now();\n\n// neuen Wert speichern\nbuffer.push(val);\ncontext.set(\"buffer\", buffer);\n\n// wenn die 10 Sekunden NICHT vorbei sind → nichts ausgeben\nif (now - lastTime < INTERVAL) {\n    node.status({\n        fill: \"yellow\",\n        shape: \"dot\",\n        text: `Sammle... n=${buffer.length}`\n    });\n    return null;\n}\n\n// Durchschnitt berechnen\nlet sum = buffer.reduce((a, b) => a + b, 0);\nlet avg = sum / buffer.length;\n\n// Status anzeigen\nnode.status({\n    fill: \"green\",\n    shape: \"dot\",\n    text: `AVG (10s) = ${avg.toFixed(2)}`\n});\n\n// Buffer zurücksetzen\ncontext.set(\"buffer\", []);\ncontext.set(\"lastTime\", now);\n\n// Output erzeugen\nmsg.payload = Number(avg.toFixed(2));\nmsg.topic = \"current_avg_10s\";\nreturn msg;\n",
        "outputs": 1,
        "timeout": 0,
        "noerr": 0,
        "initialize": "",
        "finalize": "",
        "libs": [],
        "x": 130,
        "y": 220,
        "wires": [
            [
                "a8677153517edd9e"
            ]
        ]
    },
    {
        "id": "93fb5e1f4410bf22",
        "type": "function",
        "z": "6d5500c998b1e412",
        "name": "function 5",
        "func": "// SoC Wert aus Victron (0–100)\nlet soc = Number(msg.payload);\n\nif (!isNaN(soc)) {\n    flow.set(\"soc_value\", soc);\n    node.status({\n        fill:\"blue\",\n        shape:\"dot\",\n        text:`SoC = ${soc}%`\n    });\n}\n\nreturn null;  // wir wollen hier nichts weiter routen\n",
        "outputs": 1,
        "timeout": 0,
        "noerr": 0,
        "initialize": "",
        "finalize": "",
        "libs": [],
        "x": 260,
        "y": 100,
        "wires": [
            []
        ]
    },
    {
        "id": "a8677153517edd9e",
        "type": "function",
        "z": "6d5500c998b1e412",
        "name": "SOC-Check",
        "func": "let soc = flow.get(\"soc_value\");\nlet val = Number(msg.payload);\n\n// Schwellwert\nconst LIMIT = 90;  // ab >80% soll Netzteil aus sein\n\nif (isNaN(val)) return null;\n\n// Falls SoC noch nicht gesetzt ist → normal weiter\nif (soc === undefined) {\n    node.status({ fill:\"grey\", shape:\"ring\", text:\"SoC fehlt\" });\n    return msg;\n}\n\n// Anzeige-Status\nnode.status({\n    fill: soc > LIMIT ? \"red\" : \"green\",\n    shape: \"dot\",\n    text: `SoC=${soc}%`\n});\n\n// Wenn SoC zu hoch → Strom künstlich auf 0 setzen\nif (soc > LIMIT) {\n    msg.payload = 0;\n    msg.topic = \"current\";\n    return msg;\n}\n\n// Normaler Wert wird durchgereicht\nreturn msg;\n",
        "outputs": 1,
        "timeout": 0,
        "noerr": 0,
        "initialize": "",
        "finalize": "",
        "libs": [],
        "x": 250,
        "y": 160,
        "wires": [
            [
                "99240352eaf28c7c"
            ]
        ]
    },
    {
        "id": "3fa23a596c89c749",
        "type": "victron-input-battery",
        "z": "6d5500c998b1e412",
        "service": "com.victronenergy.battery/1024",
        "path": "/Soc",
        "serviceObj": {
            "service": "com.victronenergy.battery/1024",
            "name": "Battery Aggregator"
        },
        "pathObj": {
            "path": "/Soc",
            "type": "float",
            "name": "State of charge (%)"
        },
        "name": "SOC",
        "onlyChanges": false,
        "x": 90,
        "y": 100,
        "wires": [
            [
                "93fb5e1f4410bf22"
            ]
        ]
    },
    {
        "id": "c5018be5173f1f58",
        "type": "function",
        "z": "6d5500c998b1e412",
        "name": "nur bei Änderung senden",
        "func": "let soll = Number(msg.payload);\nif (isNaN(soll)) return null;\n\n// Sollwert normalisieren\nsoll = Number(soll.toFixed(1));\n\n// Istwert aus dem Flow holen\nlet ist = flow.get(\"r48xx_state\");\n\n// Wenn wir den Istwert noch nicht kennen → lieber senden\nif (ist === undefined) {\n    node.status({\n        fill: \"grey\",\n        shape: \"ring\",\n        text: `IST unbekannt → sende ${soll}`\n    });\n    return msg;\n}\n\n// Vergleich\nif (soll === ist) {\n    node.status({\n        fill: \"blue\",\n        shape: \"dot\",\n        text: `kein Senden (Soll=Ist=${soll})`\n    });\n    return null;\n}\n\n// Unterschied → weiterleiten\nnode.status({\n    fill: \"yellow\",\n    shape: \"dot\",\n    text: `Änderung: Soll ${soll} ≠ Ist ${ist}`\n});\n\nreturn msg;\n",
        "outputs": 1,
        "timeout": 0,
        "noerr": 0,
        "initialize": "",
        "finalize": "",
        "libs": [],
        "x": 490,
        "y": 620,
        "wires": [
            [
                "2b7051c330c1f5a2"
            ]
        ]
    },
    {
        "id": "86642e60e517f7f0",
        "type": "mqtt-broker",
        "name": "CerboGX (Enter Your Cerbro IP)",
        "broker": "127.0.0.1",
        "port": "1883",
        "clientid": "",
        "autoConnect": true,
        "usetls": false,
        "protocolVersion": "4",
        "keepalive": "45",
        "cleansession": true,
        "autoUnsubscribe": true,
        "birthTopic": "",
        "birthQos": "0",
        "birthPayload": "",
        "birthMsg": {},
        "closeTopic": "",
        "closeQos": "0",
        "closePayload": "",
        "closeMsg": {},
        "willTopic": "",
        "willQos": "0",
        "willPayload": "",
        "willMsg": {},
        "userProps": "",
        "sessionExpiry": ""
    },
    {
        "id": "d896cda5c4143019",
        "type": "global-config",
        "env": [],
        "modules": {
            "@victronenergy/node-red-contrib-victron": "1.6.56"
        }
    }
]

Ja, dass mit dem Venus und OpenSource wird immer mehr gewaltsam in den Hintergrund gedrängt. Ich finde das extrem schade, aber wenn ich sehe was da in der Industrie- und Gebäudeautomation im Bereich der IT-Sicherheit gerade für ein Hype um Security abgeht, erstaunt es mich nicht. Denn mit diesen von verschiedenen Orten verordneten Sicherheitsvorschriften wird das mit OpenSource sehr schwierig werden. Dem ganzen wird sich Victron auch nicht verschliessen können, zumal sie ja immer auch von Zertifikaten für Fahrzeuge abhängig sind. Ist in meinem Job eben gerade eine sehr grosse Sache um diesen neuen Dingen wieder zu entsprechen, weil da unterdessen ganz massive juristische Dinge mit verbunden sind.

Vielen Dank für den Flow ich muss mir das mal genau anschauen und versuchen zu begreifen.

Das mit den Temperaturfühler habe ich mir auch überlegt ob ich die im IOB einfach “weiterleiten” soll. Aber dann sind die beiden System eben wieder im grossen Masse von einander abhängig, genau das möchte ich nicht. Die System sollen beide ihren Dienst möglichst autonom tun, so ist das eine für die Energieversorgung (Strom und Wärme) und das andere für den Komfort zuständig.

Das ESPEasy kenne ich gar nicht, muss ich mir mal anschauen. ESPHome nutze ich eben eigentlich nur weil es mit, für mich, relativ einfachen Mitteln brauchbare Resultate liefert. Da ich aus dem Handwerk komme, und nie gelernt habe “echte” Software zu schreiben, bin ich ganz froh wenn ein Tool mir das abnimmt. Vor langer Zeit habe ich mich mal mit einem Arduino und deren IDE versucht, bin aber gescheitert mit wirklich was brauchbares damit zu machen.

denke es geht da bei Venus / Raspi gar nicht mal um Sicherheit, denen ist das einfach über den Kopf gewachsen

Ich hatte z.B. am Raspi ein Touchdisplay, damit lässt sich nur noch die GUI V1 darstellen, V2 geht nur mit dem Cerbo - und das ist sicher kein Problem der Rechenleistung

Ich würde wenn dann ide Temperatursensoren nicht in IOB weiterleiten sondern sie mir direkt in Venus mit Node Red holen?

Du nutzt damit dann hierfür nur noch den MQTT-Broker des IOB-Systems - so ist es schon etwas autarker?

Ich finde es zugegeben eh unglücklich das man mit Venus und sonstigen Systemen 2 MQTT-Broker hat

schau Dir gerne mal ESPEasy an - hier ein paar Screenshots

die Steuerung hier reagiert direkt auf den Hauszähler per MQTT, kann aber auch mittels Taster im Notfall auf 0/1/2/3kW umgestellt werfen

Zusätzlich als Gimmick eine 7Segment-Anzeige zum Anzeigen des Zustands

Ich hole mir hier jede Minute einen Wert, wenn 3 x in Folge über X Watt Heizstab auf Stufe Y an

zusätzlich ist ein S0-Zähler drin um den wirklichen Verbrauch zu messen

so sieht z.B. die Programmierung in ESEasy aus:

So weit ich weiß fehlt dem rPi die dafür nötige HW Beschleunigung.
Über einen externen Bildschirm (also nicht per HDMI angeschlossen), sprich die Remotekonsole auf Smartphone/Tablet/Laptop, kann die neue GUI anzeigen, weil da das Venus nur die Rohdaten per MQTT schickt und die GUI auf dem Endgerät berechnet/dargestellt wird.

Ich glaube nicht, das Victron aktiv gegen die Open Source Community programmiert, diese hat über die letzten Jahre auch viel zur Entwicklung/Verbesserung der Software beigetragen.
Victron fokussiert sich aber bei der Entwicklung auf die eigene Produktpalette, da wird auf bestehende Drittsoftware keine Rücksicht genommen, aber das ist schon immer so und kann man aber auch nicht erwarten.
Neue Funktionen im Venus OS könne bestehende Fremdsoftware beeinflussen oder unbrauchbar machen.