NEWS
Wasserregulierung Aquarium
-
@aphofis Na in dem Link habe ich Dir die Definitionen gepostet. Das hatte ich Dir doch vor 45 Minuten geschrieben.
Also dann kopiere ich das nochmal hier rein:
=======================================================================
Also ein ARRAY beginnt IMMER mit einer ECKIGEN Klammer und schließt mit einer ECKIGEN Klammer ab und die einzelnen Elemente werden durch ein Komma getrennt.
=======================================================================
Also ein OBJEKT beginnt IMMER mit einer GESCHWEIFTEN Klammer und schließt mit einer GESCHWEIFTEN Klammer ab und die einzelnen Elemente werden durch ein Komma getrennt. Ein Element besteht immer aus einer Eigenschaft in Anführungszeichen und dann ein Doppelpunkt und dann dem Wert der Eigenschaft. So wie Du es zuerst gemacht hast.
-
Also ist ein Array eine selbst definierte ausgabe an payload Daten.
was genau ein Object ist weiß ich nicht -
@mickym sagte in Wasserregulierung Aquarium:
Ich glaube ich denke zu kompliziert.
Hatte ich gesehen, gelesen und solala verstanden. -
@aphofis sagte in Wasserregulierung Aquarium:
Also ist ein Array eine selbst definierte ausgabe an payload Daten.
was genau ein Object ist weiß ich nichtIch habe Dir die Definitionen gerade im vorigen Post beschrieben .
und so sollte es dann aussehen. Sprich die payload ist nun ein Objekt mit der Eigenschaft data.
Also nochmal ein Objekt hat ein oder mehrere Eigenschaften.
=======================================================================
Also ein OBJEKT beginnt IMMER mit einer GESCHWEIFTEN Klammer und schließt mit einer GESCHWEIFTEN Klammer ab und die einzelnen Elemente werden durch ein Komma getrennt. Ein Element besteht immer aus einer Eigenschaft in Anführungszeichen und dann ein Doppelpunkt und dann dem Wert der Eigenschaft. So wie Du es zuerst gemacht hast.
Siehe auch: https://www.w3schools.com/js/js_objects.asp
und in NodeRed und in JSON werden Objekte so dargestellt.
Wenn Du aus dem Debugfenster ein Wert rauskopierst und hier in CodeTags kopiert, dann sieht das payload Objekt so aus:
Der Pfad ist wie Du die Eigenschaft im Objekt ansprichst.
{"data":20}
-
Also array in eckige klammern gesetzt.
Object in geschwigten klammern
Was deffiniert ein Array und was ein Object.
Also zB wie in dem Thread sind die Tankstellen der Bereich (Array) in dem die einzelnen Punkte aufgelistet sind aber was ist dann ein Object.? -
@aphofis sagte in Wasserregulierung Aquarium:
Also zB wie in dem Thread sind die Tankstellen der Bereich (Array) in dem die einzelnen Punkte aufgelistet sind aber was ist dann ein Object.?
Lies Dir mal das vorige Posting genau durch - also ein Objekt ist eine logische Einheit mit verschiedenen Eigenschaften. Diese Eigenschaften können alle Datentypen, als auch weitere Objekte sein.
-
@mickym sagte in Wasserregulierung Aquarium:
en können alle Datentypen, als auch
Ok nur wo definiere ich das es ein Object ist.
-
@aphofis sagte in Wasserregulierung Aquarium:
@mickym sagte in Wasserregulierung Aquarium:
en können alle Datentypen, als auch
Ok nur wo definiere ich das es ein Object ist.
Siehe Definition:
Also ein OBJEKT beginnt IMMER mit einer GESCHWEIFTEN Klammer und schließt mit einer GESCHWEIFTEN Klammer ab und die einzelnen Elemente werden durch ein Komma getrennt. Ein Element besteht immer aus einer Eigenschaft in Anführungszeichen und dann ein Doppelpunkt und dann dem Wert der Eigenschaft. So wie Du es zuerst gemacht hast.
Ein Objekt definierst Du also durch die geschweiften Klammern.
-
@mickym sagte in Wasserregulierung Aquarium:
lemente werden durch ein Komma getren
Das mir ja nun auch klar, nur in welcher node setze ich das object!?
-
Ein Array hat KEINE Eigenschaften, sondern ist eine Aufzählung (in Blockly nennt man das Liste) von Daten. Diese sind aber nur durch ihre Position ansprechbar, aber nicht durch Eigenschaftsnamen.
-
@aphofis sagte in Wasserregulierung Aquarium:
@mickym sagte in Wasserregulierung Aquarium:
lemente werden durch ein Komma getren
Das mir ja nun auch klar, nur in welcher node setze ich das object!?
Nun Du kannst ein Objekt selbst definieren indem Du in der Change Node/Inject ein Objekt definierst:
Objekte und Arrays kannst Du in NodeRed über die JSON Schreibweise definieren:
-
So ich denke wir machen dann morgen weiter mit ein paar Grundlagen.
Hier nun die Auflösung der Aufgabe:
Du siehst nun dass die payload Eigenschaft in eine payload Eigenschaft data verschoben wird. Somit wird aus der payload automatisch ein Objekt.
Ich denke wir machen morgen weiter, wenn Du nichts dagegen hast.
-
Ansonsten kann man mit einer Change Node - eine Nachrichteneigenschaft auf eine Konstante setzen
Also eine Konstante vom Typ einer Zeichenkette, einer Zahl, eines Boolean, eines JSON Objekt (Objekt, Array) oder eines Buffer.
-
@mickym
Alter Schwede, jetzt habe ich es verstanden.
Das ja mega einfach wenn man erstmal die Basics kennt.
ist es so korrekt!?
-
@aphofis Na was Du halt willst, das ist ein Nachrichteigenschaft object mit einem Array.
Wie gesagt ich habe Dir nun noch das Setzen auf Konstanten im vorigen Post gezeigt.
Und wenn es komplexere Berechnungen geht, dann nimmst Du JSONATA
Wenn du also etwas mit der payload berechnen willst, dann kannst Du auch die payload mit 5,1 multiplizieren.
Dafür braucht mal also keine extra Nodes.
Hier mal etwas zum Nachlesen was JSONATA kann: https://docs.jsonata.org/overview
Diese supermächtige Bibliothek kannst Du in verschiedenen Nodes ansprechen. Aber für heute mach ich mal Schluss, aber sollte Dir für Deinen Flow weiterhelfen.
Gute N8
-
@mickym
Also ich hab die Struktur noch nicht ganz verstanden, was erzeugt was in inject und change node und ist iobroker get richtig für das abgreifen der Datenpunkte !?
Vielleicht schnalle ich das einfach auch nicht aber ich denke wenn ich den richtigen aufbau verstehe klappt das. Also wie erstellt man einen array und wie wird ein Objekt erstellt.
Die Daten werden in das Object geschrieben aber nicht in den Array. Irgendwo habe ich einen Denkfehler.
und jetzt sage ich erstmal Gute Nacht und schon mal vielen vielen dank für deine Lektionen. -
Nein - ich fürchte Du hast leider noch gar nichts verstanden - da Du immer noch an Deinem Flow klebst und nicht erst mal versuchst, das System zu verstehen. Die Datenpunkte sind doch für das Verständnis erst mal unwichtig. NodeRed gibts schon viel länger als iobroker.
Also nochmal:
- Durch die Kabel von dem einen zu dem anderen Node fließen Objekte. (Deswegen Flow).
Ein Objekt wird im JSON Format wie folgt dargestellt:
=======================================================================
Also ein OBJEKT beginnt IMMER mit einer GESCHWEIFTEN Klammer und schließt mit einer GESCHWEIFTEN Klammer ab und die einzelnen Elemente werden durch ein Komma getrennt. Ein Element besteht immer aus einer Eigenschaft in Anführungszeichen und dann ein Doppelpunkt und dann dem Wert der Eigenschaft. So wie Du es zuerst gemacht hast.
=======================================================================
- Ein Objekt ist eine logische Einheit, das entweder leer ist oder Eigenschaften besitzt.
{}
Das ist ein leeres Objekt, da es keine Eigenschaften besitzt.
{"Farbe": "rot", "Temperatur":23}
Das ist ein Objekt mit 2 Eigenschaften: Farbe und Temperatur. Eigenschaften innerhalb eines JSON Objektes werden immer in Anführungszeichen geschrieben. Nachdem Namen der Eigenschaft folgt ein Punkt mit dem Wert der Eigenschaft. Also bei der Eigenschaft "Farbe" ist der Wert "rot" und da das wieder eine Zeichenkette ist, steht dieser ebenfalls in Anführungszeichen.
Eigenschaften werden durch ein Komma getrennt.
Die 2. Eigenschaft ist eine mit dem Namen "Temperatur", gefolgt von einem Doppelpunkt und einem Wert, der ist 23. Dieser steht nicht in Anführungszeichen, da es sich um eine Zahl handelt und nicht um eine Zeichenkette.- Eine InjectNode - ist eine Node mit der Du manuell ein Nachrichtenobjekt generieren kannst (triggern kannst), indem Du auf die Schaltfläche hinten drückst.
Wenn Du wie hier eine Inject Node - ohne Eigenschaften betätigst, dann erzeugst Du ein Nachrichtenobjekt mit der Eigenschaft _msgid.
Diese id ist eine eindeutige Zahl, die NodeRed verwendet, um ein Nachrichtenobjekt zu identifizieren, damit es quasi immer weiß, wo sich das Nachrichtenobjekt im Flow befindet.
Wenn Du also ein Nachrichtenobjekt mit der Inject Node erzeugst und mit einer 1. Debug Node Dir anschaust, dann siehst Du das die Eigenschaft "_msgid" gleich geblieben ist und von der Inject Node in die 1. Debug Node, in die Change Node und in die 2. Debug Node geflossen ist. Die Change Node hat keine Regel, um Dir zu zeigen, dass wir nichts ändern und Du nur siehst, dass es das gleiche Nachrichtenobjekt ist.
Auch wenn Du den Flow verzweigst und an eine ChangeNode 2 Kabel machst, dann bleibt die "_msgid" gleich. Das Nachrichtenobjekt wird also nur kopiert.
Um das bisher gesagt nachzuvollziehen, kannst Du diese Flows importieren:
========================================================================
Nun schauen wir uns mal Deine Inject Node aus Deinem Flow an:
Du hast also dem Nachrichtenobjekt neben der obligatorischen "_msgid" noch die Eigenschaften
"daten", "durchfluss", "tag", "jahr", "gesamt" hinzugefügt.
Warum Du das gemacht hast, weiß ich nicht - bzw. kann ich mir zwar vorstellen, weil Du schon wieder Deinen Flow im Hinterkopf hattest, den Du doch erst mal vergessen solltest, wenn Du das System verstehen willst Du bist zu ungeduldig!!
Also der Eigenschaft "daten" des Nachrichtenobjektes hast Du ein Objekt zugewiesen und dann auch noch über JSONATA. Wenn man ein KONSTANTES Objekt definiert und nicht direkt weiterverarbeiten will, dann nimmt man eigentlich nur das JSON Objekt.
Also nicht das J: sondern die geschweiften Klammern.
So dieser Nachrichteneigenschaft "daten" hast Du also, als Wert ein Array zugewiesen:
["durchfluss","tag","jahr","gesamt"]
Der Grund erschließt sich mir nicht, ausser dass Du wieder an Deinen Flow gedacht hast. Du wirst aber die nicht mit einer Inject Node definieren können, wenn du sie aus Datenpunkten auslesen willst. Du kannst nur in einer Inject Nodes "Werte" in einem Nachrichtenobjekt definieren, wenn Du Werte aus Datenpunkten simulieren willst.
Da Du die restlichen Eigenschaften leer gelassen hast, also nicht definiert hast, allerdings als Datentyp eine Zahl definiert hast, hat NodeRed den Zahlenwert automatisch auf 0 gesetzt.
Hier nochmal zur Verdeutlichung zum Import, das Nachrichtenobjekt, dass Du mit Deiner Inject node erzeugt hast:
und hier das Nachrichtenobjekt direkt aus dem Debugfenster kopiert
und in verwertbares JSON Formati hier in den Thread gestellt:
{"_msgid":"712fe5877fca1470","daten":["durchfluss","tag","jahr","gesamt"],"durchfluss":0,"tag":0,"jahr":0,"gesamt":0}
===============================================================
Nun schauen wir an, was Du mit den Nachrichtenobjekt getan hast, dass Du mit Deiner Inject Node erzeugt hast.
Du hast das Nachrichtenobjekt an verschiedene iobroker-get Nodes geschickt. Die unteren 3 führst Du ja nicht mehr weiter, also gehen diese Nachrichtenobjekte verloren, dann kannst sie ja auch gleich weglassen oder entfernen.
==============================================================
Also schauen wir nur mal das Nachrichtenobjekt an, dass Du in die iobroker-get Node mit dem Namen "durchfluss" schickst.
Du liest also aus dem Datempunkt mit dem topic "0_userdata.0.Test_Wasser.Test_Durchfluss"
den Wert aus
und weist ihn der Nachrichteneigenschaft
"durchfluss" zu.Da die Nachrichteneigenschaft ja schon in der Inject Node definiert, wird diese nun durch den Wert aus dem iobroker Datenpunkt ersetzt, also 67 ersetzt.
Dein Nachrichtenobjekt nach der Inject Node schaut also so aus:
Also nicht ganz diese Objektdaten und das topic kommen noch hinzu, wie Du ja an Deiner Debug Node siehst.
=====================================================================
Nun sendest du also das Nachrichtenobjekt
an die Change Node mit 4 Regeln:- Gut also mit der 1. Regel multiplizierst Du den Durchfluss mit 5,1.
67 * 5,1 = 341,7
Na das hat ja schon mal geklappt, wie Du an Deiner Debugausgabe siehst.
Nach Deiner 1. Regel in der Change Node sieht also Dein Nachrichtenobjekt so aus:Nun die 2. Regel mit dem aktuellen Nachrichtenobjekt:
Also (das jahr ist ja 0 wie Du in Deinem Nachrichtenobjekt sehen kannst):
341,7 * 5,1/1000 + 0
Das stimmt also auch:
Für jahr, gesamt kommt natürlich das Gleiche raus, da beides im Nachrichtenobjekt 0 war.
Für tag fällt ja nur die Division durch 1000 raus.Der Rundungsfehler bei tag ist leider eine Eigenart von Javascript und hat mit NodeRed nichts zu tun. Das passiert Dir auch bei Blockly oder Javascript. Wenn Du aber rundest, fällt das ja nicht auf.
======================================================================================
Fazit alles ist logisch und folgerichtig, wenn Du Dir die Debugausgabe anschaust, aber Du siehst Du hast mehrere Fehler drin.
- Der Durchfluss wird doppelt mit 5,1 für das jahr, gesamt und tag multipliziert.
Deshalb merke: Das Nachrichtenobjekt wird von jeder Regel modifziert. Du kannst anstelle EINER Change Node mit 4 Regeln auch VIER Change Nodes mit 1 Regel verwenden.
Wenn Du also in der 1. Regel den durchfluss bereits mit 5.1 mulitpliziert hast, dann darfst Du es in den Folgeregeln nicht machen, sonst multiplizierst Du zweimal mit 5.1. (siehe Nachrichtenobjekt) nach der 1. Regel.
-
Die Eigenschaften des Nachrichtenobjektes jahr, gesamt und tag stammen aus der Inject Node und nicht aus den Datenpunkten und sind deshalb alle 0. Um das zu ändern musst du die anderen iobroker In Nodes in den Flow und somit in das Nachrichtenobjekt aufnehmen und nicht parallel ins Leere laufen lassen.
-
Die in der Inject definierten Eigenschaften des Nachrichtenobjektes sind alle überflüssig (das Array ist sowieso UNSINN), wenn Du die Daten aus dem iobroker mittels iobroker-get Nodes in den Flow holst.
Also kannst Du das GANZE aus der Inject Node entfernen:
Jetzt wird Dein Flow die Regeln mit undefinierten Eigenschaften (jahr, gesamt, tag) ignorieren, weil ja jetzt gesamt, jahr und tag nicht mehr definiert sind.
Also musst Du wohl die EIGENSCHAFTEN aus den in der Luft hängenden iobroker-get Nodes ignorieren.
- Du kannst auch mit 1 Inject Node alle Werte simulieren OHNE diese aus dem iobroker auszulesen, indem Du diese Eigenschaften als KONSTANTEN definierst.
Also eine Inject Node mit diesen Werten bastelst und damit Deine ChangeNode testest.
damit sieht das Ergebnis zwar besser aus, aber Du siehst immer noch die doppelte 5,1 Multiplikation in der Change Node, die Du nun berichtigen kannst (aber zum Testen ist das doch gut, da Du keine Daten aus dem iobroker auslesen musst).
Korrigieren wir also den Rechenfehler in der Change Node, dann sollte das Ergebnis nun richtig sein:
Hier zum Import:
So und NUR wenn Du jetzt jedes Detail verinnerlicht hast, dann machen wir mit Deinem Flow weiter. Sollte auch nur eine Kleinigkeit unklar sein, dann erwarte ich Deine Fragen.
- Durch die Kabel von dem einen zu dem anderen Node fließen Objekte. (Deswegen Flow).
-
@mickym sagte in Wasserregulierung Aquarium:
[ { "id": "f4867f82feb1d1f9", "type": "inject", "z": "95d5d241e51360cd", "name": "", "props": [ { "p": "durchfluss", "v": "67", "vt": "num" }, { "p": "tag", "v": "312", "vt": "num" }, { "p": "jahr", "v": "1.5", "vt": "num" }, { "p": "gesamt", "v": "1.8", "vt": "num" } ], "repeat": "", "crontab": "", "once": false, "onceDelay": 0.1, "topic": "", "x": 810, "y": 1260, "wires": [ [ "d4e356848cabddf5" ] ] }, { "id": "37f2d6824dc5f689", "type": "debug", "z": "95d5d241e51360cd", "name": "Teste Berechnung", "active": true, "tosidebar": true, "console": false, "tostatus": false, "complete": "true", "targetType": "full", "statusVal": "", "statusType": "auto", "x": 1230, "y": 1260, "wires": [] }, { "id": "d4e356848cabddf5", "type": "change", "z": "95d5d241e51360cd", "name": "", "rules": [ { "t": "set", "p": "durchfluss", "pt": "msg", "to": "durchfluss * 5.1", "tot": "jsonata" }, { "t": "set", "p": "jahr", "pt": "msg", "to": "durchfluss / 1000 + jahr", "tot": "jsonata" }, { "t": "set", "p": "gesamt", "pt": "msg", "to": "durchfluss / 1000 + gesamt", "tot": "jsonata" }, { "t": "set", "p": "tag", "pt": "msg", "to": "durchfluss + tag", "tot": "jsonata" } ], "action": "", "property": "", "from": "", "to": "", "reg": false, "x": 990, "y": 1260, "wires": [ [ "37f2d6824dc5f689" ] ] } ]
So bin alles durchgegangen.
Meine Fehler habe ich dann verstanden.
Also verstanden das ein Array zBArray setzt sich dann aus dem Inhalt 0 : durchfluss 1 : tag 2 : jahr 3 : gesamt.
zusammen.
Ein Objekt dann{"_msgid":"7b6801a822df7071","daten":["durchfluss","tag","jahr","gesamt"]}
der Inhalt aus Message ID, Objekt Daten und dann der der Inhalt Array ausgibt.
Also ist das Object so zu sagen die Baumstruktur und ein Array ein Teilabschnitt.
Ein Objekt kann Daten enthalten die festgelegt sind oder bezogen werden können und ein Array genau so. Doch umfasst alle Arrays immer das Object.
Das echt sehr sehr nett von dir das du dir mit mir so viel Mühe gibst.
Das soll auch nicht um sonst sein. Ich gebe mein bestes um es zu verstehen und dann bald auch umsetzen zu können.Wie kann ich jetzt den Inhalt aus dem Array (Object) raus filtern um die dann in die Datenpunkte zu schreiben.
Kann man die Datenpunkte via topic reinholen oder wie macht man das !?
Ach ja na klar bastel ich zwischendurch an dem Script rum. Es wurmte mich halt, das ich das nicht verstanden hatte. -
@aphofis sagte in Wasserregulierung Aquarium:
Also ist das Object so zu sagen die Baumstruktur und ein Array ein Teilabschnitt.
Ein Objekt kann Daten enthalten die festgelegt sind oder bezogen werden können und ein Array genau so. Doch umfasst alle Arrays immer das Object.Nein Arrays und Objekte sind völlig unabhängig von eineinander komplexe Datentypen.
Es gibt einfache, skalare Datentypen, wie
- Zeichenkette (string)
- Zahl (number)
- Logikwert (boolean)
und eben komplexe Datentypen, wie
- Arrays
- Objekte.
Ein Array ist einfach eine Sammlung von anderen Datentypen. Der Hauptunterschied zu einem Objekt ist, dass die Datentypen auch gemischt und einfach eine Liste sind. Auf den Inhalt eines Arrays greift man immer über den Index zu.
Arrays werden meistens einfach verwendet, wenn man einfach eine Anzahl von Werten hat (der Bedeutung man entweder nicht kennt oder die die gleiche Bedeutung haben.
Dabei hat das erste Element immer den Indexwert 0, das zweite den Indexwert 1 usw.
Im JSON wird ein Array einfach durch eckige Klammern und dann die einzelnen Werte durch Komma getrennt.[1,2,3,4,5]
Ein Objekt
{"_msgid":"7b6801a822df7071","daten":["durchfluss","tag","jahr","gesamt"]}
Bei einem Objekt kannst Du direkt auf eine Eigenschaft zugreifen, da jede Eigenschaft einen Namen hat.
Wie kann ich jetzt den Inhalt aus dem Array (Object) raus filtern um die dann in die Datenpunkte zu schreiben.
Kann man die Datenpunkte via topic reinholen oder wie macht man das !?Du greifst auf ein Objekt zu, in dem Du den Pfad kopierst, der Dir die Hierarchie ausgibt.
So und ich will Dir nicht einfach den Flow machen, sonst lernst Du nichts. Ich habe Dir den Flow mit jedem einzelnen Microschritt durchgegangen. Wieso bist Du nicht in der Lage, die fehlen Datenpunkte in Dein Objekt zu lesen?
Einmal hast Du einen Flow - und 3 hängen in der Luft, anstelle sie in den Flow zu integrieren???
Hast Du wirklich jeden einzelnen Schritt verstanden, den ich Dir minutiös aufgelistet habe. Wenn Du das einfach nur durchliest dann lernst Du nichts. Ich habe Dir 3 Fehler aufgelistet und worin die bestehen. Was fehlt Dir, um diese Fehler zu beheben.
Wir können gerne Fehler für Fehler im Detail durchgehen, wenn Du es nicht verstehst.Hast Du alle Flows zum Verständnis importiert und Dir angeschaut.
-
@aphofis sagte in Wasserregulierung Aquarium:
Ach ja na klar bastel ich zwischendurch an dem Script rum. Es wurmte mich halt, das ich das nicht verstanden hatte.
Warum lässt Du das nicht?
Du kannst auch keine Integralrechnung, wenn Du die Grundrechenarten nicht beherrschst. Ich versuche Dir doch das Handwerkszeug beizubringen. Deinen Flow habe ich schon im Hinterkopf.
Ich bleibe ja bei Deinem Flow, indem ich minutiös auseinander nehme. Dann ist doch ungerichtetes Rumprobieren einfach Zeitverschwendung.