Nulleinspeisung PV mit Node-Red

Moin Zusammen,

das ist hier genau das, was ich gesucht habe.
Ich stehe aber noch ganz am Anfang im Gegensatz zu anderen hier, deswegen hoffe ich dass ihr mir helfen könnt.

Meine Hardware:

  • hoymiles hm-1500
  • openDTU
  • shelly 3EM

Ich möchte eine Nulleinspeisung realisieren und wenn es funktioniert einen Speicher dazwischen bauen um den ĂŒber den ganzen Tag PV-Strom beziehen zu können.

Leider schaffe ich es nicht zum laufen zu bringen.
Liegt es evtl. an dem topic oder ist es etwas anders?
Wenn es am topic liegt, was muss ich dort genau eintragen?

Die Summe der drei Phasen habe ich auch noch nicht gemacht, aber zumindest eingetragen. Ich wollte es zum probieren erstmal so machen, aber dort hin ich dann fest, dass der Wechselrichter kein neues Limit bekommen hat.
Falls ihr mir sagen könnt, wie ich die Summe super leicht berechnen kann wÀre das auch wirklich klasse.

[{"id":"7bf3afac51a18e13","type":"tab","label":"PVNull","disabled":false,"info":"","env":[]},{"id":"2dacc22b5419c832","type":"mqtt out","z":"7bf3afac51a18e13","name":"WR MQTT","topic":"pv/cmd/116183058090/limit_nonpersistent_absolute","qos":"","retain":"","respTopic":"","contentType":"","userProps":"","correl":"","expiry":"","broker":"87b2d138566ff5cc","x":910,"y":160,"wires":[]},{"id":"018ba02f54239b1e","type":"inject","z":"7bf3afac51a18e13","name":"alle 10 sekunden","props":[{"p":"payload"},{"p":"topic","vt":"str"}],"repeat":"10","crontab":"","once":false,"onceDelay":0.1,"topic":"","payload":"","payloadType":"date","x":130,"y":160,"wires":[["e83cf29c442b64f3","6dc592f38a9c7439","b0cb0e39ee965e2e"]]},{"id":"992140f008964c0e","type":"function","z":"7bf3afac51a18e13","name":"Berechnung fĂŒr WR Limit","func":"// MAX generation of the inverter Watts\nvar maxPower = 1000;\n\n// Get current power limit or default\nvar power = context.get('power') || maxPower;\npower += msg.payload;\n\n// clamp power between 0 and max\nif (power > maxPower) power = maxPower;\nif (power < 10) power = 1;\n\n\n// store current powerlimit and update message\ncontext.set('power', power);\nmsg.payload = power;\n\nreturn msg;","outputs":1,"noerr":0,"initialize":"","finalize":"","libs":[],"x":650,"y":160,"wires":[["2dacc22b5419c832"]]},{"id":"e83cf29c442b64f3","type":"api-current-state","z":"7bf3afac51a18e13","name":"Leistung Phase 2","server":"864f5cad6b0c1ce0","version":3,"outputs":1,"halt_if":"","halt_if_type":"str","halt_if_compare":"is","entity_id":"sensor.shellyem3_485519d9e32f_channel_b_power","state_type":"num","blockInputOverrides":false,"outputProperties":[{"property":"payload","propertyType":"msg","value":"","valueType":"entityState"},{"property":"data","propertyType":"msg","value":"","valueType":"entity"}],"for":"0","forType":"num","forUnits":"minutes","override_topic":false,"state_location":"payload","override_payload":"msg","entity_location":"data","override_data":"msg","x":370,"y":160,"wires":[["992140f008964c0e"]]},{"id":"b0cb0e39ee965e2e","type":"api-current-state","z":"7bf3afac51a18e13","name":"Leistung Phasen 1","server":"864f5cad6b0c1ce0","version":3,"outputs":1,"halt_if":"","halt_if_type":"str","halt_if_compare":"is","entity_id":"sensor.shellyem3_485519d9e32f_channel_a_power","state_type":"num","blockInputOverrides":false,"outputProperties":[{"property":"payload","propertyType":"msg","value":"","valueType":"entityState"},{"property":"data","propertyType":"msg","value":"","valueType":"entity"}],"for":"0","forType":"num","forUnits":"minutes","override_topic":false,"state_location":"payload","override_payload":"msg","entity_location":"data","override_data":"msg","x":370,"y":80,"wires":[[]]},{"id":"6dc592f38a9c7439","type":"api-current-state","z":"7bf3afac51a18e13","name":"Leistung Phase 3","server":"864f5cad6b0c1ce0","version":3,"outputs":1,"halt_if":"","halt_if_type":"str","halt_if_compare":"is","entity_id":"sensor.shellyem3_485519d9e32f_channel_c_power","state_type":"num","blockInputOverrides":false,"outputProperties":[{"property":"payload","propertyType":"msg","value":"","valueType":"entityState"},{"property":"data","propertyType":"msg","value":"","valueType":"entity"}],"for":"0","forType":"num","forUnits":"minutes","override_topic":false,"state_location":"payload","override_payload":"msg","entity_location":"data","override_data":"msg","x":370,"y":240,"wires":[[]]},{"id":"87b2d138566ff5cc","type":"mqtt-broker","name":"","broker":"192.168.178.54","port":"1883","clientid":"","autoConnect":true,"usetls":false,"protocolVersion":"4","keepalive":"60","cleansession":true,"birthTopic":"","birthQos":"0","birthPayload":"","birthMsg":{},"closeTopic":"","closeQos":"0","closePayload":"","closeMsg":{},"willTopic":"","willQos":"0","willPayload":"","willMsg":{},"userProps":"","sessionExpiry":""},{"id":"864f5cad6b0c1ce0","type":"server","name":"Home Assistant","version":5,"addon":true,"rejectUnauthorizedCerts":true,"ha_boolean":"y|yes|true|on|home|open","connectionDelay":true,"cacheJson":true,"heartbeat":false,"heartbeatInterval":"5","areaSelector":"friendlyName","deviceSelector":"friendlyName","entitySelector":"friendlyName","statusSeparator":": ","statusYear":"hidden","statusMonth":"short","statusDay":"numeric","statusHourCycle":"default","statusTimeFormat":"h:m","enableGlobalContextStore":false}]

