NEWS
JSON oder JavaScript Objekt in iobroker Datenpunkte zerlegen
-
@frank579 Ich hab den Fehler schon gefunden - ich werkle gerade an einer neuen Version.
-
So einen neue Version des Subflows - hat sich sogar vereinfacht.
Einfach mal testen:
Dann wie unten vorgehen: https://forum.iobroker.net/post/856928
Dort ist ja auch noch die bisherige Version vorhanden.
EDIT: Sorry waren die Debug Nodes noch drin.
-
@mickym
Habe es mal schnell getestet irgend was passt jetzt nicht mehr, kann natürlich auch bei mir sein die Werte der Tasmota Steckdose werden nicht mehr aktualisiert...
aus der debug Node kommt0_userdata.0.objRoot.ENERGY.Total : msg.payload : number 2.689
ist das objRoot richtig da stand vorher der Name vom gerät ...
-
@frank579 Na dann hast Du leider Deine ganze Node ersetzt - Du solltest eigentlich nur wie unter beschrieben den Subflow nehmen.
-
@mickym hatte ich auch so gemacht, dacht ich ... schaue ich direkt mal nach
-
@frank579 sagte in JSON oder JavaScript Objekt in iobroker Datenpunkte zerlegen:
@mickym hatte ich auch so gemacht, dacht ich ... schaue ich direkt mal nach
Standardmässig steht in der Node
Daher das objRoot.
Da musst Du wieder den eigenen Namen eintragen unter dem das unter 0_userdata.0 auftauchen soll und wenn Du einen ganzen Baum schreiben willst, muss das keepTopic auf true.
-
@mickym genau so war es.
wenn ich jetzt wieder den ganzen baum vom 3EM haben möchte bekomme ich immer den im log :1 Nov 15:55:58 - [error] [json:6908c423c0496cdd] Unexpected token o in JSON at position 0
hast du eine idee was das sein könnte komme aber auch so klar benötige ja eigentlich nicht den ganzen Baum ist ja in den Mqtt-Adapter Datenpunkten schon drin, aber evtl. käme ich dann ohne den für die shellies klar nur mit node red, evtl. nehme ich mir auch was viel vor
-
@frank579 Ja hab noch einen Fehler gefunden - das Problem ist, dass er Zahlen als JSON Objekte erkennt, Strings aber nicht, da kommt dann dieser Fehler. Nächste Version folgt.
-
@frank579 So nächste Version. - Ist wieder etwas komplexer, aber ich hoffe jetzt passt es:
Außerdem werden jetzt (!!!) wenn gar kein topic gesetzt ist, das topic gelöscht werden soll und von Anfang an skalare Werte übergeben werden, einfach als topic der Datentyp gesetzt. Damit sollte das mit dem . am Ende nicht mehr vorkommen. Das lag an skalaren Typen ohne topic.
Ich hoffe passt jetzt.
@Frank579 - eine kurze Rückmeldung wäre Klasse, dann ändere ich den Flow im 1. Post wieder.
-
@mickym
Auf den ersten Blick sieht alles gut aus, log bleibt sauber
Top Arbeit von dir -
@frank579 Gut, dann übernehm ich diese Version mal in den ersten Post - Historie hab ich schon geändert.
Danke für Rückmeldung.
-
@mickym sagte in JSON oder JavaScript Objekt in iobroker Datenpunkte zerlegen:
@noah3112 Das ist Deine mqtt-IN Node - da hast wahrscheinlich angegeben, dass es sich um ein analysiertes JSON Objekt handelt.
Du musst das nur wieder auf String und Buffer umstellen - der Subflow wandelt Strings automatisch um. Das Problem mit der Analyse eines analysierten JSON Objektes der mqtt-In Node schmeisst den Fehler bei Analyse des Objekts bei normalen Strings. Ich hab das im Node Red Forum schon moniert und hoffe, dass es in der Version 3 behoben wird. Also einfach wieder auf String und Buffer umstellen.
Falls es Dich interessiert habe ich das Problem hier beschrieben.
https://discourse.nodered.org/t/improvement-of-mqtt-in-nodes/55445/17Falls Du in anderen Situationen trotzdem die Funktion des analysierten JSON Objektes in Deiner mqtt-IN Node nutzen willst und aber auch teilweise Strings hast, dann kann man dass auch mit einer Catch NOde abfangen. In dem Fall kann aber der Subflow damit umgehen, da die erste Switch Node sogar den Typ JSON String kennt.
Grundsätzlich kannst Du dich schon verlassen, welche Node einen Fehler verursacht:
Also die Node "zigbee2mqtt to iobroker"
Also lange Rede - kurzer Sinn - einfach wieder auf Auto-Erkennung (string or buffer) umstellen.
Dieses Thema ist übrigens seit der neuest Node-Red Version (also NodeRed Adapter 4.0.0) nicht mehr relevant. Das JSON-Objekt wird nun auch bei Strings und skalaren Werten von der mqtt-IN Node richtig interpretiert:
-
So ich habe die Eingangsanleitung aktualisiert, damit man sich die Änderungen nicht alle aus dem Thread zusammensuchen muss.
-
@mickym said in JSON oder JavaScript Objekt in iobroker Datenpunkte zerlegen:
So ich habe die Eingangsanleitung aktualisiert, damit man sich die Änderungen nicht alle aus dem Thread zusammensuchen muss.
Extrem cool, vielen Dank!
-
Mit Deinem Subflow versuche ich per ModbusTCP Daten aus einer Huawei Photovoltaik einzulesen. Soweit funktioniert das auch, aber ich verstehe die Inhalte des entstehenden Array nicht:
37109-37110 sieht gut aus, teilt man den Wert durch 100 erhält man den korrekten Strom-Wert.
Aus 37107-37108 hätte ich im Ziel-Array einen dreistelligen negativen Wert erwartet, aber nicht zwei Werte über 65000?Was raffe ich da wieder nicht?
Viele Grüße
Heinrich -
@warp-it Ich denke da bist du in diesem Thread an der falschen Adresse. - Der Subflow macht nichts anderes als ein Objekt zu zerlegen und in eigene Datenpunkte zu schreiben.
In diesem Objekt sind die Werte ja schon enthalten:
Und dieser Subflow macht nichts weiter als diese Daten auszusplitten. Wie Du auf die anderen Werte kommst, ist eine Modbus Geschichte.
Aus 37107-37108 hätte ich im Ziel-Array einen dreistelligen negativen Wert erwartet, aber nicht zwei Werte über 65000?
Sowas kann ich ja gar nicht nachvollziehen. Das würde ich in dem anderen Thread mit den Modbus Spezialisten diskutieren. Falls Du die Buffer Node nutzt, dann muss man halt mit den Daten schauen, was Du da rechnest.
Dieser Flow - verändert grundsätzlich KEINE Originalwerte.
-
@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