NEWS
[gelöst] Datenpunt aus JSON String erstellen und verarbeiten
-
Hallo,
Hat wer von euch eine Idee wie ich diesen JSON string sauber in einzelne Datenpunkte bekomme :
Ausgelesener RFID Schlüssel Wert:
{"type":"access","time":1588679373,"isKnown":"true","access":"Always","username":"MustermannTop6","uid":"aa76f784"}
und diese neuen Datenpunkte dann weiter verarbeiten kann ?
oder gibt es eine möglichkeit den JSON string custom neu zu gestalten um die Daten schöner erfassen zu können und / oder sie in der MySQL schön anzulegen.vielen Dank
-
@pmunz sagte:
diesen JSON string sauber in einzelne Datenpunkte bekomme
let obj = JSON.parse(json); setState(idKey, obj.uid, true);
-
@paul53 sagte in Datenpunt aus JSON String erstellen und weiter verarbeiten:
let key = JSON.parse(json).uid;
Danke paul53 , hast du da vielleicht noch einen kleinen Tip für dummies / neu starter wie mich
dann könnt ich mich da mal versuchen. -
@pmunz
Ich nehme an, der JSON string befindet sich in einem Datenpunkt ?
Welche Werte sollen in eigene Datenpunkte geschrieben werden ?
Sollen die eigenen Datenpunkte manuell oder per Script (dann nur unter "javascript.0") erstellt werden ? -
@paul53
Hallo,
Mein JSON string ist unter mqtt.0 unter Objekte zu finden:
String Text ist nur rot weil ich den Namen zensiert habe.ich würde gerne alle werte getrennt automatisch in einen extra Datenpunkt übergeben, ist das möglich ?
die erzeugten datenpunkte kann ich ja dann normal weiter verarbeiten und zb meine eigene MySQL DB befüttern.Oder bin ich da am Holzweg bzw. ist diese lösung nicht gut ?
Kannst du mir noch beantworten warum der Time:1588698046707 Output so ausgegeben wird ?
-
@pmunz sagte in Datenpunt aus JSON String erstellen und weiter verarbeiten:
warum der Time:1588698046707 Output so ausgegeben wird
Timestamp von deinem Sender .
Gib mal dort die Zahl ein
https://www.epochconverter.com/ -
@Glasfaser
Danke jetzt versteh ich das mit dem timestamp, perfekt -
@pmunz
Vorschlag:const idRfid = "mqtt.0.RFID_WaMa"; // bei Bedarf korrigieren const path = 'javascript.' + instance + '.RFID.'; const idType = path + 'Typ'; const idTime = path + 'Zeit'; const idKnown = path + 'Bekannt'; const idAccess = path + 'Zugang'; const idName = path + 'Name'; const idUid = path + 'UID'; if(!existsState(idName)) { // Datenpunkte erzeugen createState(idType, 'leer', {type: 'string'}); createState(idTime, 'leer', {type: 'string'}); createState(idKnown, 'leer', {type: 'string'}); createState(idAccess, 'leer', {type: 'string'}); createState(idName, 'leer', {type: 'string'}); createState(idUid, 'leer', {type: 'string'}); }; on(idRfid, function(dp) { // triggert bei Wertänderung let obj = JSON.parse(dp.state.val); setState(idType, obj.type, true); setState(idTime, formatDate(obj.time, 'DD.MM.YY hh:mm:ss'), true); setState(idKnown, obj.isKnown, true); setState(idAccess, obj.access, true); setState(idName, obj.username, true); setState(idUid, obj.uid, true); });
-
@paul53
Boah Dankeschön !
So ist es für mich leicht zu verstehen, vielen dank!
Das ganze muss ich jetzt unter Scripte als Javascript ablegen / Speichern und Starten somit läuft der spass oder ? -
@paul53
Funktioniert bestens!
Danke -
Hey genau sowas suche ich auch und häng mich mal kurz dran. Mein Json sieht nur leider etwas anders aus und es funktioniert deshalb wohl nicht. Gibst du mir den notwendigen Tipp?
const id = "mqtt.0.solar.inverter.2000668170"; // bei Bedarf korrigieren const scheune2 = "mqtt.0.solar.inverter.2000364195";const scheune3 = "mqtt.0.solar.inverter.2000395543"; const haus1 = "mqtt.0.solar.inverter.2000415588"; const haus2 = "mqtt.0.solar.inverter.2000415597"; const path = 'javascript.' + instance + '.PV.Scheune1.'; const idSpannungDC = path + 'Spannung_DC'; const idStromstaerkeAC = path + 'Stromstärke_AC'; const idSpannungAC = path + 'Spannung_AC'; const idFrequenzAC = path + 'Freuqenz_AC'; const idLeistungAC = path + 'Leistung_AC'; const idEtotal = path + 'Eingespeiste_Leistung'; const idHtotal = path + 'Betriebsdauer'; if(!existsState(idHtotal)) { // Datenpunkte erzeugen createState(idSpannungDC, '', {type: 'number',unit: 'V'}); createState(idStromstaerkeAC, '', {type: 'number',unit: 'A'}); createState(idSpannungAC, '', {type: 'number',unit: 'V'}); createState(idFrequenzAC, '', {type: 'number',unit: 'Hz'}); createState(idLeistungAC, '', {type: 'number',unit: 'W'}); createState(idEtotal, '', {type: 'number',unit: 'kWh'}); createState(idHtotal, '', {type: 'number',unit: 'h'}); }; on(id, function(dp) { // triggert bei Wertänderung let obj = JSON.parse(getAttr(dp.state.val, 'values')); setState(idSpannungDC, obj.Upv-Ist, true); setState(idStromstaerkeAC, obj.Iac-Ist, true); setState(idSpannungAC, obj.Uac, true); setState(idFrequenzAC, obj.Fac, true); setState(idLeistungAC, obj.Pac, true); setState(idEtotal, obj.E-total, true); setState(idHtotal, obj.h-Total, true); });
Mein Objekt sieht so aus:
{"sn":000,"time":1586608779,"values": { "Iac":12580, "Uac":239, "Fac":50.019998881965876, "Pac":3006, "Zac":0.17200000816956162, "Riso":10000, "dI":4, "Upv-Ist":416, "PPV":3013, "E-Total":45358.538154414855, "h-Total":47797.772832013434, "h-On":51654.766385075491, "Netz-Ein":9012, "Seriennummer":000, "E-Total DC":45694.108978657052, "Status":"Mpp", "Fehler":"-------" }}
-
@iobroker_Alex sagte:
let obj = JSON.parse(getAttr(dp.state.val, 'values'));
Versuche es mal so:
let obj = JSON.parse(dp.state.val).values;
-
@paul53 wir nähern und dem Ergebnis:
In Obj steht nun:{'Upv-Ist':432,'Upv-Soll':433,'Iac-Ist':11.118000528076664,'Uac':242,'Fac':49.979998882859945,'Pac':2691,'Zac':0.5040000239387155,'Riso':3000,'Ipv':6.52900031011086,'E-Total':44230.93310085649,'h-Total':26578.838428355462,'h-On':27670.649680297298,'Netz-Ein':6759,'Seriennummer':2000668170,'Status':'Mpp','Balancer':'Off','Fehler':'-------'}
Jetzt meckert er bei ersten setState:
setState(idSpannungDC, obj.Upv-Ist, true);
Kann es sein, dass er "Upv-Ist" nicht mag / findet?
Fehler:
javascript.0 (24587) at Object.<anonymous> (script.js.Strom.Inverter1:25:36)
-
@iobroker_Alex sagte:
Kann es sein, dass er "Upv-Ist" nicht mag / findet?
Ja, enthält ein unzulässiges Zeichen: -
setState(idSpannungDC, obj['Upv-Ist'], true);
-
@paul53 Besten Dank funktioniert!!!
Sag mal wie du siehst habe ich mehrere Inverter die auf gleiche Weise ausgelesen werden sollen => 5 Stück um genau zu sein.
Um es mir am einfachsten zu machen würde ich nun das Skript 5 mal kopieren und unter anderem Namen speichern und nur oben den Path und das Objekt abändern. => AnfängermäßigWie würdest du das lösen?
Schleife drum und vorher nen Array mit den 5 Invertern und den 5 Paths anlegen? -
@iobroker_Alex sagte:
das Skript 5 mal kopieren und unter anderem Namen speichern und nur oben den Path und das Objekt abändern. => Anfängermäßig
Wie würdest du das lösen?Genauso.
-
@paul53 Vielen Dank hab echt was gelernt heute
-
Vielen Dank @paul53
Da haben wir echt etwas gelernt
zum JSON string auslesen und in Datenpunkte speichern hätte ich da noch zwei Fragen:1.) wie kann man diesen JSON string auslesen wobei die werte mit einem Semicolon getrennt sind?
{"idx":788,"RSSI":7,"nvalue":0,"svalue":"22.9;15.4;2"}2.) was kann man machen wenn sich in einer Objektzeile die Werte immer ändern ?
wie bekommt man die werte getrennt voneinander in einen Datenpunkt.
Das ESPeasy Projekt versendet den JSON string auf diese weise. Alle Werte ok aber eben immer in die selbe Objekt zeile, die Werte und der "idx" sind narürlich unterschiedlich.
LG
-
on(idJson, function(dp) { let obj = JSON.parse(dp.state.val); if(obj.idx == 788) { let arr = obj.svalue.split(';'); setState(idWert1 , parseFloat(arr[0]), true); setState(idWert2 , parseFloat(arr[1]), true); setState(idWert3 , parseFloat(arr[2]), true); } });
-
Kann ich auch jeden Tag einen automatisch einen neuen DP erstellen mit dem Datum des jeweilligen Tages?
Ich würde gerne die maximale Leistung meiner PV-Anlage speichern....
Hab es mit Blockly versucht, geht aber scheinbar nicht. Mit JS stehe ich "noch" auf dem Kriegspfad!