NEWS
JSON oder JavaScript Objekt in iobroker Datenpunkte zerlegen
-
@mickym said in JSON oder JavaScript Objekt in iobroker Datenpunkte zerlegen:
Der Subflow macht nichts anderes als ein Objekt zu zerlegen und in eigene Datenpunkte zu schreiben.
In der alten Variante, in der die Felder einzeln ausgelesen werden, scheint aber auch nix gerechnet zu werden:
Naja, von der alten Variante wollte ich ja ursprünglich weg, weil wohl durch das gehäufte wiederholte Auslesen der einzelnen Felder haufenweise Logeinträge entstanden sind, die aber durch das von @joschipp empfohlene Update von node-red-contrib-modbus tatsächlich verschwunden sind.
-
@warp-it Nun wie gesagt, wenn es der falsche 32bit Wert ist (be statt le) signed oder unsigned - kann ganz schnell eine komischen Wert erzeugen. Wie gesagt, dein Objekt enthielt ja bereits die 65xxx.
-
@mickym Hallo und vielen Dank für das teilen Deines Wissen.
Ich habe dein Beispiel zum Einlesen einer Ordnerstruktur aus dem ioBroker nach gebaut.
Als Resultat erhalte ich diese Ausgabe:
{ "Dc.Power": -207.4, "InstalledCapacity": 1400, "ConsumedAmphours": -116, "Capacity": 1284, "Soc": 92.2, "TimeToGo": 768059.9, "Balancing": 0, "Dc.Voltage": 53.18, "Dc.Current": -3.9, "Dc.Temperature": 25.4, "Info.MaxChargeVoltage": 55.3, "Info.MaxChargeCurrent": 340, "Info.MaxDischargeCurrent": 425, "History.ChargeCycles": 46, "History.MinimumVoltage": 34.43, "History.MaximumVoltage": 58.77, "History.TotalAhDrawn": -60168.2, "System.MinVoltageCellId": "P4_Z2", "System.MinCellVoltage": 3.322, "System.MaxVoltageCellId": "P4_Z1", "System.MaxCellVoltage": 3.324, "System.NrOfModulesOnline": 5, "System.NrOfModulesOffline": 0, "System.NrOfModulesBlockingCharge": 0, "System.NrOfModulesBlockingDischarge": 0, "Io.AllowToCharge": 1, "Io.AllowToDischarge": 1, "Io.AllowToBalance": 1 }
Das json möchte per MQTT an an einen Treiber in VenusOS senden. Der Treiber erwartet die Daten in diesem Format:
{ "Dc": { "Power": 321.6, "Voltage": 52.7, "Current": 6.10, "Temperature": 23 }, "InstalledCapacity": 200.0, "ConsumedAmphours": 74.5, "Capacity": 125.5, "Soc": 63, "TimeToGo": 43967, "Balancing": 0, "Info": { "MaxChargeVoltage": 55.2, "MaxChargeCurrent": 80.0, "MaxDischargeCurrent": 120.0 }, "History": { "ChargeCycles": 5, "MinimumVoltage": 40.8, "MaximumVoltage": 58.4, "TotalAhDrawn": 1057.3 }, "System": { "MinVoltageCellId": "C3", "MinCellVoltage": 3.392, "MaxVoltageCellId": "C15", "MaxCellVoltage": 3.417, "NrOfModulesOnline": 0, "NrOfModulesOffline": 0, "NrOfModulesBlockingCharge": 0, "NrOfModulesBlockingDischarge": 0 }, "Io": { "AllowToCharge": 0, "AllowToDischarge": 0, "AllowToBalance": 0, } }
Kannst Du mir sagen wie ich das hinbekommen könnte?
Viele Grüße
HaraldEs ist schon Wahnsinn was mittlerweile alles geht.
Ich habe inzwischen die Lösung von ChatGPT bekommen. ChatGPT hat einen Code ausgespuckt den ich nur noch in eine function Node kopieren brauchte.var inputJson = JSON.parse(msg.payload); var outputJson = { "Dc": { "Power": inputJson["Dc.Power"], "Voltage": inputJson["Dc.Voltage"], "Current": inputJson["Dc.Current"], "Temperature": inputJson["Dc.Temperature"] }, "InstalledCapacity": inputJson["InstalledCapacity"], "ConsumedAmphours": inputJson["ConsumedAmphours"], "Capacity": inputJson["Capacity"], "Soc": inputJson["Soc"], "TimeToGo": inputJson["TimeToGo"], "Balancing": inputJson["Balancing"], "Info": { "MaxChargeVoltage": inputJson["Info.MaxChargeVoltage"], "MaxChargeCurrent": inputJson["Info.MaxChargeCurrent"], "MaxDischargeCurrent": inputJson["Info.MaxDischargeCurrent"] }, "History": { "ChargeCycles": inputJson["History.ChargeCycles"], "MinimumVoltage": inputJson["History.MinimumVoltage"], "MaximumVoltage": inputJson["History.MaximumVoltage"], "TotalAhDrawn": inputJson["History.TotalAhDrawn"] }, "System": { "MinVoltageCellId": inputJson["System.MinVoltageCellId"], "MinCellVoltage": inputJson["System.MinCellVoltage"], "MaxVoltageCellId": inputJson["System.MaxVoltageCellId"], "MaxCellVoltage": inputJson["System.MaxCellVoltage"], "NrOfModulesOnline": inputJson["System.NrOfModulesOnline"], "NrOfModulesOffline": inputJson["System.NrOfModulesOffline"], "NrOfModulesBlockingCharge": inputJson["System.NrOfModulesBlockingCharge"], "NrOfModulesBlockingDischarge": inputJson["System.NrOfModulesBlockingDischarge"] }, "Io": { "AllowToCharge": inputJson["Io.AllowToCharge"], "AllowToDischarge": inputJson["Io.AllowToDischarge"], "AllowToBalance": inputJson["Io.AllowToBalance"] } }; msg.payload = outputJson; return msg;
Wahnsinn!!!
-
So ich habe wieder mal eine neue Version des Subflows erstellt, der verhindert dass Punkte in den Objekteigenschaften enthalten sind und somit ggf. den iobroker durcheinander bringt.
Hier nun wieder eine neue Version:
Ein evtl. Update muss wieder selektiv durchgeführt werden, in dem nur der Subflow ersetzt wird. Genau ist es hier beschrieben:
https://forum.iobroker.net/post/856928 -
Hallo,
Ich habe mir in Node-Red einen Flow erstellt, der mir die Preise für 'current' , 'today' und 'tomorrow' abholt und in einem Datenpunkt als json ablegt
siehe hier:
jetzt würde ich gerne aus dieser json für 'today' und 'tomorrow' jeweils den 'niedrigsten' , 'höchsten' und den durchschnittlichen Preis extrahieren und in einen eigenen Datenpunkt schreiben.
Ich hab aber leider keine Ahnung wie ich das anstellen muß, sprich ich weiß wohl das ich das mittels eines function node realisieren kann der die json zerlegt, aber leider gehen mein Kenntnisse nich soweit.
Vielleicht kann ja einer helfen
Gruß
Holger -
@icebear Du wandelst den JSON String mit einer JSON Node in ein Objekt um. Dann extrahierst Du den Wert, der Dich interessiert in dem Du die payload auf den Pfad zum den entsprechenden Wert setzt. Du gehst also mit der Maus neben den Wert und kopierst den Pfad und setzt die payload auf diesen Pfad:
Nun hast Du 3 Möglichkeiten:
- Das Maximum und Minimum kannst Du entweder kodieren und mit einer Function Node in dem entsprechenden Kontext speichern.
- Du kodierst gar nichts und speicherst das Maximum oder Minimum im Flow Kontext.
In beiden Fällen setzt Du jeden Tag mit einer Inject Node wieder zurück, wenn Du willst.
- Du installierst Dir die aggregate Node , die Dir Minimum und Maximum pro Zeiteinheit also pro Tag ausgibt.
Falls Du Dich für eine der 3 Möglichkeiten entschieden hast, können wir das konkretisieren.
-
Ich hatte die aggregate node schon installiert, hatte ich aber garnich auf dem Schirm.
Ich hab jetzt nochmal einen einfachen flow erstellt, der mir mit einem template node die aktuellen preise von tibber abholt.
siehe hier:
wie krieg ich das jetzt in die aggregate node rein
Gruß
Holger -
@icebear Klapp die Objekte auf und setze via Change Node die payload auf den Pfad des Wertes im Nachrichtenobjekt, der Dich interessiert wie in meiner Animation gezeigt. Und die payload verbindest dann mit der aggregate Node.
-
also ich habs jetzt so gemacht:
keine Ahnung ob das nich noch einfacher oder übersichtlicher geht, aber das Ergebnis stimmt.
Gruß
Holger -
@icebear Nun - ich kannte die Anforderung nicht im Detail. Wenn Du willst, dass ich ggf. eine einfachere Lösung finde, dann exportiere mir doch auf der einen Seite mal alle Nodes hinter dieser tibber-query node und dann mach mal eine Debug Node hinter die tibber-query Node und kopiere mir mal das komplette Objekt hier in code-tags, sodass ich die Ausgabe der tibber-query Node mit einer Inject Node simulieren kann.
-
Vielen Dank erstmal für deine Hilfe.
Ich hab mich jetzt doch anders entschieden und nehm die Werte mit den zugehörigen Graphen bzw. Anzeigen aus Grafana.
Die 'gauges' Widgets aus iobroker gefallen mir nich so gut und passen nicht zu meiner VIS, da hab ich bei Grafana bessere Darstellungsmöglichkeiten.
Das laden dauert zwar ein Mü länger, aber einen Tod muß man ja sterben.Trotzdem nochmal vielen Dank!
Gruß Holger
-
Ok... Kann mal jemand "für Dumme" erklären, wie das funktioniert...
Hab bisher mit NodeRed nix am Hut und den nur installiert, um die Daten von Tibber auszulesen (danke an der Stelle für die tolle Beschreibung! ).
Jetzt hab ich in IOB nen DP mit dem JSON und würde den gerne zerlegen. Also das die Werte in einzelnen DPs liegen.
Das JSON sieht so aus:{"timestamp":"2023-06-19T16:13:37.000+02:00","power":0,"lastMeterConsumption":9194.1692,"accumulatedConsumption":0,"accumulatedProduction":3.5866,"accumulatedConsumptionLastHour":0,"accumulatedProductionLastHour":0.3924,"accumulatedCost":null,"accumulatedReward":null,"currency":null,"minPower":0,"averagePower":0,"maxPower":0,"powerProduction":1290,"minPowerProduction":676,"maxPowerProduction":4514,"lastMeterProduction":19342.1205,"powerFactor":null,"voltagePhase1":null,"voltagePhase2":null,"voltagePhase3":null,"currentL1":null,"currentL2":null,"currentL3":null,"signalStrength":null}
Was muss ich da jetzt machen, damit die Daten des JSON in einzelne DPs kommen? Ich hab den Node importiert, verstehe hier aber grad nur Bahnhof
-
@merlin123 ich kann Dir im Moment nur von unterwegs antworten, deshalb kann ich Dir keine Screenshots schicken. Du ziehst einfach die neue Node auf Deinen Flow und schließt sie an die Node an die Dein JSON rauskommt. Wenn du die Node öffnest dann kannst du einen Ordnernamen angeben unter dem die einzelnen States abgelegt werden sollen. Vorgegeben ist objRoot. Dann schließt Du an diese Node eine iobroker-Out Node an. Dort gibst du an, dass die States erstellt werden sollen, falls sie nicht existieren (in der Adapterkonfiguration muss Fremdobjekte erstellen aktiviert sein), dann solltest du als Typ „value“ angeben und eventuell noch als ReadOnly definieren.
Falls das nicht klar ist, melde Duch nochmal, dann melde ich mich am Abend nochmal.
-
@mickym Danke erstmal für die Erklärung. Ich hab mal versucht das umzusetzen, aber es wird nichts angelegt. Vermutlich ne Kleinigkeit....
Sieht bei mir jetzt so aus:
-
@merlin123 wenn Fremdobjekte in der Adapterkonfiguration erlaubt sind, dann topic in der iobroker-out Node rauslöschen das topic wird durch die neue Node gesetzt. Readonly würde ich noch setzen. Keep topic in der subflow node auf false lassen. Selbst einen Namen in der iobroker Out Node vergeben oder rauslöschen
-
@mickym Dank Dir vielmals! das topic war das Problem
Und allgemein Danke für die Mühe, die Du dir machst
-
@mickym
Hallo Mickymso das würde ich jetzt gerne vertiefen und fange mal von oben an zu lesen.
Wenn es dazu Hilfe benötigt werde ich sehr gerne auf Dich zukommen! Wenn ich darf.
Oder hast Du eine bessere Idee wie und wo ich anfangen sollte?
-
@einstein2002 Na wenn es Dir nicht nur um das Zerlegen von Objekten geht - dann solltest Du lieber einen eigenen Thread aufmachen und dann können wir das Durchgehen. Was nutzt Du denn bis jetzt für Deine Logikmaschine?
Blockly oder Javascript?
-
@mickym
Ich nenne den dann mal Anfänger fragen?? Oder? -
@einstein2002 Vielleicht NodeRed für Anfänger und dann ins Einsteigerforum. Was nutzt Du denn jetzt?
Du kannst auch erst mal den Artikel lesen - der ist schon bissi älter aber in Summe funktioniert der noch.
https://www.smarthome-tricks.de/uebersicht-iobroker-node-red/