Vielen dank und sonnige GrĂŒĂŸe
Fabio

Moin Bjoernix,

hast du es inzwischen hin bekommen?
Ich will mir auch einen Speicher zulegen, wenn die Nulleinspeisung funktioniert.
Anstatt einer Ahoy-DTU habe ich eine OpenDTU und einen HM-1500, aber die funktion ist ja die gleiche.

Gruß Fabio

Moin Fabio,
ja tatsÀchlich funktioniert mein System ziemlich gut allerdings nicht perfekt. Ich hatte mich anfangs gewundert warum das System ziemlich stark schwingt - es sich also fast nie auf einen Wert einpendelt. Und dann hat sich hin und wieder der Wechselrichter auch abgemeldet und nach ca. 1h wieder eingeschaltet. Dann habe ich fest gestellt, dass der Wechselrichter (hm 600) selbst auch bei konstantem Limit im Ausgang schwankt. Somit kam das System nie zur Ruhe. Ich habe mich daher entschlossen die Phase auf der der eingespeist wird aus der Berechnung herauszunehmen - das ist bei mir kein Problem, da die allermeisten Verbraucher auf den anderen beiden Phasen liegen. Seitdem lÀuft das System ziemlich stabil und zuverlÀssig.

Gerne teile ich meine Code, allerdings mĂŒsste mir jemand verraten wie ich den Code so schön in einer Zeile reinkopieren kann (exportieren aus Node Red ist kein Problem
)
Gruß
Bjoernix

Moin Bjoernix,
den Code vom Flow kannst du als “Vorformatierter Text” einfĂŒgen.

@Fabio1
Bei der OpenDTU kommt das cmd im Sendebefehl nach der Seriennummer, sollte also so aussehen:
pv/116183058090/cmd/limit_nonpersistent_absolute

LL

Hi LL,
danke fĂŒr Deine Antwort, aber mit “Vorformartierter Text” kann ich nicht so richtig was anfangen. Ich kann alle “ENTER” Zeichen entfernen, aber dann nehme ich immer noch viel Text Platz ein. Eine genauere Beschreibung wĂ€re prima.
Gruß
Björn

Moin Bjoernix,
wenn du im Textfenster bist hast du in der oberen Leiste diverse Symbole fĂŒr die Formatierung (ist zumindest bei mir so - siehe Bild). Beim Klick auf das Symbol </> kannst du dann deinen vorher kopierten Flow als Text einfĂŒgen.

GrĂŒĂŸe
LL

1 „GefĂ€llt mir“

Dank Dir. Bei mir sieht es tatsÀchlich etwas anders aus, aber ich habe die Funktion hinter dem RÀdchen nun entdeckt.

Hallo Leute,
das funzt super. Vielen Dank. Eine Frage,
Ich habe das ganze Zeitgesteuert laufen weil sich zwei WR abwechseln. Einer von 06:00 bis 10:00 der andere von 10:00 bis 22:00. wie kann ich ersteren sagen er soll danach 10:00 mit max Power weitermachen? Er bleibt beim letzten Wert stehen um 10:00 bsp. 20%. Er soll aber ausserhalb der definierten Zeit 100/ fahren.

Schon mal vielen Dank

Moin DidiHH und willkommen an Board.
Setz doch einfach eine inject Node ein die mit tÀglicher Wiederholung ab 10:01 den WR auf 100% setzt.
Sollte m.E. funktionieren.

GrĂŒĂŸe
LL

Hallo Lucky,
vielen Dank. Kannst Du mir sagen wie der aussehen mĂŒsste? Bin noch recht frisch im NodeRed :wink:

