NEWS
2 Werte Subtrtahieren in Node Red
-
@geschild sagte in 2 Werte Subtrtahieren in Node Red:
Übrigens wenn ihr hier ein Flow einstellt, dann nur zwischen CodeTags und dann verspoilern.. sonst kann niemand damit was anfangen."
Einfach die .txt öffnen, STRG-A, STRG-C, in NodeRed importieren. FeddichDas ist halt einfach umständlicher als wenn ich den Spoiler aufmache - auf SelectAll klicke und dann in die Zwischenablage kopiere.
Ich habs auch nicht gefunden. Wie gesagt - Deine Lösung KANN nur funktionieren, wenn Du in der function Node mit dem Node-Kontext arbeitet.
Falls nicht
werden sich die beide Nachrichten aus den aus den iobroker-IN Nachrichten NIE treffen. Ich kenne den Code wie gesagt nicht - ich seh das Ergebnis aber Du wirst dann wohl mit dem Node-Kontext gearbeitet haben.
var wr = context.get('Wechselrichter') || 0
oder so ähnlich,
dann musst halt das topic abfragen und dann ggf. neu setzen - also ich weiß schon wie es geht.
- Nur ich bin kein Freund des Codierens wenn es nicht sein muss.
- Dann macht man die visuelle Darstellung wieder kaputt. Im Prinzip kannst Du ganze Flows in eine function Node packen.
-
@mickym Danke, wieder was dazugelernt. Ja ich habe mit context gearbeitet.
-
@geschild Deine Lösung hat den Vorteil, wenn der Verbrauch nicht triggert, dass dann der Wert sofort angepasst wird. Sollte also auch der Wechelrichter triggern müsste man den Verbrauch extra auslesen und dann brauchst Du ein paar mehr Nodes. Insofern hat Deine Lösung durchaus seine Berechtigung, wenn der Verbrauch nicht oft genug triggert.
In diesem Fall würde sich meine Lösung wie folgt "verkomplizieren":
In diesem Fall muss man nur sicherstellen, dass immer die richtige Nachrichteneigenschaften gesetzt werden. Deshalb wird die payload dann auf die entsprechende Nachrichteneigenschaft bei den iobroker-IN Nodes nachträglich gesetzt und in den get-Nodes direkt:
Das heißt es existiert zum Zeitpunkt der Subtraktion keine payload (deshalb undefined) im Debug Fenster.
-
@mickym said in 2 Werte Subtrtahieren in Node Red:
@geschild Deine Lösung hat den Vorteil, wenn der Verbrauch nicht triggert, dass dann der Wert sofort angepasst wird. Sollte also auch der Wechelrichter triggern müsste man den Verbrauch extra auslesen und dann brauchst Du ein paar mehr Nodes. Insofern hat Deine Lösung durchaus seine Berechtigung, wenn der Verbrauch nicht oft genug triggert.
In diesem Fall würde sich meine Lösung wie folgt "verkomplizieren":
Danke für die Hilfe ,bin nun doch etwas überfordert aber ich versuche es einfach mal mit dem leztem Beispiel.
Wenn ich nicht klar komme melde ich mich nochmal hier mit dem Qode hier. -
@siporax Wie gesagt das brauchst Du nur, wenn Dir der Tech-Pow trigger nicht ausreicht.
Sonst langt die einfache Lösung.
-
@mickym said in 2 Werte Subtrtahieren in Node Red:
@siporax Wie gesagt das brauchst Du nur, wenn Dir der Tech-Pow trigger nicht ausreicht.
Sonst langt die einfache Lösung.
Setze mich später gleich man dran an das ganze.Melde mich dann wieder.
-
@siporax Die einfache Lösung nur mit der Trigger des Sonoff - war hier (sind nur 4 Nodes): https://forum.iobroker.net/post/1019849
-
@mickym said in 2 Werte Subtrtahieren in Node Red:
@siporax Die einfache Lösung nur mit der Trigger des Sonoff - war hier (sind nur 4 Nodes): https://forum.iobroker.net/post/1019849
So habs soweit übernommen u d angepasst läuft aber nicht bzw schreib keine Daten in den Broker da steht immer Null
[ { "id": "78f6b708eb6bd2fe", "type": "tab", "label": "Realer Teichverbrauch", "disabled": false, "info": "", "env": [] }, { "id": "4e110ac9e3526a1d", "type": "ioBroker in", "z": "78f6b708eb6bd2fe", "name": "Teich-Pow", "topic": "sonoff.0.Teich-Verbrauch.ENERGY_Power", "payloadType": "value", "onlyack": "", "func": "all", "gap": "", "fireOnStart": "false", "outFormat": "MQTT", "x": 120, "y": 100, "wires": [ [ "e6795d8dc9d84fcc" ] ] }, { "id": "be61f3942177482d", "type": "ioBroker get", "z": "78f6b708eb6bd2fe", "name": "WR-Fritz", "topic": "fritzdect.0.DECT_116570079058.power", "attrname": "wr", "payloadType": "value", "errOnInvalidState": "nothing", "x": 520, "y": 100, "wires": [ [ "719b166cf1c4cf56" ] ] }, { "id": "719b166cf1c4cf56", "type": "change", "z": "78f6b708eb6bd2fe", "name": "TeichPow - WR", "rules": [ { "t": "set", "p": "payload", "pt": "msg", "to": "verbrauch - wr", "tot": "jsonata" } ], "action": "", "property": "", "from": "", "to": "", "reg": false, "x": 700, "y": 140, "wires": [ [ "2528507974039f88", "ec4528823eccb390" ] ] }, { "id": "2528507974039f88", "type": "ioBroker out", "z": "78f6b708eb6bd2fe", "d": true, "name": "Realer_Teichverbrauch", "topic": "0_userdata.0.Node_Red_Realer_Teichverbrauch", "ack": "true", "autoCreate": "false", "stateName": "", "role": "", "payloadType": "", "readonly": "", "stateUnit": "", "stateMin": "", "stateMax": "", "x": 950, "y": 180, "wires": [] }, { "id": "ec4528823eccb390", "type": "debug", "z": "78f6b708eb6bd2fe", "name": "Ergebnis nur payload", "active": true, "tosidebar": true, "console": false, "tostatus": false, "complete": "payload", "targetType": "msg", "statusVal": "", "statusType": "auto", "x": 940, "y": 140, "wires": [] }, { "id": "e6795d8dc9d84fcc", "type": "change", "z": "78f6b708eb6bd2fe", "name": "", "rules": [ { "t": "move", "p": "payload", "pt": "msg", "to": "verbrauch", "tot": "msg" } ], "action": "", "property": "", "from": "", "to": "", "reg": false, "x": 320, "y": 100, "wires": [ [ "be61f3942177482d" ] ] }, { "id": "5413c6e8e87d1659", "type": "ioBroker in", "z": "78f6b708eb6bd2fe", "name": "WR-Fritz", "topic": "fritzdect.0.DECT_116570079058.power", "payloadType": "value", "onlyack": "", "func": "all", "gap": "", "fireOnStart": "false", "outFormat": "MQTT", "x": 120, "y": 180, "wires": [ [ "e857e6e86301279a" ] ] }, { "id": "8e2c30a2834a5bc7", "type": "ioBroker get", "z": "78f6b708eb6bd2fe", "name": "Teich-Pow", "topic": "sonoff.0.Teich-Verbrauch.ENERGY_Power", "attrname": "verbrauch", "payloadType": "value", "errOnInvalidState": "nothing", "x": 530, "y": 180, "wires": [ [ "719b166cf1c4cf56" ] ] }, { "id": "e857e6e86301279a", "type": "change", "z": "78f6b708eb6bd2fe", "name": "", "rules": [ { "t": "move", "p": "payload", "pt": "msg", "to": "wr", "tot": "msg" } ], "action": "", "property": "", "from": "", "to": "", "reg": false, "x": 320, "y": 180, "wires": [ [ "8e2c30a2834a5bc7" ] ] } ]
-
@siporax said in 2 Werte Subtrtahieren in Node Red:
@mickym said in 2 Werte Subtrtahieren in Node Red:
@siporax Die einfache Lösung nur mit der Trigger des Sonoff - war hier (sind nur 4 Nodes): https://forum.iobroker.net/post/1019849
So habs soweit übernommen u d angepasst läuft aber nicht bzw schreib keine Daten in den Broker da steht immer Null
[ { "id": "78f6b708eb6bd2fe", "type": "tab", "label": "Realer Teichverbrauch", "disabled": false, "info": "", "env": [] }, { "id": "4e110ac9e3526a1d", "type": "ioBroker in", "z": "78f6b708eb6bd2fe", "name": "Teich-Pow", "topic": "sonoff.0.Teich-Verbrauch.ENERGY_Power", "payloadType": "value", "onlyack": "", "func": "all", "gap": "", "fireOnStart": "false", "outFormat": "MQTT", "x": 120, "y": 100, "wires": [ [ "e6795d8dc9d84fcc" ] ] }, { "id": "be61f3942177482d", "type": "ioBroker get", "z": "78f6b708eb6bd2fe", "name": "WR-Fritz", "topic": "fritzdect.0.DECT_116570079058.power", "attrname": "wr", "payloadType": "value", "errOnInvalidState": "nothing", "x": 520, "y": 100, "wires": [ [ "719b166cf1c4cf56" ] ] }, { "id": "719b166cf1c4cf56", "type": "change", "z": "78f6b708eb6bd2fe", "name": "TeichPow - WR", "rules": [ { "t": "set", "p": "payload", "pt": "msg", "to": "verbrauch - wr", "tot": "jsonata" } ], "action": "", "property": "", "from": "", "to": "", "reg": false, "x": 700, "y": 140, "wires": [ [ "2528507974039f88", "ec4528823eccb390" ] ] }, { "id": "2528507974039f88", "type": "ioBroker out", "z": "78f6b708eb6bd2fe", "d": true, "name": "Realer_Teichverbrauch", "topic": "0_userdata.0.Node_Red_Realer_Teichverbrauch", "ack": "true", "autoCreate": "false", "stateName": "", "role": "", "payloadType": "", "readonly": "", "stateUnit": "", "stateMin": "", "stateMax": "", "x": 950, "y": 180, "wires": [] }, { "id": "ec4528823eccb390", "type": "debug", "z": "78f6b708eb6bd2fe", "name": "Ergebnis nur payload", "active": true, "tosidebar": true, "console": false, "tostatus": false, "complete": "payload", "targetType": "msg", "statusVal": "", "statusType": "auto", "x": 940, "y": 140, "wires": [] }, { "id": "e6795d8dc9d84fcc", "type": "change", "z": "78f6b708eb6bd2fe", "name": "", "rules": [ { "t": "move", "p": "payload", "pt": "msg", "to": "verbrauch", "tot": "msg" } ], "action": "", "property": "", "from": "", "to": "", "reg": false, "x": 320, "y": 100, "wires": [ [ "be61f3942177482d" ] ] }, { "id": "5413c6e8e87d1659", "type": "ioBroker in", "z": "78f6b708eb6bd2fe", "name": "WR-Fritz", "topic": "fritzdect.0.DECT_116570079058.power", "payloadType": "value", "onlyack": "", "func": "all", "gap": "", "fireOnStart": "false", "outFormat": "MQTT", "x": 120, "y": 180, "wires": [ [ "e857e6e86301279a" ] ] }, { "id": "8e2c30a2834a5bc7", "type": "ioBroker get", "z": "78f6b708eb6bd2fe", "name": "Teich-Pow", "topic": "sonoff.0.Teich-Verbrauch.ENERGY_Power", "attrname": "verbrauch", "payloadType": "value", "errOnInvalidState": "nothing", "x": 530, "y": 180, "wires": [ [ "719b166cf1c4cf56" ] ] }, { "id": "e857e6e86301279a", "type": "change", "z": "78f6b708eb6bd2fe", "name": "", "rules": [ { "t": "move", "p": "payload", "pt": "msg", "to": "wr", "tot": "msg" } ], "action": "", "property": "", "from": "", "to": "", "reg": false, "x": 320, "y": 180, "wires": [ [ "8e2c30a2834a5bc7" ] ] } ]
-
@siporax Ja dann mach mal ein Screenshot und zeig den Status bzw. mach Debug Nodes dran. Wenn 100-100 = 0 rauskommt, dann ist das ja richtig.
Und es stimmt ja nicht, dass er nichts schreibt:
Der Datenpunkt wurde um 14:34 heute beschrieben.
-
@mickym said in 2 Werte Subtrtahieren in Node Red:
@siporax Ja dann mach mal ein Screenshot und zeig den Status bzw. mach Debug Nodes dran. Wenn 100-100 = 0 rauskommt, dann ist das ja richtig.
Und es stimmt ja nicht, dass er nichts schreibt:
Der Datenpunkt wurde um 14:34 heute beschrieben.
-
@siporax Na dann kommt doch das Ergebnis raus. Du musst doch nur die iobroker-Out Node wieder aktivieren.
Die Debug Node kannst wieder wegschmeissen - das ist doch nur zur Fehlersuche bzw. zur Demonstration. Und wie gesagt - ich sehe die Sonoff Node trigger meistens - dann könntest auch die einfache Lösung mit den 4 Nodes nehmen:
-
Sorry: </> Code einfügen hab ich kapiert, aber wie daraus einen Spoiler macht ???
Egal. Code in .txt. Habe mal die topics in flow Variable gepackt. Jetzt braucht man die iobrokerIn/Out nur noch wie gewohnt mit den DP verbinden.
Könnte man das so machen. (Ich lerne gern dazu)
-
-
@geschild So nun zu Deinem Flow.
Das wird zwar so funktionieren - aber in dem Fall finde ich es übertrieben Flow variablen zu setzen, nur um das topic zu vereinfachen. Insbesondere ändert sich der Wert dieser Flowvariablen ja nie. Das würde nur Sinn machen, wenn Du unabhängig die Initialisierung triggern würdest. Dann lieber wieder das topic direkt setzen:
-
-
Übrigens Deine Function Node
var topic = msg.topic; flow.set('teichPowTopic', topic); msg.payload = flow.get('teichPowTopic'); return msg;
kann man auch mit einer ChangeNode ohne Codieren machen.
Das macht das Gleiche:
-
@mickym said in 2 Werte Subtrtahieren in Node Red:
Übrigens Deine Function Node
var topic = msg.topic; flow.set('teichPowTopic', topic); msg.payload = flow.get('teichPowTopic'); return msg;
kann man auch mit einer ChangeNode ohne Codieren machen.
Das macht das Gleiche:
So habs zum rechnen gebracht steht zwar ein minus davor im Zielordner beim Ergebnis aber damit kann ich leben.
-
-
@siporax Das Minus kannst Du eliminieren, wenn Du die Subtraktion umdrehst oder halt den absoluten Wert nimmst.
Um den absoluten Wert zu erhalten - einfach die ChangeNode wie folgt ändern:
Oder alternativ mit -1 multiplizieren also
(payload-wr) * -1