Navigation

    Logo
    • Register
    • Login
    • Search
    • Recent
    • Tags
    • Unread
    • Categories
    • Unreplied
    • Popular
    • GitHub
    • Docu
    • Hilfe
    1. Home
    2. Deutsch
    3. Off Topic
    4. Grafana
    5. JSON in Grafana einbinden

    NEWS

    • [erledigt] 15. 05. Wartungsarbeiten am ioBroker Forum

    • ioBroker goes Matter ... Matter Adapter in Stable

    • Monatsrückblick - April 2025

    JSON in Grafana einbinden

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

      Hallo

      Ich möchte gerne eine JSON Tabelle die auf Iobroker ist per Grafana darstellen lassen, kann mir einer helfen, wie ich das umsetzen könnte in Grafana?

      Codierknecht 1 Reply Last reply Reply Quote 0
      • Codierknecht
        Codierknecht Developer Most Active @stefu87_CH last edited by

        @stefu87_ch
        Du brauchst zunächst JSON/infinity als DataSource.
        51f0aea6-1e9c-4e3b-af34-fd0125f12696-grafik.png
        Und dann kannst Du per REST-API die Werte aus einem Datenpunkt lesen und formatieren.
        a5618272-f1e5-4168-8123-896b4fe5fb18-grafik.png
        Wie Du das dann darstellen willst, bleibt Dir überlassen.

        1 Reply Last reply Reply Quote 1
        • S
          stefu87_CH last edited by

          @codierknecht Vielen Dank schon mal für die Hilfe.

          Und wie komme ich dann nachher an die richtige Adresse für die URL?

          Codierknecht 1 Reply Last reply Reply Quote 0
          • Codierknecht
            Codierknecht Developer Most Active @stefu87_CH last edited by

            @stefu87_ch sagte in JSON in Grafana einbinden:

            Und wie komme ich dann nachher an die richtige Adresse für die URL?

            Das kommt u.a. darauf an, ob Du über das "eingebaute" Simple-API oder über den REST-Adapter da rangehst.
            Den Port für den URL bestimmt der verwendete Adapter.
            IP ist logischerweise die Deines ioBroker-Servers.
            Und die ID des Datenpunktes kann man ja ganz einfach kopieren und dann hinten ranhängen:
            e89cdf47-9114-4f3d-b792-1d81ea433ba1-grafik.png

            S 1 Reply Last reply Reply Quote 0
            • S
              stefu87_CH @Codierknecht last edited by

              @codierknecht sagte in JSON in Grafana einbinden:

              Das kommt u.a. darauf an, ob Du über das "eingebaute" Simple-API oder über den REST-Adapter da rangehst.

              Also ich verwende einen Javascript Code der mir dass dann unter 0_userdata.0.Wohnungsverbrauch.Tagesverbrauch in die JSON Tabelle schreibt.

              Codierknecht 1 Reply Last reply Reply Quote 0
              • Codierknecht
                Codierknecht Developer Most Active @stefu87_CH last edited by

                @stefu87_ch
                Dann versuch doch mal im Browser:
                http://192.168.178.9:8082/getPlainValue/0_userdata.0.Wohnungsverbrauch.Tagesverbrauch

                IP und Port musst Du natürlich anpassen und "eingebautes Simple-API" muss aktiviert sein.

                51d1f3af-9bc3-4653-8db8-003c0b57d91b-grafik.png

                S 1 Reply Last reply Reply Quote 0
                • S
                  stefu87_CH @Codierknecht last edited by

                  @codierknecht Habe es mal soweit geschafft, das es mir die Tabelle in Grafana anzeigt. Jetzt kommt dann nur noch das Probieren, das ich das ganze dann wie eine Grafik darstellen kann in so einer Variante:

                  044da0d6-d21f-45cd-9718-806229dc1cec-grafik.png

                  S 1 Reply Last reply Reply Quote 0
                  • S
                    stefu87_CH @stefu87_CH last edited by

                    Kann mir jemand aufzeigen, wie ich das hinkriege, das ich die Werte dann auch Graphische Balken angezeigt bekomme anhand der JSON Tabelle??

                    Codierknecht 1 Reply Last reply Reply Quote 0
                    • Codierknecht
                      Codierknecht Developer Most Active @stefu87_CH last edited by Codierknecht

                      @stefu87_ch
                      Also bei mir sieht das so aus:

                      Per Script ermittle ich z.B. die Signalstärke meiner Tasmota-Geräte und schreibe das Ganze in einen eigenen DP.

                      const sonoff_ids = Array.prototype.slice.apply($('sonoff.0.*.Wifi_RSSI'));
                      var sonoffStates = {};
                      
                      function refreshSonoffValues(elementList) {
                          for (const element of elementList) {
                              let objAlive = getState(element.replace('.Wifi_RSSI', '.alive')).val;
                              let objName = getObject(element.replace('.Wifi_RSSI', '')).common.name;
                              sonoffStates[objName] = (objAlive ? getState(element).val : 0);
                          }
                          setState('0_userdata.0.Monitoring.Sonoff.RSSI', JSON.stringify(sonoffStates), true);
                      }
                      
                      schedule('* * * * *', function() {
                          refreshSonoffValues(sonoff_ids);
                      });
                      
                      refreshSonoffValues(sonoff_ids);
                      

                      In Grafana lese ich den DP per SimpleApi.

                      0fc692bd-8385-4c6e-92f8-de66fde6a1df-grafik.png
                      Das sieht dann so aus:

                      33ec0deb-bb9e-49b0-b582-1241dc096ce4-grafik.png

                      {
                       "id": 4,
                       "type": "bargauge",
                       "title": "Sonoff",
                       "gridPos": {
                         "x": 0,
                         "y": 1,
                         "h": 17,
                         "w": 11
                       },
                       "fieldConfig": {
                         "defaults": {
                           "mappings": [],
                           "thresholds": {
                             "mode": "absolute",
                             "steps": [
                               {
                                 "color": "orange",
                                 "value": null
                               },
                               {
                                 "color": "yellow",
                                 "value": 20
                               },
                               {
                                 "color": "green",
                                 "value": 50
                               }
                             ]
                           },
                           "color": {
                             "mode": "thresholds"
                           },
                           "decimals": 0,
                           "max": 100,
                           "min": 0,
                           "unit": "percent"
                         },
                         "overrides": []
                       },
                       "transformations": [
                         {
                           "id": "extractFields",
                           "options": {
                             "replace": true,
                             "source": "A"
                           }
                         },
                         {
                           "id": "transpose",
                           "options": {}
                         },
                         {
                           "id": "sortBy",
                           "options": {
                             "fields": {},
                             "sort": [
                               {
                                 "field": "Field"
                               }
                             ]
                           }
                         }
                       ],
                       "pluginVersion": "11.4.0",
                       "targets": [
                         {
                           "columns": [],
                           "datasource": {
                             "type": "yesoreyeram-infinity-datasource",
                             "uid": "adut1o422tpfkf"
                           },
                           "filters": [],
                           "format": "table",
                           "global_query_id": "",
                           "parser": "backend",
                           "refId": "A",
                           "root_selector": "",
                           "source": "url",
                           "type": "json",
                           "uql": "parse-json\r\n| jsonata \"$.result[0].value\"\r\n\r\n",
                           "url": "http://192.168.178.9:8083/getPlainValue/0_userdata.0.Monitoring.Sonoff.RSSI",
                           "url_options": {
                             "body_content_type": "text/plain",
                             "body_type": "none",
                             "data": "",
                             "headers": [],
                             "method": "GET"
                           }
                         }
                       ],
                       "datasource": {
                         "type": "yesoreyeram-infinity-datasource",
                         "uid": "adut1o422tpfkf"
                       },
                       "options": {
                         "reduceOptions": {
                           "values": true,
                           "calcs": [
                             "min"
                           ],
                           "fields": "/^1$/"
                         },
                         "orientation": "horizontal",
                         "legend": {
                           "showLegend": false,
                           "displayMode": "list",
                           "placement": "bottom",
                           "calcs": []
                         },
                         "displayMode": "gradient",
                         "valueMode": "color",
                         "namePlacement": "left",
                         "showUnfilled": true,
                         "sizing": "manual",
                         "minVizWidth": 8,
                         "minVizHeight": 0,
                         "maxVizHeight": 20
                       }
                      }
                      

                      S 1 Reply Last reply Reply Quote 0
                      • S
                        stefu87_CH @Codierknecht last edited by

                        @codierknecht ok sowas würde ich gerne haben, aber kann man das auch machen, wenn in der Tabelle für jeden Tag ein Wert drin steht?

                        Also z.B so:
                        01.01.2025 5.64kW
                        02.01.2025 6.52kW
                        03.01.2025 4.58kW
                        usw…

                        Codierknecht 1 Reply Last reply Reply Quote 0
                        • Codierknecht
                          Codierknecht Developer Most Active @stefu87_CH last edited by

                          @stefu87_ch
                          Kein Problem. Das JSON muss dann aber etwas anders aussehen. Der Wert darf keine Einheit haben. Die wird in Grafana eingestellt.

                          64ae7f3c-d87d-4fc4-8dd9-ff108e904ad5-grafik.png

                          "{"01.01.2025":5.64,"02.01.2025":6.25,"03.01.2025":5.89,"04.01.2025":5.4}"
                          
                          S 2 Replies Last reply Reply Quote 0
                          • S
                            stefu87_CH @Codierknecht last edited by

                            @codierknecht ok danke für den Tipp.
                            Werde mir morgen mal den Java Code anschauen wo das definiert wird im Code

                            1 Reply Last reply Reply Quote 0
                            • S
                              stefu87_CH @Codierknecht last edited by

                              @codierknecht Also wenn ich die Json Tabelle anpasse, erscheint nur das bei mir:

                              344742ba-e70c-4cf4-aed2-a2fe0f6aec40-grafik.png

                              Die Tabelle sieht so aus:

                              9adce245-d638-47a4-858d-1cb0cef7349a-grafik.png

                              Codierknecht 1 Reply Last reply Reply Quote 0
                              • Codierknecht
                                Codierknecht Developer Most Active @stefu87_CH last edited by

                                @stefu87_ch
                                Dein JSON sieht ja auch völlig anders aus. Du hast ein Array von Objekten mit jeweils 2 Properties.
                                Mein JSON ist ein Objekt mit X Properties.

                                Da gibt's in Grafana jede Menge Manipulationsmöglichkeiten über die "Transformations". Da muss man mal kreativ werden und rumspielen 😁

                                Oder Du postest hier mal Dein JSON (in Code-Tags </>).

                                S 1 Reply Last reply Reply Quote 0
                                • S
                                  stefu87_CH @Codierknecht last edited by

                                  @codierknecht
                                  Also habe diesen Code so von einer Internetseite kopiert gehabt vor längere Zeit.

                                  const idVerbrauch = '0_userdata.0.Wohnungsverbrauch.Tagesverbrauch_kwh'; // ID zuweisen!
                                  
                                  const idTable = '0_userdata.0.Wohnungsverbrauch.TagesverbrauchTest'; // ID anpassen!
                                  
                                   schedule('59 23 * * *', function() {
                                  
                                      var arr = [];
                                  
                                      if(getState(idTable).val) arr = JSON.parse(getState(idTable).val);
                                  
                                      const obj = {
                                  
                                          Datum: formatDate(new Date(), 'W, DD.MM.YYYY'),
                                  
                                          Verbrauch: getState(idVerbrauch).val.toFixed(3)
                                  
                                      }
                                  
                                      arr.push(obj);
                                  
                                      if(arr.length > 23) arr.shift(); // max. 23 Zeilen
                                  
                                      setState(idTable, JSON.stringify(arr), true);
                                  
                                  });
                                  
                                  
                                  
                                  Codierknecht 1 Reply Last reply Reply Quote 0
                                  • Codierknecht
                                    Codierknecht Developer Most Active @stefu87_CH last edited by

                                    @stefu87_ch
                                    Der schreibt Dir jeden Abend einen neuen Eintrag in ein JSON-Array.
                                    Über die Sinnhaftigkeit von sowas mag man streiten. Dafür gibt's diverse History-Adapter (SQL, Influx, History).

                                    Das JS umzuschreiben könnte auch schwierig werden, da der Aufbau ja komplett anders aussehen muss und die Werte der Vergangenheit dann erstmal weg sind (es sei denn, man treibt da noch Zusatzaufwand).

                                    Versuch's mal hiermit. Ist allerdings nur so dahingeschrieben und ungetestet.

                                    const idVerbrauch = '0_userdata.0.Wohnungsverbrauch.Tagesverbrauch_kwh'; // ID zuweisen!
                                    const idTable = '0_userdata.0.Wohnungsverbrauch.TagesverbrauchTest'; // ID anpassen!
                                    const idGrafana = '0_userdata.0.Wohnungsverbrauch.TagesverbrauchGrafana';
                                     
                                    schedule('59 23 * * *', function() {
                                        var arr = [];
                                    
                                        if (getState(idTable).val) arr = JSON.parse(getState(idTable).val);
                                     
                                        const obj = {
                                            Datum: formatDate(new Date(), 'W, DD.MM.YYYY'),
                                            Verbrauch: getState(idVerbrauch).val.toFixed(3)
                                        }
                                     
                                        arr.push(obj);
                                     
                                        if(arr.length > 23) arr.shift(); // max. 23 Zeilen
                                     
                                        setState(idTable, JSON.stringify(arr), true);
                                        
                                        let values = {};
                                        for (const item of arr) {
                                          values[item.Datum] = parseFloat(item.Verbrauch);
                                        }
                                        setState(idGrafana, JSON.stringify(values), true);
                                        
                                    });
                                    
                                    S 1 Reply Last reply Reply Quote 0
                                    • S
                                      stefu87_CH @Codierknecht last edited by

                                      @codierknecht sagte in JSON in Grafana einbinden:

                                      '0_userdata.0.Wohnungsverbrauch.TagesverbrauchGrafana

                                      Muss ich diesen noch selber anlegen, oder passiert das dann automatisch?

                                      Codierknecht 1 Reply Last reply Reply Quote 0
                                      • Codierknecht
                                        Codierknecht Developer Most Active @stefu87_CH last edited by

                                        @stefu87_ch sagte in JSON in Grafana einbinden:

                                        Muss ich diesen noch selber anlegen, oder passiert das dann automatisch?

                                        Den musst Du selbst anlegen. Typ "Text/String".

                                        S 1 Reply Last reply Reply Quote 0
                                        • S
                                          stefu87_CH @Codierknecht last edited by

                                          @codierknecht Ok werde es mal testen und schauen ob heute Nacht etwas passiert.

                                          Wie würdest du den das umsetzen ohne die JSON Tabelle, sondern eben mit z.B. Influx das er immer um 23:59 den Wert speichert samt Datum?

                                          Codierknecht 1 Reply Last reply Reply Quote 0
                                          • Codierknecht
                                            Codierknecht Developer Most Active @stefu87_CH last edited by

                                            @stefu87_ch sagte in JSON in Grafana einbinden:

                                            Wie würdest du den das umsetzen ohne die JSON Tabelle, sondern eben mit z.B. Influx das er immer um 23:59 den Wert speichert samt Datum?

                                            Ich habe dafür einen eigenen DP für den Tagesverbrauch. Der wird per SQL historisiert.
                                            In den DP wird per Script um 23:59:45 Uhr der Wert reingeschrieben. So habe ich die Werte mit passendem Datum in der DB. Damit lassen sich dann ohne viel Aufwand auch Monats- oder Jahresverbräuche bestimmen.

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

                                            Support us

                                            ioBroker
                                            Community Adapters
                                            Donate

                                            759
                                            Online

                                            31.6k
                                            Users

                                            79.5k
                                            Topics

                                            1.3m
                                            Posts

                                            2
                                            39
                                            995
                                            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