Vielen Dank DidiHH

Moin DidiHH,
ich hatte mir das so vorgestellt:

inject_node_an_WR

GrĂŒĂŸe
LL

Hallo LL
Super, Danke teste ich mal aus.

@LuckyLuke
Moin LuckyLuke,

Danke dir.
Ich bin der Meinung, dass ich es auch genau so eingetragen hatte, aber ich habe es jetzt eingegeben und kann morgen mal schauen ob der Wechselrichter endlich einen neuen Wert bekommt.

Nachtrag:
@Bjoernix
Moin,

Deinen Code zum anschauen zu bekommen wÀre wirklich super.
Ich hatte meinen hier ganz einfach in das Nachrichtenfenster kopiert und es wurde dann automatisch in einer Zeile angezeigt (hatte vorher auch geschaut wie es geht und es dann einfach probiert :wink: )

Gruß Fabio

:crayon:by HarryP: ZusammenfĂŒhrung Doppelpost.
*@Fabio1 *
Bitte fĂŒr NachtrĂ€ge/Korrekturen die “bearbeiten” (geht 24h) Funktion verwenden. Danke!
DarĂŒber kannst Du auch mit “@”+User mehrer(n) andere(n) User(n) ansprechen/antworten (s.o.)

[    {        "id": "3e29bacbc9176f39",        "type": "function",        "z": "933e7d2cb83f98b7",        "name": "Leistung vom Shelly als globale Variable definieren",        "func": "global.set(\"ShellyPower2\",msg.payload);",        "outputs": 1,        "noerr": 0,        "initialize": "",        "finalize": "",        "libs": [],        "x": 770,        "y": 100,        "wires": [            []        ]    },    {        "id": "5bad38f23e0e9e93",        "type": "inject",        "z": "933e7d2cb83f98b7",        "name": "",        "props": [            {                "p": "payload"            },            {                "p": "topic",                "vt": "str"            }        ],        "repeat": "10",        "crontab": "",        "once": false,        "onceDelay": 0.1,        "topic": "",        "payload": "",        "payloadType": "date",        "x": 130,        "y": 100,        "wires": [            [                "7a039d49c2c50f77"            ]        ]    },    {        "id": "7a039d49c2c50f77",        "type": "function",        "z": "933e7d2cb83f98b7",        "name": "Addition L1 L2",        "func": "var L1 = global.get(\"L1\") || 0;\nvar L2 = global.get(\"L2\") || 0;\n//var L3 = global.get(\"L3\") || 0;\n\nmsg.payload = L1 + L2;\nmsg.payload = parseFloat((msg.payload).toFixed(2));\nreturn msg;",        "outputs": 1,        "noerr": 0,        "initialize": "",        "finalize": "",        "libs": [],        "x": 360,        "y": 100,        "wires": [            [                "3e29bacbc9176f39",                "2fe0b29adc2ca719"            ]        ]    },    {        "id": "2fe0b29adc2ca719",        "type": "debug",        "z": "933e7d2cb83f98b7",        "name": "debug 34",        "active": false,        "tosidebar": true,        "console": false,        "tostatus": false,        "complete": "false",        "statusVal": "",        "statusType": "auto",        "x": 640,        "y": 60,        "wires": []    },    {        "id": "2b8502c3ad9c1c24",        "type": "influxdb out",        "z": "933e7d2cb83f98b7",        "influxdb": "e840b95d15d8b227",        "name": "AhoyDB",        "measurement": "power_from_grid",        "precision": "",        "retentionPolicy": "",        "database": "database",        "precisionV18FluxV20": "ms",        "retentionPolicyV18Flux": "",        "org": "organisation",        "bucket": "bucket",        "x": 540,        "y": 240,        "wires": []    },    {        "id": "f3495d762fa76009",        "type": "mqtt out",        "z": "933e7d2cb83f98b7",        "name": "WR MQTT",        "topic": "inverter/ctrl/limit/0",        "qos": "",        "retain": "",        "respTopic": "",        "contentType": "",        "userProps": "",        "correl": "",        "expiry": "",        "broker": "4456b99c55c38cfe",        "x": 1090,        "y": 300,        "wires": []    },    {        "id": "7e8702a86859bb3e",        "type": "inject",        "z": "933e7d2cb83f98b7",        "name": "",        "props": [            {                "p": "payload"            },            {                "p": "topic",                "vt": "str"            }        ],        "repeat": "20",        "crontab": "",        "once": false,        "onceDelay": 0.1,        "topic": "",        "payload": "",        "payloadType": "date",        "x": 130,        "y": 300,        "wires": [            [                "a61b99d7d2377533"            ]        ]    },    {        "id": "ad90b6b560bc5c7f",        "type": "switch",        "z": "933e7d2cb83f98b7",        "name": "",        "property": "payload",        "propertyType": "msg",        "rules": [            {                "t": "eq",                "v": "15",                "vt": "num"            },            {                "t": "btwn",                "v": "15",                "vt": "num",                "v2": "2599",                "v2t": "num"            },            {                "t": "eq",                "v": "300",                "vt": "num"            },            {                "t": "btwn",                "v": "-15",                "vt": "num",                "v2": "-2599",                "v2t": "num"            }        ],        "checkall": "true",        "repair": false,        "outputs": 4,        "x": 530,        "y": 300,        "wires": [            [],            [                "8279ee583e5606b9",                "67f506ea791bcfeb"            ],            [],            [                "3a6a7d5a762c3b3e",                "67f506ea791bcfeb"            ]        ]    },    {        "id": "8279ee583e5606b9",        "type": "debug",        "z": "933e7d2cb83f98b7",        "name": "debug 35",        "active": false,        "tosidebar": true,        "console": false,        "tostatus": false,        "complete": "false",        "statusVal": "",        "statusType": "auto",        "x": 760,        "y": 260,        "wires": []    },    {        "id": "67f506ea791bcfeb",        "type": "function",        "z": "933e7d2cb83f98b7",        "name": "Berechnung Wechselrichter Setting",        "func": "var ObtainedData = global.get(\"ShellyPower2\");\nvar ObtainedData = global.get(\"power2\") || 0;\n\n// MAX generation of the inverter Prozent\nvar maxPower = 100;\n\n// setting variable power2 \nvar power2 = ((global.get(\"ShellyPower2\") ) + 30) / 6  || maxPower;\n\n// clamp power between 0 and max\nif (power2 > maxPower) power2 = maxPower;\nif (power2 < 0) power2 = 1;\n\n// store current powerlimit and update message\nmsg.payload = parseFloat((msg.payload).toFixed(0));\nmsg.payload = power2;\nglobal.set(\"power2\", power2);\n\nreturn msg;",        "outputs": 1,        "noerr": 0,        "initialize": "",        "finalize": "",        "libs": [],        "x": 800,        "y": 300,        "wires": [            [                "3a5170c0867ea632",                "f3495d762fa76009"            ]        ]    },    {        "id": "3a5170c0867ea632",        "type": "debug",        "z": "933e7d2cb83f98b7",        "name": "debug 36",        "active": true,        "tosidebar": true,        "console": false,        "tostatus": false,        "complete": "false",        "statusVal": "",        "statusType": "auto",        "x": 980,        "y": 380,        "wires": []    },    {        "id": "a61b99d7d2377533",        "type": "function",        "z": "933e7d2cb83f98b7",        "name": "Get ShellyPower",        "func": "//Berechnung ob Wechselrichter neu gesetzt werden soll;\n\nvar ShellyPower2 = global.get(\"ShellyPower2\") || 0;\nvar power2 = (global.get(\"power2\") * 6) -30 || 0;\n\n\nmsg.payload = ShellyPower2 - power2;\n//msg.payload = global.get('ShellyPower2') - (global.get('power2')) * 6 || maxPower;\n\n\nreturn msg;",        "outputs": 1,        "noerr": 0,        "initialize": "",        "finalize": "",        "libs": [],        "x": 330,        "y": 300,        "wires": [            [                "ad90b6b560bc5c7f",                "ba3a953ba7eeced0",                "2b8502c3ad9c1c24"            ]        ]    },    {        "id": "ba3a953ba7eeced0",        "type": "debug",        "z": "933e7d2cb83f98b7",        "name": "debug 37",        "active": true,        "tosidebar": true,        "console": false,        "tostatus": false,        "complete": "false",        "statusVal": "",        "statusType": "auto",        "x": 540,        "y": 400,        "wires": []    },    {        "id": "3a6a7d5a762c3b3e",        "type": "debug",        "z": "933e7d2cb83f98b7",        "name": "debug 38",        "active": false,        "tosidebar": true,        "console": false,        "tostatus": false,        "complete": "false",        "statusVal": "",        "statusType": "auto",        "x": 760,        "y": 340,        "wires": []    },    {        "id": "77920513f3c63479",        "type": "inject",        "z": "933e7d2cb83f98b7",        "name": "",        "props": [            {                "p": "payload"            },            {                "p": "topic",                "vt": "str"            }        ],        "repeat": "20",        "crontab": "",        "once": false,        "onceDelay": 0.1,        "topic": "",        "payload": "",        "payloadType": "date",        "x": 130,        "y": 520,        "wires": [            [                "1bde5ff16e25d956"            ]        ]    },    {        "id": "1bde5ff16e25d956",        "type": "function",        "z": "933e7d2cb83f98b7",        "name": "Get power2",        "func": "//var ObtainedData = global.get(\"power2\");\n\n//var ShellyPower2 = global.get(\"ShellyPower2\") || 0;\nvar power2 = global.get(\"power2\") * 6 || 0;\n\n\nmsg.payload = power2;\n\n\nreturn msg;",        "outputs": 1,        "noerr": 0,        "initialize": "",        "finalize": "",        "libs": [],        "x": 310,        "y": 520,        "wires": [            [                "5a1fbdff504c1dad"            ]        ]    },    {        "id": "5a1fbdff504c1dad",        "type": "debug",        "z": "933e7d2cb83f98b7",        "name": "debug 39",        "active": false,        "tosidebar": true,        "console": false,        "tostatus": false,        "complete": "false",        "statusVal": "",        "statusType": "auto",        "x": 580,        "y": 520,        "wires": []    },    {        "id": "e840b95d15d8b227",        "type": "influxdb",        "hostname": "192.168.2.104",        "port": "8086",        "protocol": "http",        "database": "PVDB",        "name": "AhoyDB",        "usetls": false,        "tls": "",        "influxdbVersion": "1.x",        "url": "http://localhost:8086",        "rejectUnauthorized": true    },    {        "id": "4456b99c55c38cfe",        "type": "mqtt-broker",        "name": "",        "broker": "192.168.2.104",        "port": "1883",        "clientid": "",        "autoConnect": true,        "usetls": false,        "protocolVersion": "4",        "keepalive": "60",        "cleansession": true,        "birthTopic": "",        "birthQos": "0",        "birthPayload": "",        "birthMsg": {},        "closeTopic": "",        "closeQos": "0",        "closePayload": "",        "closeMsg": {},        "willTopic": "",        "willQos": "0",        "willPayload": "",        "willMsg": {},        "userProps": "",        "sessionExpiry": ""    }]

