Seite 1 von 1

Speicherwerte berechnen?

Verfasst: Do Okt 12, 2023 6:11 am
von Stevie_AN
Hallo zusammen,

zur Senkung der nächtlichen Grundlast habe ich nun unser E-Moped (Blacktea Bonfire) über einen kleinen Hybridwechselrichter als Speicher eingebunden.

Dank Node Red konnte ich den vom Wechselrichter auslesbaren SOC und die Lade-/Entladeleistung per MQTT der openWB bereitstellen. Nun fehlen mir nur noch die Werte für:

opwnWB/set/houseBattery/WhImported
opwnWB/set/houseBattery/WhExported

...diese Daten rückt der WR nur leider nicht raus. Hier mal alles, was der Hybride so alles rausschickt:

Code: Alles auswählen

lertimestamp = 1697090710
wattstundengesamtheute = 16.17
protokoll = 16
modus = G
devicestatus = 10
warnungen = --0000000000--10010---000000----
fehlermeldung = Batterie discharge low
anzahlmppt = 1
kilowattstundentotal = 125000
netzspannung = 224.2
netzleistung = -00116
netzfrequenz = 49.9
netzstrom = 0000.3
ac_ausgangsspannung = 225.8
ac_ausgangsleistung = 00000
ac_ausgangsfrequenz = 50.0
ac_ausgangsstrom = 000.0
ac_ausgangslast = 002
batteriespannung = 046.8
batteriekapazitaet = 042
solarleistung1 = 00029
solarleistung2 = 00000
solarleistung3 = 0
solarspannung1 = 115.8
solarspannung2 = 0
solarspannung3 = 0
temperatur = 021.0
geraetestatus = A---101201
laden_entladen = 1
bezug_einspeisung = 1
solarleistung = 00029
batterieleistung = 00000
regler = 24
firmware = 0
produkt = Protokoll 16
Nun mal ganz Laienhaft gefragt... könnte man "opwnWB/set/houseBattery/WhImported" und "opwnWB/set/houseBattery/WhExported" irgendwie aus den vorhandenen Daten berechnen?

Falls nicht, ist das auch nicht schlimm, aber es sähe halt schöner aus ;-)

Schöne Grüße

Re: Speicherwerte berechnen?

Verfasst: Do Okt 12, 2023 6:29 am
von mrinas
sind die Wh Werte denn zwingend notwendig? Von anderen Modulen (z.b. PV, EVU) kenne ich das so dass fehlende Zählerstände aus der Leistung berechnet werden.

Re: Speicherwerte berechnen?

Verfasst: Do Okt 12, 2023 8:22 am
von Stevie_AN
mrinas hat geschrieben: Do Okt 12, 2023 6:29 am sind die Wh Werte denn zwingend notwendig? ...
Zwingend notwendig nicht, allerdings, wenn keine Werte vorhanden sind, zeigt die openWB (zumindest bei mir) jeweils "0,00" an:
2023-10-12_10h20_56.png
Darum kam mir die Idee, ob man diese beiden Parameter irgendwie aus den vorliegenden Daten berechnen könnte (irgendwie aus den MQTT-Daten von Wechselrichter oder openWB).

Re: Speicherwerte berechnen?

Verfasst: Do Okt 12, 2023 5:14 pm
von hominidae
Stevie_AN hat geschrieben: Do Okt 12, 2023 6:11 am Nun fehlen mir nur noch die Werte für:

opwnWB/set/houseBattery/WhImported
opwnWB/set/houseBattery/WhExported

...diese Daten rückt der WR nur leider nicht raus.
[...]
Nun mal ganz Laienhaft gefragt... könnte man "opwnWB/set/houseBattery/WhImported" und "opwnWB/set/houseBattery/WhExported" irgendwie aus den vorhandenen Daten berechnen?
Meiner Meinung nach berechnet die openWB das selbst.
Mein Speichersystem liefert die nämlich auch nicht (glaube ich).
Der Speicher wurde hier noch zu Zeiten openWB 1.9 installiert...mit Upgrade auf 2.0 (ohne Datenmigration) lief der Zähler nicht weiter, sondern startete neu - ergo wird er nicht aus dem Speicher-System geholt.

