Navigation

    Logo
    • Register
    • Login
    • Search
    • Recent
    • Tags
    • Unread
    • Categories
    • Unreplied
    • Popular
    • GitHub
    • Docu
    • Hilfe
    1. Home
    2. Deutsch
    3. Skripten / Logik
    4. [gelöst] Datenpunt aus JSON String erstellen und verarbeiten

    NEWS

    • Neuer Blog: Fotos und Eindrücke aus Solingen

    • ioBroker@Smart Living Forum Solingen, 14.06. - Agenda added

    • ioBroker goes Matter ... Matter Adapter in Stable

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

    This topic has been deleted. Only users with topic management privileges can see it.
    • paul53
      paul53 @pmunz last edited by

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

      P 1 Reply Last reply Reply Quote 0
      • P
        pmunz @paul53 last edited by pmunz

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

        Glasfaser 1 Reply Last reply Reply Quote 0
        • Glasfaser
          Glasfaser @pmunz last edited by

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

          P 1 Reply Last reply Reply Quote 1
          • P
            pmunz @Glasfaser last edited by

            @Glasfaser
            Danke jetzt versteh ich das mit dem timestamp, perfekt

            paul53 1 Reply Last reply Reply Quote 0
            • paul53
              paul53 @pmunz last edited by

              @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);
              });
              
              P I 2 Replies Last reply Reply Quote 1
              • P
                pmunz @paul53 last edited by

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

                1 Reply Last reply Reply Quote 0
                • P
                  pmunz last edited by

                  @paul53
                  Funktioniert bestens!
                  Danke

                  1 Reply Last reply Reply Quote 0
                  • I
                    iobroker_Alex @paul53 last edited by

                    @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":"-------"
                    }}
                    
                    paul53 1 Reply Last reply Reply Quote 0
                    • paul53
                      paul53 @iobroker_Alex last edited by

                      @iobroker_Alex sagte:

                      let obj = JSON.parse(getAttr(dp.state.val, 'values')); 
                      

                      Versuche es mal so:

                          let obj = JSON.parse(dp.state.val).values;
                      
                      I 1 Reply Last reply Reply Quote 0
                      • I
                        iobroker_Alex @paul53 last edited by

                        @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)
                        
                        paul53 1 Reply Last reply Reply Quote 0
                        • paul53
                          paul53 @iobroker_Alex last edited by paul53

                          @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);
                          
                          I 1 Reply Last reply Reply Quote 0
                          • I
                            iobroker_Alex @paul53 last edited by

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

                            paul53 1 Reply Last reply Reply Quote 0
                            • paul53
                              paul53 @iobroker_Alex last edited by

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

                              I 1 Reply Last reply Reply Quote 0
                              • I
                                iobroker_Alex @paul53 last edited by

                                @paul53 Vielen Dank hab echt was gelernt heute 🙂

                                1 Reply Last reply Reply Quote 0
                                • P
                                  pmunz last edited by

                                  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

                                  paul53 1 Reply Last reply Reply Quote 0
                                  • paul53
                                    paul53 @pmunz last edited by

                                    @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);
                                        }
                                    });
                                    
                                    P 1 Reply Last reply Reply Quote 1
                                    • G
                                      guergen last edited by

                                      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!

                                      paul53 1 Reply Last reply Reply Quote 0
                                      • paul53
                                        paul53 @guergen last edited by

                                        @guergen sagte:

                                        Kann ich auch jeden Tag einen automatisch einen neuen DP erstellen mit dem Datum des jeweilligen Tages?

                                        Ja, unter "javascript.0" ist es möglich.

                                        G 1 Reply Last reply Reply Quote 0
                                        • G
                                          guergen @paul53 last edited by guergen

                                          @paul53 Wie übergebe ich denn als Datenpunkt den Tag?
                                          Anstatt des Test1 soll das Datum stehen...

                                          schedule("0 23 * * *", function () {
                                            createState("PV.Test1", getState("0_userdata.0.PV.Max").val, JSON.parse('{"type":"number","unit":"W"}'), function () {
                                            });
                                          });
                                          
                                          paul53 1 Reply Last reply Reply Quote 0
                                          • paul53
                                            paul53 @guergen last edited by paul53

                                            @guergen sagte:

                                            Anstatt des Test1 soll das Datum stehen

                                            schedule("0 23 * * *", function () {
                                              let datum = formatDate(new Date(), 'YYYY.O.D');
                                              createState("PV." + datum, getState("0_userdata.0.PV.Max").val, {type: "number", unit: "W"});
                                            });
                                            

                                            Die Punkte im Datum erzeugen jedes Jahr und jeden Monat einen Ordner im Tab "Objekte". Wenn das nicht gewünscht ist, ersetze die Punkte durch Bindestriche. Doku. Datum heute bei der angegebenen Formatierung:

                                            2020.Mai.7
                                            
                                            G 1 Reply Last reply Reply Quote 0
                                            • First post
                                              Last post

                                            Support us

                                            ioBroker
                                            Community Adapters
                                            Donate

                                            847
                                            Online

                                            31.8k
                                            Users

                                            80.0k
                                            Topics

                                            1.3m
                                            Posts

                                            blockly communication javascript
                                            5
                                            33
                                            2742
                                            Loading More Posts
                                            • Oldest to Newest
                                            • Newest to Oldest
                                            • Most Votes
                                            Reply
                                            • Reply as topic
                                            Log in to reply
                                            Community
                                            Impressum | Datenschutz-Bestimmungen | Nutzungsbedingungen
                                            The ioBroker Community 2014-2023
                                            logo