Victron Überschuss Solar in Heizstab/Heizpatrone Das ganze Projekt

Hallo Zusammen,

da ich hier schon Wochen verbracht habe um mir das Wissen für dieses Projekt anzueignen, möchte ich auch etwas zurück geben und das ganze Projekt mit euch teilen:

Es geht darum den Überschussstrom in einen Heizstab/Heizpatrone zu schicken, bevor die MPPTs die Leistung runter regeln und dies ohne Unsummen auszugeben.

Der Heizstab hat jeweils 1KW an L1/2/3 und an jedem hängt ein Shelly 1pluspm.

Das ganze wird nicht mit dem genauen Überschuss gespeist sonder, bei einem Akku Stand von 100%(>99.9) geht Shelly L1 an und löst für Shelly L2 eine Wartezeit von 5 Minuten aus. Nach diesen 5 Minuten schaut Shelly L2 ob der Akku immer noch auf 100% ist und schaltet dann den Shelly L2 ein. Dies löst wiederum 5 Minuten Wartezeit für Shelly L3 aus. Dieser schaut dann wieder nach ob der Akku immer noch 100% hat und geht dann an.

So ist gewährleistet, das der Akku nicht unnötig leergesaugt wird. Sollte Shelly L2 bei der Prüfung nach 5 Minuten feststellen das der Akku keine 100% mehr hat, geht er erst gar nicht an.

Nun zum Abschalten:

Shelly L3 geht bei <99.8 aus

Shelly L2 geht bei <99.6 aus

Shelly L1 und falls noch einer manuell an sein sollte, gehen alle spätestens bei <99.1 aus.

Der Heizstab/Heizpatrone ist ein (weil kein anderer in meinen Tank passte)

Elektro-Heizpatrone Triatherm 3.0 kW 1 1/2" AG 230/400V

3x Shelly 1plusPM

und natürlich Node Red über meinem Cerbo GX

Die Steuerung mit Node Red:

Hier findet ihr den passenden Flow zum Import: (die IPs von den Shellys müsst ihr natürlich noch ändern)

