NEWS
Tageszähler Stromverbrauch
-
@martybr Wie Du an der Debugausgabe siehst enthält das ausgegebene Nachrichtenobjekt eine payload:
und der topic war täglich - also ist das der tägliche Verbrauch der hier in der Debug node ausgegeben wird.
Nun simuliere ich mal mit einer Inject-Node einen täglichen Verbrauch von 150,25 Wh.
Nun nimmst Du einfach eine ChangeNode und modifizierst Deine payload - indem Du durch 1000 teilst und mit dem kWh Preis multiplizierst. Das Ergebnis wird nun in der Debug Node Kosten ausgegeben. Wenn der kWh Preis 0,325 € ist.
Das Ergebnis kannst Du dann natürlich irgendwo im iobroker speichern.
Wenn Du Dich aber nicht weiter mit NodeRed beschäftigen willst und doch lieber puzzelst, kannst Du ja mit Blockly die Datenpunkte weiter verarbeiten.
-
@mickym
Nein, mit Blockly läuft das ja. Ich will es ja gerade aufgrund der Übersichtlichkeit in Node-red machen!
Hänge ich den Change-node nun nach dem Subflow? Wie kann ich die Datenstruktur anlegen? -
@martybr Nun ja Du kannst die Change Node wie gesagt an den Subflow hängen und dann ggf. das topic so verändern, dass die Datenpunkte automatisch geschrieben werden.
Ich habe Dir ja gerade gezeigt wie Du die payload veränderst, Du kannst das natürlich auch das topic entsprechend verändern.
Wenn Du Dir in der DebugNode das komplette Nachrichtenobjekt ausgeben lässt, dann siehst Du ja folgendes:
So neben der payload - kannst Du auch das topic modifizieren. Wenn Du bis jetzt bei Deinem Strombezug
0_userdata.0.Test.Strombezug als Basis angegeben hast, dann solltest Du ja darunter nun 2 Ordner mit den Zähler und Verbrauch haben.
Nun kannst Du ja für die Kosten noch einen Ordner Kosten nehmen und das topic entsprechend dran hängen.Wie Du in der letzten Debugausgabe nun siehst wurde das topic täglich nun mit dem vollständigen Pfad ergänzt.
Also: 0_userdata.0.Test.Strombezug.Kosten.täglichIn einer iobroker-Out Node kannst Du nun die payload in den Datenpunkt schreiben - und da kein topic angegeben wurde, wird automatisch das topic des Nachrichtenobjektes genommen.
Hier mal die Konfiguration der iobroker-Out Node:
Type ist hier "value" - das entspricht im Blocky was bestätigt schreiben (oder aktualisiere). Wenn Du type command nutzt wird unbestätigt als ohne ACK Flag geschrieben (also steuere). Dann kannst Du auch gleich die Einheit und den Datentyp mitgeben.
Wie Du siehst wurde mit dieser Konfiguration die payload in einen Datenpunkt geschrieben:
und zwar unter : 0_userdata.0.Test.Strombezug.Kosten.täglich
Hier wieder zum Import zum Spielen:
-
@mickym
Das sieht schon sehr gut aus.Ich habe auch die Einspeisung eingetragen, da gerade kein Strombezug erfolgt.
Hier der komplette Flow:
[ { "id": "dea0daa6098ba7f9", "type": "subflow", "name": "Verbrauchszähler", "info": "## Parameter:\r\n\r\n\r\n`counterSource` : Hier gibt man den Datenpunkt des Zählers an, der überwacht werden soll. <br>\r\n`baseTopic` : Hier gibt man den Basispfad ein, unter dem die Datenpunkte für Zählerstände und Verbrauchswerte abgespeichert werden sollen. <br>\r\n`changeFactor` : Hier kann man einen Wert eingeben mit dem die ermittelten Differenzen der Zählerstände multipliziert werden sollen. <br>\r\n`counterOffset` : Hier gibt einen Wert eingeben, der auf den aktuellen Zählerstand addiert wird, um ggf. einen Reset des Zählers zu kompensieren. <br>", "category": "", "in": [ { "x": 60, "y": 140, "wires": [ { "id": "e5bc5007405e7a46" } ] } ], "out": [ { "x": 1600, "y": 220, "wires": [ { "id": "f009873d7eb21eef", "port": 0 } ] } ], "env": [ { "name": "counterSource", "type": "str", "value": "" }, { "name": "baseTopic", "type": "str", "value": "0_userdata.0.Test.Gerät1" }, { "name": "changeFactor", "type": "num", "value": "1" }, { "name": "counterOffset", "type": "num", "value": "0" } ], "meta": {}, "color": "#DDAA99" }, { "id": "4d38b16657026f40", "type": "ioBroker get", "z": "dea0daa6098ba7f9", "name": "Aktueller Zähler", "topic": "", "attrname": "current", "payloadType": "value", "errOnInvalidState": "nothing", "x": 400, "y": 140, "wires": [ [ "a2654ab97236c877" ] ] }, { "id": "90df61e86d3b840c", "type": "change", "z": "dea0daa6098ba7f9", "name": "ermittle Verbrauch", "rules": [ { "t": "set", "p": "payload", "pt": "msg", "to": "current - payload", "tot": "jsonata" }, { "t": "set", "p": "factor", "pt": "msg", "to": "changeFactor", "tot": "env" }, { "t": "set", "p": "payload", "pt": "msg", "to": "payload * factor", "tot": "jsonata" }, { "t": "set", "p": "topic", "pt": "msg", "to": "consumption", "tot": "msg" } ], "action": "", "property": "", "from": "", "to": "", "reg": false, "x": 1210, "y": 140, "wires": [ [ "a00ead7de4cf452b", "f009873d7eb21eef" ] ] }, { "id": "a00ead7de4cf452b", "type": "ioBroker out", "z": "dea0daa6098ba7f9", "name": "Verbrauch", "topic": "", "ack": "true", "autoCreate": "true", "stateName": "", "role": "", "payloadType": "number", "readonly": "false", "stateUnit": "", "stateMin": "", "stateMax": "", "x": 1450, "y": 140, "wires": [] }, { "id": "cba5d50c245cea3d", "type": "change", "z": "dea0daa6098ba7f9", "name": "Basistopics", "rules": [ { "t": "set", "p": "base", "pt": "msg", "to": "baseTopic", "tot": "env" }, { "t": "set", "p": "topic", "pt": "msg", "to": "base & \".Zähler.\" & payload.config.topic", "tot": "jsonata" }, { "t": "set", "p": "consumption", "pt": "msg", "to": "base & \".Verbrauch.\" & payload.config.topic", "tot": "jsonata" }, { "t": "set", "p": "schedulerTopic", "pt": "flow", "to": "payload.config.topic", "tot": "msg" } ], "action": "", "property": "", "from": "", "to": "", "reg": false, "x": 810, "y": 140, "wires": [ [ "a07be4046c224cbf" ] ] }, { "id": "a07be4046c224cbf", "type": "ioBroker get", "z": "dea0daa6098ba7f9", "name": "Lese Zähler", "topic": "", "attrname": "payload", "payloadType": "value", "errOnInvalidState": "false", "x": 990, "y": 140, "wires": [ [ "90df61e86d3b840c", "b6eb7ae3096fbfdf" ] ] }, { "id": "1c947b18a0aa183f", "type": "ioBroker out", "z": "dea0daa6098ba7f9", "name": "Schreibe Zähler", "topic": "", "ack": "true", "autoCreate": "true", "stateName": "", "role": "", "payloadType": "number", "readonly": "false", "stateUnit": "", "stateMin": "", "stateMax": "", "x": 1460, "y": 80, "wires": [] }, { "id": "b6eb7ae3096fbfdf", "type": "change", "z": "dea0daa6098ba7f9", "name": "Update Zähler", "rules": [ { "t": "set", "p": "payload", "pt": "msg", "to": "current", "tot": "msg" } ], "action": "", "property": "", "from": "", "to": "", "reg": false, "x": 1220, "y": 80, "wires": [ [ "1c947b18a0aa183f" ] ] }, { "id": "e5bc5007405e7a46", "type": "change", "z": "dea0daa6098ba7f9", "name": "", "rules": [ { "t": "set", "p": "topic", "pt": "msg", "to": "counterSource", "tot": "env" } ], "action": "", "property": "", "from": "", "to": "", "reg": false, "x": 200, "y": 140, "wires": [ [ "4d38b16657026f40" ] ] }, { "id": "f009873d7eb21eef", "type": "change", "z": "dea0daa6098ba7f9", "name": "", "rules": [ { "t": "set", "p": "topic", "pt": "msg", "to": "schedulerTopic", "tot": "flow" } ], "action": "", "property": "", "from": "", "to": "", "reg": false, "x": 1460, "y": 220, "wires": [ [] ] }, { "id": "a2654ab97236c877", "type": "change", "z": "dea0daa6098ba7f9", "name": "Counter Offset", "rules": [ { "t": "set", "p": "offset", "pt": "msg", "to": "counterOffset", "tot": "env" }, { "t": "set", "p": "current", "pt": "msg", "to": "current + offset", "tot": "jsonata" } ], "action": "", "property": "", "from": "", "to": "", "reg": false, "x": 600, "y": 140, "wires": [ [ "cba5d50c245cea3d" ] ] }, { "id": "b6a02d4027b9655a", "type": "tab", "label": "Energiezähler", "disabled": false, "info": "", "env": [] }, { "id": "bb070f61d47fcdfd", "type": "cronplus", "z": "b6a02d4027b9655a", "name": "", "outputField": "payload", "timeZone": "", "storeName": "", "commandResponseMsgOutput": "output1", "defaultLocation": "", "defaultLocationType": "default", "outputs": 1, "options": [ { "name": "daily", "topic": "täglich", "payloadType": "default", "payload": "", "expressionType": "cron", "expression": "0 0 0 * * * *", "location": "", "offset": "0", "solarType": "all", "solarEvents": "sunrise,sunset" }, { "name": "weekly", "topic": "wöchentlich", "payloadType": "default", "payload": "", "expressionType": "cron", "expression": "0 0 0 * * 1 *", "location": "", "offset": "0", "solarType": "all", "solarEvents": "sunrise,sunset" }, { "name": "monthly", "topic": "monatlich", "payloadType": "default", "payload": "", "expressionType": "cron", "expression": "0 0 0 1 * *", "location": "", "offset": "0", "solarType": "all", "solarEvents": "sunrise,sunset" }, { "name": "yearly", "topic": "jährlich", "payloadType": "default", "payload": "", "expressionType": "cron", "expression": "0 0 0 1 1 * *", "location": "", "offset": "0", "solarType": "all", "solarEvents": "sunrise,sunset" }, { "name": "hourly", "topic": "stündlich", "payloadType": "default", "payload": "", "expressionType": "cron", "expression": "0 0 * * * * *", "location": "", "offset": "0", "solarType": "all", "solarEvents": "sunrise,sunset" } ], "x": 260, "y": 120, "wires": [ [ "897ac0a3992b06da", "cf229178dca653c1" ] ] }, { "id": "f1b0b23ecc796e87", "type": "inject", "z": "b6a02d4027b9655a", "name": "", "props": [ { "p": "topic", "vt": "str" } ], "repeat": "", "crontab": "", "once": false, "onceDelay": 0.1, "topic": "trigger-all", "x": 100, "y": 120, "wires": [ [ "bb070f61d47fcdfd" ] ] }, { "id": "897ac0a3992b06da", "type": "subflow:dea0daa6098ba7f9", "z": "b6a02d4027b9655a", "name": "Strombezug", "env": [ { "name": "counterSource", "value": "alias.0.Verbrauch.Strom.HWR.Strom_Bezug", "type": "str" }, { "name": "baseTopic", "value": "0_userdata.0.Test.Strombezug", "type": "str" } ], "x": 450, "y": 80, "wires": [ [ "42acf696bed0fcbd" ] ] }, { "id": "cf229178dca653c1", "type": "subflow:dea0daa6098ba7f9", "z": "b6a02d4027b9655a", "name": "Einspeisung", "env": [ { "name": "counterSource", "value": "alias.0.Verbrauch.Strom.HWR.Strom_Einspeisung", "type": "str" }, { "name": "baseTopic", "value": "0_userdata.0.Test.Stromeinspeisung", "type": "str" } ], "x": 450, "y": 160, "wires": [ [ "f3f26be174740b51" ] ] }, { "id": "41276c4bdde5667d", "type": "ioBroker out", "z": "b6a02d4027b9655a", "name": "", "topic": "", "ack": "true", "autoCreate": "true", "stateName": "", "role": "", "payloadType": "number", "readonly": "false", "stateUnit": "€", "stateMin": "", "stateMax": "", "x": 960, "y": 80, "wires": [] }, { "id": "42acf696bed0fcbd", "type": "change", "z": "b6a02d4027b9655a", "name": "berechne Preis von kWh", "rules": [ { "t": "set", "p": "payload", "pt": "msg", "to": "payload * 0.425", "tot": "jsonata" }, { "t": "set", "p": "topic", "pt": "msg", "to": "\"0_userdata.0.Test.Strombezug.Kosten.\" & topic", "tot": "jsonata" } ], "action": "", "property": "", "from": "", "to": "", "reg": false, "x": 670, "y": 80, "wires": [ [ "4445a621b7b8914a", "41276c4bdde5667d" ] ] }, { "id": "4445a621b7b8914a", "type": "debug", "z": "b6a02d4027b9655a", "name": "Kosten", "active": false, "tosidebar": true, "console": false, "tostatus": false, "complete": "true", "targetType": "full", "statusVal": "", "statusType": "auto", "x": 900, "y": 180, "wires": [] }, { "id": "f3f26be174740b51", "type": "change", "z": "b6a02d4027b9655a", "name": "berechne Preis von kWh", "rules": [ { "t": "set", "p": "payload", "pt": "msg", "to": "payload * 0.08", "tot": "jsonata" }, { "t": "set", "p": "topic", "pt": "msg", "to": "\"0_userdata.0.Test.Stromeinspeisung.Kosten.\" & topic", "tot": "jsonata" } ], "action": "", "property": "", "from": "", "to": "", "reg": false, "x": 630, "y": 260, "wires": [ [ "945bd735a62776f4", "308d7f57c2f460d4" ] ] }, { "id": "945bd735a62776f4", "type": "ioBroker out", "z": "b6a02d4027b9655a", "name": "", "topic": "", "ack": "true", "autoCreate": "true", "stateName": "", "role": "", "payloadType": "number", "readonly": "false", "stateUnit": "€", "stateMin": "", "stateMax": "", "x": 900, "y": 260, "wires": [] }, { "id": "308d7f57c2f460d4", "type": "debug", "z": "b6a02d4027b9655a", "name": "Kosten", "active": false, "tosidebar": true, "console": false, "tostatus": false, "complete": "true", "targetType": "full", "statusVal": "", "statusType": "auto", "x": 900, "y": 340, "wires": [] } ]
Die anderen Datenpunkte kommen wahrscheinlich später dazu, wenn der Cron plus entsprechende Trigger bekommt?
Vielen Dank erst mal für deine Mühe. Ich schaue mir das mal genau an.
Ich hatte bei meinen Experimenten immer das Problem, dass der Change keine "Number" aus dem Payload erzeugen konnte. Aber jetzt habe ich ja einen Hinweis, wie es richtig gemacht wird.Danke noch mal für deine Hilfe!
-
Na schaut doch gut und übersichtlich aus. Um 15 Uhr sollte dann ja der erste Datenpunkt auftauchen, wenn Du alles einmal getriggert hattest.
An der Optik Deiner Flows kann man noch bissi arbeiten.
In der Hilfe zur cronplus Node - kannst Du Dich ja in die Details einlesen. Und Du musst halt überprüfen welche Einheit bei der Kostenberechnung ausgespuckt werden, ob kWh oder Wh. Aber das findest Du alles selbst raus.
-
@mickym
Genau. Ich baue jetzt noch die PV dazu. Hier brauche ich keine Kosten erfassen. Dann schaue ich mal, ob ich das auch schön grafisch umsetzen kann.P.S.
Ja, bin aber schon froh, dass "mein" erster Flow läuft -
@martybr Na Du siehst ja an dem Thread wie sich der Subflow so langsam entwickelt hat. Ich brauch da ja auch meine Zeit.
-
@mickym
das ist eine ganz neue Materie für mich. Ich möchte mich aber in Node-red einarbeiten.
Das Potential scheint ja recht vielversprechend zu sein. Es gibt ja viele Codes, wie der z.B. der Cron-plus, die man integrieren kann.
Da steht mir noch viel Arbeit vor der Tür! -
@martybr Du wirst sehen wie mächtig das ist - und dahinter steht eine viel größere Community - die NodeRed mit weiteren Nodes aufgebohrt haben. Ich hoffe es hat um 15 Uhr alles funktioniert.
Ich verstehe halt nicht, warum die Mehrheit lieber puzzelt - auch wenn sich da in letzter Zeit bzgl. Objektverarbeitung viel getan hat.
NodeRed stammt halt von der IBM, Blockly von Google.
Es macht aber nicht jede Node Sinn zu installieren. Ich schau immer das soviel wie möglich mit Hausmitteln geht.
-
@mickym
Ich sehe das genau so.Der stündliche Wert bei der Stromeinspeisung ist geschrieben worden. Der Flow scheint damit zulaufen.
Ich Frage habe ich noch: Beim Schreiben der Kosten wird die Einheit € mitgegeben. Beim Verbrauch nicht. Muss/soll ich jetzt im ioBroker die Unit der Datenpunkte ändern oder kann man ein Topic "unit": "kWh" mitgeben? -
@martybr Du kannst es am Besten in den Datenpunkten ändern. Ich hab es deswegen nicht im Flow gemacht - damit dieser für alle möglichen Einheiten verwendet werden kann. Also ändere es am Besten selbst. Wenn Du nur kWh hast - also alle Datenpunkte sollen diese Einheit , dann kannst du auch noch mal alle Datenpunkte löschen und den Subflow selbst ändern. (Die Einheit wird nur beim Anlegen der Datenpunkte mitgegeben).
Wie gesagt wenn Du den Subflow änderst auf die Subflow Node klicken:
Dann den Subflow bearbeiten:
Dann kannst Du ggf. in den iobroker Out Nodes das mitgeben. Ansonsten würde ich es einmal lieber manuell eintragen in dem Datenpunkt, da Du dann den Subflow auch für andere Einheiten - wie beispielsweise Liter oder was weiß ich verwenden kannst.
Ich könnte den Subflow auch noch anpassen und die Einheit als Parameter mitgeben - aber ehrlich gesagt, ist in meinen Augen der Aufwand vertretbar, dass man die Einheit wenn man will selbst einträgt.
-
@mickym
Alles klar. Da ich noch andere Zähler benutzen möchte, dann ändere ich die unit im ioBroker . -
@martybr Also den Subflow habe ich eigentlich aus einem Blockyl von @paul53 entwickelt.
https://forum.iobroker.net/post/1025319
Ich will mich da nicht mit fremden Federn schmücken.
Den kann man sicher auch als Unterprogramm laufen lassen und parametrisieren, wenn du lieber bei Blockly bleiben willst. -
@mickym
jetzt habe ich Blut geleckt! Ich versuche mal einige Scripte in Node-Red zu erstellen. Ich besorge mir zuerst mal Literatur für die Einarbeitung. Aktuell bin ja absoluter Laie. -
@martybr Ja mach das - Du kannst ja auch mal ein Blockly Skript mal in NodeRed umsetzen, um die Unterschiede zu sehen. Nur aufpassen, dass Du nicht beides gleichzeitig laufen lässt.
Melde Dich halt ggf. in einem eigenen Thread.Hier hatte ich mal ein paar Videolinks zusammengestellt: https://forum.iobroker.net/post/470328
Generell - finde ich die Tutorialvideos von Steve sehr empfehlenswert.
Und falls Du Fragen hast, versuche ich ja hier zu unterstützen.
-
-
@mickym sagte in Tageszähler Stromverbrauch:
@frankthegreat Ja dann schau mal - wenn Du nicht initialisierst, dann musst Du halt 2 Perioden abwarten - damit eine vollständige Periode berechnet wird.
Nach einer Woche Testlauf gibt's hier mal ein fettes "RESPEKT"
Super Sache, die du hier aus dem Hut gezogen hast.Logisch aufgebaut, leicht erweiterbar, DP's werden automatisch angelegt. Und wie ich sehe, gibt's schon wieder Verbesserungen und der Subflow wird auch von anderen genutzt.
Nochmal ein herzliches Dankeschön für deinen Einsatz.