Influx - Bei Abfrage leere Werte ignorieren

  • Hallo,


    nachdem meine Influx-Datenbank von der Solaranlage schon gefüllt wird, wollte ich die Leistung, die diese Solaranlage liefert, ausrechnen und eine schöne Kurve malen, die auf meine Webseite soll.

    Dabei ist mir aufgefallen, dass einige Werte leer sind. Und das kann an natürlich schlecht darstellen.

    select median(time), median(value) from apower where time >= '2022-09-20' GROUP BY time(1m)

    liefert zum Beispiel:

    Code
    2022-09-20T14:43:00Z        292.4
    2022-09-20T14:44:00Z        287.4
    2022-09-20T14:45:00Z
    2022-09-20T14:46:00Z        293
    2022-09-20T14:47:00Z        301.3
    2022-09-20T14:48:00Z        287.45

    Der Wert in der Spalte "Value", der zu "2022-09-20T14:45:00Z" ausgegeben wird, sollte also ignoriert werden. Doch wie bekommt man das bei der Kommandozeilenversion für die Influx-Datenbank hin?


    Wenn ich die Datenbank von einem anderen System abfrage, bekomme ich für diese Fälle in der JSON-Datei den Inhalt 'null', das also zu filtern, bevor es dort landet, wäre nicht ganz unpraktisch.

    Abfrage:

    curl -G 'http://influx-system.local:8086/query?pretty=true' --data-urlencode "db=Solardaten" --data-urlencode "q=SELECT median(time), median(value) from apower where time >= '2022-09-20' GROUP BY time(1m)" --output test.txt


    -----

    Das es keine Abfragemöglichkeit auf der Kommandozeile nach 'today' gibt ist ..... nicht so schön.

    Computer ..... grrrrrr

    Edited once, last by Rasp-Berlin ().

  • Habe keine Ahnung von Influx, aber kann man da nicht auch logische Operatoren verwenden um nach mehreren Suchworten zu filtern wie z.B.

    Code
    select median(time), median(value) from apower where time >= '2022-09-20' and value != '' GROUP BY time(1m)

    oder sowas? :conf:


    Vergessen... Kann aber auch sein, dass die Spalte nicht leer, sondern NULL ist, das hängt davon ab, wie die Tabelle strukturiert ist.

  • Es heißt, das es im Influx keine Werte gibt, die 'null' seinen....

    Wenn ich die von dir angegeben Zeile aufrufe, bekomme ich keine Ausgabe, lasse ich das "and value != ''" weg, kommt wieder alles, aber eben auch die leeren Werte.

    Blöde Datenbank-Abfragesprache ;)


    Sehr lustig ist es, wenn ich das in die 'curl-Abfrage' packe, denn dann bekomme ich einige Werte, die ich aber nicht gebrauchen kann, den hier ist der Value '0', da die Werte von 00:00 Uhr bis 00:08 Uhr sind. Da scheint hier normalerweise keine Sonne ;) Also für meine Zweck nicht brauchbar.

    Computer ..... grrrrrr

  • Interessant, die Influx-Datenbank liefert, wenn man die Datenbank-Abfrage in eine Datei umleiten will, normalerweise eins JSON-Datei. Die kann man nicht ganz so einfach in eine CSV-Datei umwandeln, weil deren Aufbau anders ist.

    Wie man oben in dem Code der exportierten Datenbank sieht, gibt es einen Bereich, der die Zeilen beschreibt und dann die Bereiche, in denen einfach die Daten stehen, eben ohne den Namen des Feldes.

    und die Programme/Skripte, dei aus JSON CSV machen, mögen das nicht so.


    Doch es gibt einen Parameter für den Export der Datenbank-Abfrage in eine CSV-Datei:

    curl -G 'http://influx-system.local:8086/query?pretty=true' --data-urlencode "db=Solardaten" --data-urlencode "q=SELECT median(time), median(value) from apower where time >= '2022-09-20' GROUP BY time(1m)" -H "Accept: application/csv" --output test.csv

    -H "Accept: application/csv" ist das 'Zauberwort ;)

    Dann sieht das Ergebnis so aus:

    Leider funktioniert hier der Format-Befehl "precision 'rfc3339'" nicht, der die Zeitausgabe auf ein lesbares Datum umstellt, nicht.

    Das normale Zeitformat mit dem 'precision' sieht so aus:

    Computer ..... grrrrrr

  • Die kann man nicht ganz so einfach in eine CSV-Datei umwandeln, weil deren Aufbau anders ist.

    Du kannst es ja Mal versuchen.

    Ungetestet und mit dem Telefon zusammen gestückelt.


    Path und File in with open musst du ersetzen.

    Nicht vergessen:

    Code
    Import csv 
  • Wie ich ja geschrieben habe, die Tools und Programme, die JSON in CSV verwandeln, kommen mit dem Datenaufbau von Influx wohl nicht zurecht.

    Der obere teil ist der Aufbau der JSON-Datei vom Influx, der untere der, mit dem die Tools zurecktkommen:

    Doch da es ja den Export-Parameter gibt, werde ich den wohl nehmen. Für das 'lange' Zeitformat werde ich mich, da ich das dann wohl mit PHP weiterverwurste, mit 'microtime()' anfreunden müssen ;)

    Computer ..... grrrrrr

  • Evtl mit fill (none)?

    Jepp ;)

    Code
    datum=`date +%Y-%m-%d`
    curl -G 'http://influx-system.local:8086/query?pretty=true' --data-urlencode "db=Solardaten" --data-urlencode "q=SELECT median(time), median(value) from apower where time >= '${datum}' GROUP BY time(1m) fill(none)" -H "Accept: application/csv"|gawk 'BEGIN { OFS=FS="," } { $3 = substr($3,1,10); print $3,$5; }' >  test.csv

    trennt die Nullen vom Unix-Timestamp ab, so dass man das zum Beispiel mit "date -d @${erste_Spalte}" in eine Datum/Zeit verwandeln kann.

    Computer ..... grrrrrr

    Edited 2 times, last by Rasp-Berlin ().