Hier nun mein Code zur Nulleinspeisung. Gemessen wird die Leistung an 2 Phasen. Die Phase auf der der Wechselrichter einspeist wird nicht gemessen und auch nicht in der Nulleinspeisung berĂŒcksichtigt. Grund hierfĂŒr ist, dass der Wechselrichter (hm 600) hĂ€ufig sehr schwankt und das Gesamtsystem dadurch nicht zur Ruhe kommt. Gibt bestimmt bessere Lösungen, aber immerhin lĂ€uft das System stabil.
Hardware:
2 Module mit insgesamt 760Wp
Victron 100/50 Laderegler
DIY 2,5kW LiFePO4 Battery mit Daly BMS
Wechselrichter Hoymiles HM 600
Ahoy DTU
Raspberry PI

:crayon:by HarryP: ZusammenfĂŒhrung Doppelpost.
*@Bjoernix *
Bitte fĂŒr NachtrĂ€ge/Korrekturen die „bearbeiten“ Funktion verwenden. Danke!

@Bjoernix

vielen Dank, dass ist auch eine interessante Lösung.

ich habe es ein wenig anders gelöst.
Ich nutze eine HilfsentitĂ€t um alle drei Phasen im Vorfeld zu berechnen (ja es schwankt etwas stark). DafĂŒr habe ich bei mir einen"entpreller" (habe ich mir hier von jemanden geklaut) eingebaut, um den Traffic zu minimieren. Das funktioniert bei mir auch ganz gut soweit, obwohl ich noch den Wechsel bei einer starken Änderung von hohen zu niedrigen Verbrauch etwas langsam finde. Das gleiche habe ich auch bei meinem Ausganswert gemacht, damit ich nicht mehrmals das gleiche zum Wechselrichter sende.
Die Werte sende ich in %, dabei möchte ich aber nicht unter 30% gehen (solange ich keinen Speicher habe ist mir die verschenkte Energie egal), auch rechne ich zu den Berechneten Wert noch 1% immer dazu um lieber nichts aus dem Netz zu ziehen.
Falls Interesse besteht, so sieht es momentan bei mir aus:

