Victron + Node Red - Seite 2
23.3.2023
-19.6.2026
44 Antworten
8 Autoren
|
|
||
|
so nur zur Info, die settings müssen hier settings-user.js benannt werden und müssen das module.experts = beinhalten und nur eben die Änderungen die man haben will (in meinen Fall das contextStorage) |
||
|
||
|
@Puitl Also wenn deine DVCC Ladestrombegrenzung = deaktiviert bedeutet das du /Settings/SystemSetup/MaxChargeCurrent auf 0 setzten willst oder eben auf 200 und im anderen Fall auch auf einen fixen Wert dann hätte ich glaub ich alles zusammen wie es funktionieren könnte |
||
|
||
|
So und mein PRoblem hab ich auch gelöst, ich habe ienfach einen MQTT Input vom victron selbst auf einen virtuellen neu erfunden Namen, der wert dann im ConextStorage file gespeichert und fertig, bei Änderung der PV oder des Verbrauches kann ich dann drauf reagieren (hoffe ich das dann auch alles so funkt :) ) |
||
|
||
|
So nach 3 Jahren widme ich mich mal wieder meinem Wunsch warum ich diesen Thread erstellt habe: Möchte in Node-Red folgendes umsetzen: Wenn "Grid-lost/MP im Inverter-Betrieb" > "DVCC Ladestrombegrenzung CCL = 200A" (Habe CCL im Sommer immer auf 0A damit nur die MPPT MPPT [Maximum Power Point Tracker]´s den Akku laden (DC-feed-In ist aktiv), im Inselmodus würde er mir bei CCL 0A dann eben nicht mehr laden) Passt das so? Was passiert wenn er vom Inverter-Modus wieder draußen ist? Kann ich dann selbst wieder einen belibigen CCL per Remote-Konsole setzen? Und: Was wären die Schritte danach um den Code zu "aktivieren"? Danke 😀 |
||
|
||
|
Ich verwende die ganzen Drag&Drop-Nodes im NR nicht, aber mit einem Funktionsnode ist sowas ein etwas erweiterter Einzeiler 😉 Lässt sich auch mit ChatGPT super umsetzen wenn du mit der Syntax nicht so gut drauf bist Also du möchtest: WENN Status == 9 CCL = 200A SONST CCL = 0A und jedesmal wenn sich daran was ändert soll er entsprechend umschalten ? |
||
|
||
|
Fürs Erste möchte ich WENN Status == 9 CCL = 200A Wen außerhalb Status == 9 möchte ich den CCL selbst setzen wie ich will |
||
|
||
|
ich mach sowas einfach in einem Function-Node ![]() und in dem steht drinnen: d.h. wenn von links der Wert 9 daherkommt setzt er den auf 200 und schickt in rechts wieder raus "msg.payload" ist der Default-Wert in den Objekten die da in Node-Red herumgeschickt werden ACHTUNG: Die Logik schießt JEDESMAL wenn von links ein 9er daherkommt |
||
|
||
|
Sehr cool danke dir! Danach braucht man nur mehr oben auf "Übernahme (deploy) > vollständig" und das Ding ist aktiv? |
||
|
||
|
genau extrem hilfreich ist das verwenden von DebugNodes - die kannst überall (an jeden ausgang) dazu dranhängen und siehst dann rechts in dem Debug Tab was da genau an Daten hin und hergeschickt wird |
||
|
||
|
Den Debug setze ich zum testen ANSTELLE des "Venus settings"? |
||
|
||
|
nein, den hängst du einfach parallel dazu - dann schickt er das Datenobjekt einmal in die Venus Settings und einmal in den Debugger und zeigt dir was er in die Venus Settings geschickt hat :) EDIT: Oder zum testen auch nur in den Debug .... da kannst du kreativ sein 😃 |
||
|
||
|
Ich würde noch 0 nehmen besser umdi 10. Denn beim CCL im Netzbetrieb zählt er dem mppt schon mit aber der mppt hält sich nicht daran, soll heißen wenn der mppt 10A liefert also rung 500W wird das Akku laden über AC blockiert. So unmgeht man die waren Meldung. Und sollten alle stricke bezüglich Insel nicht Funktionen Läd der Akku wenigstens mit 500W. |
||
|
||
|
Gerade getestet, funktioniert danke 😀 Nächste Stufe: Wenn er wieder weggeht vom Inverter-Betrieb (also alles ungleich 9) > CCL = jener Wert der davor drin stand. Sprich der letzte Wert davor müsste wo gespeichert werden. Das ist schon etwas schwieriger oder? 🙈 |
||
|
||
|
nein, ist dann ein Zweizeiler 😁 das geht nur dann nicht ganz auf wenn der Cerbo zwischendurch mal neu gestartet wurde oder sich selbst gestartet hat, dann geht der gespeicherte Wert verloren (bzw. hab ich noch keine Lösung dafür irgendwas persistent im Dateisystem zu speichern ... aber ehrlich gesagt auch noch nicht wirklich danach gesucht) |
||
|
||
|
Um einen Wert in den Speicher zu legen nimmst du dieses Kommando: global.set("NameDesWertes",10); damit speichert du den Wert in den Kontextdaten unter "global" (geht mit node und flow äquivalent) ![]() Beispiel um einen Wert aus msg.payload zu speichern: global.set("CCL.AlterWert",msg.payload); mit Punkten kannst du mehrere Ebenen ansprechen z.b. CCL CCL.AlterWert CCL.AlterWert.Test CCL.AlterWert.Prod etc. um genau diesen Wert wieder auszulesen nimmst du dann z.B.: msg.payload = global.get("CCL.AlterWert"); ich hoffe das ist so logisch umzusetzen wie es für mich zu schreiben ist 😌 |
||
|
||
[ { "id": "be4ee0e1a9a64797", "type": "inject", "z": "127c36459fe4709f", "name": "", "props": [ { "p": "payload" }, { "p": "topic", "vt": "str" } ], "repeat": "", "crontab": "", "once": false, "onceDelay": 0.1, "topic": "", "payload": "9", "payloadType": "num", "x": 150, "y": 1760, "wires": [ [ "d61dcbc6f05ee641" ] ] }, { "id": "d61dcbc6f05ee641", "type": "switch", "z": "127c36459fe4709f", "name": "Erster Ausgang wenn zahl 9 sonst zweiter ausgang", "property": "payload", "propertyType": "msg", "rules": [ { "t": "eq", "v": "9", "vt": "num" }, { "t": "else" } ], "checkall": "true", "repair": false, "outputs": 2, "x": 470, "y": 1800, "wires": [ [ "1f14eea098e98ff5" ], [ "1d01d3e025d23d58" ] ] }, { "id": "fcfbc9f695dff9ba", "type": "inject", "z": "127c36459fe4709f", "name": "", "props": [ { "p": "payload" }, { "p": "topic", "vt": "str" } ], "repeat": "", "crontab": "", "once": false, "onceDelay": 0.1, "topic": "", "payload": "1", "payloadType": "num", "x": 150, "y": 1800, "wires": [ [ "d61dcbc6f05ee641" ] ] }, { "id": "6d3b0a99543822e1", "type": "inject", "z": "127c36459fe4709f", "name": "", "props": [ { "p": "payload" }, { "p": "topic", "vt": "str" } ], "repeat": "", "crontab": "", "once": false, "onceDelay": 0.1, "topic": "", "payload": "10", "payloadType": "num", "x": 150, "y": 1840, "wires": [ [ "d61dcbc6f05ee641" ] ] }, { "id": "1f14eea098e98ff5", "type": "change", "z": "127c36459fe4709f", "name": "setze 0 wenn zahl 9", "rules": [ { "t": "set", "p": "payload", "pt": "msg", "to": "0", "tot": "num" } ], "action": "", "property": "", "from": "", "to": "", "reg": false, "x": 790, "y": 1780, "wires": [ [ "5236ef2473f8d3e4" ] ] }, { "id": "1d01d3e025d23d58", "type": "change", "z": "127c36459fe4709f", "name": "setze 200 wenn wert nicht 9", "rules": [ { "t": "set", "p": "payload", "pt": "msg", "to": "200", "tot": "num" } ], "action": "", "property": "", "from": "", "to": "", "reg": false, "x": 820, "y": 1820, "wires": [ [ "5236ef2473f8d3e4" ] ] }, { "id": "5236ef2473f8d3e4", "type": "debug", "z": "127c36459fe4709f", "name": "debug 23", "active": true, "tosidebar": true, "console": false, &n |
||
|
||
|
Wennst ohne Funktionnode auskommen willst. Strg+I dann kannst den Code importieren in Node Red. |
||
|
||
|
[{"id":"be4ee0e1a9a64797","type":"inject","z":"127c36459fe4709f","name":"","props":[{"p":"payload"},{"p":"topic","vt":"str"}],"repeat":"","crontab":"","once":false,"onceDelay":0.1,"topic":"","payload":"9","payloadType":"num","x":150,"y":1760,"wires":[["d61dcbc6f05ee641"]]},{"id":"d61dcbc6f05ee641","type":"switch","z":"127c36459fe4709f","name":"Erster Ausgang wenn zahl 9 sonst zweiter ausgang","property":"payload","propertyType":"msg","rules":[{"t":"eq","v":"9","vt":"num"},{"t":"else"}],"checkall":"true","repair":false,"outputs":2,"x":470,"y":1800,"wires":[["1f14eea098e98ff5"],["1d01d3e025d23d58"]]},{"id":"fcfbc9f695dff9ba","type":"inject","z":"127c36459fe4709f","name":"","props":[{"p":"payload"},{"p":"topic","vt":"str"}],"repeat":"","crontab":"","once":false,"onceDelay":0.1,"topic":"","payload":"1","payloadType":"num","x":150,"y":1800,"wires":[["d61dcbc6f05ee641"]]},{"id":"6d3b0a99543822e1","type":"inject","z":"127c36459fe4709f","name":"","props":[{"p":"payload"},{"p":"topic","vt":"str"}],"repeat":"","crontab":"","once":false,"onceDelay":0.1,"topic":"","payload":"10","payloadType":"num","x":150,"y":1840,"wires":[["d61dcbc6f05ee641"]]},{"id":"1f14eea098e98ff5","type":"change","z":"127c36459fe4709f","name":"setze 0 wenn zahl 9","rules":[{"t":"set","p":"payload","pt":"msg","to":"0","tot":"num"}],"action":"","property":"","from":"","to":"","reg":false,"x":790,"y":1780,"wires":[["5236ef2473f8d3e4"]]},{"id":"1d01d3e025d23d58","type":"change","z":"127c36459fe4709f","name":"setze 200 wenn wert nicht 9","rules":[{"t":"set","p":"payload","pt":"msg","to":"200","tot":"num"}],"action":"","property":"","from":"","to":"","reg":false,"x":820,"y":1820,"wires":[["5236ef2473f8d3e4"]]},{"id":"5236ef2473f8d3e4","type":"debug","z":"127c36459fe4709f","name":"debug 23","active":true,"tosidebar":true,"console":false,"tostatus":false,"complete":"false","statusVal":"","statusType":"auto","x":1060,"y":1780,"wires":[]}] |
||
|
||
|
Ich kaper mal den Thread ein wenig. Seit ein paar Monaten rennt mein Neuronales Netz (https://www.energiesparhaus.at/forum-openmeteo/84360_3) für die PV Vorhersage. Für die Entladung über Nacht gibt's 2 Zeiträume (März-Oktober): 18:15 - 6:00 und 6:00 - 18:15. Über influxdb hole ich mir um 18:15 die Daten für Morgen aus der Datenbank und errechne mir meinen SOC Floor: var rows = Array.isArray(msg.payload) ? msg.payload : []; Wenn die Prognose mehr als 10kW Maximalpeak UND über den Gesamten Tag mehr als 70kWh (doppelte Batterie) ansagt, dann ist der Ziel-SOC bei 20%, sonst bei 30%. Mit den Werten spiele ich grad noch. Gefühlsmäßig werde ich hier auf 15 / 40 % gehen und die maxKW / energykWh nochmal anpassen auf 6 / 50 Dann nimmt eine Funktion den Floor und wurstet weiter: var floor = flow.get('floor'); Adleraugen sehen gleich: die letzten 10% vor dem Floor entlade ich nur mehr mit 1kw ins Netz Die ganzen Logiken münden in einen einfachen Grid-Setpoint: -2000W von 18:15 - 6:00, die letzten 10% davon mit -1000. Dann über den ganzen Tag -20 (wenn hier was von der PV kommt, speist die natürlich weiter und mehr ein). Die -20 stellen nur sicher, dass ich nichts vom Netz beziehe, ein 0er Setpoint funktioniert mäßig. Zusätzlich sperre ich ab 18uhr das Laden der Batterie, lade sie ab 6 Uhr früh mit maximal 50A bis 10 Uhr Vormittag. Dann mit 150A. Sämtliche anderen Spielereien wie Temperatur, Netzausfall, Alarme, Überspannungen, Frequenzen usw. hab ich als systemd Überwachung laufen mit Push-Benachrichtigung. Auf Node Red läuft derzeit nur das. Das Neuronale Netz läuft mittlerweile ganz gut... Auf kWh über den Tag bezogen: |err| ≤ 5 kWh: 55.0% |err| ≤ 10 kWh: 80.2% |err| ≤ 15 kWh: 93.5% An klaren, sonnigen Tagen liegt mein R² bei 0.995 - bei wechselhaftem / trüben Wetter bei 0.82 (und hier überschätzt es noch viel) |
||
|
||
|
sehr cool 🙂👍 schreibst du das alles eigentlich alles selbst oder ist das Vibe-gecodet ? |
||
|
||
|
bin kein Programmierer ;) all meine Sachen erledigt der Agent - für alltägliche Dinge, Recherche, Infos, usw die nicht unbedingt richtig sein müssen hab ich "meine" KI privat laufen (QW3.6-35B-A3B) in Verbindung mit AgentZero und Sprachsteuerung - den ruf ich im Prinzip mitm Handy an, sag ihm was ich brauche und der macht dann. Fehlersuche, Qualitätskontrolle, Debuggen, Testläufe, usw macht er alles von allein. Ich bekomm das fix fertige Produkt zum drüberschauen und beim Kommando "deploy and commit" schreibt ers in sein Git und kümmert sich um die Installation am Server. Für die wichtigen Dinge (die auch auf Anhieb richtig sein sollen und nicht die halbe Nacht brauchen dürfen) hab ich Claude Code mit Opus 4.8, leider haben sie Fable 5 abgedreht....der wär um längen besser. |
Beitrag schreiben / Werbung ausblenden?
Einloggen
Kostenlos registrieren [Mehr Infos]









