Navigation

    Logo
    • Register
    • Login
    • Search
    • Recent
    • Tags
    • Unread
    • Categories
    • Unreplied
    • Popular
    • GitHub
    • Docu
    • Hilfe
    1. Home
    2. Deutsch
    3. Praktische Anwendungen (Showcase)
    4. Grafana-Abfragen von iobroker MySQL

    NEWS

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

    • ioBroker goes Matter ... Matter Adapter in Stable

    • Monatsrückblick - April 2025

    Grafana-Abfragen von iobroker MySQL

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

      Hallo,

      ich habe nochmal eine SQL-lastige Frage:

      Wenn ich einen Verbrauchswert habe, der nur einmal am Tag geschrieben (erhöht) wird:

      Wie bekomme ich mit SQL diese Differenz raus (also die Differenz zwischen dem aktuellen und dem gestrigen Wert?

      Dank eurer Hilfe habe ich diese Abfrage, die mir eine Tabelle füllt - aber leider immer nur mit 0, weil ja nur ein Wert geschrieben wird, also die Different zwischen min und max 0 ist.

      SELECT CONCAT(MONTH(FROM_UNIXTIME(substring(ts,1,10))),'-', DAY(FROM_UNIXTIME(substring(ts,1,10)))) 
      AS Tag, round(max(val)-min(val),0) AS Solarpumpe 
      FROM iobroker.ts_number 
      WHERE  id=(SELECT id FROM iobroker.datapoints WHERE name="viessmann.0.get.VitoLaufzeitSolar") 
      AND FROM_UNIXTIME(substring(ts,1,10)) BETWEEN DATE_SUB(CURRENT_DATE(),INTERVAL 14 day) 
      AND CURRENT_DATE() 
      GROUP BY MONTH(FROM_UNIXTIME(substring(ts,1,10))),DAY(FROM_UNIXTIME(substring(ts,1,10))) 
      ORDER BY MONTH(FROM_UNIXTIME(substring(ts,1,10))) , DAY(FROM_UNIXTIME(substring(ts,1,10)))
      
      1 Reply Last reply Reply Quote 0
      • sissiwup
        sissiwup last edited by

        @piForscher:

        Hallo,

        ich habe nochmal eine SQL-lastige Frage:

        Wenn ich einen Verbrauchswert habe, der nur einmal am Tag geschrieben (erhöht) wird:

        Wie bekomme ich mit SQL diese Differenz raus (also die Differenz zwischen dem aktuellen und dem gestrigen Wert?

        Dank eurer Hilfe habe ich diese Abfrage, die mir eine Tabelle füllt - aber leider immer nur mit 0, weil ja nur ein Wert geschrieben wird, also die Different zwischen min und max 0 ist.

        SELECT CONCAT(MONTH(FROM_UNIXTIME(substring(ts,1,10))),'-', DAY(FROM_UNIXTIME(substring(ts,1,10)))) 
        AS Tag, round(max(val)-min(val),0) AS Solarpumpe 
        FROM iobroker.ts_number 
        WHERE  id=(SELECT id FROM iobroker.datapoints WHERE name="viessmann.0.get.VitoLaufzeitSolar") 
        AND FROM_UNIXTIME(substring(ts,1,10)) BETWEEN DATE_SUB(CURRENT_DATE(),INTERVAL 14 day) 
        AND CURRENT_DATE() 
        GROUP BY MONTH(FROM_UNIXTIME(substring(ts,1,10))),DAY(FROM_UNIXTIME(substring(ts,1,10))) 
        ORDER BY MONTH(FROM_UNIXTIME(substring(ts,1,10))) , DAY(FROM_UNIXTIME(substring(ts,1,10)))
        ```` `  
        

        Hmmm. Das geht bei der Datenfülle in den Tabellen nicht auf den üblichen Wegen

        (left join mit sich selbst mit dem max(datum) < aktuelle Zeile-Datum)

        (so ähnlich wie unten / ungetestet!!!)

        SELECT
            t1.ID,
            t1.val,
            t1.ts,
            t1.val - IFNULL(t2.val, 0) AS diff_val   
        FROM
            ts_number t1
            LEFT JOIN ts_number t2
                ON t2.ts = (
                    SELECT MAX(ts)
                    FROM ts_number t3
                    WHERE t3.ts < t1.ts and t3.id=t1.id
                )
            WHERE T1.ID='865'
        ORDER BY t1.ts
        

        Ich würde es mit folgenden probieren:

        SET @OVAL=0;
        SELECT *,t.val,t.val-@OVAL,@oval := t.val FROM `ts_number` t where id = 865 order by ts limit 20
        
        

        id ist der Datenpunkt (SELECT id FROM iobroker.datapoints WHERE name="viessmann.0.get.VitoLaufzeitSolar")

        Er rechnet einfach die aktuelle Zeile minus die letzte.

        Where musst du natürlich anpassen. Limit ist nur für schnelleres Testen.

        W 1 Reply Last reply Reply Quote 0
        • M
          Mitch last edited by

          Hi,

          ich lasse mir über einen Graphen immer den Tagesverbrauch angeben:

          SELECT
            floor(n.ts/1000) as time_sec,
            n.val as value,
            d.name as metric
          FROM ts_number n,datapoints d
          WHERE $__unixEpochFrom()*1000<n.ts and/$__unixepochto()*1000="">n.ts and n.id = 8 and n.id=d.id
          ORDER BY n.ts ASC</n.ts>
          

          Allerdings ist das immer der Wert von gestern, der geloggt wird. Wie kann ich jetzt immer einen Tag oben im SQL-Statement abziehen, damit der Tag wieder stimmt?

          1 Reply Last reply Reply Quote 0
          • Dutchman
            Dutchman Developer Most Active Administrators last edited by

            Brauchst du nicht, in Grafana hast du Time-Shift in den grafiek Optionen

            Sent from my iPhone using Tapatalk

            1 Reply Last reply Reply Quote 0
            • M
              Mitch last edited by

              @Dutchman:

              Brauchst du nicht, in Grafana hast du Time-Shift in den grafiek Optionen

              Sent from my iPhone using Tapatalk `

              Das verschiebt nur die Anzeige, aber die Werte bleiben an den falschen Tagen, also + 1

              1 Reply Last reply Reply Quote 0
              • andre
                andre Developer last edited by

                Hallo,
                ich mache gerade meine ersten Schritte in Grafana und stehe noch ein wenig mit der SQL-Syntax auf Kriegsfuß. Besser gesagt bekomme ich meinen Graphen nicht "smooth"...
                Im Detail geht es um meine PV-Leistung. Ich habe aktuell diese Abfrage:

                SELECT
                  floor(ts/1000) as time_sec,
                  val as value,
                  "PV-Leistung" as metric
                FROM ts_number
                WHERE $__unixEpochFrom()*1000 < ts and $__unixEpochTo()*1000 > ts and id = 2
                ORDER BY ts
                
                

                Funktioniert soweit tadellos. 🙂 Jetzt versuche ich seit Tagen übers zusammen-googlen mit MEAN bzw. AVG und GROUP BY meine Abfrage zu tunen. Zum einen in Hinblick auf kleinere Datenmengen bei der Abfrage, zum Anderen für eine "smoothe" Grafik...
                Hat vielleicht jemand ein Beispiel dazu, welches ich mit meinen SQL-Grundkenntnissen auch verstehen kann? Oder wie müsste meine Abfrage erweitert werden, wenn ich z.B. aus den Werten von jeweils 5 Minuten einen Mittelwert bilden möchte?

                Danke.

                MfG,
                André

                1 Reply Last reply Reply Quote 0
                • D
                  Denis103 last edited by

                  Ich mache grad meine ersten Gehversuche mit Garfana und einer mySQL-DB als Datenquelle. Als Beispiel habe ich hier aus dem Thread meine Test-Abfrage adaptiert:

                  SELECT
                    floor(nb.ts/1000) AS time_sec,
                    nb.val AS value,
                    dp.name AS metric
                  FROM ts_number AS nb, datapoints AS dp
                  WHERE $__unixEpochFrom()*1000 < nb.ts AND $__unixEpochTo()*1000 > nb.ts AND nb.id = 3 AND nb.id = dp.id
                  ORDER BY nb.ts ASC
                  

                  Beim ausführen der Abfrage erhalte ich in PHPMYADMIN folgenden Fehler:

                  #1305 - FUNCTION iobroker.$__unixEpochFrom does not exist 
                  

                  Füge ich das Query in Grafana ein, dann kommt da kein Fehler, aber der Graph zeigt auch keine Daten an.

                  Stimmt etwas mit meiner mySQL-Syntax nicht?

                  simatec 1 Reply Last reply Reply Quote 0
                  • simatec
                    simatec Developer Most Active @Denis103 last edited by simatec

                    Ich muss das Thema hier noch einmal aufwärmen. Ich bin gerade dabei bei mir auf Grafana umzustellen und hänge an folgenden Punkt.
                    Ich möchte gerne eine Graph erstellen, in dem ich meinen Tagesverbrauch an Strom darstellen kann.
                    Mein Stromzähler werte ich aus und alle Daten werden bei mir in die mysql Datenbank geschrieben.

                    Wie bekomme ich diese Graph hin, in der mir Tageweise der Verbrauch angezeigt wird?

                    Hier ein Beispiel, wie ich mir das gerne bauen will:
                    Bildschirmfoto 2020-11-15 um 15.47.43.png

                    Meine Datenpunkt in mysql lese ich wie folgt aus:

                    SELECT
                    floor(n.ts/1000) as time_sec,
                    n.val as value,
                    "Tagesverbrauch" as metric
                    FROM ts_number n
                    WHERE $__unixEpochFrom()*1000<n.ts and $__unixEpochTo()*1000>n.ts and n.id = 18
                    GROUP BY $__unixEpochGroup(n.ts,$__interval,previous)
                    ORDER BY n.ts ASC
                    
                    Segway 1 Reply Last reply Reply Quote 0
                    • Segway
                      Segway @simatec last edited by

                      @simatec

                      Hallo Ich sowas bei mir laufen. Hier die tägliche PV Produktion - fest eingestellt auf die letzten 2 Wochen:
                      ce04fd4d-7882-47cf-83c1-2ff60c4db431-grafik.png

                      Das ganze per InfluxDB und Grafana:
                      f296e975-f988-4cce-b914-b72d3ff60450-grafik.png

                      simatec 1 Reply Last reply Reply Quote 0
                      • simatec
                        simatec Developer Most Active @Segway last edited by

                        @Segway
                        Ich habe inzwischen auch auf Influx gewechselt und meine Log Daten von mysql auf Influx portiert.

                        Segway 1 Reply Last reply Reply Quote 0
                        • Segway
                          Segway @simatec last edited by

                          @simatec
                          Läuft es denn dann ?

                          simatec 1 Reply Last reply Reply Quote 0
                          • simatec
                            simatec Developer Most Active @Segway last edited by

                            @Segway
                            Ja mit Influx lässt sich das einfacher in Grafana umsetzen

                            1 Reply Last reply Reply Quote 0
                            • W
                              WernerS @sissiwup last edited by

                              @sissiwup

                              Hallo

                              also das funktioniert bei mir. Ich benutze Mysql und MariaDB.

                              SELECT
                                floor(nb.ts/1000) AS time_sec,
                              
                                nb.val AS value,
                                dp.name AS metric
                              FROM ts_number AS nb, datapoints AS dp
                              WHERE $__unixEpochFrom()*1000 < nb.ts AND $__unixEpochTo()*1000 > nb.ts AND nb.id = 36 AND nb.id = dp.id
                              ORDER BY nb.ts ASC
                              

                              Ich bekomme manchmal den Fehler "Data is missing a Time Field" obwohl daten vorhanden sind

                              Gruß
                              Werner

                              Benjamin Häublein 1 Reply Last reply Reply Quote 0
                              • Benjamin Häublein
                                Benjamin Häublein Developer @WernerS last edited by

                                @werners Ich habe es jetzt folgendermaßen gelöst:

                                SELECT val AS value, ts AS "time" FROM iobroker.ts_number WHERE id = 12 AND $__unixEpochFilter(ts/1000)
                                

                                Das scheint mir das einfachste zu sein.

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

                                Support us

                                ioBroker
                                Community Adapters
                                Donate

                                532
                                Online

                                31.6k
                                Users

                                79.6k
                                Topics

                                1.3m
                                Posts

                                12
                                37
                                14531
                                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