NEWS
Tageszähler Stromverbrauch
-
Ggf. ist es sinnvoller - die Trigger alle gegen 0:00:00 starten zu lassen. Dann muss man die Scheduler halt entsprechend ändern:
-
@frankthegreat
Sourceanalytix (V0.4.14) hat auch mich, einen nicht unerheblichen Teil, meiner Zeit gekostet
Sourceanalytix (in meinem Fall Ermittlung der Solarproduktion, Eigenverbrauch, etc) )scheint die Differenz zum vorherigen Wert scheinbar erst zu ermitteln, wenn sich der zu triggernde Wert ändert, d.h. der zuletzt gelesene Wert wird beibehalten, und zwar unabhängig davon ob ein Tageswechsel stattgefunden hat. (Es soll ja eine neue Version in Arbeit sein)
Somit steht im currentday-Datenpunkt nach 00:00 Uhr immer noch der Tageswert des vorangegangenen Tages, bis eben der Datenpunkt bei aufgehender Sonne wieder weitergezählt wird.
Meine Lösung:
->Blockly mit Addition von 1 Watt auf den betreffenden Datenpunkt um 00:01 Uhr.
Wenn's supergenau sein soll kann das 1 Watt ja nach Sonnenaufgang wieder abgezogen werden.
Damit werden auch alle untergeordneten Datenpunkte für Monat, Jahr, Quartal, etc tagesgenau aktualisiert. -
@cäptnblaubär
Jepp, hab mit Sourceanalytics auch einiges an Zeit investiert. Ergebnis war aber ernüchternd
Von der Sache her ein guter Adapter mit jeder Menge DP's.
Mir kommt es ja auch nicht auf Milli-Watt-Genauigkeit anAber der Tageszähler sollte schon täglich um 0:00 oder 'ne Sekunde vorher wieder auf 0 springen. Die anderen Zähler hab ich zwar nicht probiert, vermutlich machen die das aber auch nicht.
Von daher ist der SA Adapter leider nicht zu gebrauchen. Schade um die viele Zeit, die der Entwickler da investiert hat -
mir hat das enorm geholfen. danke
-
@mickym
Hallo @mickym ,
kurz zu mir: Ich habe keinerlei Erfahrung mit Node-red und bin gerade über diesen Thread gestolpert und versuche die Programmierung nachzuvollziehen.
Ich habe deinen Flow installiert. Die Datenpunkte sind auch angelegt worden.
Ich stolpere aber an (mindesten) zwei Stellen:
Wie kann ich die Schedules erweitern? Ich hätte gerne zusätzlich stündlich und jährlich.
Weiter benötige ich eine Kostenauswertung getrennt nach Gerät.Mein Stand ist der Import des letzten Flows.
Viele Grüße
Martin -
@martybr
Das habe ich nun angepasst. Ist das so in Ordnung?[ { "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": "59 59 23 * * * *", "location": "", "offset": "0", "solarType": "all", "solarEvents": "sunrise,sunset" }, { "name": "weekly", "topic": "wöchentlich", "payloadType": "default", "payload": "", "expressionType": "cron", "expression": "59 59 23 * * 6 *", "location": "", "offset": "0", "solarType": "all", "solarEvents": "sunrise,sunset" }, { "name": "monthly", "topic": "monatlich", "payloadType": "default", "payload": "", "expressionType": "cron", "expression": "59 59 23 L * *", "location": "", "offset": "0", "solarType": "all", "solarEvents": "sunrise,sunset" }, { "name": "yearly", "topic": "jährlich", "payloadType": "default", "payload": "", "expressionType": "cron", "expression": "59 59 23 31 12 * *", "location": "", "offset": "0", "solarType": "all", "solarEvents": "sunrise,sunset" } ], "x": 340, "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": 60, "wires": [ [ "bb070f61d47fcdfd" ] ] }, { "id": "54b71782eaa202fa", "type": "inject", "z": "b6a02d4027b9655a", "name": "", "props": [ { "p": "payload" }, { "p": "topic", "vt": "str" } ], "repeat": "", "crontab": "", "once": false, "onceDelay": 0.1, "topic": "trigger", "payload": "daily", "payloadType": "str", "x": 110, "y": 180, "wires": [ [ "bb070f61d47fcdfd" ] ] }, { "id": "d8046ce919ab4e18", "type": "inject", "z": "b6a02d4027b9655a", "name": "", "props": [ { "p": "payload" }, { "p": "topic", "vt": "str" } ], "repeat": "", "crontab": "", "once": false, "onceDelay": 0.1, "topic": "trigger", "payload": "weekly", "payloadType": "str", "x": 110, "y": 240, "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": 570, "y": 80, "wires": [ [] ] }, { "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": 570, "y": 160, "wires": [ [] ] }, { "id": "3bdc50cc2fcf8f69", "type": "inject", "z": "b6a02d4027b9655a", "name": "", "props": [ { "p": "payload" }, { "p": "topic", "vt": "str" } ], "repeat": "", "crontab": "", "once": false, "onceDelay": 0.1, "topic": "trigger", "payload": "hour", "payloadType": "str", "x": 110, "y": 120, "wires": [ [ "bb070f61d47fcdfd" ] ] }, { "id": "361255190e614223", "type": "inject", "z": "b6a02d4027b9655a", "name": "", "props": [ { "p": "payload" }, { "p": "topic", "vt": "str" } ], "repeat": "", "crontab": "", "once": false, "onceDelay": 0.1, "topic": "trigger", "payload": "month", "payloadType": "str", "x": 110, "y": 300, "wires": [ [ "bb070f61d47fcdfd" ] ] }, { "id": "e9bd0262aa73e1c0", "type": "inject", "z": "b6a02d4027b9655a", "name": "", "props": [ { "p": "payload" }, { "p": "topic", "vt": "str" } ], "repeat": "", "crontab": "", "once": false, "onceDelay": 0.1, "topic": "trigger", "payload": "year", "payloadType": "str", "x": 110, "y": 360, "wires": [ [ "bb070f61d47fcdfd" ] ] } ]
-
Nein - die Inject Nodes mit dem manuellen Trigger brauchst Du eigentlich nicht, wenn Du erst alles mit allen Triggern initialisiert hast. ]
Wie Du die cron-Plus Node um Stunden erweiterst habe ich doch hier gezeigt:
https://forum.iobroker.net/post/1148049
bzw. mit 0:00 als Startzeit was ich persönlich schöner finde hier:
https://forum.iobroker.net/post/1148199Aber für Dich gerne nochmal die Node mit einem Stundentrigger:
Wenn Du manuell einen bestimmten Trigger auslösen möchtest, dann musst Du den Namen des Schedulers in die payload schreiben:
Ich hab Dir das korrespondierende reingeschrieben.
Die Subflows Nodes sind soweit in Ordnung. Jährlich war schon in der urspünglichen Node enthalten - das siehst Du an den Schedulern - NICHT an den Inject Nodes - die sind NUR zum TESTEN des jeweiligen Schedulers.!!!!
-
@martybr sagte in Tageszähler Stromverbrauch:
Weiter benötige ich eine Kostenauswertung getrennt nach Gerät.
Ich will den Flow selbst nicht weiter aufblähen, aber Du kannst den Flow natürlich beliebige erweitern. Du kannst ja über die iobroker-In Nodes einen weiteren Flow anstoßen, wenn der Datenpunkt getriggert oder geschrieben wurde bzw. deswegen habe ich es ja gemacht wird ja jeder Verbrauch auch ausgegeben.
In diesem Post siehst Du doch, dass jeder Verbrauch auch nochmal ausgegeben wird:
https://forum.iobroker.net/post/1148046Da ich das ja die bisherige Einheit Wattstunden war Wh - musst ggf. halt umrechnen auf kWh ( und durch 1000 dividieren) und dann halt mit dem cent Preis multiplizieren.
-
@mickym
Ich habe nun deine Änderungen eingetragen:[ { "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": 340, "y": 120, "wires": [ [ "897ac0a3992b06da", "cf229178dca653c1" ] ] } ]
Ist das so in Ordnung? Benötige ich die beiden Trigger "Daily und Weekly" nicht, also nur den Trigger "Trigger-all"?
-
@martybr sagte in Tageszähler Stromverbrauch:
Ist das so in Ordnung? Benötige ich die beiden Trigger "Daily und Weekly" nicht, also nur den Trigger "Trigger-all"?
Du siehst doch alle Scheduler. Mit den Inject-Nodes triggerst DU manuell - das ist einmal mit Trigger-all zum Initialisieren OK - aber ansonsten brauchst Du die Inject Nodes nicht. Du kannst die auch komplett löschen, dann werden die Datenpunkte halt erst angelegt, wenn der Zeitpunkt gekommen ist und dann erst beim übernächsten Mal gezählt, weil ja dann erst die jeweiligen Zählerstände erfasst werden.
-
@mickym Bisher habe ich solche Berechnungen nur in Blockly gemacht. Kannst du mir einen Denkanstoß in Richtung Node-red geben? Wie gesagt, ich habe Node-red erst heute installiert und möchte mich anhand eines Beispiels in die Materie einarbeiten.
-
@mickym
Das ist ja wirklich extrem übersichtlich! Vielen Dank dafür. -
@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!