Seite 1 von 1

InfluxDB lesen ,letzter Wert

Verfasst: Samstag 30. April 2022, 18:56
von kiaralle
Hallo, ich hätte da wieder ein kleines Problem,

Ich frage gerade eine InfluxDB ab und möchte den Wert aus der Abfrage erhalten. Also nur den Wert, nicht die dazugehörigen Einträge.

Code: Alles auswählen

rs = client.query('SELECT mean(*) from "BatterySOC"  WHERE time >= now() - 10m and time <= now() LIMIT 1') 
points = list(rs.get_points())
print (points)
Ich erhalte:
[{'time': '2022-04-30T17:44:37.621638Z', 'mean_BatterySOC': 35.0}]

Ist meine Idee mit dieser Abfrage Müll oder wo stehe ich hier?

Gruß Ralf

Re: InfluxDB lesen ,letzter Wert

Verfasst: Samstag 30. April 2022, 19:15
von Sirius3
Wo ist Dein Problem? Du erhältst doch den Mittelwert der BatterySOC.

Re: InfluxDB lesen ,letzter Wert

Verfasst: Samstag 30. April 2022, 19:36
von kiaralle
ok, etwas missverständlich ausgedrückt ;-)

ich mochte das nur die 35.0 da steht. Denn damit könnte ich weiter rechnen.

Re: InfluxDB lesen ,letzter Wert

Verfasst: Samstag 30. April 2022, 19:42
von sparrow
Deine Überschrift und dein Code passen nicht zueinander. Möchtest du jetzt den letzten Wert aus der Datenbank oder der Wert, der mittels `mean` ermittelt wurde?

Und das was du zurück bekommst ist offensichtlich eine Datenstruktur. Eine Liste mit einem einzigen Element, das einen Datensatz repräsentiert. Dieses eine Element ist ein dict.
Der Umgang mit Datenstrukturen ist in Python elementare Grundlage. Wie man auf das erste Element einer Liste zugreift und wie man mit einem dict arbeitet, weißt du? Falls nicht, solltest du dir ein entsprechende Grundlagentutorial, zum Beispiel das aus der Dokumentation durchlesen.

Re: InfluxDB lesen ,letzter Wert

Verfasst: Samstag 30. April 2022, 19:49
von __blackjack__
@kiaralle: Wenn man nicht alles haben will, sollte man halt in der Abfrage auch nicht sagen man will alles haben. Denn das bedeutet der "*" ja — alle Spalten. Und es macht hier auch nicht so wirklich Sinn den Mittelwert von Zeitstempeln zu berechnen. Das ``LIMIT 1`` sieht auch abenteuerlich aus. Die Aggregationsfunktion `mean()` sorgt ja schon dafür, dass das Ergebnis nur einen Datensatz hat. Und auch ``time <= now()`` sollte man sich sparen können, denn es wird ja wohl keine Einträge für die Zukunft in der Datenbank geben.

Re: InfluxDB lesen ,letzter Wert

Verfasst: Samstag 30. April 2022, 20:41
von kiaralle
Ja, ok, zu viele copy und paste ist nicht gut.

wenn ich reduziere

Code: Alles auswählen

rs = client.query('SELECT * from "BatterySOC" ') 
erhalte ich die ganze Datenreihe:

.....
{'time': '2022-04-30T19:22:59.063505Z', 'BatterySOC': 34, 'BatterySOC_1': 'Growatt'}, {'time': '2022-04-30T19:23:49.041910Z', 'BatterySOC': 34, 'BatterySOC_1': 'Growatt'}, {'time': '2022-04-30T19:24:39.033493Z', 'BatterySOC': 34, 'BatterySOC_1': 'Growatt'}, {'time': '2022-04-30T19:25:29.095501Z', 'BatterySOC': 34, 'BatterySOC_1': 'Growatt'}
....

Jetzt habe ich mal in der Datenbank nachgeschaut:
fieldKey BatterySOC / integer

Also muss ich irgendwie BatterySOC rausfiltern und übergeben. Als Integer würde reichen.

Den letzten wert müsste ich über ORDER By "Time" als fieldKey , wenn ich richtig liege, und DESC LIMIT 1 finden.
Ich finde allerdings nicht "Time" als fieldKey. Eventuell liegt hier schon mein Problem.

Soweit Richtig?

Code: Alles auswählen