..warte einfach mal einen Tag...evtl. kommt das dann "über Nacht".

Re: Speicherwerte berechnen?

Verfasst: Fr Okt 13, 2023 7:59 am
von Gero
E3dc liefert auch keine Zählerstände. Also ermittelt openWB das selbst, indem sie bei jedem Lauf (also alle 10sek) annimt, dass die aktuelle Leistung die letzten 20 Sekunden auch anlag und summiert die Wh demenstprechend auf. Nennt sich „simcount“

Re: Speicherwerte berechnen?

Verfasst: Fr Okt 13, 2023 5:08 pm
von Stevie_AN
Gero hat geschrieben: Fr Okt 13, 2023 7:59 am E3dc liefert auch keine Zählerstände. Also ermittelt openWB das selbst, indem sie bei jedem Lauf (also alle 10sek) annimt, dass die aktuelle Leistung die letzten 20 Sekunden auch anlag und summiert die Wh demenstprechend auf. Nennt sich „simcount“
Hm, also bei mir läuft das jetzt den 3. Tag, aber bei Speicher Import/Export steht immer noch 0,00 kWh. Scheinbar rechnet dann meine OpenWB (Version: 1.9.301) das nicht selbst aus. Vielleicht liegt mein Fehler ja auch an den per Node-Red gesendeten Werten, das hab ich ja auch mehr oder weniger "hingepfuscht" :D
2023-10-11_23h05_22.png

Code: Alles auswählen

