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

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

    • 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.
    • 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
                                          • S
                                            stefu87_CH @Codierknecht last edited by

                                            @codierknecht
                                            Also für den Tagesverbauch habe ich auch einen Datenpunkt der alle 15min aktualisiert wird. Und um 23:59 schreibt eben der gezeigte Code dann dies in die JSON Tabelle.

                                            Könnte ich den mit dem bestehen Datenpunkt sowas weiter verarbeiten so wie du das machst?

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

                                            Support us

                                            ioBroker
                                            Community Adapters
                                            Donate

                                            916
                                            Online

                                            31.7k
                                            Users

                                            79.7k
                                            Topics

                                            1.3m
                                            Posts

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