[
{
"id": "c81232e966713e6f",
"type": "tab",
"label": "Flow 1",
"disabled": false,
"info": "",
"env": []
},
{
"id": "1559ad8c8e9f96c0",
"type": "victron-input-battery",
"z": "c81232e966713e6f",
"service": "com.victronenergy.battery/277",
"path": "/Soc",
"serviceObj": {
"service": "com.victronenergy.battery/277",
"name": "Batterie"
},
"pathObj": {
"path": "/Soc",
"type": "float",
"name": "State of charge (%)"
},
"initial": "",
"name": "",
"onlyChanges": true,
"roundValues": "2",
"x": 240,
"y": 40,
"wires": [
[
"5828d9f2b01e198d",
"dac2235f8e5a0ba4",
"234e4f489368fab0",
"17640f671806d38b",
"9ca6066b4571bc07"
]
]
},
{
"id": "e05ab10f5e055738",
"type": "shelly-gen2",
"z": "c81232e966713e6f",
"hostname": "192.168.178.x",
"description": "Heizpatrone L1 192.168.178.x",
"mode": "polling",
"server": "",
"outputmode": "event",
"uploadretryinterval": 5000,
"pollinginterval": 5000,
"pollstatus": true,
"getstatusoncommand": true,
"devicetype": "Relay",
"outputs": 1,
"credentials": {
"password": ""
},
"x": 730,
"y": 300,
"wires": [
[
"cb0dabf15d65b04c",
"37b3cea6c9ca6c4b",
"9a6d5fc9be32674c"
]
]
},
{
"id": "f2d9bc63c69d0c5c",
"type": "inject",
"z": "c81232e966713e6f",
"d": true,
"name": "An/Aus",
"props": [
{
"p": "payload"
},
{
"p": "topic",
"vt": "str"
}
],
"repeat": "",
"crontab": "",
"once": false,
"onceDelay": 0.1,
"topic": "",
"payload": "",
"payloadType": "date",
"x": 640,
"y": 220,
"wires": [
[
"21f9786961cb2fcf"
]
]
},
{
"id": "21f9786961cb2fcf",
"type": "function",
"z": "c81232e966713e6f",
"d": true,
"name": "0 toggle",
"func": "msg.payload = {\n    method: \"Switch.Toggle\",\n    parameters : {\n        id : 0,\n    }\n};\nreturn msg;\n",
"outputs": 1,
"noerr": 0,
"initialize": "",
"finalize": "",
"libs": [],
"x": 770,
"y": 220,
"wires": [
[
"e05ab10f5e055738"
]
]
},
{
"id": "5828d9f2b01e198d",
"type": "function",
"z": "c81232e966713e6f",
"name": "SOC ueber 99.9 an",
"func": "if(msg.payload > 99.9) \nmsg.payload = {\n    method: \"Switch.Set\",\n    parameters : {\n        id : 0,\n        on : true,\n    }\n};\nreturn msg;",
"outputs": 1,
"noerr": 0,
"initialize": "",
"finalize": "",
"libs": [],
"x": 480,
"y": 300,
"wires": [
[
"8be1886439da1b25",
"e05ab10f5e055738"
]
]
},
{
"id": "dac2235f8e5a0ba4",
"type": "function",
"z": "c81232e966713e6f",
"name": "SOC unter 99.1 aus",
"func": "if(msg.payload < 99.1) \nmsg.payload = {\n    method: \"Switch.Set\",\n    parameters : {\n        id : 0,\n        on : false,\n    }\n};\nreturn msg;",
"outputs": 1,
"noerr": 0,
"initialize": "",
"finalize": "",
"libs": [],
"x": 220,
"y": 140,
"wires": [
[
"e05ab10f5e055738",
"aa0d0dc467d23f0b",
"577b791f6994a584"
]
]
},
{
"id": "aa0d0dc467d23f0b",
"type": "shelly-gen2",
"z": "c81232e966713e6f",
"hostname": "192.168.178.x",
"description": "Heizpatrone L2 192.168.178.x",
"mode": "polling",
"server": "",
"outputmode": "event",
"uploadretryinterval": 5000,
"pollinginterval": 5000,
"pollstatus": true,
"getstatusoncommand": true,
"devicetype": "Relay",
"outputs": 1,
"credentials": {
"password": ""
},
"x": 730,
"y": 420,
"wires": [
[
"41c21769c4958ef2",
"08c1b0665d2e5716",
"1b68cbc942f80e75"
]
]
},
{
"id": "577b791f6994a584",
"type": "shelly-gen2",
"z": "c81232e966713e6f",
"hostname": "192.168.178.x",
"description": "Heizpatrone L3 192.168.178.x",
"mode": "polling",
"server": "",
"outputmode": "event",
"uploadretryinterval": 5000,
"pollinginterval": 5000,
"pollstatus": true,
"getstatusoncommand": true,
"devicetype": "Relay",
"outputs": 1,
"credentials": {
"password": ""
},
"x": 730,
"y": 560,
"wires": [
[
"ff25626930298154",
"f5bd91519ac11eef",
"7ad20a85b9ead491"
]
]
},
{
"id": "8be1886439da1b25",
"type": "delay",
"z": "c81232e966713e6f",
"name": "Verzögerung 5 Minuten",
"pauseType": "delay",
"timeout": "5",
"timeoutUnits": "minutes",
"rate": "1",
"nbRateUnits": "1",
"rateUnits": "second",
"randomFirst": "1",
"randomLast": "5",
"randomUnits": "seconds",
"drop": false,
"allowrate": false,
"outputs": 1,
"x": 230,
"y": 420,
"wires": [
[
"f2b1be58bc1499ad",
"5565c21418edd772"
]
]
},
{
"id": "f2b1be58bc1499ad",
"type": "function",
"z": "c81232e966713e6f",
"name": "SOC ueber 99.9 an",
"func": "if(msg.payload > 99.9) \nmsg.payload = {\n    method: \"Switch.Set\",\n    parameters : {\n        id : 0,\n        on : true,\n    }\n};\nreturn msg;",
"outputs": 1,
"noerr": 0,
"initialize": "",
"finalize": "",
"libs": [],
"x": 480,
"y": 420,
"wires": [
[
"aa0d0dc467d23f0b"
]
]
},
{
"id": "5565c21418edd772",
"type": "delay",
"z": "c81232e966713e6f",
"name": "Verzögerung 5 Minuten",
"pauseType": "delay",
"timeout": "5",
"timeoutUnits": "minutes",
"rate": "1",
"nbRateUnits": "1",
"rateUnits": "second",
"randomFirst": "1",
"randomLast": "5",
"randomUnits": "seconds",
"drop": false,
"allowrate": false,
"outputs": 1,
"x": 230,
"y": 560,
"wires": [
[
"46fee130a9cae3f7"
]
]
},
{
"id": "46fee130a9cae3f7",
"type": "function",
"z": "c81232e966713e6f",
"name": "SOC ueber 99.9 an",
"func": "if(msg.payload > 99.9) \nmsg.payload = {\n    method: \"Switch.Set\",\n    parameters : {\n        id : 0,\n        on : true,\n    }\n};\nreturn msg;",
"outputs": 1,
"noerr": 0,
"initialize": "",
"finalize": "",
"libs": [],
"x": 480,
"y": 560,
"wires": [
[
"577b791f6994a584"
]
]
},
{
"id": "234e4f489368fab0",
"type": "debug",
"z": "c81232e966713e6f",
"d": true,
"name": "Batterie",
"active": true,
"tosidebar": true,
"console": false,
"tostatus": false,
"complete": "payload",
"targetType": "msg",
"statusVal": "",
"statusType": "auto",
"x": 930,
"y": 40,
"wires": []
},
{
"id": "08c1b0665d2e5716",
"type": "debug",
"z": "c81232e966713e6f",
"d": true,
"name": "L2",
"active": true,
"tosidebar": true,
"console": false,
"tostatus": false,
"complete": "payload.switch0.apower",
"targetType": "msg",
"statusVal": "",
"statusType": "auto",
"x": 1120,
"y": 400,
"wires": []
},
{
"id": "ff25626930298154",
"type": "debug",
"z": "c81232e966713e6f",
"d": true,
"name": "L3",
"active": true,
"tosidebar": true,
"console": false,
"tostatus": false,
"complete": "payload.switch0.apower",
"targetType": "msg",
"statusVal": "",
"statusType": "auto",
"x": 1120,
"y": 540,
"wires": []
},
{
"id": "cb0dabf15d65b04c",
"type": "ui_text",
"z": "c81232e966713e6f",
"group": "c3b48c626f49884a",
"order": 1,
"width": 0,
"height": 0,
"name": "",
"label": "L1",
"format": "{{msg.payload.switch0.apower}}",
"layout": "row-spread",
"className": "",
"x": 1120,
"y": 320,
"wires": []
},
{
"id": "41c21769c4958ef2",
"type": "ui_text",
"z": "c81232e966713e6f",
"group": "c3b48c626f49884a",
"order": 3,
"width": 0,
"height": 0,
"name": "",
"label": "L2",
"format": "{{msg.payload.switch0.apower}}",
"layout": "row-spread",
"className": "",
"x": 1120,
"y": 440,
"wires": []
},
{
"id": "f5bd91519ac11eef",
"type": "ui_text",
"z": "c81232e966713e6f",
"group": "c3b48c626f49884a",
"order": 5,
"width": 0,
"height": 0,
"name": "",
"label": "L3",
"format": "{{msg.payload.switch0.apower}}",
"layout": "row-spread",
"className": "",
"x": 1120,
"y": 580,
"wires": []
},
{
"id": "37b3cea6c9ca6c4b",
"type": "debug",
"z": "c81232e966713e6f",
"d": true,
"name": "L1",
"active": true,
"tosidebar": true,
"console": false,
"tostatus": false,
"complete": "payload.switch0.apower",
"targetType": "msg",
"statusVal": "",
"statusType": "auto",
"x": 1120,
"y": 280,
"wires": []
},
{
"id": "9a6d5fc9be32674c",
"type": "ui_text",
"z": "c81232e966713e6f",
"group": "c3b48c626f49884a",
"order": 2,
"width": 0,
"height": 0,
"name": "",
"label": "Shelly Temp",
"format": "{{msg.payload.switch0.temperature.tC}} C",
"layout": "row-spread",
"className": "",
"x": 1140,
"y": 360,
"wires": []
},
{
"id": "1b68cbc942f80e75",
"type": "ui_text",
"z": "c81232e966713e6f",
"group": "c3b48c626f49884a",
"order": 4,
"width": 0,
"height": 0,
"name": "",
"label": "Shelly Temp",
"format": "{{msg.payload.switch0.temperature.tC}} C",
"layout": "row-spread",
"className": "",
"x": 1140,
"y": 480,
"wires": []
},
{
"id": "7ad20a85b9ead491",
"type": "ui_text",
"z": "c81232e966713e6f",
"group": "c3b48c626f49884a",
"order": 6,
"width": 0,
"height": 0,
"name": "",
"label": "Shelly Temp",
"format": "{{msg.payload.switch0.temperature.tC}} C",
"layout": "row-spread",
"className": "",
"x": 1140,
"y": 620,
"wires": []
},
{
"id": "9ca6066b4571bc07",
"type": "function",
"z": "c81232e966713e6f",
"name": "SOC unter 99.6 aus",
"func": "if(msg.payload < 99.6) \nmsg.payload = {\n    method: \"Switch.Set\",\n    parameters : {\n        id : 0,\n        on : false,\n    }\n};\nreturn msg;",
"outputs": 1,
"noerr": 0,
"initialize": "",
"finalize": "",
"libs": [],
"x": 360,
"y": 360,
"wires": [
[
"aa0d0dc467d23f0b"
]
]
},
{
"id": "17640f671806d38b",
"type": "function",
"z": "c81232e966713e6f",
"name": "SOC unter 99.8 aus",
"func": "if(msg.payload < 99.8) \nmsg.payload = {\n    method: \"Switch.Set\",\n    parameters : {\n        id : 0,\n        on : false,\n    }\n};\nreturn msg;",
"outputs": 1,
"noerr": 0,
"initialize": "",
"finalize": "",
"libs": [],
"x": 360,
"y": 500,
"wires": [
[
"577b791f6994a584"
]
]
},
{
"id": "c3b48c626f49884a",
"type": "ui_group",
"name": "Warmwasser",
"tab": "c2f603e5.e52fe",
"order": 4,
"disp": true,
"width": "6",
"collapse": false,
"className": ""
},
{
"id": "c2f603e5.e52fe",
"type": "ui_tab",
"name": "ESS",
"icon": "dashboard",
"order": 2,
"disabled": false,
"hidden": false
}
]