[
    {
        "id": "c6f39d8f55b734e5",
        "type": "tab",
        "label": "Solaranzeige zu openWB Batteriespeicher",
        "disabled": false,
        "info": "",
        "env": []
    },
    {
        "id": "d2a89699c8c9622a",
        "type": "mqtt in",
        "z": "c6f39d8f55b734e5",
        "name": "",
        "topic": "solaranzeige/box1/batteriekapazitaet",
        "qos": "2",
        "datatype": "auto-detect",
        "broker": "f65eccf0983837ee",
        "nl": false,
        "rap": true,
        "rh": 0,
        "inputs": 0,
        "x": 190,
        "y": 740,
        "wires": [
            [
                "7af5523fa17345fa"
            ]
        ]
    },
    {
        "id": "b37beaa6a532f6c7",
        "type": "mqtt out",
        "z": "c6f39d8f55b734e5",
        "name": "",
        "topic": "openWB/set/houseBattery/%Soc",
        "qos": "2",
        "retain": "true",
        "respTopic": "",
        "contentType": "",
        "userProps": "",
        "correl": "",
        "expiry": "",
        "broker": "f65eccf0983837ee",
        "x": 1100,
        "y": 740,
        "wires": []
    },
    {
        "id": "cffba26676c07e9b",
        "type": "mqtt in",
        "z": "c6f39d8f55b734e5",
        "name": "solaranzeige/box1/batterieleistung",
        "topic": "solaranzeige/box1/batterieleistung",
        "qos": "2",
        "datatype": "auto-detect",
        "broker": "f65eccf0983837ee",
        "nl": false,
        "rap": true,
        "rh": 0,
        "inputs": 0,
        "x": 180,
        "y": 900,
        "wires": [
            [
                "661d5951458c2593"
            ]
        ]
    },
    {
        "id": "6e8a7b821d9ee4fe",
        "type": "mqtt out",
        "z": "c6f39d8f55b734e5",
        "name": "",
        "topic": "openWB/set/houseBattery/W",
        "qos": "2",
        "retain": "true",
        "respTopic": "",
        "contentType": "",
        "userProps": "",
        "correl": "",
        "expiry": "",
        "broker": "f65eccf0983837ee",
        "x": 1090,
        "y": 940,
        "wires": []
    },
    {
        "id": "e284b75e4df6197e",
        "type": "mqtt in",
        "z": "c6f39d8f55b734e5",
        "name": "solaranzeige/box1/laden_entladen",
        "topic": "solaranzeige/box1/laden_entladen",
        "qos": "2",
        "datatype": "auto-detect",
        "broker": "f65eccf0983837ee",
        "nl": false,
        "rap": true,
        "rh": 0,
        "inputs": 0,
        "x": 180,
        "y": 1040,
        "wires": [
            [
                "3b35716383972c1b"
            ]
        ]
    },
    {
        "id": "cd3a4257c9e36ab4",
        "type": "debug",
        "z": "c6f39d8f55b734e5",
        "name": "SOC gerundet",
        "active": true,
        "tosidebar": true,
        "console": false,
        "tostatus": false,
        "complete": "payload",
        "targetType": "msg",
        "statusVal": "",
        "statusType": "auto",
        "x": 700,
        "y": 640,
        "wires": []
    },
    {
        "id": "7af5523fa17345fa",
        "type": "range",
        "z": "c6f39d8f55b734e5",
        "minin": "000",
        "maxin": "100",
        "minout": "0",
        "maxout": "100",
        "action": "scale",
        "round": true,
        "property": "payload",
        "name": "SOC runden",
        "x": 470,
        "y": 740,
        "wires": [
            [
                "b37beaa6a532f6c7",
                "cd3a4257c9e36ab4"
            ]
        ]
    },
    {
        "id": "50cb99f50696b97e",
        "type": "debug",
        "z": "c6f39d8f55b734e5",
        "name": "Soeicher laden/entladen W",
        "active": true,
        "tosidebar": true,
        "console": false,
        "tostatus": false,
        "complete": "payload",
        "targetType": "msg",
        "statusVal": "",
        "statusType": "auto",
        "x": 1000,
        "y": 840,
        "wires": []
    },
    {
        "id": "661d5951458c2593",
        "type": "range",
        "z": "c6f39d8f55b734e5",
        "minin": "00000",
        "maxin": "10000",
        "minout": "0",
        "maxout": "10000",
        "action": "scale",
        "round": true,
        "property": "payload",
        "name": "Leistung runden",
        "x": 460,
        "y": 900,
        "wires": [
            [
                "f7a15b54a977f346"
            ]
        ]
    },
    {
        "id": "3b35716383972c1b",
        "type": "change",
        "z": "c6f39d8f55b734e5",
        "name": "ändere 0 zu -1",
        "rules": [
            {
                "t": "change",
                "p": "payload",
                "pt": "msg",
                "from": "0",
                "fromt": "num",
                "to": "-1",
                "tot": "num"
            }
        ],
        "action": "",
        "property": "",
        "from": "",
        "to": "",
        "reg": false,
        "x": 500,
        "y": 1040,
        "wires": [
            [
                "f7a15b54a977f346"
            ]
        ]
    },
    {
        "id": "f7a15b54a977f346",
        "type": "function",
        "z": "c6f39d8f55b734e5",
        "name": "Multiplikation",
        "func": "if (msg.topic === \"solaranzeige/box1/batterieleistung\") context.set(\"leistung\",msg.payload);\nif (msg.topic === \"solaranzeige/box1/laden_entladen\") context.set(\"laden_entladen\",msg.payload);\n\n\nvar leistung = context.get(\"leistung\") || 0;\nvar laden_entladen = context.get(\"laden_entladen\") || 0;\n\n\nmsg.payload = leistung * laden_entladen;\nreturn msg;",
        "outputs": 1,
        "noerr": 0,
        "initialize": "",
        "finalize": "",
        "libs": [],
        "x": 760,
        "y": 940,
        "wires": [
            [
                "6e8a7b821d9ee4fe",
                "50cb99f50696b97e"
            ]
        ]
    },
    {
        "id": "f65eccf0983837ee",
        "type": "mqtt-broker",
        "name": "",
        "broker": "192.168.178.61",
        "port": "1883",
        "clientid": "",
        "autoConnect": true,
        "usetls": false,
        "protocolVersion": "3",
        "keepalive": "60",
        "cleansession": true,
        "birthTopic": "",
        "birthQos": "0",
        "birthPayload": "",
        "birthMsg": {},
        "closeTopic": "",
        "closeQos": "0",
        "closePayload": "",
        "closeMsg": {},
        "willTopic": "",
        "willQos": "0",
        "willPayload": "",
        "willMsg": {},
        "userProps": "",
        "sessionExpiry": ""
    }
]

