NEWS
Tageszähler Stromverbrauch
-
@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.