Diese Shelly Palette und diese Victron Palette muss noch installiert werden:

Ich hoffe ich habe nichts vergessen und es kann jemanden weiterhelfen.

Lieben Gruß

René

5 „Gefällt mir“

finde deine Idee prinzipiell gut.

Ich kenne jetzt nodeRed nicht so gut, aber was passiert, wenn deine Shellys alle an sind und das WLan wegbricht? Wenn ich den Flow richtig interpretiere, dann wird dein Heizstab das Akku leer saugen, oder?

Hier kann man die shelly doch als "Treppenlichtautomat" mit timeout einstellen, das NodeRed muss dann nur dafür sorgen, das die shelly immer wieder on gesetzt werden (timeout startet dann frisch)

@lenny-cb

Hi,

da hast du Recht. Allerdings ist der Heizstab mit einem Temperatur Sensor ausgestattet und schaltet dann ab.

Die Shellys bleiben zwar an, aber zeihen nichts mehr. Außerdem gehen die Shellys spätestens bei SOC <99.1 alle aus.

ohne WLAN eben nicht, würd ich meinen. Denn woher soll der Shelly das wissen ohne Kommunikation?

@lenny-cb

Jetzt habe ich verstanden was du meinst.

Allerdings würde er den Stab dann ja immer nach der Zeit abschalten.

