NEWS
[Problem]Daten aus JSON nutzen
-
Hallo Leute, ich bin leider noch relativ unerfahren in der Nutzung mit Node-Red.
Ich stehe gerade vor Aufgabe Daten die mir per MQTT und in JSON Format geschickt werden Auszuwerten, und jetzt stehe ich vor folgendem Problem das ich nicht weiß wie ich gezielt Werte aus dem JASON abfragen kann. Die folgende Abbildung zeigt den momentanen Aufbau meiner Testasusgabe, der Inject Node simuliert dabei die MQTT Nachricht. Die eingehende Nachricht sieht wie folgt aus.
{"A-01 ":{"TAG":" ","Ziel":"ort ","DATUM":"12.04.2018","Zeit":"0"}}
Der json Node formatiert mir nun entsprechend die eingehende msg.payload, so dass mir der debuger folgendes Ergebnis ausgibt.
Ich möchte nun gerne nur den Punkt DATUM ausgegeben bekommen, also hab ich einen Funktions-Node wie folgt eingebaut
und folgende Funktion definiert
var test = msg.payload.A-01.DATUM;
msg.payload = test;
return msg;
Leider bekomme ich immer folgende Fehlermeldung
Vielleicht kann mir ja jemand von euch erklären wo mein Fehler ist und wie ich den Punkt DATUM auslesen kann um ihn später zu verwenden.
Vielen Dank für alle Beiträge bereits im vorraus!
-
Stell mal den Export deines Flow rein.
Da ist ein Leerzeichen hinter A-01. Falls das so sein soll, kannst du das datum z.B. so erhalten:
[{"id":"9a7aa50a.7d73c8","type":"inject","z":"29677dc5.77b46a","name":"","topic":"","payload":"{\"A-01 \":{\"TAG\":\" \",\"Ziel\":\"ort \",\"DATUM\":\"12.04.2018\",\"Zeit\":\"0\"}}","payloadType":"json","repeat":"","crontab":"","once":false,"onceDelay":0.1,"x":122.5,"y":1051,"wires":[["e86a90de.a62158"]]},{"id":"1c8163a5.e045e4","type":"debug","z":"29677dc5.77b46a","name":"","active":true,"tosidebar":true,"console":false,"tostatus":false,"complete":"payload","x":482,"y":1054,"wires":[]},{"id":"e86a90de.a62158","type":"change","z":"29677dc5.77b46a","name":"","rules":[{"t":"set","p":"payload","pt":"msg","to":"payload.'A-01 '.DATUM","tot":"jsonata"}],"action":"","property":"","from":"","to":"","reg":false,"x":289.5,"y":1053,"wires":[["1c8163a5.e045e4"]]}]
-
Erstmal vielen Dank an rewenode.
Hier ist der Export von meinem Flow.
[{"id":"15b9b55.6925b4b","type":"inject","z":"3bd6fff6.6e10c8","name":"","topic":"","payload":" {\"A-01 \":{\"TAG\":\" \",\"Ziel\":\"ort \",\"DATUM\":\"12.04.2018\",\"Zeit\":\"0\"}}","payloadType":"str","repeat":"","crontab":"","once":false,"onceDelay":"","x":370,"y":140,"wires":[["6af5d208.dfae8c"]]},{"id":"6af5d208.dfae8c","type":"json","z":"3bd6fff6.6e10c8","name":"","property":"payload","action":"","pretty":false,"x":578,"y":141,"wires":[["95f4603f.f8a958"]]},{"id":"95f4603f.f8a958","type":"debug","z":"3bd6fff6.6e10c8","name":"","active":true,"tosidebar":true,"console":false,"tostatus":false,"complete":"payload","x":818,"y":142,"wires":[]}]
Ja das Leerzeichen dahinter hab ich berücksichtigt, leider muss das so sein da ich die Daten so zugesandt bekomme.
Gibt es eigentlich auch eine Lösung ohne Verwendung eines Change Bausteins?
-
Klar, functions-node ist in diesem einfachen Fall genauso einfach:
[{"id":"9a7aa50a.7d73c8","type":"inject","z":"29677dc5.77b46a","name":"","topic":"","payload":"{\"A-01 \":{\"TAG\":\" \",\"Ziel\":\"ort \",\"DATUM\":\"12.04.2018\",\"Zeit\":\"0\"}}","payloadType":"json","repeat":"","crontab":"","once":false,"onceDelay":0.1,"x":122.5,"y":1051,"wires":[["d8d3a757.8a1f78"]]},{"id":"d8d3a757.8a1f78","type":"function","z":"29677dc5.77b46a","name":"per f-node","func":"let d = msg.payload['A-01 '].DATUM;\nmsg.payload = d;\n\nreturn msg;","outputs":1,"noerr":0,"x":297.5,"y":1052,"wires":[["7dc8cf94.7f6c8"]]},{"id":"7dc8cf94.7f6c8","type":"debug","z":"29677dc5.77b46a","name":"","active":true,"tosidebar":true,"console":false,"tostatus":false,"complete":"payload","x":486,"y":1052,"wires":[]}]
Warum kommt eigentlich der Change-node nicht in Frage?
-
@rewenode
Ich habe heute mal versuch meinen MQTT / Json String auszuwerten:So sind der String aus:
{'data': [{'plantMoneyText': '9.2 (€)', 'plantName': 'xxx', 'plantId': '23422', 'isHaveStorage': 'false', 'todayEnergy': '2 kWh', 'totalEnergy': '33.6 kWh', 'currentPower': '164.2 W'}], 'totalData': {'currentPowerSum': '164.2 W', 'CO2Sum': '0 T', 'isHaveStorage': 'false', 'eTotalMoneyText': '9.2 (€)', 'todayEnergySum': '2 kWh', 'totalEnergySum': '33.6 kWh'}Ich wollten den Wert current Power auslesen.
Leider bin ich auf ganzer Breite gescheitert.
Wenn ich nur perr MQTT die Daten auf den Debuger lege, bekomme ich folgende Meldung:
"Unexpected token ' in JSON at position 1"Als Test habe ich mal versucht einfach nur das Item auszulesen.
[{"id":"8a70329b.ef589","type":"tab","label":"Flow 6","disabled":false,"info":""},{"id":"60f6dbff.eb65cc","type":"mqtt in","z":"8a70329b.ef589","name":"","topic":"inverter/plant_info","qos":"2","datatype":"json","broker":"c51b082c.bcad68","x":490,"y":180,"wires":[["9831eeb.105cb9"]]},{"id":"9831eeb.105cb9","type":"function","z":"8a70329b.ef589","name":"","func":"\nlet d = msg.payload['data'].currentPower;\nmsg.payload = d;\n\nreturn msg;","outputs":1,"noerr":0,"initialize":"","finalize":"","x":700,"y":180,"wires":[["ab1699ec.3f381"]]},{"id":"ab1699ec.3f381","type":"debug","z":"8a70329b.ef589","name":"post response","active":false,"tosidebar":true,"console":false,"tostatus":false,"complete":"true","targetType":"full","statusVal":"","statusType":"auto","x":900,"y":180,"wires":[]},{"id":"c51b082c.bcad68","type":"mqtt-broker","name":"openhab","broker":"192.168.111.128","port":"1883","clientid":"","usetls":false,"compatmode":false,"keepalive":"60","cleansession":true,"birthTopic":"","birthQos":"0","birthPayload":"","closeTopic":"","closeQos":"0","closePayload":"","willTopic":"","willQos":"0","willPayload":""}]
Hierbei bekomme ich:
"Failed to parse JSON string"Nun stehe ich vor einen Rätsel..
Hat jemand wohl eine Idee?
Vielen Dank..
-
@thomytp Ich weis jetzt nicht, wo dein String herkommt, Aber die einfachen Hochkommas müssen Doppelte sein. Und am Ende fehlt eine schließende geschweifte Klammer:
{ "data": [ { "plantMoneyText": "9.2 (€)", "plantName": "xxx", "plantId": "23422", "isHaveStorage": "false", "todayEnergy": "2 kWh", "totalEnergy": "33.6 kWh", "currentPower": "164.2 W" } ], "totalData": { "currentPowerSum": "164.2 W", "CO2Sum": "0 T", "isHaveStorage": "false", "eTotalMoneyText": "9.2 (€)", "todayEnergySum": "2 kWh", "totalEnergySum": "33.6 kWh" } }
dann sollte das auch klappen.
Wenn du es mit NodeRed machen willst, dann z.B. so:
-
@rewenode said in [Problem]Daten aus JSON nutzen:
Hallo,
vielen Dank schon mal für den Tip,das klappt ja schon mal ganz gut,..
Super respekt für die Top aufbereitung.. Ich habe noch nie einen Flow gemacht, daher auch meine doofen Fragen
Die Daten kommen von der Growatt API über MQTT:
Ich hatte leider nicht gesamten String kopiert, da kommt noch ein success am Ende was nun stresst.{'data': [{'plantMoneyText': '9.6 (â^b¬)', 'plantName': 'xxxxx', 'plantId': '234482', 'isHaveStorage': 'false', 'todayEnergy': '1.1 kWh', 'totalEnergy': '35 kWh','currentPower': '0 W'}], 'totalData': {'currentPowerSum': '0 W', 'CO2Sum': '0 T', 'isHaveStorage': 'false', 'eTotalMoneyText': '9.6 (â^b¬)', 'todayEnergySum': '1.1 kWh', 'totalEnergySum': '35 kWh'}, 'success': True}
Hier bekomme ich nun die Fehlermeldung
"Unexpected token T in JSON at position 378"Im anschluss möchte ich die Daten an Volkszähler geben um diese zu visualiserern.
Ich hatte da an so einen Flow gedacht, bin ich da auf dem richtigem Weg?
[{"id":"20226fae.f5f3f","type":"tab","label":"Flow 10","disabled":false,"info":""},{"id":"522399fd.b1ca3","type":"http request","z":"20226fae.f5f3f","name":"volkszaehler post","method":"POST","ret":"obj","paytoqs":"ignore","url":"","tls":"","persist":false,"proxy":"","authType":"","x":750,"y":720,"wires":[["987b67cb.1a4978"]]},{"id":"1a4ac21f.e52006","type":"template","z":"20226fae.f5f3f","name":"post data url","field":"url","fieldType":"msg","format":"handlebars","syntax":"mustache","template":"http://localhost/middleware.php/data/{{uuid}}.json?ts={{timestamp}}&value={{payload}}","x":730,"y":640,"wires":[["81bf5d64.86db58"]]},{"id":"c46f4ca6.8a3278","type":"json","z":"20226fae.f5f3f","name":"","property":"payload","action":"","pretty":false,"x":1190,"y":640,"wires":[["522399fd.b1ca3"]]},{"id":"987b67cb.1a4978","type":"debug","z":"20226fae.f5f3f","name":"post response","active":false,"tosidebar":true,"console":false,"tostatus":false,"complete":"true","targetType":"full","statusVal":"","statusType":"auto","x":1040,"y":720,"wires":[]},{"id":"81bf5d64.86db58","type":"change","z":"20226fae.f5f3f","name":"","rules":[{"t":"delete","p":"payload","pt":"msg"}],"action":"","property":"","from":"","to":"","reg":false,"x":980,"y":640,"wires":[["c46f4ca6.8a3278"]]},{"id":"4997c860.5affe","type":"change","z":"20226fae.f5f3f","name":"set uuid / timestamp","rules":[{"t":"set","p":"uuid","pt":"msg","to":"c0e80280-8978-11eb-aed4-7bf6c054beaa","tot":"str"},{"t":"set","p":"timestamp","pt":"msg","to":"","tot":"date"}],"action":"","property":"","from":"","to":"","reg":false,"x":780,"y":480,"wires":[["1a4ac21f.e52006"]]},{"id":"69a40557.f8ee4c","type":"debug","z":"20226fae.f5f3f","name":"","active":false,"tosidebar":true,"console":false,"tostatus":false,"complete":"false","statusVal":"","statusType":"auto","x":550,"y":540,"wires":[]},{"id":"d07f3214.8ebcf","type":"json","z":"20226fae.f5f3f","name":"JSON-String => javaScript-Objekt","property":"payload","action":"obj","pretty":false,"x":220,"y":400,"wires":[["98cccdab.a3e568","43cf62d3.bdd86c"]]},{"id":"98cccdab.a3e568","type":"change","z":"20226fae.f5f3f","name":"msg.payload.data[0].currentPower => msg.payload","rules":[{"t":"set","p":"payload","pt":"msg","to":"payload.data[0].currentPower","tot":"msg"}],"action":"","property":"","from":"","to":"","reg":false,"x":190,"y":480,"wires":[["69a40557.f8ee4c","4997c860.5affe"]]},{"id":"cb896446.9a8198","type":"change","z":"20226fae.f5f3f","name":"Konvertiere alle ' nach \"","rules":[{"t":"change","p":"payload","pt":"msg","from":"'","fromt":"str","to":"\"","tot":"str"}],"action":"","property":"","from":"","to":"","reg":false,"x":250,"y":260,"wires":[["d07f3214.8ebcf","5c34a8c0.88359"]]},{"id":"7f22423.5da973c","type":"debug","z":"20226fae.f5f3f","name":"","active":false,"tosidebar":true,"console":false,"tostatus":false,"complete":"false","statusVal":"","statusType":"auto","x":550,"y":40,"wires":[]},{"id":"5c34a8c0.88359","type":"debug","z":"20226fae.f5f3f","name":"","active":false,"tosidebar":true,"console":false,"tostatus":false,"complete":"false","statusVal":"","statusType":"auto","x":550,"y":260,"wires":[]},{"id":"43cf62d3.bdd86c","type":"debug","z":"20226fae.f5f3f","name":"","active":false,"tosidebar":true,"console":false,"tostatus":false,"complete":"false","statusVal":"","statusType":"auto","x":550,"y":400,"wires":[]},{"id":"70b8b8b.4428e48","type":"mqtt in","z":"20226fae.f5f3f","name":"","topic":"inverter/plant_info","qos":"2","datatype":"auto","broker":"c51b082c.bcad68","x":170,"y":40,"wires":[["7f22423.5da973c","cb896446.9a8198"]]},{"id":"c51b082c.bcad68","type":"mqtt-broker","name":"ziel","broker":"192.168.111.128","port":"1883","clientid":"","usetls":false,"compatmode":false,"keepalive":"60","cleansession":true,"birthTopic":"","birthQos":"0","birthPayload":"","closeTopic":"","closeQos":"0","closePayload":"","willTopic":"","willQos":"0","willPayload":""}]
-
@thomytp
Das'success': True
muss in Anführungsstrichen stehen. Also
'success': 'True'
oder
'success': "True"
Du kannst das zwar im change-node berücksichtigen, aber wenn das außer True noch andere Fälle vorkommen können, musst du alle Fälle berücksichtigen.
Könnte man aber sicher einfacher mit regEx lösen, aber da bin ich nicht so der Experte, dass kann dir vlt. jemand anderes aus dem Ärmel schütteln.Zu der Weiterverarbeitung Richtung Volkszähler kann ich leider nicht weiterhelfen, da habe ich noch nie was mit gemacht.
-
@rewenode
perfekt, vielen Dank, so langsam verstehe ich node-Red.Nun muss ich es noch mit dem Volkszähler hinbekommen.. aber das wird sicher auch
-
@thomytp said in [Problem]Daten aus JSON nutzen:
Die Daten kommen von der Growatt API über MQTT:
Schon mal den ioBroker Growatt Adapter getestet?