Navigation

    Logo
    • Register
    • Login
    • Search
    • Recent
    • Tags
    • Unread
    • Categories
    • Unreplied
    • Popular
    • GitHub
    • Docu
    • Hilfe
    1. Home
    2. Deutsch
    3. Skripten / Logik
    4. JavaScript
    5. Datenpunkt für JSON

    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

    Datenpunkt für JSON

    This topic has been deleted. Only users with topic management privileges can see it.
    • K
      Kail last edited by

      Hallo,
      ich möchte einen Datenpunkt anlegen und mit JSON Daten füllen, die ich dann an Grafana weitergebe.
      Bisher habe ich das händisch versucht, aber noch keinen richtigen Erfolg gehabt. Meine Vermutung ist, dass die JSON Daten als String und nicht als Objekt gespeichert/übergeben werden.
      Die Daten sind wie folgt aufgebaut:

      [
        {"time": "xxxxxxx", "value": xxx},
        {"time": "xxxxxxx", "value": xxx},
        {"time": "xxxxxxx", "value": xxx}
      ]
      

      Wie müsste ein entsprechendes Javascript aussehen?
      Danke und Grüße

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

        @kail sagte: Wie müsste ein entsprechendes Javascript aussehen?

        const arr = [
          {"time": "xxxxxxx", "value": xxx},
          {"time": "xxxxxxx", "value": xxx},
          {"time": "xxxxxxx", "value": xxx}
        ];
        
        setState(idJSON, JSON.stringify(arr), true);
        
        K 2 Replies Last reply Reply Quote 0
        • K
          Kail @paul53 last edited by

          @paul53
          Danke Paul.
          Gibt es noch bestimmte Anforderungen an die Einstellung des Datenpunktes?

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

            @kail sagte:Gibt es noch bestimmte Anforderungen an die Einstellung des Datenpunktes?

            Der DP muss vom Typ "string" oder "json" sein.
            In einen DP vom Typ "array" kann man das Array ohne Wandlung schreiben: Die Wandlung nimmt in dem Fall der JS-Adapter vor.

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

              @paul53
              Das Script hat mein Problem noch nicht ganz gelöst. In Grafana kann ich die Daten nicht separieren.
              Bildschirmfoto 2023-12-28 um 13.47.31.png
              Bildschirmfoto 2023-12-28 um 13.48.00.png

              paul53 OliverIO 2 Replies Last reply Reply Quote 0
              • paul53
                paul53 @Kail last edited by

                @kail sagte: In Grafana kann ich die Daten nicht separieren.

                Von Grafana habe ich keine Ahnung.

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

                  Habe mal das Grafana Thema in einen eigenen Thread verschoben.
                  Link zum Ziel

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

                    @paul53 sagte in Datenpunkt für JSON:

                    @kail sagte: Wie müsste ein entsprechendes Javascript aussehen?

                    const arr = [
                      {"time": "xxxxxxx", "value": xxx},
                      {"time": "xxxxxxx", "value": xxx},
                      {"time": "xxxxxxx", "value": xxx}
                    ];
                    
                    setState(idJSON, JSON.stringify(arr), true);
                    

                    Wie fülle ich das Array über eine Schleife?

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

                      @kail sagte: Wie fülle ich das Array über eine Schleife?

                      Wo kommen die Daten für das Array her?

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

                        @paul53
                        Über das Script sollen Werte aus Datenpunkten von DasWetter gesammelt werden.

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

                          @kail sagte: aus Datenpunkten

                          Z.B. so:

                          const ids = [id1, id2, id3];
                          const arr = [];
                          
                          for(let i = 0; i < ids.length; i++) {
                              let state = getState(ids[i]);
                              let obj = {
                                  time: formatDate(state.lc, 'hh:mm:ss'),
                                  value: state.val
                              };
                              arr.push(obj);
                          }
                          
                          setState(idJSON, JSON.stringify(arr), true);
                          

                          Es wird noch ein Trigger benötigt.

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

                            @paul53
                            Danke für Deinen Support.
                            Die Anzahl der Datenpunkte ist 24
                            const i_max = 24
                            Kann die id des Datenpunktes auch zusammensetzt sein, original für den ersten wäre:

                            daswetter.0.NextHours.Location_1.Day_1.Hour_1.rain_value
                            

                            Die variable Lösung wäre mit i, wobei i dann mit 1 anfangen müsste.

                            daswetter.0.NextHours.Location_1.Day_1.Hour_  + i + .rain_value
                            
                            paul53 2 Replies Last reply Reply Quote 0
                            • paul53
                              paul53 @Kail last edited by

                              @kail sagte: wobei i dann mit 1 anfangen müsste.

                              Stunden fangen mit 1 an?

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

                                @kail sagte: Kann die id des Datenpunktes auch zusammensetzt sein

                                const path = 'daswetter.0.NextHours.Location_1.Day_1.Hour_';
                                const arr = [];
                                 
                                for(let i = 1; i <= 24; i++) {
                                    let state = getState(path + i + '.rain_value');
                                    let obj = {
                                        time: formatDate(state.lc, 'hh:mm:ss'),
                                        value: state.val
                                    };
                                    arr.push(obj);
                                }
                                 
                                setState(idJSON, JSON.stringify(arr), true);
                                
                                K 1 Reply Last reply Reply Quote 0
                                • K
                                  Kail @paul53 last edited by

                                  Guten Morgen Paul,
                                  Dein Script habe ich ein wenig ergänzt. Würdest Du bitte einmal schauen, ob es JS konform ist.
                                  Die Abfrage der Wetterdaten wird alle 15 Minuten durchgeführt. Welche art des Triggers bietet sich da an?
                                  Danke und Grüße

                                  const idJSON = '0_userdata.0.Visualisierung.Niederschlag'/*Niederschlag*/;
                                  const path = 'daswetter.0.NextHours.Location_1.Day_1.';
                                  const arr = [];
                                   
                                  for(let i = 0; i <= 24; i++) {
                                      if (i == 0) {
                                          var state = getState(path + 'current.rain_value');
                                          var date = new Date(state.ts);
                                      } else {
                                          state = getState(path + 'Hour_' + i + '.rain_value');
                                          date = new Date(state.ts);
                                          date.setHours(date.getHours() + i);
                                      };
                                      let obj = {
                                          time: formatDate(date, 'YYYY-MM-DD hh:mm:ss'),
                                          value: state.val
                                      };
                                      arr.push(obj);
                                  }
                                   
                                  setState(idJSON, JSON.stringify(arr), true);
                                  
                                  paul53 1 Reply Last reply Reply Quote 0
                                  • paul53
                                    paul53 @Kail last edited by

                                    @kail sagte: alle 15 Minuten durchgeführt. Welche art des Triggers bietet sich da an?

                                    Ein Trigger auf "current.rain_value" bei Aktualisierung.

                                    const idJSON = '0_userdata.0.Visualisierung.Niederschlag'/*Niederschlag*/;
                                    const path = 'daswetter.0.NextHours.Location_1.Day_1.';
                                    
                                    on({id: path + 'current.rain_value'}, function(dp) {
                                        const arr = [];
                                        for(let i = 0; i <= 24; i++) {
                                            if (i == 0) {
                                                var state = dp.state;
                                    // wie bisher
                                    
                                    1 Reply Last reply Reply Quote 0
                                    • K
                                      Kail last edited by Kail

                                      Wie ich eben feststellen musste, habe ich die Daten vom Adapter falsch interpretiert.
                                      Die Werte beziehen sich auf die Uhrzeit und nicht auf Stunden.
                                      Dadurch muss ich das Script etwas umbauen.
                                      Wenn das Datum im Format YYYYMMDD als String vorliegt, wie bekomme ich das ins Format
                                      YYYY-MM-DD, nur mit substring?

                                      let date = getState(path + '1.day_value');
                                          let year = date.val.substring(0,4);
                                          let month = date.val.substring(4,6);
                                          let day = date.val.substring(6,8);
                                          date = year + '-' + month + '-' + day;
                                      

                                      Bildschirmfoto 2023-12-31 um 13.01.21.png

                                      K 1 Reply Last reply Reply Quote 0
                                      • K
                                        Kail @Kail last edited by

                                        Das Script habe ich nun wie folgt umgebaut, vielleicht kann noch jemand darüberschauen, wie man den Code besser schreiben kann.

                                        const idJSON = '0_userdata.0.Visualisierung.Niederschlag'/*Niederschlag*/;
                                        const path = 'daswetter.0.NextHours.Location_1.Day_';
                                        
                                        on({id: path + '1.current.temp_value'}, function(dp) {
                                            const arr = [];
                                            let date = getState(path + '1.day_value');
                                            let year = date.val.substring(0,4);
                                            let month = date.val.substring(4,6);
                                            let day = date.val.substring(6,8);
                                            let curr_date = year + '-' + month + '-' + day;
                                            
                                            for (let d = 1; d <= 2; d++) {
                                                for(let i = 1; i <= 24; i++) {
                                                    var state_temp = getState(path + d +'.Hour_' + i + '.temp_value');
                                                    var state_rain = getState(path + d + '.Hour_' + i + '.rain_value');
                                                    var time = getState(path + d + '.Hour_' + i + '.hour_value');
                                                    if (d == 2 && i == 1) {
                                                        curr_date = formatDate(new Date(curr_date).setDate(new Date(curr_date).getDate() + 1), 'YYYY-MM-DD');
                                                    }
                                                    var datetime = new Date(curr_date + ' ' + time.val);
                                                    datetime = new Date(datetime.getTime() - (1000));
                                                    
                                                    let obj = {
                                                        time: formatDate(datetime, 'YYYY-MM-DD hh:mm:ss'),
                                                        Niederschlag: state_rain.val,
                                                        Temperatur: state_temp.val
                                                    };
                                                    arr.push(obj);
                                                };
                                            };
                                         
                                            setState(idJSON, JSON.stringify(arr), true);
                                        });
                                        
                                        

                                        Das Resultat:
                                        Bildschirmfoto 2023-12-31 um 15.54.48.png

                                        1 Reply Last reply Reply Quote 0
                                        • OliverIO
                                          OliverIO @Kail last edited by

                                          @kail sagte in Datenpunkt für JSON:

                                          In Grafana kann ich die Daten nicht separieren

                                          sollte man die daten nicht besser in eine datenbank schreiben (influx oder maria), dann kann grafana die daten selbst daraus lesen?
                                          https://grafana.com/docs/grafana/latest/datasources/

                                          1 Reply Last reply Reply Quote 0
                                          • K
                                            Kail last edited by

                                            @oliverio
                                            Die Einstellungen für Grafana habe ich parallel hinbekommen und es funktioniert gut.
                                            In die MariaDB speichere ich eigentlich nur Daten, die mich für einen längeren Zeitraum gesichert und abrufbar haben möchte dastrifft auf die Wetter-Vorschau nicht zu.
                                            Grüße Kail

                                            OliverIO 1 Reply Last reply Reply Quote 0
                                            • First post
                                              Last post

                                            Support us

                                            ioBroker
                                            Community Adapters
                                            Donate

                                            955
                                            Online

                                            31.9k
                                            Users

                                            80.1k
                                            Topics

                                            1.3m
                                            Posts

                                            3
                                            22
                                            879
                                            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