Zur Zeit laufen ab mittags wenn der Akku voll ist zwei Schlangen dauerhaft bis die Temperatur erreicht ist.

Die dritte schaltet sich immer mal zu und dann wieder ab.

Da mein Wlan sehr stabil ist, und ich im Moment nicht wüste was da die richtige Zeitspanne ist, probiere ich es erstmal so.

Doofe Frage, warum nicht den Relaisassistenten auf dem Multiplus für ac2 nutzen, z.b. oberhalb 95% an, unterhalb 90% Soc aus - ohne zusätzliche Geräte und Fehlerquellen zu machen - die Mppt regeln dann nicht runter, solange das Thermostat im Heizstab an ist!

1 „Gefällt mir“

Ich hänge mich hier mal ran.

Kann ich über die Relais vom CERBO GX die SG-Schnittstelle meiner Wärmepumpe ansteuern? DIE Wärmepumpe braucht ja nur ein Signal und schaltet dann intern ein Relais um die Temperatur zu erhöhren. Cerbo Relais sollte dann potenialfrei schalten, wenn ich das richtig verstehe.
Grüße

Ben

Ja natürlich, das geht. Relais-Assistenten installieren, geeignetes Relais und Bedingungen entsprechend auswählen, und schon geht's los.

Und vielen Dank an @mamaplatzda für die node-red Tipps. War mir sehr hilfreich. ?

