EVU mit MQTT

Hier kommt alles rein was nicht direkt zur OpenWB gehört.
derirrepeter
Beiträge: 26
Registriert: So Jun 27, 2021 1:07 pm
Been thanked: 1 time

Re: EVU mit MQTT

Beitrag von derirrepeter »

Habs verstanden, war ein wenig euphorisch. Wenn jemand die Flows benötigt, dann kann er mir gerne schreiben. Denke ich werde trotzdem das ein oder andere noch überarbeiten.
ruffieuxh
Beiträge: 214
Registriert: So Jul 07, 2019 9:02 am
Has thanked: 4 times
Been thanked: 1 time

Re: EVU mit MQTT

Beitrag von ruffieuxh »

Hallo zusammen,

Ich habe ein ähnliches Problem, wobei ich alle EVU Angaben via Node-Red und MQTT korrekt übermitteln kann, aber nicht WhImported und WhExported.

ACHTUNG: Bin noch auf V1.9!

Unten stehend habe ich den entsprechenden Flow beigefügt. Leider stellt unser Smartmeter keine Tageszähler zur Verfügung. Somit muss ich um Mitternacht jeweils die Zählerstände abfragen und danach laufend die Differenz zu Mitternacht bilden.
Bildschirmfoto vom 2025-11-18 10-01-38.png
Bildschirmfoto vom 2025-11-18 10-01-38.png (127.6 KiB) 112 mal betrachtet


Wie man nachstehend sieht, sind alle Werte vorhanden ausser den beiden:
Bildschirmfoto vom 2025-11-18 09-42-07.png
Bildschirmfoto vom 2025-11-18 09-42-07.png (57.43 KiB) 112 mal betrachtet

Im MQTT-Explorer wird dies bestätigt:
Bildschirmfoto vom 2025-11-18 09-44-08.png
Bildschirmfoto vom 2025-11-18 09-44-08.png (27.56 KiB) 112 mal betrachtet

Die beiden Werte werden an folgende Topics geschickt:

Code: Alles auswählen

openWB/set/evu/WhImported 
openWB/set/evu/WhExported

Wie in diesem Thread vorgeschlagen, habe ich auch mit den Nachkommastellen gespielt und sichergestellt, dass ich numerische Werte schicke.
Bildschirmfoto vom 2025-11-18 09-48-24.png
Bildschirmfoto vom 2025-11-18 09-48-24.png (16.96 KiB) 112 mal betrachtet
Bisher aber ohne Erfolg.

Hat da ev. jemand noch eine Idee?

PS: Ich habe gar nichts gegen die Posts mit Flows, ganz im Gegenteil... :-)

Code: Alles auswählen

