NEWS

[gelöst] Datenpunt aus JSON String erstellen und verarbeiten


  • Starter

    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);
    

  • Starter

    @paul53 sagte in Datenpunt aus JSON String erstellen und weiter verarbeiten:

    @pmunz

    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 ?


  • Starter

    @paul53
    Hallo,
    Mein JSON string ist unter mqtt.0 unter Objekte zu finden:
    Bildschirmfoto 2020-05-05 um 18.59.26.png
    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/


  • Starter

    @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);
    });
    

  • Starter

    @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 ?


  • Starter

    @paul53
    Funktioniert bestens!
    Danke


  • Starter

    @paul53

    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;
    

  • Starter

    @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);
    

  • Starter

    @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äßig

    Wie 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.


  • Starter

    @paul53 Vielen Dank hab echt was gelernt heute 🙂


  • Starter

    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.
    Bildschirmfoto 2020-05-07 um 14.38.23.png Bildschirmfoto 2020-05-07 um 14.37.42.png Bildschirmfoto 2020-05-07 um 14.38.07.png

    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



  • @pmunz

    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!



Suggested Topics

1.2k
Online

32.4k
Users

39.0k
Topics

528.1k
Posts