RRDTOOL: nur einen Wert eintragen: wie?

Installation und Anwendung von Datenbankschnittstellen wie SQLite, PostgreSQL, MariaDB/MySQL, der DB-API 2.0 und sonstigen Datenbanksystemen.
Antworten
Octeon
User
Beiträge: 14
Registriert: Sonntag 23. September 2018, 08:08

Hallo Forum,

in meinem Round-Robin-Archiv habe ich mehrere Datensätze mit Temperaturen: temp1, temp2, temp3.

Eingetragen werden die Werte z.B. mit:

Code: Alles auswählen

rrdtool.update("Temperaturen.rrd","N:21:22:32")
Was ist aber, wenn ich nur einen bestimmten Temperaturwert (z.B. temp2) eintragen will?
Geht das ausschließlich mit:

Code: Alles auswählen

rrdtool.update("Temperaturen.rrd","N::25:")
Oder kann ich auch irgendwie direkt auf den Datensatz-Namen verweisen, wo ich einen Wert eintragen will, also z.B.

Code: Alles auswählen

rrdtool.update("Temperaturen.rrd","N:temp2:25")
Gruß
Octeon
Benutzeravatar
__blackjack__
User
Beiträge: 13004
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@Octeon: Das geht mit der ``--template``/``-t``-Option. Siehe die Dokumentation. Und da auch den Hinweis das nicht eingetragene Werte zu dem Zeitpunkt als unbekannt eingetragen werden.
“Most people find the concept of programming obvious, but the doing impossible.” — Alan J. Perlis
Octeon
User
Beiträge: 14
Registriert: Sonntag 23. September 2018, 08:08

Danke für die Antwort, aber es funktioniert irgendwie nicht.

Mein Code sieht jetzt so aus:

Code: Alles auswählen

rrdtool.update("Temperaturen.rrd","-t temp1 N:21")
Normalerweise bekomme ich ein NONE zurück, wenn alles ordnungsgemäß ausgeführt wurde. Ich bekomme aber nichts zurück, auch keinen Fehler o.ä.

Was mache ich falsch?
Benutzeravatar
__blackjack__
User
Beiträge: 13004
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@Octeon: Meinst Du `None` oder `NONE`? Und ”nichts” geht gar nicht, *jeder* Aufruf hat in Python einen Rückgabewert. Wenn es keinen expliziten gibt, dann wird implizit `None` zurückgegeben.

Zum Aufruf selbst: das müssten *zwei* Argumente sein. Also "-t temp1" und "N:21".
“Most people find the concept of programming obvious, but the doing impossible.” — Alan J. Perlis
Octeon
User
Beiträge: 14
Registriert: Sonntag 23. September 2018, 08:08

Das ist ja das komisch: da kommt nichts zurück.
Normalerweise wird None zurückgemeldet, wenn alles einwandfrei ausgeführt wurde.

Ich prüfe das mit:

Code: Alles auswählen

print (rrdtool.update("Temperaturen.rrd","-t temp1","N:21"))
(so sieht mein Code jetzt aus, es wird aber nichts in das RRD-Archiv eingetragen und auch kein None zurückgemeldet)

Ich kann auch das hier eingeben, ohne das ein Fehler auftritt:

Code: Alles auswählen

print (rrdtool.update("Temperaturen.rrd","MickeyMaus","N:21"))
Komisch....
Benutzeravatar
sparrow
User
Beiträge: 4164
Registriert: Freitag 17. April 2009, 10:28

Der Aufruf von Funktionen gibt immer etwas zurück.
Nach einem Funktionsaufruf gehört kein Leerzeichen.
Was gibt das denn aus?

Code: Alles auswählen

print("Vorher")
return_value = rrdtool.update("Temperaturen.rrd","-t temp1","N:21")
print(f"Return value: {return_value}")
print("Hinterher)
Es kling nämlich, als würde dein Code an der Stelle nicht ankommen.
Octeon
User
Beiträge: 14
Registriert: Sonntag 23. September 2018, 08:08

Ok...ich glaube, langsam komme ich dem Problem auf die Schliche.

Abgesehen davon, dass das

Code: Alles auswählen

print(f"Return value: {return_value}")
einen Syntaxfehler gibt (habe ich geändert), kommt immer nur "Vorher".
Ich rufe den Befehl in eine Callback-Funktion auf, die jedes Mal aufgerufen wird, wenn ein MQTT-Wert eintrifft.
Kann es sein, dass die rrdtool.update-Funktion gar nicht richtig zu Ende ausgeführt, da schon der nächste MQTT-Wert eintrudelt und somit der nächste Callback getriggert wird?
Benutzeravatar
__blackjack__
User
Beiträge: 13004
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@Octeon: Wie alt ist denn Dein Python? f-Zeichenkettenliterale gibt es seit Python 3.6. Und das ist das älteste Python für das es noch Support gibt.

Wie geht der Callback-Mechanismus denn mit Ausnahmen aus? Siehst Du die irgendwo? Falls nicht ist das, ähm, sehr ugnünstig für die Fehlersuche.
“Most people find the concept of programming obvious, but the doing impossible.” — Alan J. Perlis
Octeon
User
Beiträge: 14
Registriert: Sonntag 23. September 2018, 08:08

So, Problem mehr oder weniger "gelöst".

Zu Deiner Frage: ist Python 3.5.3 auf einem älteren RasPi.

Zum Problem:
Mein Programm trägt jedes Mal, wenn ein Temperatur-Wert per MQTT eintrudelt, den Wert in ein RRD ein.
Das passiert in der Callback-Funktion von MQTT (on_message, gestartet über loop_start()).
Und offensichtlich ist es so, dass wenn beim Aufruf von rrdtool.update(*args) irgendwas nicht passt (z.B. falsche Parameter, s.u.), KEIN Fehler geworfen wird. Es wird die Callback-Funktion m.E. einfach abgebrochen. Vielleicht weil das Hauptprogramm sowieso in irgendeiner anderen Schleife o.ä. hängt und die Callback-Funktion on_message in einem neuen Thread bearbeitet wird.

Der Fehler war, dass ich den Parameter -t / --template falsch übergegen habe: da darf kein Leerzeichen zwischen dem -t und dem Name des DS.
Antworten