InfluxDB lesen ,letzter Wert

Installation und Anwendung von Datenbankschnittstellen wie SQLite, PostgreSQL, MariaDB/MySQL, der DB-API 2.0 und sonstigen Datenbanksystemen.
Antworten
kiaralle
User
Beiträge: 64
Registriert: Donnerstag 19. August 2021, 19:11

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
Sirius3
User
Beiträge: 17711
Registriert: Sonntag 21. Oktober 2012, 17:20

Wo ist Dein Problem? Du erhältst doch den Mittelwert der BatterySOC.
kiaralle
User
Beiträge: 64
Registriert: Donnerstag 19. August 2021, 19:11

ok, etwas missverständlich ausgedrückt ;-)

ich mochte das nur die 35.0 da steht. Denn damit könnte ich weiter rechnen.
Benutzeravatar
sparrow
User
Beiträge: 4165
Registriert: Freitag 17. April 2009, 10:28

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.
Benutzeravatar
__blackjack__
User
Beiträge: 13004
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@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.
“Most people find the concept of programming obvious, but the doing impossible.” — Alan J. Perlis
kiaralle
User
Beiträge: 64
Registriert: Donnerstag 19. August 2021, 19:11

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"}
kiaralle
User
Beiträge: 64
Registriert: Donnerstag 19. August 2021, 19:11

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 :-)
Sirius3
User
Beiträge: 17711
Registriert: Sonntag 21. Oktober 2012, 17:20

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.
kiaralle
User
Beiträge: 64
Registriert: Donnerstag 19. August 2021, 19:11

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.
Benutzeravatar
__blackjack__
User
Beiträge: 13004
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@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.
“Most people find the concept of programming obvious, but the doing impossible.” — Alan J. Perlis
kiaralle
User
Beiträge: 64
Registriert: Donnerstag 19. August 2021, 19:11

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?
Sirius3
User
Beiträge: 17711
Registriert: Sonntag 21. Oktober 2012, 17:20

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
kiaralle
User
Beiträge: 64
Registriert: Donnerstag 19. August 2021, 19:11

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:
Antworten