...bin auf jedem Fall trotzdem ein bisschen stolz, dass ich es wenigstens so weit hinbekommen hab.

Re: Speicherwerte berechnen?

Verfasst: Sa Okt 14, 2023 11:20 am
von Gero
Du versuchst doch, einen MQTT-Speicher einzubinden. Der erwartet wohl kWh-Werte, weil da wohl kein simcount openWB-seitig implementiert ist. (Im e3dc-Modul und einigen anderen ist es drin)

Was du nun tun musst, ist in deinem Flow die Wh-Zähler selbst selbst zu implementieren und diese Zähler per MQTT zu publishen. Die Zähler legst du als Flow-globale Variablen an und erhöhst ihn immer wenn ein neuer Wert kommt. Ich hab‘ mir deinen Flow nicht angekuckt, weil ich das hier auf dem Handy schreibe. Kann ich aber gerne machen, wenn ich wieder am Rechner sitze.

Re: Speicherwerte berechnen?

Verfasst: Sa Okt 14, 2023 11:52 am
von hominidae
Stevie_AN hat geschrieben: Do Okt 12, 2023 6:11 am Dank Node Red konnte ich den vom Wechselrichter auslesbaren SOC und die Lade-/Entladeleistung per MQTT der openWB bereitstellen. Nun fehlen mir nur noch die Werte für:

opwnWB/set/houseBattery/WhImported
opwnWB/set/houseBattery/WhExported

...diese Daten rückt der WR nur leider nicht raus.
Stevie_AN hat geschrieben: Fr Okt 13, 2023 5:08 pm Hm, also bei mir läuft das jetzt den 3. Tag, aber bei Speicher Import/Export steht immer noch 0,00 kWh. Scheinbar rechnet dann meine OpenWB (Version: 1.9.301) das nicht selbst aus.
Gero hat geschrieben: Sa Okt 14, 2023 11:20 am Du versuchst doch, einen MQTT-Speicher einzubinden. Der erwartet wohl kWh-Werte, weil da wohl kein simcount openWB-seitig implementiert ist. (Im e3dc-Modul und einigen anderen ist es drin)

Was du nun tun musst, ist in deinem Flow die Wh-Zähler selbst selbst zu implementieren und diese Zähler per MQTT zu publishen. Die Zähler legst du als Flow-globale Variablen an und erhöhst ihn immer wenn ein neuer Wert kommt.
Ja, so wird es wohl sein...im mqtt-Modul macht es die openWB nicht selbst.
Aber wenn der WR die Werte nicht nativ rausrückt, musst Du aus Leistungswerten (W) die Energie (Wh) berechnen.
Einfach nur die Leistung aufsummieren reicht da nicht...Energie ist Leistung über Zeit ..also das jeweilige Leistungs-Delta mit der Dauer der Differenz-Bildung (Dein Messintervall) multiplizieren. ... diese Werte musst Du dann aufaddieren.

Schau mal hier: https://flows.nodered.org/node/node-red ... b-watt2kwh

Re: Speicherwerte berechnen?