[{"id":"7bf3afac51a18e13","type":"tab","label":"PVNull","disabled":false,"info":"","env":[]},{"id":"018ba02f54239b1e","type":"inject","z":"7bf3afac51a18e13","name":"alle 6 sekunden","props":[{"p":"payload"},{"p":"topic","vt":"str"}],"repeat":"6","crontab":"","once":false,"onceDelay":0.1,"topic":"","payload":"","payloadType":"date","x":130,"y":160,"wires":[["7d3dbe6a1cb2c90a"]]},{"id":"df53353baaec9129","type":"mqtt out","z":"7bf3afac51a18e13","name":"WR MQTT","topic":"dtu/open/116183058090/cmd/limit_nonpersistent_relative","qos":"2","retain":"","respTopic":"","contentType":"","userProps":"","correl":"","expiry":"","broker":"87b2d138566ff5cc","x":1370,"y":100,"wires":[]},{"id":"e74b794e78eb257f","type":"function","z":"7bf3afac51a18e13","name":"Berechnung fĂŒr WR Limit","func":"// MAX generation of the inverter Watts\nvar maxPower = 1500;\n\n// Get current power limit or default\nvar power = context.get('power') || maxPower;\npower += msg.payload;\n\n// clamp power between 0 and max\nif (power > maxPower) power = maxPower;\nif (power < 10) power = 100;\n\n\n// store current powerlimit and update message\ncontext.set('power', power);\nmsg.payload = power;\n\nreturn msg;","outputs":1,"noerr":0,"initialize":"","finalize":"","libs":[],"x":570,"y":160,"wires":[["6936620e44334ae4","bff02b570b6dd8ac"]]},{"id":"7d3dbe6a1cb2c90a","type":"api-current-state","z":"7bf3afac51a18e13","name":"Total_Energy","server":"d589ff3c.f3647","version":3,"outputs":1,"halt_if":"","halt_if_type":"str","halt_if_compare":"is","entity_id":"sensor.shelly3em_total_energy","state_type":"num","blockInputOverrides":false,"outputProperties":[{"property":"payload","propertyType":"msg","value":"","valueType":"entityState"},{"property":"data","propertyType":"msg","value":"","valueType":"entity"}],"for":"0","forType":"num","forUnits":"minutes","override_topic":false,"state_location":"payload","override_payload":"msg","entity_location":"data","override_data":"msg","x":310,"y":160,"wires":[["23d4475b2f446112"]]},{"id":"23d4475b2f446112","type":"rbe","z":"7bf3afac51a18e13","name":"entprellen","func":"deadband","gap":"5","start":"","inout":"out","septopics":true,"property":"payload","topi":"topic","x":420,"y":240,"wires":[["e74b794e78eb257f","3c3aeb93e6241992"]]},{"id":"3c3aeb93e6241992","type":"debug","z":"7bf3afac51a18e13","name":"Check 1","active":true,"tosidebar":true,"console":false,"tostatus":true,"complete":"payload","targetType":"msg","statusVal":"payload","statusType":"auto","x":560,"y":280,"wires":[]},{"id":"0f5d1335544ee938","type":"debug","z":"7bf3afac51a18e13","name":"Check Ausgang","active":true,"tosidebar":true,"console":false,"tostatus":true,"complete":"payload","targetType":"msg","statusVal":"payload","statusType":"auto","x":1380,"y":180,"wires":[]},{"id":"773bf57e6b390e2d","type":"function","z":"7bf3afac51a18e13","name":"zwischen 30% bis 100% (+1%)","func":"let eingangswert = msg.payload; // Eingangswert aus der msg.payload extrahieren\nlet mindestwert = 29;\n\nif (eingangswert < mindestwert) {\n    eingangswert = mindestwert;\n} else if (eingangswert > 100) {\n    eingangswert = 100;\n}\n\nif (eingangswert < 100) {\n    eingangswert += 1;\n}\n\n// Hier kann der bereinigte Wert weiterverwendet werden\nmsg.payload = eingangswert;\nreturn msg;","outputs":1,"noerr":0,"initialize":"","finalize":"","libs":[],"x":1070,"y":160,"wires":[["bbafd32e1e7d3829"]]},{"id":"bbafd32e1e7d3829","type":"rbe","z":"7bf3afac51a18e13","name":"entprellen","func":"deadband","gap":"1","start":"","inout":"out","septopics":true,"property":"payload","topi":"topic","x":1160,"y":220,"wires":[["df53353baaec9129","0f5d1335544ee938"]]},{"id":"6936620e44334ae4","type":"range","z":"7bf3afac51a18e13","minin":"1","maxin":"1500","minout":"1","maxout":"100","action":"scale","round":true,"property":"payload","name":"Umrechnen in %","x":820,"y":160,"wires":[["773bf57e6b390e2d"]]},{"id":"bff02b570b6dd8ac","type":"debug","z":"7bf3afac51a18e13","name":"Check 2","active":true,"tosidebar":true,"console":false,"tostatus":true,"complete":"payload","targetType":"msg","statusVal":"payload","statusType":"auto","x":780,"y":240,"wires":[]},{"id":"87b2d138566ff5cc","type":"mqtt-broker","name":"","broker":"192.168.178.54","port":"1883","tls":"09e52006b6cb7e2b","clientid":"","autoConnect":true,"usetls":false,"protocolVersion":"4","keepalive":"60","cleansession":true,"birthTopic":"","birthQos":"0","birthPayload":"","birthMsg":{},"closeTopic":"","closeQos":"0","closePayload":"","closeMsg":{},"willTopic":"","willQos":"0","willPayload":"","willMsg":{},"userProps":"","sessionExpiry":""},{"id":"d589ff3c.f3647","type":"server","name":"Home Assistant","addon":true},{"id":"09e52006b6cb7e2b","type":"tls-config","name":"","cert":"","key":"","ca":"","certname":"","keyname":"","caname":"","servername":"","verifyservercert":false,"alpnprotocol":""}]