[{"id":"7993662aaa32078e","type":"group","z":"7f9ef685.babe58","name":"This flow computes the input for the openWB energy manager","style":{"label":true},"nodes":["fbdab03365341ee7","32adcdca57f746d8","271668c90226888f","b13363c51ed87dea","14433bcb978823db","87e1488e4a4843c5","3cb9dae26753f906","ac145ec23d0c24cb","f3604b0b4c6cc202","d5ea58fbe5755a6b","8abb9ea85c4effb7","cfc4eaff5591c17a","0cef386fa6279e42","42111814e246db04","7da63ec045c8a365","2e8ee5d4cf61f29d","fa20b751addfb775","221881dd7c4589e1","84cd5b78eb98ba80","b8becc81fbd0ae5e","12620f81e50c7678","d6ecf57a40fc5d22","46af17ef51cb1d9c","d7d89d8774978362","47fe4f781bbface8","0386d3e1c8357cf2"],"x":34,"y":1619,"w":1112,"h":702},{"id":"fbdab03365341ee7","type":"mqtt in","z":"7f9ef685.babe58","g":"7993662aaa32078e","name":"Groupe-e Smartmeter Power (Grid)","topic":"tele/gPlugD/SENSOR","qos":"2","datatype":"json","broker":"7a4dd03f.f90ad","nl":false,"rap":true,"rh":0,"inputs":0,"x":200,"y":1900,"wires":[["32adcdca57f746d8","fa20b751addfb775"]]},{"id":"32adcdca57f746d8","type":"function","z":"7f9ef685.babe58","g":"7993662aaa32078e","name":"Conversion for openWB","func":"//This function replaces the SolarLog input for the openWB\n//Input is taken from the gPlugD device connected to the \n//Groupe-e smart meter and converted to match the requirements\n//of the openWB MQTT EVU input \n//17.11.25: Initial setup\n\n\n//The smartmeter does not provide the daily import and export values, so, we need to\n//compute them ourselfes\n//Setting up all required variables for the calculation\nconst MidnightWhArray = flow.get(\"MidnightReading\"); //Format (totals since smartmeter installation): \n                                                     //imported peaktariff, imported low tariff,\n                                                     //exported peaktariff, exported low tariff\n\nconst WhImportedActual  = (parseFloat(msg.payload[\"z\"][\"Ei1\"])+parseFloat(msg.payload[\"z\"][\"Ei2\"]))*1000;\nconst WhExportedActual  = (parseFloat(msg.payload[\"z\"][\"Eo1\"])+parseFloat(msg.payload[\"z\"][\"Eo2\"]))*1000;\n\nconst WhImportedMidnight = (MidnightWhArray[0] + MidnightWhArray[1])*1000+0.000001;\nconst WhExportedMidnight = (MidnightWhArray[2] + MidnightWhArray[3])*1000+0.000001;\n\n\nlet GridPower = new Object();\nlet AmpPh1 = new Object();\nlet AmpPh2 = new Object();\nlet AmpPh3 = new Object();\nlet WhImported = new Object();\nlet WhExported = new Object();\nlet VPh1 = new Object();\nlet VPh2 = new Object();\nlet VPh3 = new Object();\nlet Frq  = new Object(); //Frequency, currently not used\nlet WPh1 = new Object();\nlet WPh2 = new Object();\nlet WPh3 = new Object();\n\n\nGridPower.payload     = parseInt((msg.payload[\"z\"][\"Pi\"]- msg.payload[\"z\"][\"Po\"])*1000);\n\nWPh1.payload        = parseFloat(msg.payload[\"z\"][\"P1i\"]) - parseFloat(msg.payload[\"z\"][\"P1o\"]);\nWPh2.payload        = parseFloat(msg.payload[\"z\"][\"P2i\"]) - parseFloat(msg.payload[\"z\"][\"P2o\"]);\nWPh3.payload        = parseFloat(msg.payload[\"z\"][\"P3i\"]) - parseFloat(msg.payload[\"z\"][\"P3o\"]);\n\n\n\n//the smartmeter does not report exported Amps as negative number, hence we need to adapt\nAmpPh1.payload      = parseFloat(msg.payload[\"z\"][\"I1\"]);\nif (WPh1.payload < 0 ){\n    AmpPh1.payload = AmpPh1.payload*-1;\n}\n\nAmpPh2.payload      = parseFloat(msg.payload[\"z\"][\"I2\"]);\nif (WPh2.payload < 0 ){\n    AmpPh2.payload = AmpPh2.payload *-1;\n}\n\nAmpPh3.payload      = parseFloat(msg.payload[\"z\"][\"I3\"]);\nif (WPh3.payload < 0 ){\n    AmpPh3.payload = AmpPh3.payload*-1;\n}\n\n\n//the difference between the actual reading and the reading from midnight is the daily consumption or export\nWhImported.payload  = WhImportedActual-WhImportedMidnight;\nWhExported.payload  = WhExportedActual-WhExportedMidnight;\n\nVPh1.payload = parseFloat(msg.payload[\"z\"][\"V1\"]);\nVPh2.payload = parseFloat(msg.payload[\"z\"][\"V2\"]);\nVPh3.payload = parseFloat(msg.payload[\"z\"][\"V3\"]);\n\nFrq.payload  = 50.00; //fix value for the moment\n\n\n\nreturn [GridPower, AmpPh1, AmpPh2, AmpPh3, WhImported, WhExported, VPh1, VPh2, VPh3, Frq, WPh1, WPh2, WPh3 ];","outputs":13,"timeout":0,"noerr":0,"initialize":"","finalize":"","libs":[],"x":570,"y":1900,"wires":[["271668c90226888f"],["b13363c51ed87dea"],["14433bcb978823db"],["87e1488e4a4843c5"],["0cef386fa6279e42","47fe4f781bbface8"],["42111814e246db04","0386d3e1c8357cf2"],["3cb9dae26753f906"],["ac145ec23d0c24cb"],["f3604b0b4c6cc202"],["7da63ec045c8a365"],["d5ea58fbe5755a6b"],["8abb9ea85c4effb7"],["cfc4eaff5591c17a"]]},{"id":"271668c90226888f","type":"mqtt out","z":"7f9ef685.babe58","g":"7993662aaa32078e","name":"Grid power","topic":"openWB/set/evu/W","qos":"","retain":"","respTopic":"","contentType":"","userProps":"","correl":"","expiry":"","broker":"7a4dd03f.f90ad","x":1050,"y":1660,"wires":[]},{"id":"b13363c51ed87dea","type":"mqtt out","z":"7f9ef685.babe58","g":"7993662aaa32078e","name":"APhase1","topic":"openWB/set/evu/APhase1","qos":"","retain":"","respTopic":"","contentType":"","userProps":"","correl":"","expiry":"","broker":"7a4dd03f.f90ad","x":1060,"y":1700,"wires":[]},{"id":"14433bcb978823db","type":"mqtt out","z":"7f9ef685.babe58","g":"7993662aaa32078e","name":"APhase2","topic":"openWB/set/evu/APhase2","qos":"","retain":"","respTopic":"","contentType":"","userProps":"","correl":"","expiry":"","broker":"7a4dd03f.f90ad","x":1060,"y":1740,"wires":[]},{"id":"87e1488e4a4843c5","type":"mqtt out","z":"7f9ef685.babe58","g":"7993662aaa32078e","name":"APhase3","topic":"openWB/set/evu/APhase3","qos":"","retain":"","respTopic":"","contentType":"","userProps":"","correl":"","expiry":"","broker":"7a4dd03f.f90ad","x":1060,"y":1780,"wires":[]},{"id":"3cb9dae26753f906","type":"mqtt out","z":"7f9ef685.babe58","g":"7993662aaa32078e","name":"VPhase1","topic":"openWB/set/evu/VPhase1","qos":"","retain":"","respTopic":"","contentType":"","userProps":"","correl":"","expiry":"","broker":"7a4dd03f.f90ad","x":1060,"y":1900,"wires":[]},{"id":"ac145ec23d0c24cb","type":"mqtt out","z":"7f9ef685.babe58","g":"7993662aaa32078e","name":"VPhase2","topic":"openWB/set/evu/VPhase2","qos":"","retain":"","respTopic":"","contentType":"","userProps":"","correl":"","expiry":"","broker":"7a4dd03f.f90ad","x":1060,"y":1940,"wires":[]},{"id":"f3604b0b4c6cc202","type":"mqtt out","z":"7f9ef685.babe58","g":"7993662aaa32078e","name":"VPhase3","topic":"openWB/set/evu/VPhase3","qos":"","retain":"","respTopic":"","contentType":"","userProps":"","correl":"","expiry":"","broker":"7a4dd03f.f90ad","x":1060,"y":1980,"wires":[]},{"id":"d5ea58fbe5755a6b","type":"mqtt out","z":"7f9ef685.babe58","g":"7993662aaa32078e","name":"WPhase1","topic":"openWB/set/evu/WPhase1","qos":"","retain":"","respTopic":"","contentType":"","userProps":"","correl":"","expiry":"","broker":"7a4dd03f.f90ad","x":1060,"y":2060,"wires":[]},{"id":"8abb9ea85c4effb7","type":"mqtt out","z":"7f9ef685.babe58","g":"7993662aaa32078e","name":"WPhase2","topic":"openWB/set/evu/WPhase2","qos":"","retain":"","respTopic":"","contentType":"","userProps":"","correl":"","expiry":"","broker":"7a4dd03f.f90ad","x":1060,"y":2100,"wires":[]},{"id":"cfc4eaff5591c17a","type":"mqtt out","z":"7f9ef685.babe58","g":"7993662aaa32078e","name":"WPhase3","topic":"openWB/set/evu/WPhase3","qos":"","retain":"","respTopic":"","contentType":"","userProps":"","correl":"","expiry":"","broker":"7a4dd03f.f90ad","x":1060,"y":2140,"wires":[]},{"id":"0cef386fa6279e42","type":"mqtt out","z":"7f9ef685.babe58","g":"7993662aaa32078e","name":"WhImported ","topic":"openWB/set/evu/WhImported ","qos":"","retain":"","respTopic":"","contentType":"","userProps":"","correl":"","expiry":"","broker":"7a4dd03f.f90ad","x":1050,"y":1820,"wires":[]},{"id":"42111814e246db04","type":"mqtt out","z":"7f9ef685.babe58","g":"7993662aaa32078e","name":"WhExported ","topic":"openWB/set/evu/WhExported ","qos":"","retain":"","respTopic":"","contentType":"","userProps":"","correl":"","expiry":"","broker":"7a4dd03f.f90ad","x":1050,"y":1860,"wires":[]},{"id":"7da63ec045c8a365","type":"mqtt out","z":"7f9ef685.babe58","g":"7993662aaa32078e","name":"Frequency","topic":"openWB/set/evu/Hz","qos":"","retain":"","respTopic":"","contentType":"","userProps":"","correl":"","expiry":"","broker":"7a4dd03f.f90ad","x":1050,"y":2020,"wires":[]},{"id":"2e8ee5d4cf61f29d","type":"inject","z":"7f9ef685.babe58","g":"7993662aaa32078e","name":"Get midnight reading","props":[{"p":"payload"},{"p":"topic","vt":"str"}],"repeat":"","crontab":"00 00 * * *","once":true,"onceDelay":"60","topic":"GetMidnightReading","payload":"","payloadType":"date","x":180,"y":2220,"wires":[["fa20b751addfb775"]]},{"id":"fa20b751addfb775","type":"function","z":"7f9ef685.babe58","g":"7993662aaa32078e","name":"Compute smartmeter counter @ midnight","func":"//this function get's the reading from the smartmeter counters at mightnight\n//and provides it for the provision of differentials to various applications\n//17.11.25: Initial setup\n\nconst TimeZoneOffset = new Date().getTimezoneOffset()/-60; //make it positive\nlet CurrentTime = new Date().toISOString();\n\n\nswitch (msg.topic) {\n    case \"tele/gPlugD/SENSOR\": //if msg from Smartmeter (gPlugD)\n        context.data.WhImportedPeak = parseFloat(msg.payload[\"z\"][\"Ei1\"]);\n        context.data.WhImportedLow = parseFloat(msg.payload[\"z\"][\"Ei2\"]);\n        context.data.WhExportedPeak = parseFloat(msg.payload[\"z\"][\"Eo1\"]);\n        context.data.WhExportedLow = parseFloat(msg.payload[\"z\"][\"Eo2\"]);\n        context.data.WhArray = [context.data.WhImportedPeak, context.data.WhImportedLow, context.data.WhExportedPeak, context.data.WhExportedLow];\n        msg = null;\n    break;\n\n    case \"GetMidnightReading\": \n        flow.set(\"MidnightReading\", context.data.WhArray);\n        //msg.payload = CurrentTime + \" Grid counters at midnight (Ei1, Ei2, Eo1, Eo2): \" + flow.get(\"MidnightReading\");\n        msg.payload = context.data.WhArray;\n    break;\n\n    default:\n        msg = null;\n    break;\n\n}\n\nif (msg != null){\n    return msg;\n}\n\n\n\n\n","outputs":1,"timeout":0,"noerr":0,"initialize":"// Der Code hier wird ausgeführt,\n// wenn der Node gestartet wird\ncontext.data = context.data || new Object();\ncontext.data.WhImportedPeak = 0;\ncontext.data.WhImportedLow = 0;\ncontext.data.WhExportedPeak = 0;\ncontext.data.WhExportedLow = 0; \ncontext.data.WhArray = 0;","finalize":"","libs":[],"x":620,"y":2220,"wires":[["d7d89d8774978362"]]},{"id":"221881dd7c4589e1","type":"file","z":"7f9ef685.babe58","g":"7993662aaa32078e","name":"Write counters","filename":"/var/log/SmartMeterCounters.log","filenameType":"str","appendNewline":false,"createDir":false,"overwriteFile":"true","encoding":"utf8","x":1040,"y":2220,"wires":[[]]},{"id":"84cd5b78eb98ba80","type":"inject","z":"7f9ef685.babe58","g":"7993662aaa32078e","name":"On Startup","props":[{"p":"payload"},{"p":"topic","vt":"str"}],"repeat":"","crontab":"","once":true,"onceDelay":"10","topic":"","payload":"","payloadType":"date","x":150,"y":2280,"wires":[["b8becc81fbd0ae5e"]]},{"id":"b8becc81fbd0ae5e","type":"file in","z":"7f9ef685.babe58","g":"7993662aaa32078e","name":"Reading Last Smartmeter Counters","filename":"/var/log/SmartMeterCounters.log","filenameType":"str","format":"utf8","chunk":false,"sendError":false,"encoding":"utf8","allProps":false,"x":420,"y":2280,"wires":[["46af17ef51cb1d9c"]]},{"id":"12620f81e50c7678","type":"debug","z":"7f9ef685.babe58","g":"7993662aaa32078e","name":"Startup Values","active":true,"tosidebar":true,"console":false,"tostatus":false,"complete":"payload","targetType":"msg","statusVal":"","statusType":"auto","x":1020,"y":2280,"wires":[]},{"id":"d6ecf57a40fc5d22","type":"function","z":"7f9ef685.babe58","g":"7993662aaa32078e","name":"Make flow variable","func":"//this function gets the last stored smartmeter readings from file\n//and stores it correctly formated in the flow variable\n//17.11.25: Initial setup\n\nconst MidnightArray = msg.payload;\nlet WhArray = [];\n\nWhArray[0] = parseFloat([MidnightArray][0][\"col1\"]);\nWhArray[1] = parseFloat([MidnightArray][0][\"col2\"]);\nWhArray[2] = parseFloat([MidnightArray][0][\"col3\"]);\nWhArray[3] = parseFloat([MidnightArray][0][\"col4\"]);\n\nflow.set(\"MidnightReading\", WhArray);\n\nmsg.payload =  WhArray;\n\nreturn msg;","outputs":1,"timeout":0,"noerr":0,"initialize":"","finalize":"","libs":[],"x":830,"y":2280,"wires":[["12620f81e50c7678"]]},{"id":"46af17ef51cb1d9c","type":"csv","z":"7f9ef685.babe58","g":"7993662aaa32078e","name":"","spec":"rfc","sep":",","hdrin":"","hdrout":"none","multi":"one","ret":"\\n","temp":"","skip":"0","strings":true,"include_empty_strings":"","include_null_values":"","x":650,"y":2280,"wires":[["d6ecf57a40fc5d22"]]},{"id":"d7d89d8774978362","type":"csv","z":"7f9ef685.babe58","g":"7993662aaa32078e","name":"","spec":"rfc","sep":",","hdrin":"","hdrout":"none","multi":"one","ret":"\\n","temp":"","skip":"0","strings":true,"include_empty_strings":"","include_null_values":"","x":870,"y":2220,"wires":[["221881dd7c4589e1"]]},{"id":"47fe4f781bbface8","type":"debug","z":"7f9ef685.babe58","g":"7993662aaa32078e","name":"WhImported","active":true,"tosidebar":true,"console":false,"tostatus":false,"complete":"payload","targetType":"msg","statusVal":"","statusType":"auto","x":810,"y":2100,"wires":[]},{"id":"0386d3e1c8357cf2","type":"debug","z":"7f9ef685.babe58","g":"7993662aaa32078e","name":"WhExported","active":true,"tosidebar":true,"console":false,"tostatus":false,"complete":"payload","targetType":"msg","statusVal":"","statusType":"auto","x":810,"y":2140,"wires":[]},{"id":"7a4dd03f.f90ad","type":"mqtt-broker","name":"OpenWB","broker":"192.168.1.65","port":"1883","clientid":"","autoConnect":true,"usetls":false,"protocolVersion":"4","keepalive":"60","cleansession":true,"autoUnsubscribe":true,"birthTopic":"","birthQos":"0","birthPayload":"","birthMsg":{},"closeTopic":"","closeQos":"0","closePayload":"","closeMsg":{},"willTopic":"","willQos":"0","willPayload":"","willMsg":{},"userProps":"","sessionExpiry":""}]