Hi,

meines Wissens lassen sich beim Multiplus2, wenn 3 als ESS eingerichtet sind, dieser Assistent nicht mehr nutzen.

Hänge das WLAN doch an den Notstrom, dann hast Du immer WLAN solange noch Energie in der Batterie.

Ich nutze auch einen 3 Kw Heizstab um das Warmwasser zu erwärmen und die Heizung auszulassen im Sommer. Meiner geht um 4 Uhr an und um 6 Uhr aus und startet dann wieder um 9 Uhr bis 19 Uhr. Nach meiner Erfahrung, braucht er mind. 2 Std. um die 200 Liter hoch zu heizen und wenn Du deinen dann nur so eingeschränkt nutzt, wird dann das Wasser überhaupt warm? Wie sieht es mit der Haltbarkeit des Heizstabes aus wenn du nur 1 Phase von den 3 befeuerst? Ist ja schließlich ein 400V Drehstrom-Gerät und auch dafür gebaut. Ich sehe das kritisch, nicht umsonst gibt es Heizpatronen welche von 500-3000 Watt stufenlos angesteuert werden können, aber auch 3 mal so teuer sind. Ich steuere meinen mit einem einfachen Sonoff welcher das Schütz steuert. Ich wollte auch keine 1000€ ausgeben und bin deshalb interessiert wie das ein erfahrener Elektiker oder Installateur sieht mit deiner Steuerung auf jeweils einer Phase. Ebenso würde mich die Haltbarkeit interessieren. ?

Habe ESS am Acin laufen, Notstrom ac out1 und den ac2 Relaisassistenten genau wie oben beschrieben am laufen, geht einwandfrei

zum heizstab kurze info:

so ein heizstab besteht nur aus widerständen, eben den heizdrähten.

wenn da nur eine phase läuft bzw angeschlossen ist, dann liegt da nur 1x 240v an statt 3x 240v(bei dreieck-schaltung gar 400v).

was soll da also kaputt gehen können?

einzig der verschleiss wäre dann an der einen phasen geringst höher.

man kann übrigens die 3 phasen auch parallel schalten um unterm strich dann alle heizdrähte mit einer phase anzusteuern, wenn das die pv-anlage hergibt.

evtl dazu die ansteuerung am heizstab abklemmen, wenn da eine ist, gibt ja verschiedene heizstäbe.

Hi,

ich bin auch gerade dabei mein Haus komplett bzw. sowei ich selber kann etwas smarter zu machen.

Daher eine kurze frage....

Du schreibst oben das du alle 5 mintuen schaust ob die Batterie leer gezogen wird und reagierst entsprechend.....