Verfasst: Sa Okt 14, 2023 9:36 pm
von Stevie_AN
Gero hat geschrieben: Sa Okt 14, 2023 11:20 am ... Die Zähler legst du als Flow-globale Variablen an und erhöhst ihn immer wenn ein neuer Wert kommt.
Oha... genau da sind meine Grenzen definitiv erreicht - meine Programmierkenntnisse sind leider extrem rudimentär (das siehst Du spätestens dann, nachdem Du meinen Flow angeschaut hast).

Immer, wenn ich Variablen höre, bekomme ich Gänsehaut. Ich hatte z. B. auch schon versucht, bei Unterschreiten einer bestimmten Akkuspannung einen Shelly zu schalten, der den Hybridwechselrichter vom Netz nimmt (der genehmigt sich nämlich über 25W fürs Nichtszun)... aber auch her musste ich mir leider zugestehen, dass mir das ne Nummer zu groß ist. Hier hätte ich auch Variablen gebraucht.

Es ist schon extrem spannend, mit Node Red zu spielen, für mich bewegt sich das allerdings in einem sehr kleinen Rahmen. Und mit Online-Teaching kommt bei mir irgendwie nichts an... ich brächte jemanden, der mir das direkt zeigt/erklärt.

Aber wie gesagt, ich bin immer noch überglücklich, dass es soweit hinbekommen habe, dass zumindest SOC und Leistung an die OpenWB geschickt werden ;)

Re: Speicherwerte berechnen?

Verfasst: So Okt 15, 2023 8:56 am
von Gero
Stevie_AN hat geschrieben: Sa Okt 14, 2023 9:36 pm Oha... genau da sind meine Grenzen definitiv erreicht - meine Programmierkenntnisse sind leider extrem rudimentär
Nun, das ist ja nichts, was so bleiben muss ;-)

NodeRED hat so die Eigenschaft, dass durch die Nodes eine Message durchrauscht, irgendwie verändert wird und hinten wieder rauskommt. Wenn man nun eine Leistungsänderung berechnen möchte, muss man sich ja merken, was die letzte Leistung war, die in der vorherigen Message durchkam. Dazu braucht es einen Speicher, in dem man das ablegen kann. Dieser Speicher heißt Variable. Nun gibt es verschieden Orte, wo man den Speicher anlegen kann: Einmal in der Node selbst, das wäre node-global, und das reicht für das Beispiel der Leistungsänderung. Möchte man nun aus zwei Nodes auf den selben Speicher zugreifen, braucht es eine flow-globale Variable. Ein Beispiel wäre die Multiplikation von Spannung und Strom um die Leistung zu erhalten, wenn Leistung und Strom in zwei verschiedenen Topics vom Wechselrichter geliefert werden. Man kann sich auch nicht darauf verlassen, dass zwei Werte vom selben Gerät auch gleichzeitig ankommen. Da sind immer ein paar milli- oder mikrosekunden dazwischen, was Berechnungen schon mal falsch laufen lässt.

Mein Vorschlag war es ja, das selbst zu programmieren. @hominidae hat aber schon etwas gefunden, was genau das macht. Leistungen in Energie umrechnen. Dazu musst Du im Hamburgermenü auf Palette verwalten klicken und dann im Reiter Installation "node-red-contrib-watt2kwh" eintippen und dann auf Installieren klicken. Nach einem Neustart von nodeRED bekommst Du eine neue Node, die Du mal so ausprobieren kannst:
kwh.jpg
Einfach ein paar Inject-Nodes, die unterschiedliche Zahlen in die neue auf Joule (entspricht Wattsekunden) eingestellte watt2kwh-Node schicken. Im Debug-Output siehst Du dann die Summierung der Energie. Quatsch passiert allerdings, wenn Du auf die -10 klickst. Das ist aber nicht schlimm, denn Wh_imported und Wh_exported sollen ja sowieso in eigene Topics. Also splitten wir die positiven und die negativen und machen die negativen dann noch positiv, da die neue node mit negativen Leistungen nicht so recht klarkommt.
kwh-2.jpg