Wenn ich große Änderungen mache, werde ich es berichten.

2 „GefĂ€llt mir“

Hallo ich habe ein Àhnliches Anliegen. Ich möchte auch drei Sensoren Werte aufaddieren.
Mein StrombezugszĂ€hler berĂŒcksichtigt nicht, dass die beiden Wechselrichter einspeisen. Der gelieferte Wert ist also immer zu gering. Diesen Wert schickt aber die Regelung an die Wechselrichter als Limit. Der Strombezug steigt dann sofort um die nun fehlende Leistung. Das wiederholt sich dauernd. Kann mir jemand den notwendigen Code geben um die Leistungen vor der Funktion Berechnung fĂŒr Wechselrichter zusammenzufĂŒhren.

[{"id":"2b19c160a65668d1","type":"inject","z":"f19035e05f3e1cc0","name":"Alle 10 Sekunden","props":[{"p":"payload"},{"p":"topic","vt":"str"}],"repeat":"60","crontab":"","once":false,"onceDelay":0.1,"topic":"","payload":"","payloadType":"date","x":90,"y":280,"wires":[["b7003a79ab70080a"]]},{"id":"e0a4ae180d2b8fad","type":"api-current-state","z":"f19035e05f3e1cc0","name":"Eingespeiste Leistung Tasmota ZĂ€hler","server":"","version":3,"outputs":1,"halt_if":"","halt_if_type":"str","halt_if_compare":"is","entity_id":"sensor.tasmota_mt681_power_curr","state_type":"str","blockInputOverrides":false,"outputProperties":[{"property":"payload","propertyType":"msg","value":"","valueType":"entityState"},{"property":"data","propertyType":"msg","value":"","valueType":"entity"}],"for":"20","forType":"num","forUnits":"seconds","override_topic":false,"state_location":"payload","override_payload":"msg","entity_location":"data","override_data":"msg","x":610,"y":480,"wires":[["a95a4f6a785efdf2"]]},{"id":"a95a4f6a785efdf2","type":"function","z":"f19035e05f3e1cc0","name":"Berechnung fĂŒr Wechselrichterlimit","func":"var maxPower = 1600;\n\n// Die aktuelle Leistung oder den Maximalleistung\nvar power = context.get('power') || maxPower;\n\n// Berechnet die prozentuale Differenz zwischen aktuellem und vorherigem Wert\nvar percentageDiff = Math.abs((msg.payload - power) / power) * 100;\n\n// Vorherige Wert muss 10% grĂ¶ĂŸer oder kleiner sein gleich vorherigen Wert\nif (percentageDiff > 10) {\n    if (msg.payload > maxPower) {\n        if (msg.payload > 1600) {\n            power = maxPower;\n        } else {\n            power = msg.payload;\n        }\n    } else if (msg.payload < 20) {\n        power = 40;\n    } else {\n        power = msg.payload;\n    }\n}\n\n// Aktuelle Leistungsgrenze speichern und Nachricht aktualisieren\ncontext.set('power', power);\nmsg.payload = power;\n\n// ÜberprĂŒfen Sie, ob der aktuelle Wert mit dem vorherigen ĂŒbereinstimmt\nif (msg.payload === context.get('previousPower')) {\n    return null; // Verlassen Sie die Funktion, ohne etwas zurĂŒckzugeben, bei gleichem Wert\n}\n\n// Speichern Sie den aktuellen Leistungswert wie zuvor fĂŒr die nĂ€chste Berechnung\ncontext.set('previousPower', msg.payload);\n\nreturn msg;","outputs":2,"noerr":0,"initialize":"","finalize":"","libs":[],"x":880,"y":320,"wires":[["bfc187c3264f44c5","1ec84a0b10d09459"],["92ba9cfb922d9ec5"]]},{"id":"bfc187c3264f44c5","type":"mqtt out","z":"f19035e05f3e1cc0","name":"number.HMT2250_limit_nonpersistent_absolute","topic":"solar/138281321796/cmd/limit_nonpersistent_absolute","qos":"","retain":"","respTopic":"","contentType":"","userProps":"","correl":"","expiry":"","broker":"9eefe9c92eb3326b","x":1080,"y":120,"wires":[]},{"id":"1ec84a0b10d09459","type":"mqtt out","z":"f19035e05f3e1cc0","name":"number.HOY600_limit_nonpersistent_absolute","topic":"solar/114182944183/cmd/limit_nonpersistent_absolute","qos":"","retain":"","respTopic":"","contentType":"","userProps":"","correl":"","expiry":"","broker":"9eefe9c92eb3326b","x":1100,"y":640,"wires":[]},{"id":"92ba9cfb922d9ec5","type":"debug","z":"f19035e05f3e1cc0","name":"debug 1","active":true,"tosidebar":true,"console":true,"tostatus":false,"complete":"payload","targetType":"msg","statusVal":"","statusType":"auto","x":1210,"y":380,"wires":[]},{"id":"b7003a79ab70080a","type":"time-range-switch","z":"f19035e05f3e1cc0","name":"","lat":"","lon":"","startTime":"sunrise","endTime":"sunset","startOffset":"120","endOffset":"-120","x":300,"y":360,"wires":[["f09901d058ade621","723a87dcf40df33f","e0a4ae180d2b8fad"],[]]},{"id":"723a87dcf40df33f","type":"api-current-state","z":"f19035e05f3e1cc0","name":"Eingespeiste Leistung HMT 2250","server":"","version":3,"outputs":1,"halt_if":"","halt_if_type":"str","halt_if_compare":"is","entity_id":"sensor.hmt2250_power","state_type":"str","blockInputOverrides":false,"outputProperties":[{"property":"payload","propertyType":"msg","value":"","valueType":"entityState"},{"property":"data","propertyType":"msg","value":"","valueType":"entity"}],"for":"20","forType":"num","forUnits":"seconds","override_topic":false,"state_location":"payload","override_payload":"msg","entity_location":"data","override_data":"msg","x":380,"y":700,"wires":[["a95a4f6a785efdf2"]]},{"id":"f09901d058ade621","type":"api-current-state","z":"f19035e05f3e1cc0","name":"Eingespeiste LeistungHoy600","server":"","version":3,"outputs":1,"halt_if":"","halt_if_type":"str","halt_if_compare":"is","entity_id":"sensor.hoy_600_power","state_type":"str","blockInputOverrides":false,"outputProperties":[{"property":"payload","propertyType":"msg","value":"","valueType":"entityState"},{"property":"data","propertyType":"msg","value":"","valueType":"entity"}],"for":"20","forType":"num","forUnits":"seconds","override_topic":false,"state_location":"payload","override_payload":"msg","entity_location":"data","override_data":"msg","x":490,"y":120,"wires":[["a95a4f6a785efdf2"]]},{"id":"0e814cab1830de6f","type":"junction","z":"f19035e05f3e1cc0","x":228,"y":251,"wires":[[]]},{"id":"9eefe9c92eb3326b","type":"mqtt-broker","name":"WR","broker":"core-mosquitto","port":"1883","clientid":"","autoConnect":true,"usetls":false,"protocolVersion":"4","keepalive":"60","cleansession":true,"birthTopic":"","birthQos":"0","birthPayload":"","birthMsg":{},"closeTopic":"","closeQos":"0","closePayload":"","closeMsg":{},"willTopic":"","willQos":"0","willPayload":"","willMsg":{},"userProps":"","sessionExpiry":""}]
*🖍by HarryP: Codezeilen in Code-TAG's ĂŒberfĂŒhrt*