Wäre es nicht einfacher zu ermitteln wieviel Strom du aktuell einspeist in das Stromnetz?

Ausgehend davon das deine Platten gerade 10 KWH machen.... Interner Hausverbauch 2 KWH + 2 KWH weil der akku gerade lädt..... würde bedeuten das du in diesem moment 6 KWH in das Netz einspeist.

Wenn du nun genau weist das du 6 KWH einspeist dann mach es doch davon abhängig......(Denn du willst den akku ja nicht belasten....)

Ich selber arbeite gerade so mit node red und meinen verbrauchern.

Am Stromzähler habe ich einen IR-Lesekopf dieser sagt mir jede Sekunde wieviel Strom ich in das netz einspeise.

Z.B. geht mein Outdoor-Sommer-Getränke-Kühlschrank an wenn ich eine Einspeisung von -200 Watt habe. Fällt die aktuelle einspeisung unter -50 geht der Kühlschrank aus.

(Der braucht zwar nur ca. 80 Watt aber somit geht er morgens wenn die Sonne gerade startet nicht 20 mal an und aus)

(Realisiert wirde das ganze mit einfachen Wlan Steckdosen)

Das ganze mache ich noch zusätzlich mit vielen weiteren Geräten.

Somit könntest du meiner Meinung nach den Akku schonen..... Oder?

Hi,

ich baue gerade bei einem Kumpel eine "light" Variante ein.

Was mir durch den Kopf geht:

Muss so ein Brauchwasserspeicher zirkulieren? nicht dass da ein Wärmestau am Heizstab passiert?!

Die Variante ist etwas abgespeckt. Shelly 3pro und bitshake am Stromzähler.

Mein Kumpel hat Rücksprache mit dem Heizungsbauer gehalten: Es ist kein Problem.

Huhu, ich bin mit etwas zeitlichem Delay auf diesen Thread gestoßen. Mag den Node Red Flow an sich, aber mir kommt dabei dennoch eine Frage in den Sinn:

Ich hab gerade, da es die Sonne ja seit einigen Wochen nicht ganz so gut mit uns meint, das Problem, dass mein SoC so gut wie nie bei auch nur ansatzweise 90% ankommt. Muss ich da jetzt kalt duschen? :winking_face_with_tongue:

Oder um es etwas ernsthafter zu machen: Müsste man nicht einmal am Tag nen Aufheizvorgang starten, der auf jeden Fall stattfindet? Entweder hat die Sonne vorher den SoC übers Limit gebracht und damit eh schon das Boiler laden ausgelöst, dann ist dieser eh warm und nimmt beim turnusmäßigen Aufladevorgang nix mehr auf. Oder halt nicht, aber dann wird wenigstens trotzdem das Wasser warm?

Nein das ist dafür gedacht im Sommer dein Warmwasser, dass z.B. noch durch eine Gastherme warm gemacht wird, stattdessen mit Solar Überschuss zu erhitzen.

So muss im Sommerhalbjahr diese nicht laufen und du sparst Gas bekommst aber im Gegenzug dafür weniger Einspeisevergütung.

Da die Lösung DIY eingebaut unter 400€ kostet ist dies auch wirtschaftlich machbar.

2 „Gefällt mir“

Alles klar. Zusätzliche Heizstäbe parallel zu einer sonst ohnehin laufenden Heizlösung. :slight_smile:

Werde mal versuchen, ob die Lösung mir dennoch was nutzt, auch wenn ich NUR mit den Heizstäben heize… Quasi ein Baustein, den ich jetzt noch durch andere ergänzen muss.

Klar das Prinzip is das gleiche.

Einfach den aktuellen Export ins Netz als Steuerungsparameter nehmen.

Wenn dieser > 1000W dann shelly 1 an, wenn immer noch > 1000W dann shelly 2, wenn immer noch >1000W dann shelly 3.

Und halt mit Hysterese das dies nicht jede Sekunde das Relais klickt.
Ausschalten Prüfung alle z.B. alle 10s, einschalten nur alle 5-10 Minuten.

1 „Gefällt mir“