Code: Alles auswählen

[{"id":"dd976059fadbe648","type":"inject","z":"c924233921a179dd","name":"","props":[{"p":"payload"},{"p":"topic","vt":"str"}],"repeat":"","crontab":"","once":false,"onceDelay":0.1,"topic":"","payload":"-10","payloadType":"num","x":110,"y":860,"wires":[["e1647d2b0707369e"]]},{"id":"dca99dcb2a18233c","type":"inject","z":"c924233921a179dd","name":"","props":[{"p":"payload"},{"p":"topic","vt":"str"}],"repeat":"","crontab":"","once":false,"onceDelay":0.1,"topic":"","payload":"10","payloadType":"num","x":110,"y":1040,"wires":[["e1647d2b0707369e"]]},{"id":"84a1c57d9557ba71","type":"inject","z":"c924233921a179dd","name":"","props":[{"p":"payload"},{"p":"topic","vt":"str"}],"repeat":"","crontab":"","once":false,"onceDelay":0.1,"topic":"","payload":"0","payloadType":"num","x":110,"y":980,"wires":[["e1647d2b0707369e"]]},{"id":"1b06b4aa93d3ae74","type":"inject","z":"c924233921a179dd","name":"","props":[{"p":"payload"},{"p":"topic","vt":"str"}],"repeat":"","crontab":"","once":false,"onceDelay":0.1,"topic":"","payload":"-23","payloadType":"num","x":110,"y":920,"wires":[["e1647d2b0707369e"]]},{"id":"88887018cf45db35","type":"debug","z":"c924233921a179dd","name":"imported","active":true,"tosidebar":true,"console":false,"tostatus":false,"complete":"payload","targetType":"msg","statusVal":"","statusType":"auto","x":800,"y":940,"wires":[]},{"id":"db82644b43ff739a","type":"watt2kwh","z":"c924233921a179dd","format":"j","maximum":"60","maximumunit":"mins","name":"","x":640,"y":940,"wires":[["88887018cf45db35"]]},{"id":"fc85b28a765f8712","type":"debug","z":"c924233921a179dd","name":"exported","active":true,"tosidebar":true,"console":false,"tostatus":false,"complete":"payload","targetType":"msg","statusVal":"","statusType":"auto","x":800,"y":1020,"wires":[]},{"id":"3ddaaad7373a1613","type":"watt2kwh","z":"c924233921a179dd","format":"j","maximum":"60","maximumunit":"mins","name":"","x":640,"y":1020,"wires":[["fc85b28a765f8712"]]},{"id":"e1647d2b0707369e","type":"switch","z":"c924233921a179dd","name":"","property":"payload","propertyType":"msg","rules":[{"t":"gte","v":"0","vt":"num"},{"t":"lt","v":"0","vt":"num"}],"checkall":"true","repair":false,"outputs":2,"x":310,"y":980,"wires":[["db82644b43ff739a"],["6f3d603888f36a09"]]},{"id":"6f3d603888f36a09","type":"function","z":"c924233921a179dd","name":"","func":"\nmsg.payload = -1 * msg.payload;\nreturn msg;","outputs":1,"noerr":0,"initialize":"","finalize":"","libs":[],"x":480,"y":1020,"wires":[["3ddaaad7373a1613"]]},{"id":"e1730e01f9e6b6c9","type":"inject","z":"c924233921a179dd","name":"","props":[{"p":"payload"},{"p":"topic","vt":"str"}],"repeat":"","crontab":"","once":false,"onceDelay":0.1,"topic":"","payload":"23","payloadType":"num","x":110,"y":1100,"wires":[["e1647d2b0707369e"]]}]
Fertig. Ob ich nun mit negativ = imported richtig liege, da bin ich mir allerdings nicht sicher.