Nachtrag: Output von /var/www/html/openWB/ramdisk/mqtt.log

Code: Alles auswählen

 
 2025-11-18 10:08:50,370: Topic: openWB/set/evu/W, Message: 15
2025-11-18 10:08:50,375: Topic: openWB/set/evu/APhase1, Message: 1
2025-11-18 10:08:50,379: Topic: openWB/set/evu/APhase2, Message: 2
2025-11-18 10:08:50,383: Topic: openWB/set/evu/APhase3, Message: -1
2025-11-18 10:08:50,388: Topic: openWB/set/evu/WhImported , Message: 25395.999998999992
2025-11-18 10:08:50,391: Topic: openWB/set/evu/WhExported , Message: 239.99999900069088
2025-11-18 10:08:50,394: Topic: openWB/set/evu/VPhase1, Message: 238.8
2025-11-18 10:08:50,398: Topic: openWB/set/evu/VPhase2, Message: 238.5
2025-11-18 10:08:50,403: Topic: openWB/set/evu/VPhase3, Message: 239.2
2025-11-18 10:08:50,407: Topic: openWB/set/evu/Hz, Message: 50
2025-11-18 10:08:50,412: Topic: openWB/set/evu/WPhase1, Message: 29
2025-11-18 10:08:50,417: Topic: openWB/set/evu/WPhase2, Message: 118
2025-11-18 10:08:50,421: Topic: openWB/set/evu/WPhase3, Message: -131 
Antworten