rs = client.query('SELECT * from "BatterySOC" ORDER BY "Time" DESC LIMIT 1') 
points = list(rs.get_points())
Ich bekomme das zurück :-(

Traceback (most recent call last):
File "/home/ralf/pythons/./test.py", line 34, in <module>
rs = client.query('SELECT * from "BatterySOC" ORDER BY Time DESC LIMIT 1')
File "/home/ralf/.local/lib/python3.9/site-packages/influxdb/client.py", line 521, in query
response = self.request(
File "/home/ralf/.local/lib/python3.9/site-packages/influxdb/client.py", line 378, in request
raise InfluxDBClientError(err_msg, response.status_code)
influxdb.exceptions.InfluxDBClientError: 400: {"error":"error parsing query: only ORDER BY time supported at this time"}

Re: InfluxDB lesen ,letzter Wert

Verfasst: Samstag 30. April 2022, 20:45
von kiaralle

Code: Alles auswählen

rs = client.query('SELECT * from "BatterySOC" ORDER BY time DESC LIMIT 1') 
Jetzt funktioniert es mit der Time-Abfrage.

Wie jetzt Weiter ?

[{'time': '2022-04-30T19:43:51.172399Z', 'BatterySOC': 34, 'BatterySOC_1': 'Growatt'}].... etwas zu lang :-)

Re: InfluxDB lesen ,letzter Wert

Verfasst: Samstag 30. April 2022, 21:10
von Sirius3
Jetzt willst Du also plötzlich keinen Mittelwert mehr bilden?
Und es gilt weiterhin das was sparrow geschrieben hatte: Listen und Wörterbücher gehören zu den absoluten Grundlagen von Python und wenn Du die noch nicht beherrschst, dann solltest Du nochmal ein Grundlagentutorial durcharbeiten.

Re: InfluxDB lesen ,letzter Wert

Verfasst: Samstag 30. April 2022, 22:04
von kiaralle
Auf Handbücher zu verweisen ist echt toll und die lese ich auch stückweise.
Nur habe ich gehofft ich erhalte für mein Hobby etwas Hilfe und Tipps auf die ich aufbauen kann.
Man lernt ja am Projekt.
Ich handhabe das jedenfalls in meinem Fachgebiet so.

Re: InfluxDB lesen ,letzter Wert

Verfasst: Samstag 30. April 2022, 22:33
von __blackjack__
@kiaralle: Aber die absoluten Grundlagen, die extra in einem Tutorial aufbereitet sind, sollte man halt schon vorher mal durchgegangen sein. Letztlich würden wir Teile des Tutorials für jeden fragenden Anfänger hier erneut reinkopieren müssen, oder es selbst und dann wahrscheinlich schlechter formulieren. Das ist Arbeit die sich die Python-Entwickler schon mal gemacht haben, und es macht wenig Sinn, das wir die hier jedes mal erneut machen müssen.

Falls Du zu dem Tutorial dann fragen haben solltest, kannst Du die ja dann hier stellen.

Re: InfluxDB lesen ,letzter Wert

Verfasst: Sonntag 1. Mai 2022, 06:34
von kiaralle
die extra in einem Tutorial aufbereitet sind
Würde mich über einen Link freuen.

Ich möchte etwas lernen, nur bräuchte ich da einen Ansatzpunkt.
Mit ließ das 1000Seitige Buch ist wenig Spaß vorprogrammiert. Und im Hobby geht nun mal Spaß vor.
Ich weiß ihr seit auf einem höheren Wissenslevel und es nervt sicher wenn Deppen wie ich ständig die selben Fragen stellen.
So ist aber das Leben. Deppen wachsen immer nach :-)

Wie bearbeite ich diesen Dataframe. So nennt das Ding doch.
Oder?

Re: InfluxDB lesen ,letzter Wert

Verfasst: Sonntag 1. Mai 2022, 09:53
von Sirius3
Dataframe ist ein Begriff, den Pandas benutzt. Du hast hier aber einfach eine Liste (list) und ein Wörterbuch (dict). Das ist die Begriffe, nach denen Du suchen kannst, um mehr Informationen zu bekommen. Das hat sparrow in seiner Antwort schon geschrieben und das ist auch die Hilfe, mit der Du am besten weiterkommst. Du hast eine unbekannte Struktur und wir nennen Dir hier im Forum das Stichwort, mit dem Du Google füttern kannst.

Niemand hat gesagt, dass Du ein 1000seitiges Buch durcharbeiten sollst, aber etwas mit den Grundlagen beschäftigen mußt Du dich schon, vor allem, wenn Du merkst, dass Du mit Deinem jetzigen Wissen nicht weiter kommst.
Hier ist der kurze Abschnitt zu Wörterbüchern: https://docs.python.org/3/tutorial/data ... ctionaries

Re: InfluxDB lesen ,letzter Wert

Verfasst: Sonntag 1. Mai 2022, 14:28
von kiaralle
Danke an euch,

das mit dem dict ist mir nicht so als Hinweiß auf Dictionaries ins Auge gefallen.
Hab es mir angesehen. Ist einleuchtend und damit komme ich doch weiter.
Auch wenn es Anstrengend war mit mir, noch mal vielen Dank :wink: