Re: EVU mit MQTT
Verfasst: Di Mär 28, 2023 1:27 pm
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.
Code: Alles auswählen
openWB/set/evu/WhImported
openWB/set/evu/WhExportedCode: 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":""}]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 Code: Alles auswählen
2025-11-22 14:42:04,030: Topic: openWB/set/evu/faultState, Message: 0
2025-11-22 14:42:04,077: Topic: openWB/set/evu/faultStr, Message: Kein Fehler
2025-11-22 14:42:07,673: Topic: openWB/set/evu/W, Message: -650
2025-11-22 14:42:07,727: Topic: openWB/set/evu/APhase1, Message: -3
2025-11-22 14:42:07,729: Topic: openWB/set/evu/APhase2, Message: -4
2025-11-22 14:42:07,731: Topic: openWB/set/evu/APhase3, Message: -3
2025-11-22 14:42:07,734: Topic: openWB/set/evu/WhImported, Message: 41731
2025-11-22 14:42:07,737: Topic: openWB/set/evu/WhExported, Message: 6886
2025-11-22 14:42:07,739: Topic: openWB/set/evu/VPhase1, Message: 239.5
2025-11-22 14:42:07,742: Topic: openWB/set/evu/VPhase2, Message: 239.6
2025-11-22 14:42:07,745: Topic: openWB/set/evu/VPhase3, Message: 239.4
2025-11-22 14:42:07,747: Topic: openWB/set/evu/Hz, Message: 50
2025-11-22 14:42:07,749: Topic: openWB/set/evu/WPhase1, Message: -224
2025-11-22 14:42:07,751: Topic: openWB/set/evu/WPhase2, Message: -101
2025-11-22 14:42:07,754: Topic: openWB/set/evu/WPhase3, Message: -324