EVU mit MQTT
-
derirrepeter
- Beiträge: 26
- Registriert: So Jun 27, 2021 1:07 pm
- Been thanked: 1 time
Re: EVU mit MQTT
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
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.
Wie man nachstehend sieht, sind alle Werte vorhanden ausser den beiden:
Im MQTT-Explorer wird dies bestätigt:
Die beiden Werte werden an folgende Topics geschickt:
Wie in diesem Thread vorgeschlagen, habe ich auch mit den Nachkommastellen gespielt und sichergestellt, dass ich numerische Werte schicke. Bisher aber ohne Erfolg.
Hat da ev. jemand noch eine Idee?
PS: Ich habe gar nichts gegen die Posts mit Flows, ganz im Gegenteil...
Nachtrag: Output von /var/www/html/openWB/ramdisk/mqtt.log
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.
Wie man nachstehend sieht, sind alle Werte vorhanden ausser den beiden:
Im MQTT-Explorer wird dies bestätigt:
Die beiden Werte werden an folgende Topics geschickt:
Code: Alles auswählen
openWB/set/evu/WhImported
openWB/set/evu/WhExportedWie in diesem Thread vorgeschlagen, habe ich auch mit den Nachkommastellen gespielt und sichergestellt, dass ich numerische Werte schicke. 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