Navigation

    Logo
    • Register
    • Login
    • Search
    • Recent
    • Tags
    • Unread
    • Categories
    • Unreplied
    • Popular
    • GitHub
    • Docu
    • Hilfe
    1. Home
    2. Deutsch
    3. ioBroker Allgemein
    4. SQL-Protokollierung abfragen

    NEWS

    • Wir empfehlen: Node.js 22.x

    • Neuer Blog: Fotos und Eindrücke aus Solingen

    • ioBroker goes Matter ... Matter Adapter in Stable

    SQL-Protokollierung abfragen

    This topic has been deleted. Only users with topic management privileges can see it.
    • Codierknecht
      Codierknecht Developer Most Active last edited by

      Vielleicht will er ja sowas erreichen?
      Meine Glaskugel ist leider auch etwas eingetrübt.

      6f26e9dd-39cb-46bc-ae73-96e346834cbe-image.png

      1 Reply Last reply Reply Quote 1
      • OliverIO
        OliverIO @Smilie108 last edited by OliverIO

        @smilie108

        also eigentlich ist es nicht so schwer.
        hier ein beispiel mit allen wahlmöglichkeiten für numerische datenpunkte

        SELECT dp.name,data.val, data.ts
        FROM `datapoints` as dp, ts_number as data 
        WHERE 
           dp.id=data.id and 
           data.ts>=1672527600000 and 
           data.ts < 1704063540000 and 
           dp.name in 
              (
                 "javascript.0.test.test1",
                 "javascript.0.test.test2"
              )
        

        Zeile 2 werden alle Tabellen ausgewählt, aus denen du daten einsammeln willst. hier ist jede tabelle noch mit einem alias versehen, das man nicht den kompletten namen mit angeben muss
        Zeile 1: hier werden alle Felder aufgezählt, die nachher als Daten zurückgegeben werden sollen
        ab Zeile 3 wird, ganz wichtig der constraint, also abhängigkeit zwischen den beiden Tabellen abgebildet. Ansonsten erhälst du ein kartesisches Produkt beider Tabellen. Das heißt jeder Datenasatz aus der einen Tabelle wird mit jedem Datensatz aus der anderen Tabelle kombiniert. bei jeweils 100 Datensätzen in beiden Tabellen kommen dann schon mal 100*100 Ergebniszeilen heraus. Das macht dein Server wahrscheinlich Memory-technisch nicht mit und macht auch kein Sinn.
        daher dp.id=data.id
        die bedingung auf den zeitstempel muss ich glaube ich nicht erklären
        bei der wahl von ein oder mehreren datenpunkten, kann man den IN operator nehmen. da kann man dann bequem alle aufzählen ohne zuviel zu wiederholen

        der timestamp kannst du am besten so berechnen

        new Date("2023-12-31#23:59:00").getTime()
        

        theoretisch geht es auch mehrere sql-statements in einem ergebnis zurückzugeben. bspw wenn du von ts_number und von ts_bool zurückgeben willst, das würde dann über ein UNION operator gehen, dann muss man sich aber auch um die konvertierung von val kümmern.
        daher ist das eigentlich nicht notwendig
        https://www.w3schools.com/sql/sql_union.asp

        das obige sql statement geht auch noch mit einem join, aber dir reicht glaube ich eine notation vollkommen aus.

        Smilie108 Codierknecht 2 Replies Last reply Reply Quote 0
        • Smilie108
          Smilie108 @OliverIO last edited by

          @oliverio @Codierknecht Codierknecht hatte recht und auch @dp20eic das eine für die graphik in grafana denn wenn man mal 10 sensoren hat kann man 20 bis 30 abfragen nehmen je nach anzahl der werte. was etwas mühselig ist. Das andere ist im vis eine kleine Tabelle die die aktuellen temperaturen anzeigen soll. 😉
          Und naja arbeite schn sehre lange mit mysql da mache ich tabellen anders als es diese influx geschichte macht das ist zu unübersichtlich für meinen geschmack 😉 aber jeder mag es anderes und das ist gut so 😉

          Danke auf alle fälle an alle 😉 DANKE

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

            @smilie108 sagte in SQL-Protokollierung abfragen:

            als es diese influx geschichte macht

            Was denn jetzt? SQL oder Influx?

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

              @oliverio

              das obige sql statement geht auch noch mit einem join, aber dir reicht glaube ich eine notation vollkommen aus.

              Geschmacksache. Ich persönlich finde Joins deutlich besser lesbar.

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

                @codierknecht naja er schreibt die datenpunkte in sql gleich rein als in influx und mit influx werde ich einfach nicht warm sorry 😉 Geschmacksache
                Allerdings ist es recht fein wenn man bei den Objekten die Protokolierung einfach aktivieren kann die meisten werte die ich allerdings habe kommen über nod red da ich das shon hatte bevor ich iobroker kannte.
                Alles neu machen alleine schon von den berechnungen ist mir zu aufwändig außerdem hängt am nod red eine 1500er von Siemens für die ganzen modbus usw geschichten ( Wechselrichter, Wärmepumpe, usw.. )
                Von Nodred in iobroker übertrage ich die Daten die ich brauche für vis2.
                Naja inzwischen komme ich immer mehr in den iobroker rein und es erschließen sich da noch andere möglichkeiten.
                Da aber ein PC nie sicher vor ausfällen lasse ich das meiste in der SPS laufen da ich erstens die sehr gut programieren kann und zweitens dort keine daten verliere.
                Die brauchen normalerweise nie einen neustart 😉
                Im gegensatz zu allen pc sachen die irgendwann wegen irgendwelcher Updates oder sonstigen Sachen einen neustart brauchen und dann hoffentlich wieder starten wenn nicht wieder irgendwas querschießt.
                Bei mysql baue ich halt normalerweise die datenbancken anders auf 😉

                Aber danke muss ich jetzt mal austesten wie das so geht 😉
                Danke an all eure hinweise

                Apropos zur Hardware der sollte das alles schlucken ist ein Lenovo Thinkcenter mit 32gb ram und Intel Gold proz mit nvme und ssd Platte 😉

                Hoffe ich habe die meisten fehler ausgebessert und es ist leichter Lesbar 😉

                Codierknecht 2 Replies Last reply Reply Quote 0
                • Codierknecht
                  Codierknecht Developer Most Active @Smilie108 last edited by

                  @smilie108
                  Mit Interpunktion und Groß-/Kleinschreibung könnte man den Text sogar sinnverstehend lesen 😞

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

                    @smilie108
                    Mit Influx werde auch ich nicht warm. SQL ist halt mein täglich Brot.
                    Ich war nur verwirrt, weil Du plötzlich Influx ins Soiel gebracht hast.

                    Die Tabellen sind schon OK aufgebaut. Die sind halt normalisiert.

                    Ich würde das SQL eher mit JOIN aufbauen

                    SELECT dp.name, data.val, data.ts
                      FROM datapoints AS dp
                     INNER JOIN ts_number AS data ON data.id = dp.id 
                     WHERE data.ts >= 1672527600000
                       AND data.ts < 1704063540000 
                       AND dp.name IN ('javascript.0.test.test1', 'javascript.0.test.test2')
                    

                    Hier mal gleich mit der in meinem Team vorgegebenen Einrückung.

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

                      @codierknecht Mhm gibt es eigentlich da auch eine möglichkeit den einzelnen id´s andere Namen zuzuweisen.
                      In meinem fall ist der Name zb "zigbee.0.00158d0009ef1902.temperature" wäre einfach lesbarer wenn ich da zb Temperatur Wohnzimmer draus machen könnte.
                      Beim ts geht das ja noch wenn ich in Zeile 1 bei data.ts ein as time mache aber bei den einzelen id´s steig ich aus. 🙄

                      Im moment mache ich das so
                      SELECT ts as time, val as Luftdruck Küche FROM iobroker1.ts_number WHERE id = 58 and ts between ${__from} and ${__to} ORDER BY ts DESC LIMIT 10000
                      Dann bekomme ich in grafana die richtigen arrays.
                      Normalerweise habe ich pro ts die kompletten Werte für diesen Zeitpunkt und lese sie so aus
                      SELECT * FROM Azzurro1.Warmepumpe1 where time between $__timeFrom() and $__timeTo() ORDER BY ID DESC LIMIT 10000

                      Dann bekomme ich ein array für die Variabeln und ein für jede Variabel ein array mit den Werten.
                      Wenn ich die Abfragen verwende die ich von euch bekommen habe bekomme ich 3 arrays mit den bezeichnungen val ts und name.

                      Brauche aber für jeden ts die zb 2 werte dazu.

                      Hoffe ich habe das jetzt richtig geschrieben oder geht das dann nur über einzelabfragen.

                      Danke das ihr euer wissen teilt 😉 Stehe da komplett vor einer Wand.

                      MFg smilie108

                      Danke im voraus

                      OliverIO B Codierknecht 3 Replies Last reply Reply Quote 0
                      • OliverIO
                        OliverIO @Smilie108 last edited by

                        @smilie108
                        Es ist halt eine technische Abfrage
                        Wie du es darstellst ist ja wieder was anderes.

                        Wenn man will könnte man in der Datenbank noch eine mappingtabelle
                        Name zu datenpunkt
                        Oder name zu id
                        Hinzufügen
                        Und das dann in den Ergebnissen ausgeben lassen.

                        1 Reply Last reply Reply Quote 0
                        • B
                          Blockmove @Smilie108 last edited by

                          @smilie108 said in SQL-Protokollierung abfragen:

                          @codierknecht Mhm gibt es eigentlich da auch eine möglichkeit den einzelnen id´s andere Namen zuzuweisen.
                          In meinem fall ist der Name zb "zigbee.0.00158d0009ef1902.temperature" wäre einfach lesbarer wenn ich da zb Temperatur Wohnzimmer draus machen könnte.
                          Beim ts geht das ja noch wenn ich in Zeile 1 bei data.ts ein as time mache aber bei den einzelen id´s steig ich aus. 🙄
                          Danke im voraus

                          Ich nutze da einfach einen Alias. Da kannst du den Datenpunkt frei benennen und bist unabhängig von irgendwelcher Hardware. Du kannst - wenn ich’s recht weiß - im SQL-Adapter einen eigenen Namen vergeben

                          Smilie108 1 Reply Last reply Reply Quote 0
                          • Smilie108
                            Smilie108 @Blockmove last edited by

                            @blockmove Ja das ist schon Richtig. das geht in Grafana.
                            Aber wenn ich dann das Ergebniss in einer Tabelle im vis möchte zb die lezten 10 werte oder so für den eine Verlaufs Anzeige dann geht das so wieder nicht.
                            Eigentlich müsste das Ergebniss dan ts| Name Var1| wert var 1| Name var 2 | wert var2 usw. aussehen.

                            Wenn ich zb.
                            SELECT time as time, Aktueller_Energieverbrauch_in_W as Strom, Wärmeleistung as Wärme, ROUND((Wärmeleistung/Aktueller_Energieverbrauch_in_W),2) as Leistungsfaktor FROM Warmepumpe1 where time between $__timeFrom() and $__timeTo() ORDER BY ID DESC LIMIT 1000;
                            das verwende kann ich es ganz normal als Tabelle verwenden.
                            So geht es allerdings nicht mit den werten aus der Sql Objekt Sicherung.

                            😉

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

                              @smilie108
                              Vielleicht in der Art:

                              SELECT * FROM (
                                  SELECT ts as time, val as Luftdruck_Kueche 
                                    FROM iobroker1.ts_number
                                   WHERE id = 58 
                                     AND ts BETWEEN ${__from} AND ${__to} 
                                UNION
                                  SELECT ts as time, val as Temperatur_Kueche 
                                    FROM iobroker1.ts_number
                                   WHERE id = 59 
                                     AND ts BETWEEN ${__from} AND ${__to} 
                                UNION
                                  SELECT ts as time, val as Blubb 
                                    FROM iobroker1.ts_number
                                   WHERE id = 42 
                                     AND ts BETWEEN ${__from} AND ${__to} 
                              )
                              ORDER BY ts DESC LIMIT 10000
                              

                              Keine Leerzeichen und/oder Umlaute in Variablen oder Feldnamen!

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

                                @codierknecht Mhm da bekomme ich die Meldung

                                MySQL meldet: Dokumentation
                                #1248 - Für jede abgeleitete Tabelle muss ein eigener Alias angegeben werden

                                Das mit UNION hatte ich schon probiert aber egal wie ich das auch aus der Doku übernommen hatte ging es nicht.
                                Deswegen dachte ich ja ich frage hier mal wo ihr an dem Adapter arbeitet und sicher das ein oder andere Problem schon gelöst bekommen habt.

                                wenn ich zb

                                SELECT * FROM PVTageswerte WHERE id=3788;

                                code_text
                                ```ID 	time 	PV Erzeugt Aktueller Tag 	Verbrauch am Ausgang Aktueller Tag 	Gekaufte Energie Aktueller Tag 	Energie Eingespeist Aktueller Tag 	Batterie Laden Aktueller Tag 	Batterie Entladen Aktueller Tag 	Autark 	
                                3788	2023-10-19 23:59:45	16.06	14.18	9.77	10.28	0.04	0	31.29395218002813	12.464	18	
                                

                                mache dann bekomme ich die werte von dem tag als Zeile mit den Überschriften der Spalten .
                                Und ich war eigentlich der Meinung das sowas eigentlich nicht so schwer sein kann.

                                Wenn das nicht geht muss ich halt wieder alle werte per eigenem Skript wieder in eine verarbeitbare form in die Datenbank schreiben und kann nicht einfach den haken setzen. 😉

                                F 1 Reply Last reply Reply Quote 0
                                • F
                                  fastfoot @Smilie108 last edited by

                                  @smilie108 wenn du immer die gleichen Werte(ids) abfrägst dann kannst du das Ergebnis so pivotieren. Die ts und ids und Spaltennamen und die Instanz im sendTo() musst du natürlich anpassen, die sind meinen Testdaten und meiner Faulheit geschuldet. Getestet mit Mariadb sollte aber mit MySQL auch so laufen

                                  const query = `
                                  SELECT ts,
                                   nullif (sum(case when id = 1000 then val ELSE 0 END),0) AS id1,
                                   nullif(sum(case when id = 1001 then val ELSE 0 END),0) AS id2,
                                   nullif(sum(case when id = 2646 then val ELSE 0 END),0) AS id3
                                  FROM iobroker.ts_number
                                  WHERE ts BETWEEN 1 AND 30 AND id IN(1000,1001,2646)
                                  GROUP BY ts
                                  -- ORDER BY ts DESC
                                  -- LIMIT 100`
                                  
                                  sendTo("sql.1", "query", query, res => {
                                     log(res.result);
                                     setState('0_userdata.0.test', JSON.stringify(res.result));
                                  })
                                  

                                  Pivot.PNG

                                  Smilie108 1 Reply Last reply Reply Quote 1
                                  • Smilie108
                                    Smilie108 @fastfoot last edited by

                                    @fastfoot Super danke so funkktionieren alle abfragen die ich brauche egal ob für Tabelle ( ja nullwerte muss ich noch filtern ) oder auch in Grafana 😉

                                    😉 😉 😉 😉 Vielen Dank

                                    Jensen 1 Reply Last reply Reply Quote 0
                                    • Jensen
                                      Jensen @Smilie108 last edited by Jensen

                                      sorry, Fehlbeitrag

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

                                      Support us

                                      ioBroker
                                      Community Adapters
                                      Donate
                                      FAQ Cloud / IOT
                                      HowTo: Node.js-Update
                                      HowTo: Backup/Restore
                                      Downloads
                                      BLOG

                                      366
                                      Online

                                      32.0k
                                      Users

                                      80.3k
                                      Topics

                                      1.3m
                                      Posts

                                      9
                                      23
                                      1204
                                      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