Moin Johi und willkommen in unserer netten community.
Bevor wir ĂŒber deinen Flow diskutieren solltest du diesen anonymisieren damit zumindest dein Standort nicht fĂŒr jeden sichtbar ist. Dies geht am einfachsten ĂŒber den Scrubber der das automatisch fĂŒr dich erledigt.

Viele GrĂŒĂŸe
LL

Hallo in die Runde;

ich hatte bereites einen Thread aufgemacht; wurde dann auf diesen NodeRed Thread freundlich hingewiesen.
Einen Flow konnte ich anlegen; klappt auch soweit sehr gut; nun ist es aber so dass ich gerne einen weiteren WR steuern möchte. Diesen jedoch immer in % Relation zu der Leistung des ersten.

Ich kann natĂŒrlich einfach das Script kopieren und einen zweiten dranhĂ€ngen
 dann ist es jedoch so, dass meistens beide WR gleichzeitig hoch und runter geregelt werden.

Bedeutet vom einen 100 Watt weg und vom anderen auch; dies fĂŒhrt dann aber zu der Spitze von 100 Watt; dann muss wieder runtergeregelt werden, also beide kanibalisieren sich gleichzeitig.

Die WR laufen auf unterschiedlichen Phasen. Jedoch wird die Last ja am Ende saldiert, wenn ich nun den 
als Beispiel PC einschalte und die Musikanlage und beides auf Phase 1 lĂ€uft; dann wird der WR welcher evtl auf Phase 2 misst, natĂŒrlich nicht eingreifen. Also wĂŒrde es aus meiner Sicht mehr Sinn machen, die Gesamtsumme zu regulieren. Dann habe ich jedoch nur eine Quelle und bekomme es nicht hin die beiden WR in Relation zueinander zu setzen, dass wenn der eine regelt, der andere nicht, oder am Ende beide geregelt werden mĂŒssen.

Daher die Frage nach Hilfe :slight_smile:

Ich habe heute zumindest , einen Weg gefunden die drei Sensor Werte zu addieren. . Nicht in Node Red , sondern in Homeassistant. Ich habe einen neuen sensor erstellt der die drei ZĂ€hler Sensoren addiert. Diesen frage ich nun in Node Red ab. Bin aber trotzdem noch daran interessiert zu erfahren wie das in Node Red gemacht werden kann.

Function-Node ist hier das Zauberwort!
image


und einfach mal etwas Googeln (“Rechnen mit node red”), die Ergebnisse reichen fĂŒr einen
langen Abend! :stuck_out_tongue_winking_eye: :wink: